]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/tab-bar.el (tab-bar-switch-to-recent-tab): New command.
authorJuri Linkov <juri@linkov.net>
Sat, 26 Oct 2019 22:16:10 +0000 (01:16 +0300)
committerJuri Linkov <juri@linkov.net>
Sat, 26 Oct 2019 22:16:10 +0000 (01:16 +0300)
(tab-recent): Alias to tab-bar-switch-to-recent-tab.
(tab-bar--tab-index-recent): New internal function.
(tab-bar-close-tab-select): Add new default option 'recent'.
(tab-bar-close-tab): Handle it.

* lisp/emacs-lisp/seq.el (seq-sort-by, seq-remove): Add autoload.

lisp/emacs-lisp/seq.el
lisp/tab-bar.el

index 8d4093004a7699a026cabb84ef7d76dc83534bd8..918b0dcd390dd792fb6cb678e8e53d0e75d0fa90 100644 (file)
@@ -237,6 +237,7 @@ The result is a sequence of the same type as SEQUENCE."
 (cl-defmethod seq-sort (pred (list list))
   (sort (seq-copy list) pred))
 
+;;;###autoload
 (defun seq-sort-by (function pred sequence)
   "Sort SEQUENCE using PRED as a comparison function.
 Elements of SEQUENCE are transformed by FUNCTION before being
@@ -295,6 +296,7 @@ list."
                                exclude))
                            sequence))))
 
+;;;###autoload
 (cl-defgeneric seq-remove (pred sequence)
   "Return a list of all the elements for which (PRED element) is nil in SEQUENCE."
   (seq-filter (lambda (elt) (not (funcall pred elt)))
index f7b0f2611398ce1d5febde7e56119155bbcf14b3..2b71bf8b2c52ff1654cc4082eb988d24c4c8adfc 100644 (file)
@@ -458,6 +458,16 @@ Return its existing value or a new value."
   (seq-position (or tabs (funcall tab-bar-tabs-function))
                 name (lambda (a b) (equal (cdr (assq 'name a)) b))))
 
+(defun tab-bar--tab-index-recent (nth &optional tabs)
+  (let* ((tabs (or tabs (funcall tab-bar-tabs-function)))
+         (sorted-tabs
+          (seq-sort-by (lambda (tab) (cdr (assq 'time tab))) #'>
+                       (seq-remove (lambda (tab)
+                                     (eq (car tab) 'current-tab))
+                                   tabs)))
+         (tab (nth (1- nth) sorted-tabs)))
+    (tab-bar--tab-index tab tabs)))
+
 \f
 (defun tab-bar-select-tab (&optional arg)
   "Switch to the tab by its absolute position ARG in the tab bar.
@@ -514,6 +524,16 @@ to the numeric argument.  ARG counts from 1."
     (setq arg 1))
   (tab-bar-switch-to-next-tab (- arg)))
 
+(defun tab-bar-switch-to-recent-tab (&optional arg)
+  "Switch to ARGth most recently visited tab."
+  (interactive "p")
+  (unless (integerp arg)
+    (setq arg 1))
+  (let ((tab-index (tab-bar--tab-index-recent arg)))
+    (if tab-index
+        (tab-bar-select-tab (1+ tab-index))
+      (message "No more recent tabs"))))
+
 (defun tab-bar-switch-to-tab (name)
   "Switch to the tab by NAME."
   (interactive (list (completing-read "Switch to tab by name: "
@@ -626,12 +646,14 @@ If ARG is zero, create a new tab in place of the current tab."
 (defvar tab-bar-closed-tabs nil
   "A list of closed tabs to be able to undo their closing.")
 
-(defcustom tab-bar-close-tab-select 'right
+(defcustom tab-bar-close-tab-select 'recent
   "Defines what tab to select after closing the specified tab.
 If `left', select the adjacent left tab.
-If `right', select the adjacent right tab."
+If `right', select the adjacent right tab.
+If `recent', select the most recently visited tab."
   :type '(choice (const :tag "Select left tab" left)
-                 (const :tag "Select right tab" right))
+                 (const :tag "Select right tab" right)
+                 (const :tag "Select recent tab" recent))
   :group 'tab-bar
   :version "27.1")
 
@@ -682,7 +704,8 @@ TO-INDEX counts from 1."
                               ('left (1- current-index))
                               ('right (if (> (length tabs) (1+ current-index))
                                           (1+ current-index)
-                                        (1- current-index)))))))
+                                        (1- current-index)))
+                              ('recent (tab-bar--tab-index-recent 1 tabs))))))
           (setq to-index (max 0 (min (or to-index 0) (1- (length tabs)))))
           (tab-bar-select-tab (1+ to-index))
           ;; Re-read tabs after selecting another tab
@@ -819,6 +842,7 @@ function `tab-bar-tab-name-function'."
 (defalias 'tab-select      'tab-bar-select-tab)
 (defalias 'tab-next        'tab-bar-switch-to-next-tab)
 (defalias 'tab-previous    'tab-bar-switch-to-prev-tab)
+(defalias 'tab-recent      'tab-bar-switch-to-recent-tab)
 (defalias 'tab-move        'tab-bar-move-tab)
 (defalias 'tab-move-to     'tab-bar-move-tab-to)
 (defalias 'tab-rename      'tab-bar-rename-tab)