フレームの下部に沿って単語のリストを表示しますか?


20

私は開いているすべてのemacsフレームの下部に沿って水平に別々の行に3つの単語のリストを表示したいと思います(上部も機能しますが)。私はこれを行う6つの方法を考えましたが、それらにはすべて問題があります:

  1. 最初に考えたのは、モード行に行を追加することでしたが、モード行で改行文字を使用することはできません。「^ J」に変換されるだけです。

  2. 私の2番目の考えは、画面の上部に行を持ち、ヘッダー行を使用することでしたが、改行文字もサポートしていません。

  3. ウィンドウの最後の3行にオーバーレイを表示できましたが、これを堅牢にするのは難しいようです。ウィンドウの実際の端ではなく、ポイントがオーバーレイに達したときにスクロールをトリガーする必要があり、常に再配置する必要がありますオーバーレイはウィンドウスペースではなくテキストスペースにあるため、オーバーレイ。

  4. フレームの下部に専用の窓を作ってみることができました。私はこれをコーディングしようとしましたが、あまり堅牢ではありません。フレームにすでに分割ウィンドウが含まれていて、Cx、1を無視するカスタムバージョンのdelete-other-windowsに再バインドする必要がある場合、正しく動作しないようです私の特別な窓と私は他のコーナーケースがあると確信しています。また、ヘルプウィンドウが開くと、水平方向の分割が既にあると考えられるため、垂直方向に開きます(技術的には存在しますが、1行のウィンドウのみを表示します)。

  5. これに専用のフレームを用意することもできますが、その場合、設定はターミナルモードで動作しません。また、ウィンドウマネージャーのスクリプトを作成して、画面の下部に沿って保持し、選択不能にしてレイアウトに影響を与えないようにする必要があります。などなど

  6. 3行のテキストを直接ミニバッファーに挿入できます。これが部分的に機能するようになったので、ミニバッファーを増やして3行を収容し、表示できます。ただし、メッセージがエコーされるたびに、別のコマンドを発行して行が再表示されるまで、行は消えます。理想的には、3本の線とエコーエリアが重ならないので、両方を見ることができます。どのメッセージをエコーエリアに送信するかを確実にフィルタリングできれば、これは面倒ではありません-EmacsWikiで解決策を見つけましたが、emacs Cソースに由来するメッセージでは機能しないようです(具体的には、タイマーで頻繁に自動保存するため、メッセージを保存するファイルを取り除きます)。

コンテキストに関して、私の目標は、現在のバッファーで最も頻繁に使用される単語、現在のバッファーで最も近いポイント、および現在のバッファーで最近使用された単語を常に表示することです。私は音声コマンドを介してそれらをバッファに挿入できるようにするつもりです。したがって、「最近接2」と言って、ポイントに最も近い単語のリストから2番目の項目を選択して挿入することができます。私は、現在編集しているバッファが何であれ、単語リストが表示されることだけに関心があります。リストが常に表示される必要があるため、さまざまなコード補完モードで使用されるポップアップウィンドウを使用したくありません。


良い質問です。いくつかの有用な提案が得られれば幸いです。
ドリュー

#5の他の部分については、ターミナルモードの必要性(メジャー)以外に疑問に思います。下部にある専用フレームを使用できます(問題ありません)。unselectableとはどういう意味ですか、なぜそれが必要なのですか?読み取り専用を意味する場合、それも問題ありません。レイアウトに影響ないとはどういう意味ですか?要するに、#5は私にはあまり明確ではありません。
ドリュー

@Drew:キーボードを使用してWMを操作することを意味し、そのフレームを意図的にフォーカスしたいことはまずないので、次のウィンドウ/前のウィンドウのバインドでスキップする必要があります。同様に、そのフレームがパネル/タスクバーの一部であるかのように、ウィンドウレイアウトを動作させたいと思います。編集:このコメントのどこでも私は「ウィンドウ」と言った、私はXウィンドウを意味し、emacsウィンドウではありません; p
ジョセフ・ガービン14

私に提案されたもう1つの可能性は、ミニバッファーを使用することです。それはかかわらず、それを使用しようとしている他のすべてに干渉することなくそこにダウン受動的に表示テキストに可能だ場合、私は...わかりません
ジョセフ・ガービン

ミニバッファーを使用しようとすることに関するメモを追加しました。
ジョセフガービン14

回答:


8

たくさんのハッキーな実験により、(ミニバッファーテキストを使用して)#6を「十分に良い」動作状態にすることができました。スクリーンショットは次のとおりです。

動作中のベルトのスクリーンショット

この作業を行うには、いくつかの重要な部分があります。

  • 驚くべきことに、ミニバッファーにテキストを挿入すると、箱から出してすぐに正しいことが行われます。そこに挿入されたテキストは実際に表示されます。
  • テキストを通常のテキストではなく、オーバーレイの「後の文字列」にすることで、選択できなくなり、カーソルが誤って挿入されることを心配する必要がなくなります。
  • ミニバッファープロンプトコマンドを正しく機能させるには、ミニバッファーウィンドウがアクティブなときにテキスト/オーバーレイの挿入を禁止する必要があります。
  • 通常のウィンドウサイズ変更機能を使用してミニバッファーのサイズを変更しようとすると、ウィンドウが小さすぎるというエラーが表示されます。ドキュメントに記載されていないmd-resize-minibuf関数を使用すると、最初にresize-mini-windowsをnilに設定しました。
  • メッセージがあるたびに消えるリストを解決するには、メッセージをインターセプトするようメッセージ機能にアドバイスする必要があります。次に、自分でそれらをミニバッファに挿入します。また、エコー領域に最後に表示されたものを格納するcurrent-message変数を調べる必要があります(驚くことに、エコー領域とミニバッファーは技術的に区別され、一部のCソースコード関数はメッセージを経由せずにエコー領域に直接出力します関数)。これについて以下に提供するコードは不完全であり、メッセージは通常調査する必要がある通常よりも長く存続します(* Messages *の最後のエントリを確認する方が簡単で堅牢かもしれません)が、これは今のところ「十分」です。

キルリングを表示するサンプルベルトを使用した実装へのリンクを次に示します。最終的に、これは適切なプロジェクトの一部になります:https : //gist.github.com/jgarvin/ce37d08654978fd7e4c9

かなりの量のelispを書くのは今回が初めてなので、品質はおそらく準劣ですが、うまくいきます。


1

残念ながら、モード行もヘッダー行も複数行にすることはできません。私はこれについて以前に尋ねましたが、この作業を行うための隠されたオプションはあります(少なくともそうではありませんでした)。1と2が出ています。また、3と6は長期的にはあなたを幸せにしないハッキングのような気がします。3と4は素晴らしいアプローチのように思えますが、それらを確実に機能させるには多大な投資が必要です。

そのため、まずこれをemacs-develで取り上げることをお勧めします。私の経験では、あなたが何を望んでいるのか、なぜそれが良いことなのかを注意深く説明することに気が付くと、最終的には実装されます。少なくとも次のリリースまでには時間がかかるかもしれませんが、少し待っても開発バージョンを使用しても問題ない場合は、はるかに少ない労力で望みどおりの結果を得ることができます。


emacs-develに連絡する提案をありがとう。私が解決策を思いついたとしても、それはかなりハッキーで、画面座標に直接描画するための本当のAPIがあればいいので、時間があるときにメールを自分で撮影するでしょう。
ジョセフガービン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.