2017-04-03 14 views
1

이전에 입력 한 대화 형 인수에 액세스해야 다음 인수의 초기 값으로 사용할 수 있습니다. 무슨 뜻인지 명확히하기 위해, 버퍼의 이름을 변경하는 예 기능을 고려다음 매개 변수의 초기 값에서 이전 대화 형 인수 사용

(defun my/rename-buffer (old-name new-name) 
    (interactive (list (read-buffer "Buffer to rename: " (current-buffer) t) 
        (read-string "Rename buffer to: "))) 
    ;; Implementation here. 
) 

나는 내가 new-name 프롬프트에 대한 초기 값으로 사용할 수 있도록 old-name에 입력 된 값에 액세스 할 수 있습니까?

자세히 설명해 드리겠습니다. 우리가 M-x my/example 할 때, 사용자는과 같이 (*scratch* 가정 현재 버퍼이다)하라는 메시지가 표시됩니다 : 사용자가 *scratch를 사용하는 첫 번째 프롬프트 (*scratch*), 내가 좋아하는 것 두 번째 프롬프트에 대한 기본을 받아

Buffer to rename (default *scratch*): 
Rename buffer to: 

경우 초기 값은 사용자에게 표시되는 상기 사용자가 상기 제 프롬프트 다른 버퍼의 이름을 입력하는 대신 경우

Rename buffer to: *scratch* 

, 두 번째 메시지가 초기 값으로 another-buffer 있어야 another-buffer 말 :

Rename buffer to: another-buffer 

그래서 두 번째 프롬프트는 첫 번째 매개 변수의 값을 두 번째 프롬프트의 초기 값으로 사용해야합니다. 선명도

일부 노트 :

  • 나는 표준 rename-buffer 잘 작동 이후 my/rename-buffer의 구체적인 예에 ​​관심이 아니다. 이것은 실제로 예일뿐입니다.

  • 문자열을 arg-descriptor으로 사용하지 않는 솔루션을 찾고 있습니다. 표현식의 목록 인 기존의 arg-descriptor으로 솔루션을 작성해야합니다. 문자열로 다시 구현할 수 있다고는 생각하지 않지만, 가능하다해도 그러한 솔루션에는 관심이 없습니다.

  • 마지막 값을 읽기 전용 프롬프트 문자열의 일부로 표시하고 싶지 않지만 프롬프트 문자열 다음에 표시되는 수정 가능한 초기 값으로 사용하고 싶습니다.

  • 을 눌러 이전 인수에 액세스하는 것은 해결책이 아닙니다. 마지막 값을 얻기 위해 사용자 상호 작용을 원하지 않기 때문입니다. 나는 또한 (미래에 또는 다른 기능을 위해) 축약 된 그대로 표시하는 대신 마지막 값의 약간 수정 된 버전을 보여주기를 원할 수도있다. 이러한 솔루션은 프롬프트가 다른 유형이라면 동일한 기록을 가지지 않기 때문에 작동하지 않습니다.

답변

1

interactive, 주어진 리스프 형식은 해당 형식을 평가하여 목록을 얻습니다. 궁극적 인 반환 값이 함수 인수에 대한 적절한 값 목록 인 경우 을 그 형식으로 모두으로 수행 할 수 있습니다.

(defun my/rename-buffer (old-name new-name) 
    (interactive 
    (let* ((old (read-buffer "Buffer to rename: " (current-buffer) t)) 
      (new (read-string "Rename buffer to: " old))) 
    (list old new))) 
    ;; ... 
) 
+0

고맙습니다!지금 문서를 살펴보면이 점은 분명합니다. 그러나 내 두뇌는'(list ...) '형식의 "list literal"을 사용하는 것 이상으로 생각할 수 없습니다. –