diff --git a/lisp/tab-line.el b/lisp/tab-line.el index 54e9ee16243..776d33de3e2 100644 --- a/lisp/tab-line.el +++ b/lisp/tab-line.el @@ -843,26 +857,9 @@ tab-line-select-tab (force-mode-line-update)))))))) (defun tab-line-select-tab-buffer (buffer &optional window) - (let* ((window-buffer (window-buffer window)) - (next-buffers (seq-remove (lambda (b) (eq b window-buffer)) - (window-next-buffers window))) - (prev-buffers (seq-remove (lambda (b) (eq b window-buffer)) - (mapcar #'car (window-prev-buffers window)))) - ;; Remove next-buffers from prev-buffers - (prev-buffers (seq-difference prev-buffers next-buffers))) - (cond - ((and (eq tab-line-tabs-function #'tab-line-tabs-window-buffers) - (memq buffer next-buffers)) - (dotimes (_ (1+ (seq-position next-buffers buffer))) - (switch-to-next-buffer window))) - ((and (eq tab-line-tabs-function #'tab-line-tabs-window-buffers) - (memq buffer prev-buffers)) - (dotimes (_ (1+ (seq-position prev-buffers buffer))) - (switch-to-prev-buffer window))) - (t - (with-selected-window window - (let ((switch-to-buffer-obey-display-actions nil)) - (switch-to-buffer buffer))))))) + (with-selected-window window + (let ((switch-to-buffer-obey-display-actions nil)) + (switch-to-buffer buffer)))) (defcustom tab-line-switch-cycling nil "Enable cycling tab switch. @@ -919,6 +916,26 @@ tab-line-switch-to-next-tab (let ((switch-to-buffer-obey-display-actions nil)) (switch-to-buffer buffer)))))))) +(defun tab-line-buffer-change (_window) + (let* ((new-buffer (window-buffer)) + (old-buffers (window-parameter nil 'tab-line-window-buffers)) + (prev-buffers (window-prev-buffers)) + (next-buffers (memq new-buffer old-buffers))) + (when next-buffers + (set-window-next-buffers nil (seq-filter (lambda (b) + (assq b prev-buffers)) + (cdr next-buffers)))) + (set-window-prev-buffers + nil (sort prev-buffers + (lambda (a b) + (cond + ((eq (car a) new-buffer) nil) + ((eq (car b) new-buffer) t) + (t (< (length (memq (car a) old-buffers)) + (length (memq (car b) old-buffers)))))))) + (set-window-parameter nil 'tab-line-window-buffers + (tab-line-tabs-window-buffers)))) + (defcustom tab-line-close-tab-function 'bury-buffer "What to do upon closing a tab on the tab line. @@ -1025,13 +1042,17 @@ tab-line-mode "Toggle display of tab line in the windows displaying the current buffer." :lighter nil (let ((default-value '(:eval (tab-line-format)))) - (if tab-line-mode - ;; Preserve the existing tab-line set outside of this mode - (unless tab-line-format - (setq tab-line-format default-value)) + (cond + (tab-line-mode + (add-hook 'window-buffer-change-functions #'tab-line-buffer-change nil t) + ;; Preserve the existing tab-line set outside of this mode + (unless tab-line-format + (setq tab-line-format default-value))) + (t + (remove-hook 'window-buffer-change-functions #'tab-line-buffer-change t) ;; Reset only values set by this mode (when (equal tab-line-format default-value) - (setq tab-line-format nil))))) + (setq tab-line-format nil)))))) (defcustom tab-line-exclude-modes '(completion-list-mode)