2

ミニバッファ入力をシミュレートする方法を探しています。そのため、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
  )

何か案は?

ありがとう!

4

3 に答える 3

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

関連するドキュメントは、 Vector のキーボード マクロ関数 です

于 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 に答える