2010-01-15 64 views
2

我正在寻找一种方法来模拟迷你缓冲区输入。因此,some-func需要来自minibuffer的一些输入,并对它进行一些操作。问题是我必须从其他函数调用some-funccalling-func我需要交互式地做,所以我不能传递一个参数。在Emacs中模拟迷你缓冲区输入

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

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

任何想法?

谢谢!

回答

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))))) 

相关文件是Keyboard MacrosFunctions for Vectors

+0

我想我可以使用这样的东西。我会试一试。你问为什么我需要交互地调用它。我不需要*。但它更好。我正在尝试一些测试。所以我想模拟一个用户。我可以调用该函数,但这不是用户如何与之交互的。 – rejeep 2010-01-15 21:49:52

+0

好吧,kbd宏本质上是用户与它交互的方式。这只是将一些按键发送给Emacs。 – 2010-01-15 22:27:25

+0

你对Emacs了解得越多,就越意识到它有多辉煌。有时候你会怀疑是否有可能发生,事情总是如此。 – rejeep 2010-01-15 22:35:30

0

如何如下:

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

也就是说,使用空interactive规范,并通过call-interactively拿起传递规范。

如果这实际上是你要求的,那么有一个几乎相同的答案here

+0

我不认为这会帮助我,因为我仍然必须输入一些内容,但我无法做到这一点。我必须模拟这一点。出于理性,请参阅Trey Jackson的评论。 – rejeep 2010-01-15 21:51:29

+0

啊,我以为你希望'calling-func'与'some-func'具有完全相同的交互界面,而不需要再次指定它的交互界面。 – seh 2010-01-15 22:29:35

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吗?

+0

是的,为了得到你想要的,你做的。这就是为什么我的解决方案有'vconcat调用。 – 2010-01-15 22:58:28

+0

好的,谢谢你的回答! – rejeep 2010-01-16 11:12:17