1 ポイント 投稿者 GN⁺ 2024-05-13 | 1件のコメント | WhatsAppで共有

Emacsウィンドウ管理の概要

ウィンドウ管理の評判と可能性

  • Emacsのウィンドウ管理は評判があまりよくない
  • これは非常に柔軟で細分化されたレイアウトシステムと粗い制御が組み合わさった結果であることが多い
  • そのため、ウィンドウを扱うためのよりよいメタファーやアフォーダンスを提供するツールを作って使う余地が残されている

基本的なウィンドウ管理オプション

other-windowと「次のウィンドウ」

  • other-window (C-x o) は基本的なウィンドウ切り替え体験を提供する
  • これはEmacsチュートリアルで教えられるもので、ウィンドウ数が少ないときにはうまく機能する
  • ウィンドウ選択はフレーム全体をおおむね時計回りに巡回する

windmove

  • windmoveは方向に応じてウィンドウ間でフォーカスを移動し、ウィンドウ間でバッファを移動するためのEmacs組み込みライブラリである
  • Vimユーザーには期待される機能であり、evil-modeユーザーはすでにWindmoveを使っている
  • windmove-left-right-up-downを方向に対応するキーへバインドして使う

frames-only-mode

  • frames-only-modeを使うとEmacsのウィンドウ処理をOSに任せられる
  • すべてのバッファを新しいフレームで開けば、あとはウィンドウマネージャの仕事になる
  • これによりEmacsバッファをOSウィンドウと同等に扱い、同じキーで管理できる

winum-mode

  • Winumは、n個のウィンドウ間を移動する労力を O(n)(other-window)から O(√n)(windmove)、さらに O(1) へと進化させた自然な発展形である
  • モードラインにウィンドウ番号を追加し、その番号でウィンドウを選択できる
  • ミニバッファが有効になると常に番号0が割り当てられる

ace-window

  • ace-windowはキーボード主体のEmacsウィンドウ制御の決定版である
  • 各ウィンドウ上部に「ヒント」を表示し、そのキーを押すと該当ウィンドウへフォーカスが移る
  • 一般的な方法でウィンドウを「選択」し、そのウィンドウに対して何をするかをユーザーが決める
  • ウィンドウの削除、移動または入れ替え、分割、バッファ表示といった標準の操作に加え、ユーザー定義の操作も追加できる

マウスの使用

  • ウィンドウ管理にマウスを使う利点は即時的で明白である
  • ウィンドウ選択は基本的なマウス操作の自然な延長であり、ウィンドウサイズ変更も簡単である
  • コンテキストメニューやドラッグ&ドロップのサポートはとても直感的である
  • 欠点を差し引いても、すでに他の作業でマウスを使っているなら、Emacsをマウスで操作するのは実際には最も抵抗の少ない道である

transpose-frame(回転、反転、左右反転)

  • transpose-frameはフレーム内のウィンドウレイアウトを回転またはミラーリングするコマンドを提供する
  • rotate-frameflip-frameflop-frameを適切なキーにバインドしてよく使う

window-prefix-map

  • window-prefix-mapはデフォルトでC-x wにバインドされており、いくつかの便利なウィンドウ管理コマンドがまとめられている
  • split-root-window-rightsplit-root-window-belowはフレームのルートウィンドウを分割する
  • tab-detachtear-off-windowは、ウィンドウを新しいタブや新しいフレームへ移す便利なコマンドである

other-window-prefix

  • other-window-prefixはウィンドウ選択をバッファ表示から切り離す方法を提供し、3つのウィンドウ関連の不便さを解消する
  • 多くのEmacsコマンドは、基本操作・バッファ・ウィンドウを密接に結び付けている。other-window-prefixを使えば、コマンドのバッファを別のウィンドウに表示できる
  • other-window-prefixを使うと、リンクのようなオブジェクトを有効化するときにウィンドウを選択できる
  • other-window-prefixを使えば、各パッケージ作者の流儀に合わせたり個別にカスタマイズしたりしなくても、「リンク」オブジェクトを一貫した方法で開ける

ウィンドウ構成の保存と復元

  • window-configuration-to-registerはやや無骨なツールだが、大きな赤いリセットボタンとしては完璧である
  • いつでもこのコマンドで現在のウィンドウ構成をレジスタに保存し、jump-to-registerで復元できる
  • winner-modeを使えば、過去のウィンドウ配置のスタックをEmacsに管理させられる

深掘り

行ったり来たりする方法

  • 同時にいくつウィンドウが開いていても、ほとんどの場合必要なのは2つのウィンドウ間を切り替えることだけである
  • other-window-mruコマンドを使えば、ウィンドウの組の間を切り替えられる

other-windowの改善

  • ウィンドウが1つしかない場合にフレームを分割するよう、other-windowを作り替えることができる
  • 空間的な順序ではなく、最後に使った順でウィンドウを巡回するようにもできる(switchy-windowパッケージ)
  • 呼び出すたびにウィンドウ切り替え方向を反転させれば、2つのウィンドウ間を自然に交互移動できる

