空のエコー領域を利用して情報を表示する


10

ほとんどの場合、エコー領域には何も表示されないため、情報を表示するために使用できると思います。たとえばorg-clock、現在のタスク、残り時間、合計経過時間をモードラインに表示します。この情報は実際に読めるがない(モードラインはかなり短くすることができます)、(それが全体のEmacsセッションに適用されるため)各モードライン上で繰り返されて、ではないことを、私はそれのためにいくつかの貴重なモードラインのスペースを犠牲にして喜んだと便利。一方、ここに表示するものがない場合は、エコー領域に表示される可能性があります。

これを達成するための標準的な方法はありますか?私は挿入機能をハッキングするminibuffer-inactive-mode-hook(ただし、エコー領域が再び使用されるとすぐにメッセージが消えるなど、確実に機能しない)か、ログに記録されていないメッセージをスパムすることを考えました(しかし、これは他の用途では混乱します)エコー領域とミニバッファ)。

これの貧乏人バージョンはアイドルタイマーを使用しますが、エコー領域は空にすることができます(たとえば、テキストを入力しているとき)。


1
表示されるエコー領域は、 `*エコー領域0 *`または `*エコー領域1 *`の内容であり、これらは「通常の」バッファです。Emacsにパッチを適用して、これらのバッファーが「フラッシュ」される(または表示されて空になる)たびにフックを実行できるようにして、この機能を効率的かつ確実に実装できるようにする必要があります。
ステファン

それはあなたが考えているまさにありませんが、バスティアンGuerryは、特にフレームのタイトルにモード行を表示すると、画面の不動産を保存するために、いくつかの興味深いものをした:bzg.fr/emacs-strip-tease.html
Dieter.Wilhelm

回答:


4

この質問へのコメントは、symonという名前のパッケージがそのような機能を利用していることを述べています。

これは、ミニバッファーがアクティブでないときにログに記録されていないメッセージをスパムし、コマンドが発行されるたびに再表示を停止することによって実現されます。そのボイラープレートはかなり短く、数分の使用後、私はそれに関する問題に気付くことができませんでした:メッセージとミニバッファーの使用は依然としてメッセージよりも優先されます。

主なコンポーネントは次のとおりです。

  • 表示関数、アイドルタイマーで実行されます(にmessage-log-max設定されたメッセージを呼び出しnil、表示された文字列が*Messages*バッファーに入らないようにします)
  • 再表示機能、タイマーで実行
  • 表示を停止する関数、実行 pre-command-hook

唯一の問題は、コマンドの実行中(入力時を含む)に表示が停止することです。

興味のある方のために、関連するコードをgithubで利用可能なボイラープレートパッケージに抽出しました。


1

答えは、IMO、ではない何も。エコー領域は一時的なメッセージ用です。そして、そこにエコーされた可能性のあるものを明確に消去するものがたくさんあります。したがって、IMOが要求することを合理的な方法で実現することには問題があります。

つまり、別の方法を使用してください。ここに幾つかあります:

  1. 他のバッファーを使用します(この目的のために開いたままにする小さなフレームまたはウィンドウなど)。操作は簡単で、移動、編集、消去など、好きなように操作できます。

  2. モードラインの一部または全部を使用します(明らかに、すでに検討済みです)。

  3. ヘッダー行を使用します。

  4. フレームタイトルを使用します。

もし私なら、おそらく#1を選ぶでしょう。(しかし、私はそのようなフルタイムのステータス情報の表示を本当に望まない/必要としません。オンデマンドで情報(履歴/ログも含む)を表示するコマンドを定義する可能性が高くなります。)


コメントの後に更新:

あなたの質問では、すでに「エコー領域が再び使用されるとすぐにメッセージが消える」と述べました。エコー領域があなたのニーズに合わないので、それはそのようなはかない空間を使うように聞こえました。コメントの返信はこれと矛盾しているようです。

本当にエコー領域を使用したい場合はminibuffer-inactive-mode-hook、前述のようにを使用するか、タイマーを使用して、message他の方法で時間メッセージを呼び出したり、エコー領域に時間メッセージを挿入したりします。ただし、その問題についてはすでに説明しました。これらの問題(上書き、消去)は、エコー領域の意図されたはかない性質から生じます。

つまり、一時的なメッセージ用の領域を使用したいが、その領域が再び使用されるとすぐにメッセージが消えないようにする必要があります。

(ところで、モードライン情報はすべてのモードラインで繰り返されるということについて言及します:そうである必要はありません。モードラインを特定のバッファなどに固有にすることができます。IOW、常に1つのモードラインを選択できます(または定期的に)時計などを表示します。)


ご提案ありがとうございます!最初に、しかし、私はよくわかりません、なぜそれが問題なのですか?エコー領域atmに移動して、エコー領域の他の使用を上書きするものを使用したいので、消去しても問題ありません。また、エコー領域が空の場合にのみ追加情報が表示されるため、消去するものはありません。それは妥当な仕様のように聞こえませんか?#1については、画面スペースを無駄にしたくないという問題があります。エコー領域は、空であっても常に存在します。#2のいくつかの問題を挙げましたが、#3と#4はこれらの問題の多くを共有しています。
T. Verron、2015年

私は情報のフルタイムの表示をする理由について、例えば取るorg-clock質問から例を:私はタイマーは私がやって、と私はそれを行うことになっていますそのすべきかを思い出させるために下に刻々と過ぎたい、など可能な限り。
T. Verron、2015年

「メッセージはエコー領域が再び使用されるとすぐに消えます」わかりませんでした。つまりminibuffer-inactive-mode-hook、ミニバッファーを使用して終了すると、メッセージが表示されるということです。次に、他のコマンドがエコー領域に何かを出力すると、この新しいメッセージが追加され、一時メッセージは返されません(今回はミニバッファーが関与しなかったため)。
T. Verron、2015年

モードラインについての主な問題は、そこにある利用可能なスペースが小さいことです(多くのウィンドウが水平方向に分割されていることが多いため、非常に短いモードラインです)。
T. Verron、2015年

繰り返しますが、要約すると、一時的なメッセージ用の領域を使用したいが、その領域が再び使用されるとすぐにメッセージが消えないようにする必要があります。messageまたはpost-command-hookでタイマーを使用します。ただし、一時的な表示領域を使用して一時的なものにしたくないものがあるため、消えたり上書きしたりするという本質的な問題によって頭がもたれることがあります。
2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.