ElScreen のスクリーン番号を 1 から始める

ElScreen のスクリーン番号は 0 から始まるのですが、タブの並びとキーボードの並びと合わないことが気になる人は結構いるようです。かく言う私もその一人で、下記プログラムで無理矢理 1 から始まるようにしています。

;;;
;;; elscreen のタブの並びと数字キーの並びを合わせる
;;;

;; 既存スクリーンのリストを要求された際、0 番が存在しているかのように偽装する
(defadvice elscreen-get-screen-list (after my-ad-elscreen-get-screenlist disable)
  (add-to-list 'ad-return-value 0))

;; スクリーン生成時に 0 番が作られないようにする
(defadvice elscreen-create (around my-ad-elscreen-create activate)
  (interactive)
  ;; 0 番が存在しているかのように偽装
  (ad-enable-advice 'elscreen-get-screen-list 'after 'my-ad-elscreen-get-screenlist)
  (ad-activate 'elscreen-get-screen-list)
  ;; 新規スクリーン生成
  ad-do-it
  ;; 偽装解除
  (ad-disable-advice 'elscreen-get-screen-list 'after 'my-ad-elscreen-get-screenlist)
  (ad-activate 'elscreen-get-screen-list))

;; スクリーン 1 番を作成し 0 番を削除 (起動時、フレーム生成時用)
(defun my-elscreen-kill-0 ()
  (when (and (elscreen-one-screen-p)
             (elscreen-screen-live-p 0))
    (elscreen-create)
    (elscreen-kill 0)))

;; フレーム生成時のスクリーン番号が 1 番になるように
(defadvice elscreen-make-frame-confs (after my-ad-elscreen-make-frame-confs activate)
  (let ((selected-frame (selected-frame)))
    (select-frame frame)
    (my-elscreen-kill-0)
    (select-frame selected-frame)))

;; 起動直後のスクリーン番号が 1 番になるように
(add-hook 'after-init-hook 'my-elscreen-kill-0)

動作確認環境は以下の通りです。

実装について

正直、スクリーン番号を 1 から始めるだけなら、elscreen.el を直接改造してしまった方が簡単です。ElScreen は十分に枯れているようですが、仮に本家が更新されたとしても、.emacs.d をローカルでバージョン管理していれば直接改造して問題になることもないと思います。にも関わらず、上記のようにアドバイスで無理矢理なんとかしたのは、単に気分の問題です。

スクリーンを操作するキーバインディング

普段仕事では Windows がほとんどなので、スクリーン操作を Windows 風にしています。

;; C-tab/C-S-tab でスクリーンの切り替え、C-F4 でスクリーンの削除
(global-set-key [C-tab] 'elscreen-next)
(global-set-key [C-S-tab] 'elscreen-previous)
(global-set-key [C-f4] 'elscreen-kill)

;; M-0 〜 M-9 で指定番号のスクリーンに切り替え
(let ((i 0))
  (while (<= i 9)
    (define-key esc-map (number-to-string i)
                        `(lambda () (interactive) (elscreen-goto ,i)))
    (setq i (1+ i))))

"M-数字" は Magit と重なっているので、Magit の方を封じないと不便だなぁ、と思っている今日この頃です。Linux で仮想コンソールを切り替えることに慣れている人は、"M-数字" より "M-ファンクションキー" の方がいいかもしれません。