aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuri Linkov2019-10-27 01:38:32 +0300
committerJuri Linkov2019-10-27 01:38:32 +0300
commit1660f5875c6022ba4f342a53efadfc4d2deb150a (patch)
tree9e5397fc0e09efcacbfad61ef1a23af9b732789b
parent5a9a01797b4dad36b81ebfa83eebf96d27a2f395 (diff)
downloademacs-1660f5875c6022ba4f342a53efadfc4d2deb150a.tar.gz
emacs-1660f5875c6022ba4f342a53efadfc4d2deb150a.zip
Customizable tab-line-tabs-function and new buffer-local tab-line-mode.
* lisp/tab-line.el (tab-line-tabs-function): Turn defvar into defcustom with default of tab-line-tabs-window-buffers. (tab-line-tabs-mode-buffers): New function. (tab-line-tabs-window-buffers): Rename from tab-line-tabs. (tab-line-select-tab, tab-line-switch-to-prev-tab) (tab-line-switch-to-next-tab): Handle the value tab-line-tabs-window-buffers of tab-line-tabs-function specially. (tab-line-mode): Rename from global-tab-line-mode and change scope to buffer-local. (global-tab-line-mode): New globalized-minor-mode. (tab-line-mode--turn-on): New function. (tab-line-exclude-modes): New defcustom. (tab-line-exclude): New buffer-local variable. https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00988.html * lisp/dired.el (dired-mark-pop-up): Set tab-line-exclude to nil. Don't set tab-line-format. (Bug#37699) * lisp/speedbar.el (speedbar-mode): Set tab-line-exclude to nil. Don't set tab-line-format.
-rw-r--r--lisp/dired.el2
-rw-r--r--lisp/speedbar.el2
-rw-r--r--lisp/tab-line.el91
3 files changed, 77 insertions, 18 deletions
diff --git a/lisp/dired.el b/lisp/dired.el
index 75dfbc4b9a0..1d085e010f6 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -3437,7 +3437,7 @@ argument or confirmation)."
3437 (if (eq (car files) t) (cdr files) files)) 3437 (if (eq (car files) t) (cdr files) files))
3438 (remove-text-properties (point-min) (point-max) 3438 (remove-text-properties (point-min) (point-max)
3439 '(mouse-face nil help-echo nil)) 3439 '(mouse-face nil help-echo nil))
3440 (setq tab-line-format nil)))))) 3440 (setq tab-line-exclude nil))))))
3441 3441
3442(defun dired-format-columns-of-files (files) 3442(defun dired-format-columns-of-files (files)
3443 (let ((beg (point))) 3443 (let ((beg (point)))
diff --git a/lisp/speedbar.el b/lisp/speedbar.el
index c489d18ce16..961a1571c7b 100644
--- a/lisp/speedbar.el
+++ b/lisp/speedbar.el
@@ -1080,7 +1080,7 @@ in the selected file.
1080 dframe-mouse-click-function #'speedbar-click 1080 dframe-mouse-click-function #'speedbar-click
1081 dframe-mouse-position-function #'speedbar-position-cursor-on-line) 1081 dframe-mouse-position-function #'speedbar-position-cursor-on-line)
1082 (setq-local tab-bar-mode nil) 1082 (setq-local tab-bar-mode nil)
1083 (setq-local tab-line-format nil)) 1083 (setq tab-line-exclude nil))
1084 speedbar-buffer) 1084 speedbar-buffer)
1085 1085
1086(define-obsolete-function-alias 'speedbar-message 'dframe-message "24.4") 1086(define-obsolete-function-alias 'speedbar-message 'dframe-message "24.4")
diff --git a/lisp/tab-line.el b/lisp/tab-line.el
index 7dc6e2b6d04..cfb4223bd21 100644
--- a/lisp/tab-line.el
+++ b/lisp/tab-line.el
@@ -247,13 +247,37 @@ Reduce tab width proportionally to space taken by other tabs."
247 "Maximum number of buffer tabs displayed in the tab line. 247 "Maximum number of buffer tabs displayed in the tab line.
248If nil, no limit.") 248If nil, no limit.")
249 249
250(defvar tab-line-tabs-function #'tab-line-tabs 250(defcustom tab-line-tabs-function #'tab-line-tabs-window-buffers
251 "Function to get a list of tabs to display in the tab line. 251 "Function to get a list of tabs to display in the tab line.
252This function should return either a list of buffers whose names will 252This function should return either a list of buffers whose names will
253be displayed, or just a list of strings to display in the tab line. 253be displayed, or just a list of strings to display in the tab line.
254By default, use function `tab-line-tabs'.") 254By default, use function `tab-line-tabs-window-buffers' that
255returns a list of buffers associated with the selected window.
256When `tab-line-tabs-mode-buffers', return a list of buffers
257with the same major mode as the current buffer."
258 :type '(choice (const :tag "Window buffers"
259 tab-line-tabs-window-buffers)
260 (const :tag "Same mode buffers"
261 tab-line-tabs-mode-buffers)
262 (function :tag "Function"))
263 :initialize 'custom-initialize-default
264 :set (lambda (sym val)
265 (set-default sym val)
266 (force-mode-line-update))
267 :group 'tab-line
268 :version "27.1")
255 269
256(defun tab-line-tabs () 270(defun tab-line-tabs-mode-buffers ()
271 "Return a list of buffers with the same major mode with current buffer."
272 (let* ((window (selected-window))
273 (buffer (window-buffer window))
274 (mode (with-current-buffer buffer major-mode)))
275 (seq-sort-by #'buffer-name #'string<
276 (seq-filter (lambda (b) (with-current-buffer b
277 (derived-mode-p mode)))
278 (buffer-list)))))
279
280(defun tab-line-tabs-window-buffers ()
257 "Return a list of tabs that should be displayed in the tab line. 281 "Return a list of tabs that should be displayed in the tab line.
258By default returns a list of window buffers, i.e. buffers previously 282By default returns a list of window buffers, i.e. buffers previously
259shown in the same window where the tab line is displayed. 283shown in the same window where the tab line is displayed.
@@ -383,10 +407,12 @@ using the `previous-buffer' command."
383 ;; Remove next-buffers from prev-buffers 407 ;; Remove next-buffers from prev-buffers
384 (prev-buffers (seq-difference prev-buffers next-buffers))) 408 (prev-buffers (seq-difference prev-buffers next-buffers)))
385 (cond 409 (cond
386 ((memq buffer next-buffers) 410 ((and (eq tab-line-tabs-function #'tab-line-tabs-window-buffers)
411 (memq buffer next-buffers))
387 (dotimes (_ (1+ (seq-position next-buffers buffer))) 412 (dotimes (_ (1+ (seq-position next-buffers buffer)))
388 (switch-to-next-buffer window))) 413 (switch-to-next-buffer window)))
389 ((memq buffer prev-buffers) 414 ((and (eq tab-line-tabs-function #'tab-line-tabs-window-buffers)
415 (memq buffer prev-buffers))
390 (dotimes (_ (1+ (seq-position prev-buffers buffer))) 416 (dotimes (_ (1+ (seq-position prev-buffers buffer)))
391 (switch-to-prev-buffer window))) 417 (switch-to-prev-buffer window)))
392 (t 418 (t
@@ -398,16 +424,26 @@ using the `previous-buffer' command."
398Its effect is the same as using the `previous-buffer' command 424Its effect is the same as using the `previous-buffer' command
399(\\[previous-buffer])." 425(\\[previous-buffer])."
400 (interactive (list last-nonmenu-event)) 426 (interactive (list last-nonmenu-event))
401 (switch-to-prev-buffer 427 (let ((window (and (listp mouse-event) (posn-window (event-start mouse-event)))))
402 (and (listp mouse-event) (posn-window (event-start mouse-event))))) 428 (if (eq tab-line-tabs-function #'tab-line-tabs-window-buffers)
429 (switch-to-prev-buffer window)
430 (with-selected-window (or window (selected-window))
431 (let ((buffer (cadr (memq (current-buffer)
432 (reverse (funcall tab-line-tabs-function))))))
433 (when buffer (switch-to-buffer buffer)))))))
403 434
404(defun tab-line-switch-to-next-tab (&optional mouse-event) 435(defun tab-line-switch-to-next-tab (&optional mouse-event)
405 "Switch to the next tab. 436 "Switch to the next tab.
406Its effect is the same as using the `next-buffer' command 437Its effect is the same as using the `next-buffer' command
407(\\[next-buffer])." 438(\\[next-buffer])."
408 (interactive (list last-nonmenu-event)) 439 (interactive (list last-nonmenu-event))
409 (switch-to-next-buffer 440 (let ((window (and (listp mouse-event) (posn-window (event-start mouse-event)))))
410 (and (listp mouse-event) (posn-window (event-start mouse-event))))) 441 (if (eq tab-line-tabs-function #'tab-line-tabs-window-buffers)
442 (switch-to-next-buffer window)
443 (with-selected-window (or window (selected-window))
444 (let ((buffer (cadr (memq (current-buffer)
445 (funcall tab-line-tabs-function)))))
446 (when buffer (switch-to-buffer buffer)))))))
411 447
412 448
413(defcustom tab-line-close-tab-action 'bury-buffer 449(defcustom tab-line-close-tab-action 'bury-buffer
@@ -443,14 +479,37 @@ from the tab line."
443 479
444 480
445;;;###autoload 481;;;###autoload
446(define-minor-mode global-tab-line-mode 482(define-minor-mode tab-line-mode
447 "Display window-local tab line." 483 "Toggle display of window tab line in the buffer."
484 :lighter nil
485 (setq tab-line-format (when tab-line-mode '(:eval (tab-line-format)))))
486
487(defcustom tab-line-exclude-modes
488 '(completion-list-mode)
489 "List of major modes in which the tab line is not enabled."
490 :type '(repeat symbol)
491 :group 'tab-line
492 :version "27.1")
493
494;;;###autoload
495(defvar tab-line-exclude nil)
496;;;###autoload
497(make-variable-buffer-local 'tab-line-exclude)
498
499(defun tab-line-mode--turn-on ()
500 "Turn on `tab-line-mode'."
501 (unless (or (minibufferp)
502 (string-match-p "\\` " (buffer-name))
503 (memq major-mode tab-line-exclude-modes)
504 (get major-mode 'tab-line-exclude)
505 (buffer-local-value 'tab-line-exclude (current-buffer)))
506 (tab-line-mode 1)))
507
508;;;###autoload
509(define-globalized-minor-mode global-tab-line-mode
510 tab-line-mode tab-line-mode--turn-on
448 :group 'tab-line 511 :group 'tab-line
449 :type 'boolean 512 :version "27.1")
450 :global t
451 :init-value nil
452 (setq-default tab-line-format (when global-tab-line-mode
453 '(:eval (tab-line-format)))))
454 513
455 514
456(global-set-key [tab-line mouse-4] 'tab-line-hscroll-left) 515(global-set-key [tab-line mouse-4] 'tab-line-hscroll-left)