Имитация ввода минибуфера в Emacs - PullRequest
2 голосов
/ 15 января 2010

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

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

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

Есть идеи?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 16 января 2010

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

Вот пример "интерактивного вызова" функции и отправки текста в минибуфер,Вы просто используете макросы клавиатуры 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 голос
/ 16 января 2010

Я смешиваюсь с макросами. Рассмотрим эти разные случаи:

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 голосов
/ 16 января 2010

Как насчет следующего:

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

То есть используйте пустую спецификацию interactive и выберите транзитивную спецификацию через call-interactively.

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

...