Имитация ввода минибуфера в 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,

Если это на самом деле то, о чем вы просили, здесь есть почти идентичный ответ.

Другие вопросы по тегам