Split buffers en grupos
Es posible con tabbar. Puede agregar reglas para agrupar buffers en grupos. Aquí hay un fragmento 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"
))))
Reglas de ejemplo:
- Lista de nombres de búfer:
((member (buffer-name)
'("*scratch*" "*Messages*" "*Help*"))
"Common" ;; this is a group name
)
- Con respecto a los búferes comunes, prefiero poner en "Común" cada búfer cuyo nombre comienza con una estrella. Esto da un ejemplo de hacer un búfer para esta regla:
((string-equal "*" (substring (buffer-name) 0 1))
"Common"
)
- Aquí hay un ejemplo de agrupación de buffers por modo mayor:
((memq major-mode
'(org-mode text-mode rst-mode))
"Text"
)
- Aquí hay un ejemplo de agrupación de búferes según el modo del que derivan:
((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"
)
- Aquí hay un ejemplo de agrupación de pestañas por regexp:
((string-match "^__" (buffer-name))
"Templates"
)
- Agrupar 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))
Una vez que compuso las reglas, puede presionar + o - en la línea de pestañas de la barra de pestañas para alternar grupos, y también ◀ y ▶ para cambiar entre buffers. O simplemente une los siguientes defuns:
tabbar-forward
tabbar-backward
tabbar-forward-group
tabbar-backward-group
y moverse entre pestañas y grupos de pestañas con el teclado.
Personalmente, agrupo las pestañas para ver lo que está abierto, pero navegar con ellas ido-switch-buffer
.
Cambiar entre un conjunto de reglas
También se puede definir un conjunto diferente de reglas de agrupación de búfer y alternar entre ellas. Aquí hay un ejemplo de ciclo entre dos conjuntos de reglas de agrupación de búfer:
;; 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)
Esto alterna entre tabbar-buffer-groups-common
y la tabbar-buffer-groups
agrupación de tabulaciones defuns.
Ordenar los búferes de tabbar por nombre
Me resulta beneficioso ordenar los búferes de tabbar por nombre. Aquí se explica cómo obtenerlo:
(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))))))))))