2

我正在寻找一种模拟 minibuffer 输入的方法。因此,some-func从 minibuffer 中获取一些输入并对其进行处理。问题是我必须从其他一些函数调用函数调用一些函数,并且我需要交互地执行它,所以我不能只传递一个参数。

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

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

有任何想法吗?

谢谢!

4

3 回答 3

5

探索为什么需要以交互方式调用另一个函数可能会很有趣……但这不是你问的。

这是一个交互式“调用”函数并将文本发送到 minibuffer 的示例。您只需使用 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 and Functions for Vectors

于 2010-01-15T21:11:19.470 回答
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吗?

于 2010-01-15T22:33:17.343 回答
0

以下情况如何:

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

也就是说,使用一个空interactive规范,并通过 获取传递规范call-interactively

如果这实际上是您所要求的,那么这里有一个几乎相同的答案。

于 2010-01-15T21:16:01.483 回答