3

次の例を考えてみましょう: 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 はそのコマンド ループを破棄します。

4

3 に答える 3

1

マニュアルを引用するには:

一般に、GNU Emacs では再帰的な編集レベルの使用を最小限に抑えようとしています。これは、最も内側のレベルから最上位のレベルに向かって、特定の順序で「戻る」ように制約するためです。可能な場合は、さまざまなアクティビティを別々のバッファに表示して、好きなように切り替えることができるようにします。一部のコマンドは、元に戻すコマンドを提供する新しいメジャー モードに切り替わります。これらのアプローチにより、選択した順序で未完了のタスクに戻る柔軟性が向上します。

実際にこれを行う必要があるシナリオを説明していただけますか? Ido は、この場合のように動作するため、非常に奇妙です。

于 2012-07-10T01:30:22.887 に答える
1

したがって、あなたの質問には3つの答えがあると思います。

  • 他のキーと同じように、ミニバッファー マップでキーをバインドできます。関連する可能性のあるキーマップがいくつかあります。

  • idoには、さまざまな関数の動作を変更するために使用できるフックが多数あります。特に、ido-make-*-hook変数が関連しているようです。(一度も使用したことがない場合はM-x describe-variable、別名\C-h vがあなたの友達です。)

  • 関数の動作を普遍的に変更したいが、利用可能なフックがない場合は、 を検討する必要がありますdefadvice。あなたの場合、私はあなたがうまくいくと思います(テストされていません!):

    (defadvice ido-find-file (before)
       (ido-merge-work-directories))
    (ad-activate ido-find-file)
    

    次の行を に追加できます.emacs

    (when (require 'ido)
      (defadvice ido-find-file (before)
         (ido-merge-work-directories))
      (ad-activate ido-find-file))
    
于 2012-07-08T20:55:22.380 に答える
1

あなたが何を求めているのかははっきりしていませんが、トップレベルでないときにミニバッファーから読み取るコマンドを対話的に呼び出す方法を尋ねているように聞こえます。

それが問題であれば、答えは簡単です。コマンド呼び出しの前後にバインドenable-recursive-minibuffersします。nil

于 2013-10-21T03:14:45.587 に答える