一部のコマンドがミニバッファーを終了するときに終了する(isearch)一方で、終了しないコマンド(find-file)があるのはなぜですか?


6

時々、ファイルを開き始め、何らかの理由でファイルを選択するC-x o前に、プロンプトに答える前に実行します。その後、私がもう一度実行しようとするたびにfind-fileCommandがminibufferにいる間にminibufferを使用しようとしたことについて不平を言います。ただし、のようなコマンドを使用したisearch-forward-regexp場合(すでにfind-fileプロンプト内にある場合でも)、エラーはスローされず、を使用してミニバッファーに戻すことはできませんother-window
一部のプロンプトがミニバッファーを一時的にアップグレードしother-windowて、ミニバッファーを可能なターゲットとみなすプロンプトとそうでないプロンプトがあるのはなぜですか?


明確にするために、私は行き詰まる方法を尋ねているのではありません。
もともとこれに遭遇したときは、ミニバッファーに切り替えてプロンプトをエスケープするEsc Esc EscC-g、エスケープして、ミニバッファーを使用する新しいコマンドを開始できるようにしました。ただし、この質問について熟考すると、abort-recursive-editC-])がother-window+ を実行しなくても、進行中のこのミニバッファーを閉じることがわかりましたkeyboard-quit

それでも、元のユースケースが何のためにあるのかはよくわかりません。おそらく、それはミニバッファープロンプトへのコピー貼り付けや、マクロの途中でのコマンドの実行を支援するためのものですか?

知りたいのは、この再帰性を無効にする方法があるかどうかですisearch。でisearch、それは、ブロッキングプロンプトの代わりに、読み取りイベントを使用しているため安全ですか?abort-recursive-editミニバッファーを終了するときにトリガーするフックはありますか?


TL; DR

  1. 一部のミニバッファーコマンドがミニバッファーをのターゲットにアップグレードし、other-window新しいミニバッファーコマンドの実行をブロックするのに対し、などの他のコマンドisearchはそうしないのはなぜですか?
  2. これを無効にする方法はありますか?
  3. この機能の使用目的は何ですか?

2
あなたの質問は不明瞭です。何をしようとしているの?C-]はい、1レベルのミニバッファーを中止します。Isearchはミニバッファーを使用しません。そして、「立ち往生」は、あなたが説明する残りの部分のどれと関係があるのでしょうか?このswitch-windowような状況では、まったく使用する必要はありません。しかし、何をしようとしているのか明確ではありません。説明のさまざまな部分を分離して、1つの質問を考え出してください。
2014年

2
コマンドがミニバッファーメッセージ内にあるときにミニバッファーを使用しようenable-recursive-minibufferstしないように設定を試みます。質問をrecursive-edit個別に投稿した場合、元の質問を明確にするのに役立つ場合があります。
Vamsi 2014年

回答:


5
  1. 多くの対話型コマンドはミニバッファー入力を読み取ります。 find-fileそのようなコマンドの1つです。ミニバッファ入力を読み取ると、ミニバッファウィンドウが「アクティブ」になりますother-window。そのため、コマンドを使用してミニバッファウィンドウに切り替えることができます。インタラクティブ isearchモードはマイナーモードとして実装されるため、特別です。技術的には、ミニバッファーから検索文字列を読み取るのではなく、入力時にキー入力をキャッチし、でミニバッファーにエコーします message。これが、other-window振る舞いが違って見える理由です。
  2. これは役立つ場合とそうでない場合がありますが、技術的にはfind-file、に格納されている関数を変更することにより 、のプロンプト動作を変更できますread-file-name-function。私は@kaushalmodiの答えに基づいて関数に助言を試みたことがありませんが、それが機能する場合はこれを更新します。
  3. minibuffer.elのコードに取り組んだハッカーについて話すことはできませんが、マニュアルの以下の説明から、 この動作はテキストをキルアンドヤンクできるように設計されていると思います。

ミニバッファーがアクティブな場合、エコー領域は通常のEmacsウィンドウと同様に扱われます。たとえば、Cx oを使用して別のウィンドウに切り替え、そこでテキストを編集してから、ミニバッファーウィンドウに戻って引数を終了することができます。別のウィンドウのテキストを削除して、ミニバッファーウィンドウに戻り、テキストを引数にヤンクすることもできます。


2

以下のスニペット[ Source ]は、フォーカスがミニバッファーから離れると再帰編集を中止します。これはC-g、カーソルのフォーカスが外に移動したときに繰り返し押してもミニバッファーが編集されないというイライラする状況を避けるためです。

(defun stop-using-minibuffer()
  「ミニバッファーを殺す」
  (when(and(> =(recursion-depth)1)(active-minibuffer-window))の場合
    (中止-再帰編集)))
(add-hook 'mouse-leave-buffer-hook' stop-using-minibuffer)

1

ドリューはすでにこれについてコメントしていますが...

isearch1は実際にはミニバッファーを使用していません。これはおそらく混乱の原因の1つです。エコー領域(ミニバッファーと同じウィンドウにありますが、実際にはミニバッファーではありません)に表示されます。

そのため、isearchの実行中にミニバッファーとの間で切り替えるという概念は、意味がありません。

1のようなコマンドを無視しisearch-edit-stringミニバッファを使用しますが、最も基本的なインクリメンタルサーチワークフローの一部ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.