elisp에서 미니 버퍼 프롬프트에 응답하려면 어떻게해야합니까?


10

나는 때때로 내 자신을 위해 쓰고있는 함수 내에서 대화 형 함수를 사용한다는 것을 알게됩니다. 함수가 일부 정보를 요청하면 (예 : "출력 파일 : ~ /") 미니 버퍼에 텍스트를 추가 한 다음 Enter 키를 눌러 사용자가 그렇게하지 않아도되는 일반적인 방법이 있습니까?

예를 들어, org-latex-export-to-pdf함수 내 에서 실행 하고 싶지만 사용자가 파일 이름을 지정하지 않기를 원한다고 가정하십시오. 실행 (org-latex-export-to-pdf)미니 버퍼에 지점을 이동하지만, 같은 것을 넣어 (insert "filename.tex")다음 라인은 작동하지 않습니다.


3
일반적으로 대화식 함수는 해당 interactive절 에 그러한 정보를 요구해야합니다 . elisp에서 호출하면 정보를 함수 인수로 전달할 수 있어야합니다. 물론 호출하려는 함수가이 디자인을 따르지 않는 경우에는 도움이되지 않습니다.
Lindydancer

예, 일반적으로 (아쉽게도 현재는 아닙니다) 이것이 사실이라는 것을 알았습니다. 사용자가 미니 버퍼의 프롬프트에 대한 답변을 실제로 입력하기를 원하는 설계 이유가 있는지 알고 있습니까?
세스 로스 차일드

당신의 의견은 분명하지 않습니다. 사용자가 조회하고 응답하도록 하시겠습니까? 그렇지 않으면 프로그래밍 방식으로 원하는 / 필요한 인수 값 (출력 파일 이름)을 생성하여 함수에 전달합니다. 나는 당신이 어떤 코드를 보여 주거나 다른 방법으로 당신의 문제와 질문이 무엇인지 , 또는 질문의 위험이 명확하지 않은 것으로 명확 하고 명확하게 제시 할 것을 제안합니다 .
Drew

사용자 (나)가 쿼리하는 것을 원하지 않습니다. 질문을 명확히 할 수 있습니다. 몇 년 전부터 미니 버퍼에 대한 얀킹에 관한 이메일 스레드의 일부를 읽은 후이 작업을 수행하는 방법을 알고 있다고 생각합니다. 작동하면 작성하겠습니다.
세스 로스 차일드

1
다른 포럼 참가자가 함수에 인수를 전달하고 미니 버퍼를 완전히 무시하는 방법을 보여줄 수 있도록 자신의 함수를 작성할 때 사용할 대화식 함수의 특정 예를 게시하십시오.
법률 목록

답변:


3

재미있는 문제. post-command-hook새 명령 루프를 입력 할 때마다 편집기가 실행되는 것처럼 보입니다 ( 예 : a) recursive-edit. 그러나 우리는 minibuffer-setup-hook미니 버퍼에 들어간 후 함수를 실행하는로 시작할 수 있습니다. 이렇게하면 입력을 삽입 할 수 있지만 캐치가 아직 설정되지 않았기 때문에 미니 버퍼를 종료하기에는 너무 이릅니다.

(defmacro with-minibuffer-input (form &rest inputs)
  (declare (indent 1))
  `(minibuffer-with-setup-hook
       (lambda ()
         (minibuffer-input-provider ',inputs))
     ,form))

그건의 우리의 우리가를 입력 할 때마다 실행 얻을 우리 자신의 '명령 루프'에서 '인수를'포장 할 필요가 있었다 recursive-edit,하는 그것을 통해, 하나 개의 인수를 팝업 한 수준을 던졌습니다 포인트 exit-minibuffer.

;; -*- lexical-binding: t -*-
(defun minibuffer-input-provider (inputs)
  (let ((hook (make-symbol "hook")))
    (fset hook (lambda ()
                 (remove-hook 'post-command-hook hook)
                 (when inputs
                   (when (= 0 (minibuffer-depth))
                     (error "Too many inputs"))
                   (when (cdr inputs)
                     (add-hook 'post-command-hook hook))
                   (insert (pop inputs))
                   (exit-minibuffer))))
    (add-hook 'post-command-hook hook)))


(with-minibuffer-input (call-interactively 'find-file)
  "/")

(with-minibuffer-input (call-interactively 'occur)
  "\\(foo\\)\\(bar\\)" "\\1");;C-u C-x C-e

;;foobar

(with-minibuffer-input (call-interactively 'replace-string)
  "foo" "bar")

;; foo

3

나는이라는위한 매크로 쓴 with-simulated-input당신이 얻을 수있는, 여기를 . 사용자 상호 작용을 시뮬레이션하기 위해 임의의 입력을 제공하고 임의의 lisp 양식을 실행할 수 있습니다.

예를 들면 다음과 같습니다.

(with-simulated-input '("hello SPC" (insert "world") "RET")
  (read-string "Enter greeting: "))

"hello world"첫 번째 문자열에 의해 "hello"가 삽입되고 lisp 코드를 통해 "world"가 삽입되고 마지막으로 "RET"가 입력되어을 반환 합니다.

더 많은 사용 예제를 볼 수있는 테스트 스위트가 제공됩니다.


0

run-with-timerwith 를 사용 insert하면 작업이 완료되는 것 같습니다 .

(run-with-timer .2 nil 'insert "filename.tex")
(run-with-timer .3 nil 'execute-kbd-macro (kbd "RET"))
(org-latex-export-to-pdf)

insert나중에 배치 할 때 명령 이 너무 빨리 나타납니다. 문자열을 삽입하기 전에 문자열을 삽입하려고 시도합니다.


프로그래밍 방식으로 파일 이름을 통과 도움을 요청하는 질문을 수정하는 것이 좋습니다 org-export-output-file-name사용하는 경우 org-latex-export-to-pdf사용자가 파일 이름을 입력하라는 메시지가 표시되지 않도록. 질문에 노력을 기울일 수 있습니다 (예 : run-with-timer등).하지만 좋은 해결책은 아닙니다 (제 생각에는). 더 나은 해결책은 파일 이름을 프로그래밍 방식으로 올바르게 전달하여 미니 버퍼가 처음에 열리지 않도록하는 것입니다. elisp경험 이 많은 사람이 더 나은 솔루션을 얻을 수 있도록이 답변을 삭제하는 것이 좋습니다 .
법률 목록

@lawlist 파일 이름을 전달하는 방법에 대한 질문은 org-latex-export-to-pdf내가 관심이있는 것이 아닙니다. 이것은 파일 이름을 추가하려는 의도로 보인 예입니다. 내가 물었던 질문은 내가 의미 한 것입니다. elisp를 통해 미니 버퍼 프롬프트에 안정적으로 대답 할 수있는 방법이 있습니까? 사례 별 솔루션은 내가 찾고있는 것이 아닙니다. 귀하의 의견으로는 권장하지 않는 것으로 추론 할 수 있습니다.
세스 로스 차일드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.