tabbar 的修改

改变 tabbar-buffer-groups-function

原来的 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)))
      )
     
     )))