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
が有効になりタブに表示されるバッファが選別されるようになるので、一旦これで逃げることにした。