diff options
author | Juri Linkov <juri@linkov.net> | 2019-11-07 00:59:28 +0200 |
---|---|---|
committer | Juri Linkov <juri@linkov.net> | 2019-11-07 00:59:28 +0200 |
commit | f5f40af1daba7dd2b9a979cc6c414ee7b44a6d8c (patch) | |
tree | 30d016b795967b8e3149cd254cd768bff1b842df /lisp/tab-line.el | |
parent | b5bcc6f9ea23118f7d181c2dcdf17eb03b200be8 (diff) | |
download | emacs-f5f40af1daba7dd2b9a979cc6c414ee7b44a6d8c.tar.gz emacs-f5f40af1daba7dd2b9a979cc6c414ee7b44a6d8c.tar.bz2 emacs-f5f40af1daba7dd2b9a979cc6c414ee7b44a6d8c.zip |
* lisp/tab-line.el: More configurability for tab buffer groups.
* lisp/tab-line.el (tab-line-tabs-buffer-group-function)
(tab-line-tabs-buffer-group-sort-function)
(tab-line-tabs-buffer-groups-sort-function): New defvars.
(tab-line-tabs-buffer-group-name): Rename from
tab-line-tabs-buffer-groups--name and use tab-line-tabs-buffer-group-function.
(tab-line-tabs-buffer-groups): Use tab-line-tabs-buffer-groups-sort-function
and tab-line-tabs-buffer-group-sort-function.
(tab-line-new-tab): Let bind tab-line-tabs-buffer-groups to
mouse-buffer-menu-mode-groups.
Diffstat (limited to 'lisp/tab-line.el')
-rw-r--r-- | lisp/tab-line.el | 84 |
1 files changed, 51 insertions, 33 deletions
diff --git a/lisp/tab-line.el b/lisp/tab-line.el index 95f26e20ac8..bf090374fad 100644 --- a/lisp/tab-line.el +++ b/lisp/tab-line.el @@ -289,33 +289,44 @@ with the same major mode as the current buffer." (derived-mode-p mode))) (buffer-list))))) +(defvar tab-line-tabs-buffer-group-function nil + "Function to put a buffer to the group. +Takes a buffer as arg and should return a group name as string. +When the return value is nil, filter out the buffer.") + +(defvar tab-line-tabs-buffer-group-sort-function nil + "Function to sort buffers in group.") + +(defvar tab-line-tabs-buffer-groups-sort-function #'string< + "Function to sort group names.") + (defvar tab-line-tabs-buffer-groups mouse-buffer-menu-mode-groups "How to group various major modes together in the tab line. Each element has the form (REGEXP . GROUPNAME). If the major mode's name string matches REGEXP, use GROUPNAME instead.") -(defun tab-line-tabs-buffer-groups--name (&optional buffer) - (let* ((buffer (or buffer (current-buffer))) - (mode (with-current-buffer buffer - (format-mode-line mode-name)))) - (or (cdr (seq-find (lambda (group) - (string-match-p (car group) mode)) - tab-line-tabs-buffer-groups)) - mode))) +(defun tab-line-tabs-buffer-group-name (&optional buffer) + (if (functionp tab-line-tabs-buffer-group-function) + (funcall tab-line-tabs-buffer-group-function buffer) + (unless (= (elt (buffer-name buffer) 0) ?\s) + (let ((mode (if buffer (with-current-buffer buffer + (format-mode-line mode-name)) + (format-mode-line mode-name)))) + (or (cdr (seq-find (lambda (group) + (string-match-p (car group) mode)) + tab-line-tabs-buffer-groups)) + mode))))) (defun tab-line-tabs-buffer-groups () (if (window-parameter nil 'tab-line-groups) - (let* ((buffers (seq-filter (lambda (b) - (not (= (elt (buffer-name b) 0) ?\s))) - (buffer-list))) + (let* ((buffers (buffer-list)) (groups - (seq-sort #'string< - (seq-map #'car - (seq-group-by - (lambda (buffer) - (tab-line-tabs-buffer-groups--name - buffer)) - buffers)))) + (seq-sort tab-line-tabs-buffer-groups-sort-function + (delq nil (mapcar #'car (seq-group-by + (lambda (buffer) + (tab-line-tabs-buffer-group-name + buffer)) + buffers))))) (selected-group (window-parameter nil 'tab-line-group)) (tabs (mapcar (lambda (group) @@ -324,12 +335,13 @@ If the major mode's name string matches REGEXP, use GROUPNAME instead.") (selected . ,(equal group selected-group)) (select . ,(lambda () (set-window-parameter nil 'tab-line-groups nil) - (set-window-parameter nil 'tab-line-group group))))) + (set-window-parameter nil 'tab-line-group group) + (set-window-parameter nil 'tab-line-hscroll nil))))) groups))) tabs) (let* ((window-parameter (window-parameter nil 'tab-line-group)) - (group-name (tab-line-tabs-buffer-groups--name)) + (group-name (tab-line-tabs-buffer-group-name)) (group (prog1 (or window-parameter group-name) (when (equal window-parameter group-name) (set-window-parameter nil 'tab-line-group nil)))) @@ -338,21 +350,26 @@ If the major mode's name string matches REGEXP, use GROUPNAME instead.") ;; Just to highlight the current group name (selected . t) (select . ,(lambda () - (set-window-parameter nil 'tab-line-groups t) - (set-window-parameter nil 'tab-line-group group))))) + (set-window-parameter nil 'tab-line-groups t) + (set-window-parameter nil 'tab-line-group group) + (set-window-parameter nil 'tab-line-hscroll nil))))) (buffers - (seq-sort-by #'buffer-name #'string< - (seq-filter (lambda (b) - (and (not (= (elt (buffer-name b) 0) ?\s)) - (equal (tab-line-tabs-buffer-groups--name b) - group))) - (buffer-list)))) + (seq-filter (lambda (b) + (equal (tab-line-tabs-buffer-group-name b) + group)) + (seq-uniq (append (list (current-buffer)) + (reverse (mapcar #'car (window-prev-buffers))) + (buffer-list))))) + (sorted-buffers (if (functionp tab-line-tabs-buffer-group-sort-function) + (seq-sort tab-line-tabs-buffer-group-sort-function + buffers) + buffers)) (tabs (mapcar (lambda (buffer) `(tab (name . ,(funcall tab-line-tab-name-function buffer)) (selected . ,(eq buffer (current-buffer))) (buffer . ,buffer))) - buffers))) + sorted-buffers))) (cons group-tab tabs)))) (defun tab-line-tabs-window-buffers () @@ -470,10 +487,11 @@ corresponding to the switched buffer." (interactive (list last-nonmenu-event)) (if (functionp tab-line-new-tab-choice) (funcall tab-line-new-tab-choice) - (if (and (listp mouse-event) window-system) ; (display-popup-menus-p) - (mouse-buffer-menu mouse-event) ; like (buffer-menu-open) - ;; tty menu doesn't support mouse clicks, so use tmm - (tmm-prompt (mouse-buffer-menu-keymap))))) + (let ((tab-line-tabs-buffer-groups mouse-buffer-menu-mode-groups)) + (if (and (listp mouse-event) window-system) ; (display-popup-menus-p) + (mouse-buffer-menu mouse-event) ; like (buffer-menu-open) + ;; tty menu doesn't support mouse clicks, so use tmm + (tmm-prompt (mouse-buffer-menu-keymap)))))) (defun tab-line-select-tab (&optional e) "Switch to the selected tab. |