开发者

Simulate minibuffer input in Emacs

开发者 https://www.devze.com 2022-12-17 01:06 出处:网络
I\'m looking for a way to simulate minibuffer input. So, some-func takes some input from the minibuffer and does something with it. The problem is that I have to call some-func from some other functio

I'm looking for a way to simulate minibuffer input. So, some-func takes some input from the minibuffer and does something with it. The problem is that I have to call some-func from some other function calling-func and I need to do it interactively so I cant just pass an argument.

开发者_开发问答
(defun some-func (arg)
  (interactive "*sEnter something: ")
  ;; Do something with arg
  )

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

Any ideas?

Thanks!


It might be interesting to explore why you need to call the other function interactively... but that's not what you asked.

Here's an example of "calling" a function interactively and sending text to the minibuffer. You just use Emacs keyboard macros:

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

The relevant documentation are Keyboard Macros and Functions for Vectors.


I've been mixing around with the macro stuff. Consider these different cases:

1) When the whole vector is all together it works!

(defun a ()
  (interactive)
  (execute-kbd-macro [?\M-x ?l ?i ?n ?u ?m ?- ?m ?o ?d ?e return]))

2) But when I split it up, it doesn't.

(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) Running it as a string does not work either.

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

I actually need to chain the events together. So, do I need to use vconcat on vectors then?


How about the following:

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

That is, use an empty interactive specification, and pick up the transitive specification via call-interactively.

If that was in fact what you were asking for, there's a nearly identical answer here.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号