From: Juri Linkov Date: Sun, 26 Apr 2020 22:28:36 +0000 (+0300) Subject: Fix bugs in tab-bar and tab-line and mention remaining features in manual. X-Git-Tag: emacs-27.1-rc1~179 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f0e1bf56f041a7f104839678db61e47006b5657c;p=emacs.git Fix bugs in tab-bar and tab-line and mention remaining features in manual. * doc/emacs/frames.texi (Tab Bars): Mention tab-bar-new-tab-to, tab-bar-close-last-tab-choice, tab-bar-close-tab-select, tab-undo, tab-select, tab-bar-history-mode. * doc/emacs/windows.texi (Tab Line): Mention tab-line-tabs-function. * lisp/tab-bar.el (tab-bar-select-tab-modifiers): Mention tab-bar-tab-hints in docstring. (tab-bar-tab-hints): Mention tab-bar-select-tab-modifiers in docstring. (tab-bar-select-tab): Mention tab-bar-select-tab-modifiers in docstring. (tab-bar-switch-to-tab): Expand the docstring. (tab-bar-new-tab-to): Fix bug in handling 'left' value. (tab-bar-close-tab): Fix bug in handling 'left' value. (tab-bar-undo-close-tab): Use funcall tab-bar-tabs-function instead of direct call to tab-bar-tabs. (tab-bar-history-back, tab-bar-history-forward): Add docstrings. (tab-bar-history-mode): Expand docstring. * lisp/tab-line.el (tab-line-format): Fix bug for handling window switching that should set face 'tab-line-tab-current'. --- diff --git a/doc/emacs/frames.texi b/doc/emacs/frames.texi index d9373b8bc78..8f448e1aedc 100644 --- a/doc/emacs/frames.texi +++ b/doc/emacs/frames.texi @@ -1266,7 +1266,7 @@ Note that the Tab Bar is different from the Tab Line (@pxref{Tab Line}). Whereas tabs on the Tab Line at the top of each window are used to switch between buffers, tabs on the Tab Bar at the top of each frame are used to switch between window configurations containing several -windows. +windows with buffers. @findex tab-bar-mode To toggle the use of tab bars, type @kbd{M-x tab-bar-mode}. This @@ -1324,6 +1324,10 @@ current before calling the command that adds a new tab. To start a new tab with other buffers, customize the variable @code{tab-bar-new-tab-choice}. +@vindex tab-bar-new-tab-to + The variable @code{tab-bar-new-tab-to} defines where to place a new tab. +By default, a new tab is added on the right side of the current tab. + The following commands can be used to delete tabs: @table @kbd @@ -1331,7 +1335,8 @@ To start a new tab with other buffers, customize the variable @kindex C-x t 0 @findex tab-close Close the selected tab (@code{tab-close}). It has no effect if there -is only one tab. +is only one tab, unless the variable @code{tab-bar-close-last-tab-choice} +is customized to a non-default value. @item C-x t 1 @kindex C-x t 1 @@ -1339,6 +1344,14 @@ is only one tab. Close all tabs on the selected frame, except the selected one. @end table +@vindex tab-bar-close-tab-select + The variable @code{tab-bar-close-tab-select} defines what tab to +select after closing the current tab. By default, it selects +a recently used tab. + +@findex tab-undo + The command @code{tab-undo} restores the last closed tab. + The following commands can be used to switch between tabs: @table @kbd @@ -1358,22 +1371,60 @@ switches back to the previous Nth tab. Switch to the previous tab. With a positive numeric argument N, it switches to the previous Nth tab; with a negative argument −N, it switches back to the next Nth tab. + +@item C-x t @key{RET} @var{tabname} @key{RET} +Switch to the tab by its name, with completion on all tab names. +Default values are tab names sorted by recency, so you can use +@kbd{M-n} (@code{next-history-element}) to get the name of the last +visited tab, the second last, and so on. + +@item @var{modifier}-@var{tabnumber} +@findex tab-select +Switch to the tab by its number. After customizing the variable +@code{tab-bar-select-tab-modifiers} to specify a @var{modifier} key, you +can select a tab by its ordinal number using the specified modifier in +combination with the tab number to select. To display the tab number +alongside the tab name, you can customize another variable +@code{tab-bar-tab-hints}. This will help you to decide what key to press +to select the tab by its number. + +@item @var{modifier}-@kbd{0} +@findex tab-recent +Switch to the recent tab. The key combination is the modifier key +defined by @code{tab-bar-select-tab-modifiers} and the key @kbd{0}. +With a numeric argument N, switch to the Nth recent tab. @end table The following commands can be used to operate on tabs: @table @kbd @item C-x t r @var{tabname} @key{RET} +@findex tab-rename Rename the current tab to @var{tabname}. You can control the programmatic name given to a tab by default by customizing the variable @code{tab-bar-tab-name-function}. @item C-x t m +@findex tab-move Move the current tab N positions to the right with a positive numeric -argument N. With a negative argument −N, it moves the current tab +argument N. With a negative argument −N, move the current tab N positions to the left. @end table +@findex tab-bar-history-mode + You can enable @code{tab-bar-history-mode} to remember window +configurations used in every tab, and restore them. + +@table @kbd +@item tab-bar-history-back +Restore a previous window configuration used in the current tab. +This navigates back in the history of window configurations. + +@item tab-bar-history-forward +Cancel restoration of the previous window configuration. +This navigates forward in the history of window configurations. +@end table + @node Dialog Boxes @section Using Dialog Boxes @cindex dialog boxes diff --git a/doc/emacs/windows.texi b/doc/emacs/windows.texi index cb5e9bce4d1..4c67660b92d 100644 --- a/doc/emacs/windows.texi +++ b/doc/emacs/windows.texi @@ -628,8 +628,16 @@ Selecting the previous window-local tab is the same as typing @kbd{C-x same as @kbd{C-x @key{RIGHT}} (@code{next-buffer}). Both commands support a numeric prefix argument as a repeat count. +You can customize the variable @code{tab-line-tabs-function} to define +the preferred contents of the tab line. By default, it displays all +buffers previously visited in the window, as described above. But you +can also set it to display a list of buffers with the same major mode +as the current buffer, or to display buffers grouped by their major +mode, where clicking on the mode name in the first tab displays a list +of all major modes where you can select another group of buffers. + Note that the Tab Line is different from the Tab Bar (@pxref{Tab Bars}). Whereas tabs on the Tab Bar at the top of each frame are used to -switch between window configurations containing several windows, +switch between window configurations containing several windows with buffers, tabs on the Tab Line at the top of each window are used to switch -between buffers. +between buffers in the window. diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el index 8c2027eb6a2..a1ff2b0ca8b 100644 --- a/lisp/tab-bar.el +++ b/lisp/tab-bar.el @@ -87,10 +87,11 @@ (defcustom tab-bar-select-tab-modifiers '() - "List of key modifiers for selecting a tab by its index digit. -Possible modifiers are `control', `meta', `shift', `hyper', `super' and -`alt'." - :type '(set :tag "Tab selection key modifiers" + "List of modifier keys for selecting a tab by its index digit. +Possible modifier keys are `control', `meta', `shift', `hyper', `super' and +`alt'. To help you to select a tab by its number, you can customize +`tab-bar-tab-hints' that will show tab numbers alongside the tab name." + :type '(set :tag "Tab selection modifier keys" (const control) (const meta) (const shift) @@ -310,7 +311,8 @@ If nil, don't show it at all." (defcustom tab-bar-tab-hints nil "Show absolute numbers on tabs in the tab bar before the tab name. -This helps to select the tab by its number using `tab-bar-select-tab'." +This helps to select the tab by its number using `tab-bar-select-tab' +and `tab-bar-select-tab-modifiers'." :type 'boolean :initialize 'custom-initialize-default :set (lambda (sym val) @@ -563,9 +565,10 @@ Return its existing value or a new value." (defun tab-bar-select-tab (&optional arg) "Switch to the tab by its absolute position ARG in the tab bar. -When this command is bound to a numeric key (with a prefix or modifier), -calling it without an argument will translate its bound numeric key -to the numeric argument. ARG counts from 1." +When this command is bound to a numeric key (with a prefix or modifier key +using `tab-bar-select-tab-modifiers'), calling it without an argument +will translate its bound numeric key to the numeric argument. +ARG counts from 1." (interactive "P") (unless (integerp arg) (let ((key (event-basic-type last-command-event))) @@ -664,7 +667,10 @@ to the numeric argument. ARG counts from 1." (message "No more recent tabs")))) (defun tab-bar-switch-to-tab (name) - "Switch to the tab by NAME." + "Switch to the tab by NAME. +Default values are tab names sorted by recency, so you can use \ +\\\\[next-history-element] +to get the name of the last visited tab, the second last, and so on." (interactive (let* ((recent-tabs (mapcar (lambda (tab) (alist-get 'name tab)) @@ -789,7 +795,7 @@ After the tab is created, the hooks in (pcase tab-bar-new-tab-to ('leftmost 0) ('rightmost (length tabs)) - ('left (1- (or from-index 1))) + ('left (or from-index 1)) ('right (1+ (or from-index 0))) ((pred functionp) (funcall tab-bar-new-tab-to)))))) @@ -920,7 +926,7 @@ for the last tab on a frame is determined by ;; Select another tab before deleting the current tab (let ((to-index (or (if to-index (1- to-index)) (pcase tab-bar-close-tab-select - ('left (1- current-index)) + ('left (1- (if (< current-index 1) 2 current-index))) ('right (if (> (length tabs) (1+ current-index)) (1+ current-index) (1- current-index))) @@ -1004,7 +1010,7 @@ for the last tab on a frame is determined by (unless (eq frame (selected-frame)) (select-frame-set-input-focus frame)) - (let ((tabs (tab-bar-tabs))) + (let ((tabs (funcall tab-bar-tabs-function))) (setq index (max 0 (min index (length tabs)))) (cl-pushnew tab (nthcdr index tabs)) (when (eq index 0) @@ -1102,6 +1108,8 @@ function `tab-bar-tab-name-function'." (setq tab-bar-history-omit nil))) (defun tab-bar-history-back () + "Restore a previous window configuration used in the current tab. +This navigates back in the history of window configurations." (interactive) (setq tab-bar-history-omit t) (let* ((history (pop (gethash (selected-frame) tab-bar-history-back))) @@ -1119,6 +1127,8 @@ function `tab-bar-tab-name-function'." (message "No more tab back history")))) (defun tab-bar-history-forward () + "Cancel restoration of the previous window configuration. +This navigates forward in the history of window configurations." (interactive) (setq tab-bar-history-omit t) (let* ((history (pop (gethash (selected-frame) tab-bar-history-forward))) @@ -1136,7 +1146,9 @@ function `tab-bar-tab-name-function'." (message "No more tab forward history")))) (define-minor-mode tab-bar-history-mode - "Toggle tab history mode for the tab bar." + "Toggle tab history mode for the tab bar. +Tab history mode remembers window configurations used in every tab, +and can restore them." :global t :group 'tab-bar (if tab-bar-history-mode (progn diff --git a/lisp/tab-line.el b/lisp/tab-line.el index eb279deab4c..7a2bdc0b72f 100644 --- a/lisp/tab-line.el +++ b/lisp/tab-line.el @@ -474,8 +474,12 @@ variable `tab-line-tabs-function'." "Template for displaying tab line for selected window." (let* ((tabs (funcall tab-line-tabs-function)) (cache-key (list tabs + ;; handle buffer renames (buffer-name (window-buffer)) - (window-parameter nil 'tab-line-hscroll))) + ;; handle tab-line scrolling + (window-parameter nil 'tab-line-hscroll) + ;; for setting face 'tab-line-tab-current' + (eq (selected-window) (old-selected-window)))) (cache (window-parameter nil 'tab-line-cache))) ;; Enable auto-hscroll again after it was disabled on manual scrolling. ;; The moment to enable it is when the window-buffer was updated.