diff options
| author | Juri Linkov | 2019-10-27 01:38:32 +0300 |
|---|---|---|
| committer | Juri Linkov | 2019-10-27 01:38:32 +0300 |
| commit | 1660f5875c6022ba4f342a53efadfc4d2deb150a (patch) | |
| tree | 9e5397fc0e09efcacbfad61ef1a23af9b732789b | |
| parent | 5a9a01797b4dad36b81ebfa83eebf96d27a2f395 (diff) | |
| download | emacs-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.el | 2 | ||||
| -rw-r--r-- | lisp/speedbar.el | 2 | ||||
| -rw-r--r-- | lisp/tab-line.el | 91 |
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. |
| 248 | If nil, no limit.") | 248 | If 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. |
| 252 | This function should return either a list of buffers whose names will | 252 | This function should return either a list of buffers whose names will |
| 253 | be displayed, or just a list of strings to display in the tab line. | 253 | be displayed, or just a list of strings to display in the tab line. |
| 254 | By default, use function `tab-line-tabs'.") | 254 | By default, use function `tab-line-tabs-window-buffers' that |
| 255 | returns a list of buffers associated with the selected window. | ||
| 256 | When `tab-line-tabs-mode-buffers', return a list of buffers | ||
| 257 | with 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. |
| 258 | By default returns a list of window buffers, i.e. buffers previously | 282 | By default returns a list of window buffers, i.e. buffers previously |
| 259 | shown in the same window where the tab line is displayed. | 283 | shown 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." | |||
| 398 | Its effect is the same as using the `previous-buffer' command | 424 | Its 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. |
| 406 | Its effect is the same as using the `next-buffer' command | 437 | Its 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) |