windows.el 再び

windows.elよりもelscreen.elの方が使いやすい - gan2 の Ruby 勉強日記から
ずっと elscreen を愛用し続けてきたのだけど、
タブを使える elscreen よりも
ウィンドウの分割情報も保存してくれるという windows の方が
便利なんじゃないかと思えてきたのでちょっと乗り換えてみることにする。
毎回同じファイルを開いて同じように分割する、という作業が
いい加減面倒になってきたのがきっかけだ。

.emacs に書いてあるコード

;;; windows.el
;; 分割されたウィンドウを切り替えることができる。
;; さらに、分割形態を保存することもできる。
;;
;; キーバインド C-z にを変更。デフォルトは C-c C-w。
;; 変更しない場合は,以下の 3 行を削除する。
;; C-z n   前のウィンドウ
;; C-z p   後のウィンドウ
;; C-z !   現在のウィンドウを破棄
;; C-z C-m メニューの表示
;; C-z ;   ウィンドウの一覧を表示
(setq win:switch-prefix "\C-z")
(define-key global-map win:switch-prefix nil)
(define-key global-map "\C-z1" 'win-switch-to-window)
;; 1-9 ではなく a-z でウィンドウを管理する
(setq win:base-key ?`) ;; ` は「直前の状態」
(setq win:max-configs 27) ;; ` 〜 z は 27 文字
(setq win:quick-selection nil) ;; C-c 英字 に割り当てない
(require 'windows)
;; 新規にフレームを作らない
(setq win:use-frame nil)
(win:startup-with-window)
;; C-x C-c で終了するとそのときのウィンドウの状態を保存する
;; C-x C なら保存しない
(define-key ctl-x-map "\C-c" 'see-you-again)
(define-key ctl-x-map "C" 'save-buffers-kill-emacs)
;; *migemo* のようなバッファも保存
(setq revive:ignore-buffer-pattern "^ \\*")
;; キーバインドの追加
(add-hook 'win:add-hook
    '(lambda ()
       (define-key win: "\C-c\C-g" 'clgrep)
       ))
(define-key win:switch-map "\C-m" 'win-menu)
(define-key win:switch-map ";" 'win-switch-menu)


基本的な設定は分割情報を保存 -- windowsで紹介されているものと同じ。
違うのは、終了時のキーバインドを変えてたり
通常時の操作に使うキーバインドを追加してたりすること。

終了時のキーバインド

;; C-x C-c で終了するとそのときのウィンドウの状態を保存する
;; C-x C なら保存しない
(define-key ctl-x-map "\C-c" 'see-you-again)
(define-key ctl-x-map "C" 'save-buffers-kill-emacs)

普通は「C-x C」したときにウィンドウの状態を保存させるみたい。
でもこれだと保存させるのが少し特別な操作のように思える。
僕は保存することを特に意識せずに自動的にやってもらいたいので
「C-x C-c」したときに自動的に保存されるように変更した。
で、逆に保存したくないときは「C-x C」。

通常時の操作に使うキーバインドの追加

;; キーバインドの追加
(add-hook 'win:add-hook
    '(lambda ()
       (define-key win: "\C-c\C-g" 'clgrep)
       ))
(define-key win:switch-map "\C-m" 'win-menu)
(define-key win:switch-map ";" 'win-switch-menu)

clmemo を使っているときに「C-c C-g」で clgrep という機能が呼び出せるのだけど
これのバインドを取られないようにするのが最初の設定。
実はこの設定はけっこう前に書いていて
しかもなんかよく分からない書き方をしているので
どうしてこれで大丈夫なのか今一分からない*1のだけど
そういうように動作してるのでたぶんそうなのだろう。。


下の2つは、デフォルトのキーバインドだと
「C-z C-w」でメニューとか、「C-z =」でウィンドウの一覧を表示とかになっていて
これは分かりにくいしあまり押しやすくもないので、
それを「C-z C-m」と「C-z ;」に変更している。

できれば起動時に自動でウィンドウ情報を復元してほしい

保存は上にすでに書いたように「C-x C-c」で自動的に行えるようになったのだけど
復元は「C-z C-r r」をしなくちゃいけなくて
どうせだったらこれも自動でやりたいと思っている。
.emacs の一番下に

(resume-windows)

って書いておくと一応望んだ動作をしてくれるが
メッセージバッファによく分からないエラーが出るのでそれが気になる。


ドキュメントに自動で復元する方法の記述がないので
「C-z C-r r」とかで復元するしかないのかなぁ。自動化は難しいのだろうか。

*1:win: ってなんだ…