* lisp/tab-bar.el (tab-bar-show): New defcustom.

* lisp/tab-bar.el (tab-bar-close-current-tab, tab-bar-close-tab):
(tab-bar-new-tab): Use tab-bar-show.

* doc/emacs/frames.texi (Tab Bars): Add tab-bar-show.

* lisp/speedbar.el (speedbar-mode): Set buffer-local tab-bar-mode
and tab-line-format to nil to not show in dedicated speedbar frame.
This commit is contained in:
Juri Linkov 2019-10-02 23:18:01 +03:00
parent 5eb2477be2
commit 52ab948510
4 changed files with 72 additions and 15 deletions

View file

@ -1242,6 +1242,19 @@ command applies to all frames, including frames yet to be created. To
control the use of tab bars at startup, customize the variable
@code{tab-bar-mode}.
@vindex tab-bar-show
@cindex Tab Bar show
This variable is intended to toggle the tab bar automatically.
When the value is @code{t}, then @code{tab-bar-mode} is enabled when
using the commands that create new window configurations. The value
@code{1} hides the tab bar when it has only one tab, and shows it
again once more tabs are created. If @code{nil}, always keep the tab
bar hidden. In this case it's still possible to use persistent named
window configurations without using the tab bar by relying on keyboard
commands that create a new window configuration (@kbd{M-x tab-new}),
that switch windows configurations (@kbd{M-x tab-next}, @kbd{M-x
tab-list}), or delete the existing ones (@kbd{M-x tab-close}).
@vindex tab-bar-new-tab-choice
@cindex Tab Bar new tab
By default, Emacs follows the same behavior as when creating frames,

View file

@ -1115,7 +1115,9 @@ in the selected file.
(setq dframe-track-mouse-function #'speedbar-track-mouse))
(setq dframe-help-echo-function #'speedbar-item-info
dframe-mouse-click-function #'speedbar-click
dframe-mouse-position-function #'speedbar-position-cursor-on-line))
dframe-mouse-position-function #'speedbar-position-cursor-on-line)
(setq-local tab-bar-mode nil)
(setq-local tab-line-format nil))
speedbar-buffer)
(define-obsolete-function-alias 'speedbar-message 'dframe-message "24.4")

View file

