我正在寻找一种模拟迷你缓冲输入的方法。因此, some-func 会从迷你缓冲区获取一些输入并对其执行某些操作。问题是我必须从其他函数 calling-func 调用 some-func ,我需要以交互方式进行,所以我不能传递参数。
(defun some-func (arg)
(interactive "*sEnter something: ")
;; Do something with arg
)
(defun calling-func ()
(call-interactively 'some-func)
;; Type to minibuffer
)
有什么想法吗?
谢谢!
答案 0 :(得分: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)))))
答案 1 :(得分: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 吗?
答案 2 :(得分:0)
以下内容如何:
(defun calling-func ()
(interactive)
(call-interactively 'some-func)
;; Type to minibuffer
)
也就是说,使用空的interactive
规范,并通过call-interactively
获取传递规范。
如果这实际上是你所要求的,那么答案几乎完全相同here。