emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master d07ed6d: * lisp/tab-bar.el (tab-bar-close-group-tabs): New comman


From: Juri Linkov
Subject: master d07ed6d: * lisp/tab-bar.el (tab-bar-close-group-tabs): New command.
Date: Wed, 10 Mar 2021 13:09:41 -0500 (EST)

branch: master
commit d07ed6dfee9338b0d715f8181703252c99e5133a
Author: Juri Linkov <juri@linkov.net>
Commit: Juri Linkov <juri@linkov.net>

    * lisp/tab-bar.el (tab-bar-close-group-tabs): New command.
    
    (tab-close-group): New alias.
    (tab-bar-close-other-tabs): Rewrite to fix old bug where regardless of
    the returned value from tab-bar-tab-prevent-close-functions,
    only one tab was retained.
---
 etc/NEWS        |  1 +
 lisp/tab-bar.el | 48 +++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index b5ee788..b48f7c3 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -542,6 +542,7 @@ It also supports a negative argument.
 
 ---
 *** 'C-x t G' assigns a group name to the tab.
+'tab-close-group' can close all tabs that belong to the selected group.
 
 ---
 *** New user option 'tab-bar-tab-name-format-function'.
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index bc89a11..66f8cca 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -1148,22 +1148,25 @@ for the last tab on a frame is determined by
   "Close all tabs on the selected frame, except the selected one."
   (interactive)
   (let* ((tabs (funcall tab-bar-tabs-function))
-         (current-index (tab-bar--current-tab-index tabs)))
-    (when current-index
-      (dotimes (index (length tabs))
-        (unless (or (eq index current-index)
+         (current-index (tab-bar--current-tab-index tabs))
+         (current-tab (and current-index (nth current-index tabs)))
+         (index 0))
+    (when current-tab
+      (dolist (tab tabs)
+        (unless (or (eq tab current-tab)
                     (run-hook-with-args-until-success
-                     'tab-bar-tab-prevent-close-functions
-                     (nth index tabs)
+                     'tab-bar-tab-prevent-close-functions tab
                      ;; `last-tab-p' logically can't ever be true
                      ;; if we make it this far
                      nil))
           (push `((frame . ,(selected-frame))
                   (index . ,index)
-                  (tab . ,(nth index tabs)))
+                  (tab . ,tab))
                 tab-bar-closed-tabs)
-          (run-hook-with-args 'tab-bar-tab-pre-close-functions (nth index 
tabs) nil)))
-      (set-frame-parameter nil 'tabs (list (nth current-index tabs)))
+          (run-hook-with-args 'tab-bar-tab-pre-close-functions tab nil)
+          (setq tabs (delq tab tabs)))
+        (setq index (1+ index)))
+      (set-frame-parameter nil 'tabs tabs)
 
       ;; Recalculate tab-bar-lines and update frames
       (tab-bar--update-tab-bar-lines)
@@ -1277,6 +1280,32 @@ If GROUP-NAME is the empty string, then remove the tab 
from any group."
     (unless tab-bar-mode
       (message "Set tab group to '%s'" group-new-name))))
 
+(defun tab-bar-close-group-tabs (group-name)
+  "Close all tabs that belong to GROUP-NAME on the selected frame."
+  (interactive
+   (let* ((tabs (funcall tab-bar-tabs-function))
+          (tab-index (1+ (tab-bar--current-tab-index tabs)))
+          (group-name (alist-get 'group (nth (1- tab-index) tabs))))
+     (list (completing-read
+            "Close all tabs with group name: "
+            (delete-dups (delq nil (cons group-name
+                                         (mapcar (lambda (tab)
+                                                   (alist-get 'group tab))
+                                                 (funcall 
tab-bar-tabs-function)))))))))
+  (let* ((close-group (and (> (length group-name) 0) group-name))
+         (tab-bar-tab-prevent-close-functions
+          (cons (lambda (tab _last-tab-p)
+                  (not (equal (alist-get 'group tab) close-group)))
+                tab-bar-tab-prevent-close-functions)))
+    (tab-bar-close-other-tabs)
+
+    (let* ((tabs (funcall tab-bar-tabs-function))
+           (current-index (tab-bar--current-tab-index tabs))
+           (current-tab (and current-index (nth current-index tabs))))
+      (when (and current-tab (equal (alist-get 'group current-tab)
+                                    close-group))
+        (tab-bar-close-tab)))))
+
 
 ;;; Tab history mode
 
@@ -1807,6 +1836,7 @@ When `switch-to-buffer-obey-display-actions' is non-nil,
 (defalias 'tab-duplicate   'tab-bar-duplicate-tab)
 (defalias 'tab-close       'tab-bar-close-tab)
 (defalias 'tab-close-other 'tab-bar-close-other-tabs)
+(defalias 'tab-close-group 'tab-bar-close-group-tabs)
 (defalias 'tab-undo        'tab-bar-undo-close-tab)
 (defalias 'tab-select      'tab-bar-select-tab)
 (defalias 'tab-switch      'tab-bar-switch-to-tab)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]