Dividi i buffer in gruppi
È possibile con la barra delle schede. È possibile aggiungere regole per raggruppare i buffer in gruppi. Ecco uno snippet di base:
(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"
))))
Regole di esempio:
- Elenca i nomi dei buffer:
((member (buffer-name)
'("*scratch*" "*Messages*" "*Help*"))
"Common" ;; this is a group name
)
- Per quanto riguarda i buffer comuni preferisco mettere in "Common" ogni buffer il cui nome inizia con una stella. Questo fornisce un esempio di creazione di un buffer per questa regola:
((string-equal "*" (substring (buffer-name) 0 1))
"Common"
)
- Ecco un esempio di raggruppamento di buffer per modalità principale:
((memq major-mode
'(org-mode text-mode rst-mode))
"Text"
)
- Ecco un esempio di raggruppamento dei buffer in base alla modalità da cui derivano:
((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"
)
- Ecco un esempio di raggruppamento di schede per regexp:
((string-match "^__" (buffer-name))
"Templates"
)
- Raggruppa i buffer in base alla modalità principale:
(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))
Dopo aver composto le regole, è possibile premere + o - nella scheda della barra delle schede per attivare / disattivare i gruppi, e anche ◀ e ▶ per passare da un buffer all'altro. O semplicemente associa i seguenti defuns:
tabbar-forward
tabbar-backward
tabbar-forward-group
tabbar-backward-group
e spostati tra le schede e i gruppi di schede con la tastiera.
Personalmente raggruppo le schede, in modo da vedere ciò che è aperto, ma navigo con ido-switch-buffer
.
Passa da un set di regole a un altro
Inoltre, è possibile definire un diverso insieme di regole di raggruppamento del buffer e passare da una all'altra. Ecco un esempio di ciclo tra due serie di regole di raggruppamento del 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)
In questo modo si alternano tabbar-buffer-groups-common
e si tabbar-buffer-groups
raggruppano i defun.
Ordina i buffer della barra delle schede per nome
Trovo utile ordinare i buffer della barra delle schede per nome. Ecco come ottenerlo:
(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))))))))))