From 8f08cb386efa989d75d10b95b26999b8ff38cb72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?El=C3=ADas=20Gabriel=20P=C3=A9rez?= Date: Fri, 1 Aug 2025 20:14:59 -0600 Subject: [PATCH] tab-line: Allow to hide excluded buffers in the tab line. (Bug#79159) * etc/NEWS: Announce changes. * lisp/tab-line.el (tab-line-tabs-window-buffers-filter-function): New user option. (tab-line-tabs-non-excluded): New function. (tab-line-tabs-window-buffers): Update. --- etc/NEWS | 5 +++++ lisp/tab-line.el | 32 +++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 79d124bd585..f8d4b8f2f67 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -436,6 +436,11 @@ a buffer. The value must be a condition which is passed to With this user option, if non-nil (the default), the tab close button will change its appearance if the tab buffer has been modified. +--- +*** New user option 'tab-line-tabs-window-buffers-filter-function'. +This user option controls which buffers should appear in the tab line. +By default, this is set to not filter the buffers. + ** Project --- diff --git a/lisp/tab-line.el b/lisp/tab-line.el index 2d8c75574bb..2952f3cc116 100644 --- a/lisp/tab-line.el +++ b/lisp/tab-line.el @@ -569,6 +569,30 @@ generate the group name." sorted-buffers))) (cons group-tab tabs)))) +(defcustom tab-line-tabs-window-buffers-filter-function + #'identity + "Filter which buffers should be displayed in the tab line." + :type '(choice function + (const :tag "No filter the buffers" identity) + (const :tag "Show non-excluded buffers only" tab-line-tabs-non-excluded)) + :group 'tab-line + :version "31.1") + +(defvar tab-line-exclude-buffers) +(defvar tab-line-exclude-modes) + +(defun tab-line-tabs-non-excluded (buffers) + "Filter BUFFERS and return non-excluded buffers list. +Intended to be used in `tab-line-tabs-window-buffers-filter-function'." + (seq-remove + (lambda (b) + (or (memq (buffer-local-value 'major-mode b) + tab-line-exclude-modes) + (buffer-match-p tab-line-exclude-buffers b) + (get (buffer-local-value 'major-mode b) 'tab-line-exclude) + (buffer-local-value 'tab-line-exclude b))) + buffers)) + (defun tab-line-tabs-window-buffers () "Return a list of tabs that should be displayed in the tab line. By default returns a list of window buffers, i.e. buffers previously @@ -585,9 +609,11 @@ variable `tab-line-tabs-function'." (prev-buffers (seq-filter #'buffer-live-p prev-buffers)) ;; Remove next-buffers from prev-buffers (prev-buffers (seq-difference prev-buffers next-buffers))) - (append (reverse prev-buffers) - (list buffer) - next-buffers))) + (funcall + tab-line-tabs-window-buffers-filter-function + (append (reverse prev-buffers) + (list buffer) + next-buffers)))) (defun tab-line-tabs-fixed-window-buffers () "Like `tab-line-tabs-window-buffers' but keep stable sorting order.