三 月
21
水曜日
2018

Spacemacsでtabbar

Vimではtablineを常用しているのでSpacemacsでも同じようにバッファをタブ化して表示させたい。
ということで tabbar を試してみる。


Spacemacs用のtabbar layerとして evacchi/tabbar-layer を使用する。

git clone https://github.com/evacchi/tabbar-layer ~/.emacs.d/private/tabbar

Spacemacsを起動。
SPC f e d でドットファイルを編集。
dotspacemacs/layers関数内dotspacemacs-configuration-layersリストにtabbarを追加。

dotspacemacs/user-init に以下を追加。

;;--------------------------------------------------------
;; tabbar
;;--------------------------------------------------------
;; 画像をつかわない
(setq tabbar-use-images nil) 
;; 左に表示されるボタンを無効化
(dolist (btn '(tabbar-buffer-home-button
               tabbar-scroll-left-button
               tabbar-scroll-right-button))
  (set btn (cons (cons "" nil)
                 (cons "" nil))))

dotspacemacs/user-config ではなく、dotspacemacs/user-initに定義しているのは、dotspacemacs/layers が読み込まれる前にしておかないと設定が反映されないため。
(読み込み順序は dotspacemacs/user-init -> dotspacemacs/layers -> dotspacemacs/user-config)

dotspacemacs/user-config に以下を追加。

;;--------------------------------------------------------
;; tabbar
;;--------------------------------------------------------
;; グループ化しない
(setq tabbar-buffer-groups-function nil)
;; CTRL-Nで次のタブ
(define-key evil-normal-state-map (kbd "C-n") 'tabbar-forward-tab)
;; CTRL-Pで前のタブ
(define-key evil-normal-state-map (kbd "C-p") 'tabbar-backward-tab)
;; タブに表示するバッファをフィルタするカスタム関数
(defun my-tabbar-buffer-list ()
  (delq nil
        (mapcar #'(lambda (b)
                    (cond
                     ((eq (current-buffer) b) b)
                     ((buffer-file-name b) b)
                     ((char-equal ?\  (aref (buffer-name b) 0)) nil)
                     ;;((equal "*scratch*" (buffer-name b)) b)
                     ((char-equal ?* (aref (buffer-name b) 0)) nil)
                     ((buffer-live-p b) b)))
                (buffer-list))))
;; カスタム関数を登録
(setq tabbar-buffer-list-function 'my-tabbar-buffer-list)

関数 my-tabbar-buffer-list を定義してタブに表示するバッファを選別している。
上記では カレントバッファ以外の * から始まるバッファ(*spacemacs**Messages* 等々)は除外している。

以上で設定は終わりだが、一部塩梅が悪いところがある。
Spacemacsの初回起動後はmy-tabbar-buffer-list関数が有効にならずバッファのフィルタが行われない状態 になってしまう。
初回起動時の tabbar-buffer-list-function の値を確認すると persp-buffer-list が設定されている。
どうも persp-mode や処理順序などに関係がありそうだ。

SPC f e R で設定をリロードすると関数 my-tabbar-buffer-list が有効になりタブに表示されるバッファが選別されるようになるので、一旦これで逃げることにした。