• このエントリーをはてなブックマークに追加


ss-1393668923

はじめに

ふと,Emacs のビューの左側に,ファイルツリー的なものが欲しくなったのでググってみたところ,「emacs-nav」なるものが(かなり以前から)あることを知ったので,ちょっと入れてみました.

emacs-nav が使えるようになった後,ElScreen との表示的相性がよろしくない感じがしたので,いつかどこかで見かけたような気がする「tabbar」なるキーワードでググり,そのまんまである「tabbar」が見つかったので,ElScreen から乗り換えてみました.

emacs-nav

リポジトリ等

書いた設定

https://github.com/ancane/emacs-nav の README をベースに.

また,nav 領域の幅をデフォルトより少なめに.

;;
;; emacs-nav
;;
(require 'nav)
(nav-disable-overeager-window-splitting)
(global-set-key (kbd "<f8>") 'nav-toggle)
(global-set-key [(C x) (C j)] 'nav-toggle)  ; override of 'dired-jump
(custom-set-variables
 '(nav-width 12))
 
(defun nav-mode-hl-hook ()
  (local-set-key (kbd "<right>") 'nav-open-file-under-cursor)
  (local-set-key (kbd "<left>")  'nav-go-up-one-dir)
  )
 
(add-hook 'nav-mode-hook 'nav-mode-hl-hook)
(add-hook 'emacs-startup-hook
          (lambda ()
            (nav-toggle-hidden-files)
            ))

雑感

q で終了,u で「上階層」へ,p で「1段階戻る (pop)」あたりは便利な感じです.

nav なバッファが存在している状態で「その表示対象であるディレクトリ」でないディレクトリ下のファイル編集時に toggle-nav しても,表示対象ディレクトリが切り替わらないのがちょっと不満でしょうか.(もしかしたら後述の問題で処理が中断しているのかな?)

あと,nav なバッファが存在している状態で nav-toggle すると,次のようなエラー(警告?)が:

Symbol's function definition is void: pcase

今使っているバージョンは GNU Emacs 23.4.1 (x86_64-apple-darwin11.4.2, NS apple-appkit-1138.47),これによるものかなぁ.

tabbar

リポジトリ等

書いた設定

次を参考に:

現在,Solarized なカラースキーム を使っているので,タブの配色もそんな感じに.

;;
;; tabber-mode
;;
(require 'tabbar)
(tabbar-mode 1)
;;
;; ref: http://d.hatena.ne.jp/plasticster/20110825/1314271209
;; タブ上でマウスホイール操作無効
(tabbar-mwheel-mode -1)
 
;; グループ化しない
(setq tabbar-buffer-groups-function nil)
 
;; 左に表示されるボタンを無効化
(dolist (btn '(tabbar-buffer-home-button
               tabbar-scroll-left-button
               tabbar-scroll-right-button))
  (set btn (cons (cons "" nil)
                 (cons "" nil))))
 
;; タブに表示させるバッファの設定
(defvar my-tabbar-displayed-buffers
  '("*scratch*" "*Messages*" "*Backtrace*" "*Colors*" "*Faces*" "*vc-")
  "*Regexps matches buffer names always included tabs.")
 
(defun my-tabbar-buffer-list ()
  "Return the list of buffers to show in tabs.
Exclude buffers whose name starts with a space or an asterisk.
The current buffer and buffers matches `my-tabbar-displayed-buffers'
are always included."
  (let* ((hides (list ?\  ?\*))
         (re (regexp-opt my-tabbar-displayed-buffers))
         (cur-buf (current-buffer))
         (tabs (delq nil
                     (mapcar (lambda (buf)
                               (let ((name (buffer-name buf)))
                                 (when (or (string-match re name)
                                           (not (memq (aref name 0) hides)))
                                   buf)))
                             (buffer-list)))))
    ;; Always include the current buffer.
    (if (memq cur-buf tabs)
        tabs
      (cons cur-buf tabs))))
 
(setq tabbar-buffer-list-function 'my-tabbar-buffer-list)
 
;; appearances
(setq tabbar-separator '(1.0)) ;; タブセパレータの長さ
(set-face-attribute 'tabbar-default nil
                    :family "Ricty"
                    :foreground "#c4c1b0"
                    :background "#002c37"
                    :height 1.0)
(set-face-attribute 'tabbar-unselected nil
                    :foreground "#002c37"
                    :background "#c4c1b0"
                    :box nil)
(set-face-attribute 'tabbar-selected nil
                    :foreground "#e4007e"
                    :background "#ffffff"
                    :box nil)
(set-face-attribute 'tabbar-button nil
                    :box nil)
(set-face-attribute 'tabbar-separator nil
                    :foreground "#002c37"
                    :background "#002c37"
                    :height 1.0)
 
;; key bindings
(global-set-key [(C-tab)]   'tabbar-forward-tab)
(global-set-key [(C-S-tab)] 'tabbar-backward-tab)
(global-set-key "\M-}"      'tabbar-forward-tab)
(global-set-key "\M-{"      'tabbar-backward-tab)

雑感

あくまで,「バッファリストを俯瞰できるだけ」という感じを受けました.シンプル!

ElScreen では,「タブペイン」ごとにマルチバッファが独立(?)していたり,1つのファイル(バッファ)を複数のタブで出せたり(もちろん内部は共通),そんなところを多用していたので,そういった機能を(たぶん)持っていない tabbar に,少々戸惑いはありましょうか.

おわりに

以上,Emacs に emacs-nav と tabbar を入れてみたお話でした.

1日ほどざっと触ってみて,先に書いたような不満がいくらかありますが,まずはしばらくの間,そんな環境でコードを書くなどしてみることにします.