Emacs のバッファ名
Emacs のバッファ名は基本的にファイル名になります.しかし,バッファ名がファイル名のみだとわかりにくい場合もあります.そこでヒントとなるような文字列を追加してわかりやすくしてみます.
Dired バッファに [Dired] を追加する
Emacs 内蔵のファイラーである dired ですが,通常のバッファ名は単純なディレクトリ名になります.このままではわかりにくいので,バッファ名にヒントを追加します.
(defun dired-my-append-buffer-name-hint ()
"Append a auxiliary string to a name of dired buffer."
(when (eq major-mode 'dired-mode)
(let* ((dir (expand-file-name list-buffers-directory))
(drive (if (and (eq 'system-type 'windows-nt) ;; Windows の場合はドライブレターを追加
(string-match "^\\([a-zA-Z]:\\)/" dir))
(match-string 1 dir) "")))
(rename-buffer (concat (buffer-name) " [" drive "Dired]") t))))
(add-hook 'dired-mode-hook 'dired-my-append-buffer-name-hint)
このコードを init.el に追加すればバッファ名の末尾に " [Dired]" を追加します.Windows の場合(Cygwin 除く)はドライブレターも追加します.
Tramp バッファにユーザ名とホスト名を追加する
Emacs でリモートファイルを編集できる tramp なんですが,これまた基本的なファイル名しか表示されません.ローカルファイルを編集してるつもりが実はリモートファイルでした,なんてことが起きないようにバッファ名にユーザ名とホスト名を追加します.
(defun tramp-my-append-buffer-name-hint ()
"Append a hint (user, hostname) to a buffer name if visiting
file is a remote file (include directory)."
(let ((name (or list-buffers-directory (buffer-file-name))))
(when (and name (tramp-tramp-file-p name))
(let* ((tramp-vec (tramp-dissect-file-name name))
(method (tramp-file-name-method tramp-vec))
(host (tramp-file-name-real-host tramp-vec))
(user (or (tramp-file-name-real-user tramp-vec)
(nth 2 (assoc method tramp-default-user-alist))
tramp-default-user
user-real-login-name)))
(rename-buffer (concat (buffer-name) " <" user "@" host ">") t)))))
(add-to-list 'find-file-hook 'tramp-my-append-buffer-name-hint)
(add-to-list 'dired-mode-hook 'tramp-my-append-buffer-name-hint)
これで tramp で開いたファイル(ディレクトリ含む)のバッファ名の末尾に " <user@hostname>" が追加されます.
まとめ
バッファ名にヒントを追加してわかりやすくしてみようと試みました.anything (or helm) でバッファ切り替えをしていれば,ヒントをもとにバッファを絞り込めるので非常に便利です.
- (buffer-file-name) でバッファに結びついているファイル名を取得
- list-buffers-directory で Dired バッファに結びついているディレクトリ名を取得
- (buffer-name) で現在のバッファ名を取得
- (rename-buffer "string") でバッファ名の変更
ができるので,自分の好きなヒントを作ってみて find-file-hook や dired-mode-hook に引っ掛ければいいかと思います.VCS 下のファイルにブランチとリビジョンを追加するとか,プロジェクト下のファイルにプロジェクト名を追加など役に立ちそうな気がしています.