summaryrefslogtreecommitdiff
path: root/lisp/tab-line.el
diff options
context:
space:
mode:
authorJuri Linkov <juri@linkov.net>2019-11-07 00:59:28 +0200
committerJuri Linkov <juri@linkov.net>2019-11-07 00:59:28 +0200
commitf5f40af1daba7dd2b9a979cc6c414ee7b44a6d8c (patch)
tree30d016b795967b8e3149cd254cd768bff1b842df /lisp/tab-line.el
parentb5bcc6f9ea23118f7d181c2dcdf17eb03b200be8 (diff)
downloademacs-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.el84
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.