次の例を考えてみましょう: ido を使用してミニバッファーからファイルを読み取りたいのですが、よく使用するすべてのディレクトリをマージします。私はただ実行することはできません
(ido-find-file)
(ido-merge-work-directories)
2 番目の sexp は、ユーザーがファイルの選択を終了した後にのみ実行されるためです。質問は次のとおりです: ミニバッファーのコマンドループでコマンドを実行するための最良/最もクリーンな方法は何ですか?
これを行う唯一の方法は、目的のコマンドをキー シーケンスにバインドし、そのシーケンスを unread-command-events に追加して、ミニバッファー コマンド ループに入るとキーが実行されるようにすることです。
(setq unread-command-events (append (listify-key-sequence (kbd "M-s")) unread-command-events)) ; std key-binding for ido-merge-work-directories
(ido-find-file)
しかし、それは非常にハックであり、より良い解決策があるかどうか知りたい.
ありがとう!
編集:明確にするために、この質問はidoに関するものではありません。説明させてください。find-file、switch-to-buffer、またはミニバッファーの相互作用を必要とする何かを呼び出すと、「再帰編集」が作成されます。つまり、コマンドループ内のコマンドループです。
したがって、コード:
(message "A")
(recursive-edit)
(message "B")
A を出力してから、関数の実行を一時停止し、コマンド ループに再び入ります。再帰編集を終了するまで、移動したり、ファイルを開いたりすることができます。その後、「B」が出力されます。
では、私の質問を言い換えてみましょう: 再帰編集を作成する場合、作成された新しいコマンド ループで (同じ関数内で) コマンドを実行するにはどうすればよいでしょうか? 余分なキーを入力する必要がある場合はカウントされません。ido の例では、ディレクトリをマージするには、ido が実行されている必要があります。ido が呼び出される前にマージ ディレクトリを実行することは、ido のコマンド ループ内ではありません。後で実行すると、ido はそのコマンド ループを破棄します。