tabbar.el 2.0 の導入

Emacs Wikiversion 2.0 が上がっていることに気がついたので,導入してみました.

主な変更点

ver 1.3 からどこら辺が変わったのか.

  • タブ上でマウスホイールをスクロールさせるとタブ移動
  • 画像が使える(ver 1.3 でも使えたかも?)

初期設定

タブ上でマウスホイールを使わない

正直いらないです.

(tabbar-mwheel-mode -1)
グループを使わない(1.3 とやり方が違う)
(setq tabbar-buffer-groups-function nil)
左側のボタンを消す(これも 1.3 と違う)
(dolist (btn '(tabbar-buffer-home-button
               tabbar-scroll-left-button
               tabbar-scroll-right-button))
  (set btn (cons (cons "" nil)
                 (cons "" nil))))
ウィンドウからタブがはみ出たときの動作
  • タブをスクロールさせる(デフォルト)
(setq tabbar-auto-scroll-flag t)
  • タブを省略して表示
(setq tabbar-auto-scroll-flag nil)

こんな感じになります.以前似たようなことやったなあ.

  • スクロールも省略もさせない(そのままはみ出させたい場合)
(setq tabbar-auto-scroll-flag nil)
(defadvice tabbar-buffer-tab-label (around my-tabbar-ad-dont-shorten activate)
  (let ((tabbar-auto-scroll-flag t))
    ad-do-it))
タブに表示させるバッファ名

1.3 とやり方は変わっていませんでした.僕の場合はこんな感じ

(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)
タブ移動のキーバインド

僕は Mac のデフォルトと同じように command + shift + cursor にしてます.

(global-set-key (kbd "<S-s-right>") 'tabbar-forward-tab)
(global-set-key (kbd "<S-s-left>") 'tabbar-backward-tab)
フェイス

1.3 から変更されて,tabbar-hoge-face だったのが tabbar-hoge になっています.

タブの間

長さを指定するだけならこんな感じ

(setq tabbar-separator '(1.5))
タブ上でのマウスクリック

ホイールクリックで kill-buffer するように弄ってます.それだけ.

(defun my-tabbar-buffer-help-on-tab (tab)
  "Return the help string shown when mouse is onto TAB."
  (if tabbar--buffer-show-groups
      (let* ((tabset (tabbar-tab-tabset tab))
             (tab (tabbar-selected-tab tabset)))
        (format "mouse-1: switch to buffer %S in group [%s]"
                (buffer-name (tabbar-tab-value tab)) tabset))
    (format "\
mouse-1: switch to buffer %S\n\
mouse-2: kill this buffer\n\
mouse-3: delete other windows"
            (buffer-name (tabbar-tab-value tab)))))

(defun my-tabbar-buffer-select-tab (event tab)
  "On mouse EVENT, select TAB."
  (let ((mouse-button (event-basic-type event))
        (buffer (tabbar-tab-value tab)))
    (cond
     ((eq mouse-button 'mouse-2)
      (with-current-buffer buffer
        (kill-buffer)))
     ((eq mouse-button 'mouse-3)
      (delete-other-windows))
     (t
      (switch-to-buffer buffer)))
    ;; Don't show groups.
    (tabbar-buffer-show-groups nil)))

(setq tabbar-help-on-tab-function 'my-tabbar-buffer-help-on-tab)
(setq tabbar-select-tab-function 'my-tabbar-buffer-select-tab)
super + number でタブ指定

以前の物がそのまま使える

タブをカラフルにする

以前やった改造は 2.0 だとより泥臭いやり方になってしまうので,今回はなしで.

まとめ

画像とか使わないなら 1.3 で十分な気がする.なんか便利な使い方知っている人がいたら教えてください.