超シンプル目立たない複数ウィンドウ管理(ぞ式ElScreen)

  • 6
    いいね
  • 0
    コメント

こんにちは、.emacs Advent Calendar 2016です。みなさんEmacsでいっぱいファイルを開きますよね?

私もいっぱいファイルを開いたり、かちかち切替したりしたいです ヾ(〃><)ノ゙ しばらく前から雑に使ってて馴染んでる設定がありますので紹介します。

そもそもElScreenって何

るびきち師のelscreen.el : Emacsをタブエディタ+GNU Screen(Tmux)化してしまえ!ウィンドウ構成管理の重鎮をお読みください。

ついでにEmacs用語のの「ウィンドウ(window)」とか「フレーム(frame)」とかややこしいので、おなじくるびきち師のそろそろEmacsのウィンドウについて一言いっとくかを読まれると良いです。マルチウィンドウ管理やタブの実装はいくつかあるのですが、ここでは触れません。

私はElScreenの機能を、最低限は使ってるもののフル活用はしてません。

私とtmux

私は自己主張しないtmux設定(SSH向け)で書いたように、以下のようなポリシーで設定します。

  • ステータスラインごときに画面をもう一行占有されたくない
  • ウィンドウを操作するのはめんどくさい
    • 複数のウィンドウ/タブの移動・管理は煩雑である
    • たかだか「表」と「裏」をフリップできれば用は足りる

なぜタブを利用しないか

もしA, B, C, Dの4面があったとすると、それぞれの面でどんな操作してるか記憶しておく必要があります。また、タブの形式では「左右の並び」といふ位置関係が生じます。

タブやウィンドウを散らかすよりは基本的に2面だけを使って、どうしても足りないときに1面だけ追加して3面にするといった運用にします。はじめから2面しかなければ、位置関係の移動を考慮する必要がありません。

Emacsで、私はどうしたか

以上のような発想で私は3面以上のスクリーンを管理したくないので、ElScreenの機能を潰します

つまり、以下のように設定します。

  • タブ表示は不要なので消す
  • Emacs起動時に既に2面が存在する状態にする
  • ワンタッチでタブ切替できるようにする (C-<tab>)
  • (そのほかタブ関連の設定は無効化)

.emacsファイルの記述は以下のような感じになります。

~/.emacs.d/init.el
;; ElScreen
(require 'elscreen)
(setq elscreen-prefix-key (kbd "C-z"))      ;; これは任意
(setq elscreen-display-tab nil)             ;; タブを消す
(setq elscreen-tab-display-kill-screen nil) ;; タブ全消しをしない
(setq elscreen-tab-display-control nil))
(bind-key* "C-<tab>" 'elscreen-next)
(bind-key* "<C-iso-lefttab>" 'elscreen-previous)
(elscreen-start)  ;; ElScreen開始
(elscreen-create) ;; ElScreenのスクリーン作成

運用方法

わたしはこんな感じで使ってます。便宜上「表」「裏」と表現しますが、どっちが表に意味はないです。

  • (表左)実装コード (表右)参考コード/リファレンス (裏全面)テストコード
  • (表全面)原稿(Writeroom-mode) (裏左)参考実装コード (裏右)REPL(comint)等

要は、メインの作業とサブ作業と参考にしたいファイル、のようなものをかちかちスイッチしながら複数ファイルを横断できるのでべんりです。

ElScreenとは関係ないところ

あたらしいフレーム

ウィンドウじゃなくてフレームの話なんですが、私は基本的にEmacsは全画面表示にして使ってます。ところが、たまに小さいウィンドウ(Emacs用語でのフレーム)を作って、ほかのアプリのウィンドウと並べて作業をしたいことがあります。

そんなときのために私はM-Nmeke-frameコマンドに割り当ててます。ところがmacosでfullscreenで表示してるときにmake-frameすると、新しいフレームもfullscreenになります。そこで<f11>を押すとfullscreenが解除されてるのではありますが、それがちょっとめんどくさい… after-make-frame-functionsとかに登録すればmake-frame直後の動作を制御できるように見えるのですが、うまくいかない… ぐぬぬぬ……。