]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/tab-bar.el (display-buffer-in-tab): New function (bug#38354)
authorJuri Linkov <juri@linkov.net>
Tue, 26 Nov 2019 22:29:31 +0000 (00:29 +0200)
committerJuri Linkov <juri@linkov.net>
Tue, 26 Nov 2019 22:29:31 +0000 (00:29 +0200)
lisp/tab-bar.el

index 69a26c515ec345e56f26bd70ede63da534d841ce..5eb332884c507b8d6a1eeb071e860b24823933e2 100644 (file)
@@ -1254,6 +1254,36 @@ in the selected frame."
   (goto-char (posn-point (event-end event)))
   (tab-bar-list-select))
 
+\f
+(defun display-buffer-in-tab (buffer alist)
+  "Display BUFFER in a tab.
+ALIST is an association list of action symbols and values.  See
+Info node `(elisp) Buffer Display Action Alists' for details of
+such alists.
+
+If ALIST contains a `name' entry, it creates a new tab with that name and
+displays BUFFER in a new tab.  If a tab with this name already exists, it
+switches to that tab before displaying BUFFER.  The `name' entry can be
+a function, then it is called with two arguments: BUFFER and ALIST, and
+should return the tab name.  When a `name' entry is omitted, create
+a new tab without an explicit name.
+
+This is an action function for buffer display, see Info
+node `(elisp) Buffer Display Action Functions'.  It should be
+called only by `display-buffer' or a function directly or
+indirectly called by the latter."
+  (let ((name (cdr (assq 'name alist))))
+    (when (functionp name)
+      (setq name (funcall name buffer alist)))
+    (if name
+        (let ((tab-index (tab-bar--tab-index-by-name name)))
+          (if tab-index
+              (tab-bar-select-tab (1+ tab-index))
+            (let ((tab-bar-new-tab-choice t))
+              (tab-bar-new-tab)
+              (tab-bar-rename-tab name))))
+      (tab-bar-new-tab))))
+
 \f
 (defun switch-to-buffer-other-tab (buffer-or-name &optional norecord)
   "Switch to buffer BUFFER-OR-NAME in another tab.