Dividir buffers em grupos
É possível com a barra de tabulação. Você pode adicionar regras para agrupar buffers em grupos. Aqui está um trecho básico:
(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"
))))
Regras de exemplo:
- Listar nomes de buffer:
((member (buffer-name)
'("*scratch*" "*Messages*" "*Help*"))
"Common" ;; this is a group name
)
- Em relação aos buffers comuns, prefiro colocar em "Common" cada buffer cujo nome começa com uma estrela. Isso fornece um exemplo de como fazer um buffer para esta regra:
((string-equal "*" (substring (buffer-name) 0 1))
"Common"
)
- Aqui está um exemplo de agrupamento de buffers por modo principal:
((memq major-mode
'(org-mode text-mode rst-mode))
"Text"
)
- Aqui está um exemplo de agrupamento de buffers com base no modo de origem:
((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"
)
- Aqui está um exemplo de agrupamento de guias por regexp:
((string-match "^__" (buffer-name))
"Templates"
)
- Agrupe buffers por modo principal:
(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))
Depois de compor as regras, você pode pressionar + ou - na linha de guias da barra de guias para alternar entre grupos, e também ◀ e ▶ para alternar entre buffers. Ou apenas vincule os seguintes antônimos:
tabbar-forward
tabbar-backward
tabbar-forward-group
tabbar-backward-group
e mova-se entre guias e grupos de guias com o teclado.
Pessoalmente, agrupo guias, para ver o que está aberto, mas as navego com elas ido-switch-buffer
.
Alternar entre o conjunto de regras
Também é possível definir um conjunto diferente de regras de agrupamento de buffer e alternar entre elas. Aqui está um exemplo de alternância entre dois conjuntos de regras de agrupamento de 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)
Isso alterna entre tabbar-buffer-groups-common
e tabbar-buffer-groups
desativa o agrupamento de guias.
Classificar buffers da barra de guias por nome
Acho útil classificar os buffers da barra de tabulação por nome. Veja como obtê-lo:
(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))))))))))