2010-01-15 2 views
2

Я ищу способ имитации ввода минибуфера. Итак, some-func берет некоторый вклад от минибуфера и что-то делает с ним. Проблема в том, что я должен позвонить some-func из какой-либо другой функции call-func, и мне нужно сделать это интерактивно, поэтому я не могу просто передать аргумент.Имитировать вход минибуфера в Emacs

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

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

Любые идеи?

Спасибо!

ответ

5

Возможно, вам интересно узнать, почему вам нужно вызвать другую функцию в интерактивном режиме ... но это не то, что вы просили.

Вот пример «вызова» функции в интерактивном режиме и отправки текста в минибуфер. Вы просто использовать Emacs клавиатурные макросы:

(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 Macros и Functions 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

Я не думаю, что это поможет мне, так как мне все равно придется набирать что-то, и я не могу этого сделать. Я должен имитировать это. Смотрите комментарий к Трей Джексону по причине. – rejeep

+0

Ах, я думал, что вы хотите, чтобы 'call-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

Смежные вопросы