@ -96,9 +96,9 @@
(assq-delete-all 'tab-bar-lines
default-frame-alist)))))
(when tab-bar-mode
(global-set-key [(control shift iso-lefttab)] 'tab-bar-switch-to-prev-tab)
(global-set-key [(control shift tab)] 'tab-bar-switch-to-prev-tab)
(global-set-key [(control tab)] 'tab-bar-switch-to-next-tab)))
(global-set-key [(control shift iso-lefttab)] 'tab-previous)
(global-set-key [(control shift tab)] 'tab-previous)
(global-set-key [(control tab)] 'tab-next)))
(defun tab-bar-handle-mouse (event)
"Text-mode emulation of switching tabs on the tab bar.
@ -152,6 +152,28 @@ Its main job is to show tabs in the tab bar."
(puthash key tab-bar-map tab-bar-keymap-cache)))))
(defcustom tab-bar-show t
"Defines when to show the tab bar.
If t, enable `tab-bar-mode' automatically on using the commands that
create new window configurations (e.g. `tab-new').
If the value is `1', then hide the tab bar when it has only one tab,
and show it again once more tabs are created.
If nil, always keep the tab bar hidden. In this case it's still
possible to use persistent named window configurations by relying on
keyboard commands `tab-list', `tab-new', `tab-close', `tab-next', etc."
:type '(choice (const :tag "Always" t)
(const :tag "When more than one tab" 1)
(const :tag "Never" nil))
:initialize 'custom-initialize-default
:set (lambda (sym val)
(set-default sym val)
(tab-bar-mode
(if (or (eq val t)
(and (natnump val) (> (length (tab-bar-tabs)) val)))
1 -1)))
:group 'tab-bar
:version "27.1")
(defcustom tab-bar-new-tab-choice t
"Defines what to show in a new tab.
If t, start a new tab with the current buffer, i.e. the buffer
@ -192,8 +214,9 @@ If nil, don't show it at all."
(const :tag "On selected tab" selected)
(const :tag "On non-selected tabs" non-selected)
(const :tag "None" nil))
:initialize 'custom-initialize-default
:set (lambda (sym val)
(set sym val)
(set-default sym val)
(force-mode-line-update))
:group 'tab-bar
:version "27.1")
@ -354,7 +377,8 @@ Return its existing value or a new value."
((eq (car (car tabs)) 'current-tab)
(setcar tabs new-tab)))
(setq tabs (cdr tabs)))
(force-mode-line-update))))
(when tab-bar-mode
(force-mode-line-update)))))
(defun tab-bar-switch-to-prev-tab (&optional _arg)
"Switch to ARGth previous tab."
@ -389,11 +413,14 @@ If `rightmost', create as the last tab."
(defun tab-bar-new-tab ()
"Clone the current tab to the position specified by `tab-bar-new-tab-to'."
(interactive)
(unless tab-bar-mode
(tab-bar-mode 1))
(let* ((tabs (tab-bar-tabs))
;; (i-tab (- (length tabs) (length (memq tab tabs))))
(new-tab (tab-bar-tab-default)))
(when (and (not tab-bar-mode)
(or (eq tab-bar-show t)
(and (natnump tab-bar-show)
(>= (length tabs) tab-bar-show))))
(tab-bar-mode 1))
(cond
((eq tab-bar-new-tab-to 'leftmost)
(setq tabs (cons new-tab tabs)))
@ -415,6 +442,9 @@ If `rightmost', create as the last tab."
(tab-bar-select-tab new-tab)
(when tab-bar-new-tab-choice
(delete-other-windows)
;; Create a new window to get rid of old window parameters
;; (e.g. prev/next buffers) of old window.
(split-window) (delete-window)
(let ((buffer
(if (functionp tab-bar-new-tab-choice)
(funcall tab-bar-new-tab-choice)
@ -463,6 +493,10 @@ if its value is provided."
(setq tabs (delq tab tabs)
i-select (max 0 (min (1- (length tabs)) i-select))
select-tab (nth i-select tabs))))
(when (and tab-bar-mode
(and (natnump tab-bar-show)
(<= (length tabs) tab-bar-show)))
(tab-bar-mode -1))
(set-frame-parameter nil 'tabs tabs)
(tab-bar-select-tab select-tab)))
@ -474,9 +508,15 @@ specified by `tab-bar-close-tab-select'."
(when tab
(if (eq (car tab) 'current-tab)
(tab-bar-close-current-tab tab)
;; Close non-current tab, no need to switch to another tab
(set-frame-parameter nil 'tabs (delq tab (tab-bar-tabs)))
(force-mode-line-update))))
(let ((tabs (tab-bar-tabs)))
;; Close non-current tab, no need to switch to another tab
(when (and tab-bar-mode
(and (natnump tab-bar-show)
(<= (length tabs) tab-bar-show)))
(tab-bar-mode -1))
(set-frame-parameter nil 'tabs (delq tab tabs))
(when tab-bar-mode
(force-mode-line-update))))))
;;; Non-graphical access to frame-local tabs (named window configurations)
@ -733,7 +773,8 @@ in the selected frame."
Like \\[switch-to-buffer-other-frame] (which see), but creates a new tab."
(interactive
(list (read-buffer-to-switch "Switch to buffer in other tab: ")))
(tab-bar-new-tab)
(let ((tab-bar-new-tab-choice t))
(tab-bar-new-tab))
(delete-other-windows)
(switch-to-buffer buffer-or-name norecord))
@ -752,8 +793,8 @@ Like \\[find-file-other-frame] (which see), but creates a new tab."
value)
(switch-to-buffer-other-tab value))))
(define-key ctl-x-6-map "2" 'tab-bar-new-tab)
(define-key ctl-x-6-map "0" 'tab-bar-close-current-tab)
(define-key ctl-x-6-map "2" 'tab-new)
(define-key ctl-x-6-map "0" 'tab-close)
(define-key ctl-x-6-map "b" 'switch-to-buffer-other-tab)
(define-key ctl-x-6-map "f" 'find-file-other-tab)
(define-key ctl-x-6-map "\C-f" 'find-file-other-tab)

View file

@ -147,8 +147,9 @@ If nil, don't show it at all."
(const :tag "On selected tab" selected)
(const :tag "On non-selected tabs" non-selected)
(const :tag "None" nil))
:initialize 'custom-initialize-default
:set (lambda (sym val)
(set sym val)
(set-default sym val)
(force-mode-line-update))
:group 'tab-line
:version "27.1")