原来的 tabbar 强行对你的 buffer 进行分组,但是如果你想在 你编辑的buffer间切换而不论它们是什么组,那么似乎没有一个好办 法。但是 tabbar 本来提供了一个机制,让你可以自己确定 tab 属 于哪组,只要修改 tabbar-buffer-groups-function 就行了。
这样,我可以把每个 buffer 同时加入它所在的 major mode 的组和 一个叫做 "default" 的组,这样我在 default 组里就可以方便的浏 览到所有的 buffer 了。而切换到其它组就可以分组浏览。你还可以 自行把某些 buffer 分到一组,比如我可以把 scheme-mode 的 buffer 和 inferer-scheme-mode 的 buffer 分到同一个组。
(setq tabbar-buffer-groups-function 'tabbar-buffer-ignore-groups)
(defun tabbar-buffer-ignore-groups (buffer)
"Return the list of group names BUFFER belongs to.
Return only one group for each buffer."
(with-current-buffer (get-buffer buffer)
(cond
((or (get-buffer-process (current-buffer))
(memq major-mode
'(comint-mode compilation-mode)))
'("Process")
)
((member (buffer-name)
'("*scratch*" "*Messages*"))
'("Common")
)
((eq major-mode 'dired-mode)
'("Dired")
)
((memq major-mode
'(help-mode apropos-mode Info-mode Man-mode))
'("Help")
)
((memq major-mode
'(rmail-mode
rmail-edit-mode vm-summary-mode vm-mode mail-mode
mh-letter-mode mh-show-mode mh-folder-mode
gnus-summary-mode message-mode gnus-group-mode
gnus-article-mode score-mode gnus-browse-killed-mode))
'("Mail")
)
(t
(list
"default" ;; no-grouping
(if (and (stringp mode-name) (string-match "[^ ]" mode-name))
mode-name
(symbol-name major-mode)))
)
)))