ace-windowディスパッチでウィンドウ魔法を使う

  • ace-windowは、文字列の一覧に対するcompleting-readと同じことをウィンドウに対して行う
  • aw-selectは、_あらゆる_ウィンドウに対して_あらゆる_操作を呼び出すための3段階のうち、最初の2段階(フィルタリングと選択)に最適である
  • ace-window-one-commandを使えば、ace-windowでウィンドウを選んだ後、そのウィンドウで_あらゆる_単純なコマンドを実行できる
  • ace-window-prefixを使うと、other-window-prefixに似ているが、次のコマンドのバッファを表示するウィンドウを明示的に選択できる

ウィンドウを切り替える必要はあるのか?

  • Avyを使ったウィンドウに縛られない移動は、一般的なアイデアの特殊な一例である
  • テキストコンテナとしてのウィンドウは不要な抽象化かもしれない
  • mark-ringglobal-mark-ringは移動した位置を追跡し、必要ならウィンドウ全体をまたいで移動できるようにしてくれる
  • point-to-registerjump-to-registerを使えば、あとで移動したい位置を手動で固定できる
  • ブックマークの作成と移動により、Emacsやユーザーが確認した意味のある位置へウィンドウ全体をまたいで移動する多くの選択肢が得られる

ウィンドウと相互作用しないためのウィンドウ処理

  • display-buffer-alistと自動ウィンドウ動作を使えば、モグラたたきのようなウィンドウ問題を解決できる
  • 日々Emacsで目にするあらゆる種類のバッファに対するルールを設定すれば、ウィンドウ管理の大半は解決する
  • display-buffer-alistの問題は動かないことではなく、_大量の_作業が必要なことにある
  • Shackleパッケージはdisplay-buffer-alistの癖を覆い隠し、ウィンドウルールを指定するための単純化されたelispインターフェースを提供する
  • Emacsディストリビューションは通常、こうした設定を指定するための簡単なインターフェースを提供している

Popper、Popwin、shell-pop、vterm-toggle

  • PopwinとPopperは、すべてのバッファが同じように作られているわけではないという観察に基づいている
  • これらのパッケージを使うと、補助ウィンドウを使うポップアップバッファを指定し、必要に応じてそのウィンドウを呼び出したり閉じたりできる

欠けている部分

window-tree

  • Emacsがウィンドウを表現する方法と、上で議論したアプローチでウィンドウを操作する方法の間には根本的な違いがある
  • フレーム内のウィンドウはツリーとして配置され、リーフノードが「実際の」ウィンドウで、残りは「内部」ウィンドウである
  • ウィンドウツリー操作のためのコマンドを追加すれば、多くの新しい可能性が開ける

タイリングウィンドウマネージャ統合

  • Emacsのウィンドウツリーモデルは、i3やbspwmのような手動タイリングウィンドウマネージャのモデルとほぼ同じである
  • タイリングウィンドウマネージャの中で別のタイリングウィンドウマネージャを使う理由は自然と疑問になる
  • Emacsからすべてのウィンドウマネージャとの統合に向けた、よりクリーンで統一的なインターフェースを提供できれば、ずっと簡単になるかもしれない

展望

  • ウィンドウの切り替え、移動、スキップ、作成、削除、操作の方法、コマンド呼び出し時にその場でウィンドウ表示を制御するさまざまな方法、ウィンドウ上で作業する方法、そしてウィンドウをまったく意識しない方法などがある
  • ウィンドウ管理は複雑というより、開かれている
  • Emacsは材料といくらかの指針を提供しており、その材料だけでも素の食事として使える
  • しかし少し調理すれば、私たちはおいしいものを作れる

GN⁺の意見

  • ウィンドウ管理はEmacsの最大の弱点の一つであり、ユーザーフレンドリーではない。特に初心者には混乱しやすい。
  • 提示された方法はEmacsのウィンドウ管理の問題を緩和できるが、根本的な解決策にはならない。より直感的で使いやすいウィンドウ管理システムが必要である。
  • Emacsのウィンドウ管理は非常に優

1件のコメント

 
GN⁺ 2024-05-13
Hacker Newsの意見

以下はHacker Newsのコメントを要約した内容:

  • Custom Elisp関数を使って、2つのウィンドウを70%対30%のサイズに調整する方法を紹介している。Lispコードも提供されている。
  • ace-windowace-window-display-modeframes-only-mode などのパッケージを活用してみることを提案している。
  • Emacsをシングルウィンドウモードで使い、やむを得ず複数ウィンドウが生成されても自動で閉じるようにするという意見もある。
  • windmove-mode を有効にし、(windmove-default-keybindings 'control) によって Ctrl+方向キーでウィンドウ移動を可能にするヒントが紹介されている。
  • zygospore パッケージにより、C-x 1 でウィンドウを閉じた後、再び C-x 1 を押すと以前のウィンドウレイアウトを復元できることを紹介している。
  • Acmeエディタへの言及を称賛するコメントもある。
  • hledger-balance-sheet 関数の実行時に、journalファイルを左に開いたまま、右側に結果を30%サイズで分割表示する方法について質問している。