2010-01-15 3 views
2

미니 버퍼 입력을 시뮬레이트하는 방법을 찾고 있습니다. 따라서 some-func은 미니 버퍼에서 일부 입력을 받아서 처리합니다. 문제는 내가 일부 func 다른 함수에서 calling-func 전화해야하고 나는 단지 인수를 전달할 수 없도록 대화 형으로해야합니다.이맥스에서 미니 버퍼 입력 시뮬레이트

(defun some-func (arg) 
    (interactive "*sEnter something: ") 
    ;; Do something with arg 
) 

(defun calling-func() 
    (call-interactively 'some-func) 
    ;; Type to minibuffer 
) 

아이디어가 있으십니까?

감사합니다.

답변

5

다른 기능을 대화식으로 호출해야하는 이유를 알아 보는 것은 흥미로울 수 있지만 그게 당신이 요구 한 것이 아닙니다.

다음은 대화식으로 함수를 호출하고 미니 버퍼에 텍스트를 보내는 예제입니다. 당신은 이맥스 키보드 매크로를 사용

(defun my-call-find-file (something) 
    "An example of how to have emacs 'interact' with the minibuffer 
use a kbd macro" 
    (interactive "sEnter something:") 
    (let ((base-vector [?\M-x ?f ?i ?n ?d ?- ?f ?i ?l ?e return])) 
    ;; create new macro of the form 
    ;; M-x find-file RET <userinput> RET 
    (execute-kbd-macro (vconcat base-vector 
           (string-to-vector something) 
           (vector 'return))))) 

관련 문서는 Keyboard MacrosFunctions for Vectors 있습니다. 다음에 대한

+0

나는 이런 식으로 사용할 수 있다고 생각합니다. 나는 그것을 조금 시도 할 것이다. 왜 내가 대화식으로 호출해야하는지 묻습니다. 나는 ~ 할 필요가 없다. 하지만 더 좋습니다. 나는 약간의 시험을하고있다. 따라서 사용자를 시뮬레이트하고 싶습니다. 함수를 호출 할 수는 있지만 사용자가이 함수와 상호 작용하는 방식이 아닙니다. – rejeep

+0

kbd 매크로는 기본적으로 사용자가 어떻게 상호 작용 하는지를 보여줍니다. Emacs로 전송되는 키 프레스 스트림입니다. –

+0

Emacs에 대해 더 많이 배울수록 얼마나 훌륭한 지 알 수 있습니다. 때로는 무언가가 가능하고 언제나 그것이 가능하다는 것을 의심합니다. – rejeep

0

방법 :

입니다
(defun calling-func() 
    (interactive) 
    (call-interactively 'some-func) 
    ;; Type to minibuffer 
) 

, 빈 interactive 사양을 사용하고 call-interactively를 통해 전이 사양을 선택하십시오.

실제로 이것이 귀하가 요구 한 것이라면 거의 동일한 대답 here이 있습니다.

+0

아직 입력해야 할 것이기 때문에 이것이 도움이되지 않는다고 생각합니다. 그렇게 할 수 없습니다. 나는 그것을 시뮬레이션해야한다. Trey Jackson에 대한 논평을 참조하십시오. – rejeep

+0

아,'calling-func'가 대화식 인터페이스를 다시 지정하지 않고'some-func'와 완전히 같은 대화 형 인터페이스로 동작하도록하고 싶다고 생각했습니다. – seh

1

나는 매크로 물건들과 섞어왔다. 다음과 같은 다른 경우를 고려하십시오.

1) 전체 벡터가 모두 함께 작동하면 작동합니다!

(defun a() 
    (interactive) 
    (execute-kbd-macro [?\M-x ?l ?i ?n ?u ?m ?- ?m ?o ?d ?e return])) 

2)하지만 분할 할 때 그렇지 않습니다.

(defun a() 
    (interactive) 
    (b) 
    (c) 
    (d)) 

(defun b() 
    (execute-kbd-macro [?\M-x])) 

(defun c() 
    (execute-kbd-macro [?l ?i ?n ?u ?m ?- ?m ?o ?d ?e])) 

(defun d() 
    (execute-kbd-macro (vector 'return))) 

3) 문자열로 실행하는 것도 작동하지 않습니다.

(defun a() 
    (interactive) 
    (execute-kbd-macro (string-to-vector "M-x linum-mode RET"))) 

(defun a() 
    (interactive) 
    (execute-kbd-macro "M-x linum-mode RET")) 

실제로 이벤트를 연결해야합니다. 그렇다면 vconcat을 벡터에 사용해야합니까?

+0

예, 당신이하려는 것을 얻기 위해, 당신은 그렇게합니다. 그래서 내 솔루션에 'vconcat 호출이있었습니다. –

+0

답변을 주셔서 감사합니다. – rejeep

관련 문제