Emacs特集の未収録その4 Emacsの操作をブラウザっぽくする。

WEB+DB PRESS Vol.58の未収録内容その4です。第4章の「履歴」で紹介しきれなかった拡張が2つあります。
1つは k1LoW さんの historyf.el、もうひとつは id:kitokitoki ([twitter:@mori_dev]) さんのバッファの削除と復元を気軽に行うでした。
今日はこの2つの紹介に加えて、Mac の Emacs のキーバインドを整えて、ブラウザっぽい挙動にしてみたいと思います。
なお、紹介しきれなかったこの2つは WEB+DB PRESS Vol.58:サポートページにあるサンプルコードの中で密かに紹介しています。また、これ以外にもおまけがあります。

Elscreen と Anything を加えて、ブラウザのタブ操作をEmacsで実現する。

最近のブラウザは新規タブを開くと、Opera であればスピードダイアル、Safari や Chrome のよくアクセスするページなど、移動しやすいページが開かれます。
Elscreen は Emacs にタブっぽいバーを表示してくれます。新規スクリーンを作成すると、標準では *scratch* バッファが表示されますが、毎回、*scratch* を開いても結局別のバッファを開きなおすだけなので、ブラウザのようによくアクセスするバッファ一覧を表示させると便利かもしれません。
ということを踏まえて、Mac の ⌘ キーを使ったブラウザの操作を参考に Elscreen のキーバインドを調節してみましょう。

(defun create-newscreen ()
  "`elscreen-create' and `anything-for-files'"
  (interactive)
	(elscreen-create)
	(anything-for-files))

(define-key global-map (kbd "s-t") 'create-newscreen)
(define-key global-map (kbd "s-w") 'elscreen-kill)
(define-key global-map (kbd "s-M-<right>") 'elscreen-next)
(define-key global-map (kbd "s-M-<left>") 'elscreen-previous)

create-newscreen という単純に新規スクリーンを作成し、anything-for-files を実行するだけのコマンドを作成します。それを ⌘T に割り当てると、まるでブラウザで新規タブを開いたときのように、タブ(スクリーン)を開いてそのまま別のバッファへ移動できます。とりあえず、何もしない場合は C-g でキャンセルします。
あとは、⌘W でスクリーンを閉じる、⌘⌥→ と ⌘⌥← でスクリーンを移動するというキーバインドも加えました。
操作がだいぶタブブラウザっぽくなってきました。

ブラウザの戻ると、閉じたタブを復元するを Emacs で行なう。

ブラウザでいうところの、⌘← と ⌘→ による戻る、あと、Opera の ⌘Z によるタブの復元を Emacs で行なってみましょう。

;;; historyf.elでブラウザの「戻る」ボタン的なバッファ移動を実現する
;; http://emacs.g.hatena.ne.jp/k1LoW/20100410/1270886156
;; (install-elisp "http://github.com/k1LoW/emacs-historyf/raw/master/historyf.el")
(when (require 'historyf nil t)
  (define-key global-map (kbd "s-<right>") 'historyf-forward)
  (define-key global-map (kbd "s-<left>") 'historyf-back))

;;; 最近閉じたバッファを復元
;; http://d.hatena.ne.jp/kitokitoki/20100608/p2
(defvar my-killed-file-name-list nil)
(defun my-push-killed-file-name-list ()
  (when (buffer-file-name)
    (push (expand-file-name (buffer-file-name)) my-killed-file-name-list)))
(defun my-pop-killed-file-name-list ()
  (interactive)
  (unless (null my-killed-file-name-list)
    (find-file (pop my-killed-file-name-list))))
(add-hook 'kill-buffer-hook 'my-push-killed-file-name-list)

(define-key global-map (kbd "s-z") 'my-pop-killed-file-name-list)

タブの復元については、スクリーンを復元するのではなく、最近閉じたバッファ履歴を遡って復元していきます。大変便利です。
Mac の Emacs は OS との親和性が非常に高く、⌘ によるキーバインドは Mac 標準のショートカット、Control は Emacs のキーバインドとそれぞれ切り分けて考えることができるので、環境変化に対する負荷も少なくとても快適です。
Control による Emacs キーバインドは、他のMacアプリでも使えるので、Mac は Emacs 入門OS として優秀ですね。