Сплит буферы по группам
Это возможно с вкладкой. Вы можете добавить правила для группировки буферов в группах. Вот основной фрагмент:
(defun tabbar-buffer-groups ()
"Returns the list of group names the current buffer belongs to."
(list
(cond
;; ADD RULES TO SPLIT BUFFERS IN GROUPS HERE!
;; if buffer is not grouped by the rules you would add above
;; put it in the "General" group:
(t
"General"
))))
Пример правил:
- Список имен буферов:
((member (buffer-name)
'("*scratch*" "*Messages*" "*Help*"))
"Common" ;; this is a group name
)
- Что касается общих буферов, я предпочитаю ставить в «Common» каждый буфер, имя которого начинается со звезды. Это дает пример создания буфера для этого правила:
((string-equal "*" (substring (buffer-name) 0 1))
"Common"
)
- Вот пример группировки буферов по мажорному режиму:
((memq major-mode
'(org-mode text-mode rst-mode))
"Text"
)
- Вот пример группировки буферов в зависимости от режима, из которого они получены:
((or (get-buffer-process (current-buffer))
;; Check if the major mode derives from `comint-mode' or
;; `compilation-mode'.
(tabbar-buffer-mode-derived-p
major-mode '(comint-mode compilation-mode)))
"Process"
)
- Вот пример группировки вкладок по регулярному выражению:
((string-match "^__" (buffer-name))
"Templates"
)
- Групповые буферы по основным режимам:
(if (and (stringp mode-name)
;; Take care of preserving the match-data because this
;; function is called when updating the header line.
(save-match-data (string-match "[^ ]" mode-name)))
mode-name
(symbol-name major-mode))
После того, как вы составили правила, вы можете нажать + или - в строке вкладок панели вкладок для переключения групп, а также ◀ и ▶ для переключения между буферами. Или просто свяжите следующие defuns:
tabbar-forward
tabbar-backward
tabbar-forward-group
tabbar-backward-group
и перемещаться между вкладками и группами вкладок с помощью клавиатуры.
Лично я группирую вкладки, чтобы видеть, что открыто, но перемещаться по ним ido-switch-buffer
.
Переключение между набором правил
Также можно определить различный набор правил группировки буферов и цикл между ними. Вот пример цикла между двумя наборами правил группировки буферов:
;; tab-groups!
(setq tbbr-md "common")
(defun toggle-tabbar-mode ()
"Toggles tabbar modes - all buffers vs. defined in the `tabbar-buffer-groups'."
(interactive)
(if (string= tbbr-md "groups")
(progn ;; then
(setq tabbar-buffer-groups-function 'tabbar-buffer-groups-common)
(setq tbbr-md "common"))
(progn ;; else
(setq tabbar-buffer-groups-function 'tabbar-buffer-groups)
(setq tbbr-md "groups"))))
;; by default - all tabs:
(setq tabbar-buffer-groups-function 'tabbar-buffer-groups-common)
Это позволяет переключаться между tabbar-buffer-groups-common
и tabbar-buffer-groups
Группировка вкладок Определения функций.
Сортировка буферов вкладок по имени
Я считаю полезным сортировать буферы вкладок по имени. Вот как это сделать:
(defun tabbar-add-tab (tabset object &optional append_ignored)
"Add to TABSET a tab with value OBJECT if there isn't one there yet.
If the tab is added, it is added at the beginning of the tab list,
unless the optional argument APPEND is non-nil, in which case it is
added at the end."
(let ((tabs (tabbar-tabs tabset)))
(if (tabbar-get-tab object tabset)
tabs
(let ((tab (tabbar-make-tab object tabset)))
(tabbar-set-template tabset nil)
(set tabset (sort (cons tab tabs)
(lambda (a b) (string< (buffer-name (car a)) (buffer-name (car b))))))))))