Имитация ввода минибуфера в Emacs
Я ищу способ имитации ввода минибуфера. Итак, some-func берет некоторый вклад от минибуфера и что-то с ним делает. Проблема в том, что мне нужно вызвать some-func из другой функции вызывающей-func, и мне нужно сделать это в интерактивном режиме, чтобы я не мог просто передать аргумент.
(defun some-func (arg)
(interactive "*sEnter something: ")
;; Do something with arg
)
(defun calling-func ()
(call-interactively 'some-func)
;; Type to minibuffer
)
Есть идеи?
Спасибо!
3 ответа
Может быть интересно выяснить, почему вам нужно вызывать другую функцию в интерактивном режиме... но это не то, что вы просили.
Вот пример "интерактивного" вызова функции и отправки текста в минибуфер. Вы просто используете макросы клавиатуры 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)))))
Соответствующей документацией являются макросы клавиатуры и функции для векторов.
Я смешиваюсь с макросами. Рассмотрим эти разные случаи:
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 для векторов?
Как насчет следующего:
(defun calling-func ()
(interactive)
(call-interactively 'some-func)
;; Type to minibuffer
)
То есть используйте пустой interactive
спецификацию, и выберите транзитивную спецификацию через call-interactively
,
Если это на самом деле то, о чем вы просили, здесь есть почти идентичный ответ.