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.