aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Morris2020-04-29 07:50:20 -0700
committerGlenn Morris2020-04-29 07:50:20 -0700
commitb56401f3849cf6d00717ab8a64a221f2c01455a6 (patch)
tree936d8d0fc04faf7aa2ec069c9376a8be09ec5f79
parent17eae91cb1b45711be676bce79bcc5fcd7df2d3d (diff)
parent2f9bfaef21043d7894334b33b8538a165250f499 (diff)
downloademacs-b56401f3849cf6d00717ab8a64a221f2c01455a6.tar.gz
emacs-b56401f3849cf6d00717ab8a64a221f2c01455a6.zip
Merge from origin/emacs-27
2f9bfaef21 (origin/emacs-27) ; Fix last change 520fd3e728 * lisp/env.el (substitute-env-vars): Doc fix. (Bug#40948) 85544f8ef5 * lisp/isearch.el: Fix lazy-highlighting and lazy-counting... d83cc05a73 Fix error in ERC when 'erc-server-coding-system' is custom... 16fed05ba8 Avoid crashes on TTY frames with over-long compositions 0278741676 Fix typo in custom.texi 9f5ae717fb * test/lisp/simple-tests.el (with-shell-command-dont-erase... 1f76a16ed3 * lisp/image-mode.el (image-mode-map): Update menu items. f0e1bf56f0 Fix bugs in tab-bar and tab-line and mention remaining fea... f0b9f18457 Make shell-command tests fit for tcsh. 68f4a740a1 Remove doc duplication ac31cd384c * etc/NEWS: Fix inconsistencies. # Conflicts: # etc/NEWS
-rw-r--r--doc/emacs/custom.texi2
-rw-r--r--doc/emacs/frames.texi57
-rw-r--r--doc/emacs/windows.texi12
-rw-r--r--doc/lispref/objects.texi3
-rw-r--r--etc/NEWS.2716
-rw-r--r--lisp/env.el8
-rw-r--r--lisp/erc/erc-backend.el3
-rw-r--r--lisp/image-mode.el20
-rw-r--r--lisp/isearch.el7
-rw-r--r--lisp/tab-bar.el38
-rw-r--r--lisp/tab-line.el6
-rw-r--r--src/term.c2
-rw-r--r--test/lisp/simple-tests.el11
13 files changed, 135 insertions, 50 deletions
diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index e7e879065ed..406f0c96c1f 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -755,7 +755,7 @@ non-@code{nil} value). If you set a variable using the customization
755buffer, you need not worry about giving it an invalid type: the 755buffer, you need not worry about giving it an invalid type: the
756customization buffer usually only allows you to enter meaningful 756customization buffer usually only allows you to enter meaningful
757values. When in doubt, use @kbd{C-h v} (@code{describe-variable}) to 757values. When in doubt, use @kbd{C-h v} (@code{describe-variable}) to
758check the variable's documentation string to see kind of value it 758check the variable's documentation string to see what kind of value it
759expects (@pxref{Examining}). 759expects (@pxref{Examining}).
760 760
761@menu 761@menu
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}).
1266Whereas tabs on the Tab Line at the top of each window are used to 1266Whereas tabs on the Tab Line at the top of each window are used to
1267switch between buffers, tabs on the Tab Bar at the top of each frame 1267switch between buffers, tabs on the Tab Bar at the top of each frame
1268are used to switch between window configurations containing several 1268are used to switch between window configurations containing several
1269windows. 1269windows with buffers.
1270 1270
1271@findex tab-bar-mode 1271@findex tab-bar-mode
1272 To toggle the use of tab bars, type @kbd{M-x tab-bar-mode}. This 1272 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.
1324To start a new tab with other buffers, customize the variable 1324To start a new tab with other buffers, customize the variable
1325@code{tab-bar-new-tab-choice}. 1325@code{tab-bar-new-tab-choice}.
1326 1326
1327@vindex tab-bar-new-tab-to
1328 The variable @code{tab-bar-new-tab-to} defines where to place a new tab.
1329By default, a new tab is added on the right side of the current tab.
1330
1327 The following commands can be used to delete tabs: 1331 The following commands can be used to delete tabs:
1328 1332
1329@table @kbd 1333@table @kbd
@@ -1331,7 +1335,8 @@ To start a new tab with other buffers, customize the variable
1331@kindex C-x t 0 1335@kindex C-x t 0
1332@findex tab-close 1336@findex tab-close
1333Close the selected tab (@code{tab-close}). It has no effect if there 1337Close the selected tab (@code{tab-close}). It has no effect if there
1334is only one tab. 1338is only one tab, unless the variable @code{tab-bar-close-last-tab-choice}
1339is customized to a non-default value.
1335 1340
1336@item C-x t 1 1341@item C-x t 1
1337@kindex C-x t 1 1342@kindex C-x t 1
@@ -1339,6 +1344,14 @@ is only one tab.
1339Close all tabs on the selected frame, except the selected one. 1344Close all tabs on the selected frame, except the selected one.
1340@end table 1345@end table
1341 1346
1347@vindex tab-bar-close-tab-select
1348 The variable @code{tab-bar-close-tab-select} defines what tab to
1349select after closing the current tab. By default, it selects
1350a recently used tab.
1351
1352@findex tab-undo
1353 The command @code{tab-undo} restores the last closed tab.
1354
1342 The following commands can be used to switch between tabs: 1355 The following commands can be used to switch between tabs:
1343 1356
1344@table @kbd 1357@table @kbd
@@ -1358,22 +1371,60 @@ switches back to the previous Nth tab.
1358Switch to the previous tab. With a positive numeric argument N, it 1371Switch to the previous tab. With a positive numeric argument N, it
1359switches to the previous Nth tab; with a negative argument −N, it 1372switches to the previous Nth tab; with a negative argument −N, it
1360switches back to the next Nth tab. 1373switches back to the next Nth tab.
1374
1375@item C-x t @key{RET} @var{tabname} @key{RET}
1376Switch to the tab by its name, with completion on all tab names.
1377Default values are tab names sorted by recency, so you can use
1378@kbd{M-n} (@code{next-history-element}) to get the name of the last
1379visited tab, the second last, and so on.
1380
1381@item @var{modifier}-@var{tabnumber}
1382@findex tab-select
1383Switch to the tab by its number. After customizing the variable
1384@code{tab-bar-select-tab-modifiers} to specify a @var{modifier} key, you
1385can select a tab by its ordinal number using the specified modifier in
1386combination with the tab number to select. To display the tab number
1387alongside the tab name, you can customize another variable
1388@code{tab-bar-tab-hints}. This will help you to decide what key to press
1389to select the tab by its number.
1390
1391@item @var{modifier}-@kbd{0}
1392@findex tab-recent
1393Switch to the recent tab. The key combination is the modifier key
1394defined by @code{tab-bar-select-tab-modifiers} and the key @kbd{0}.
1395With a numeric argument N, switch to the Nth recent tab.
1361@end table 1396@end table
1362 1397
1363 The following commands can be used to operate on tabs: 1398 The following commands can be used to operate on tabs:
1364 1399
1365@table @kbd 1400@table @kbd
1366@item C-x t r @var{tabname} @key{RET} 1401@item C-x t r @var{tabname} @key{RET}
1402@findex tab-rename
1367Rename the current tab to @var{tabname}. You can control the 1403Rename the current tab to @var{tabname}. You can control the
1368programmatic name given to a tab by default by customizing the 1404programmatic name given to a tab by default by customizing the
1369variable @code{tab-bar-tab-name-function}. 1405variable @code{tab-bar-tab-name-function}.
1370 1406
1371@item C-x t m 1407@item C-x t m
1408@findex tab-move
1372Move the current tab N positions to the right with a positive numeric 1409Move the current tab N positions to the right with a positive numeric
1373argument N. With a negative argument −N, it moves the current tab 1410argument N. With a negative argument −N, move the current tab
1374N positions to the left. 1411N positions to the left.
1375@end table 1412@end table
1376 1413
1414@findex tab-bar-history-mode
1415 You can enable @code{tab-bar-history-mode} to remember window
1416configurations used in every tab, and restore them.
1417
1418@table @kbd
1419@item tab-bar-history-back
1420Restore a previous window configuration used in the current tab.
1421This navigates back in the history of window configurations.
1422
1423@item tab-bar-history-forward
1424Cancel restoration of the previous window configuration.
1425This navigates forward in the history of window configurations.
1426@end table
1427
1377@node Dialog Boxes 1428@node Dialog Boxes
1378@section Using Dialog Boxes 1429@section Using Dialog Boxes
1379@cindex dialog boxes 1430@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
628same as @kbd{C-x @key{RIGHT}} (@code{next-buffer}). Both commands 628same as @kbd{C-x @key{RIGHT}} (@code{next-buffer}). Both commands
629support a numeric prefix argument as a repeat count. 629support a numeric prefix argument as a repeat count.
630 630
631You can customize the variable @code{tab-line-tabs-function} to define
632the preferred contents of the tab line. By default, it displays all
633buffers previously visited in the window, as described above. But you
634can also set it to display a list of buffers with the same major mode
635as the current buffer, or to display buffers grouped by their major
636mode, where clicking on the mode name in the first tab displays a list
637of all major modes where you can select another group of buffers.
638
631Note that the Tab Line is different from the Tab Bar (@pxref{Tab Bars}). 639Note that the Tab Line is different from the Tab Bar (@pxref{Tab Bars}).
632Whereas tabs on the Tab Bar at the top of each frame are used to 640Whereas tabs on the Tab Bar at the top of each frame are used to
633switch between window configurations containing several windows, 641switch between window configurations containing several windows with buffers,
634tabs on the Tab Line at the top of each window are used to switch 642tabs on the Tab Line at the top of each window are used to switch
635between buffers. 643between buffers in the window.
diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi
index d35a9ace572..cd037d663da 100644
--- a/doc/lispref/objects.texi
+++ b/doc/lispref/objects.texi
@@ -2406,8 +2406,7 @@ call @code{(make-string 3 ?a)} yields a mutable string that can be
2406changed via later calls to @code{aset}. 2406changed via later calls to @code{aset}.
2407 2407
2408 A mutable object can become constant if it is part of an expression 2408 A mutable object can become constant if it is part of an expression
2409that is evaluated, because a program should not modify an object 2409that is evaluated. The reverse does not occur: constant objects
2410that is being evaluated. The reverse does not occur: constant objects
2411should stay constant. 2410should stay constant.
2412 2411
2413 Trying to modify a constant variable signals an error 2412 Trying to modify a constant variable signals an error
diff --git a/etc/NEWS.27 b/etc/NEWS.27
index 1eb391f1350..42133b8bad8 100644
--- a/etc/NEWS.27
+++ b/etc/NEWS.27
@@ -28,7 +28,7 @@ applies, and please also update docstrings as needed.
28** Emacs now uses GMP, the GNU Multiple Precision library. 28** Emacs now uses GMP, the GNU Multiple Precision library.
29By default, if 'configure' does not find a suitable libgmp, it 29By default, if 'configure' does not find a suitable libgmp, it
30arranges for the included mini-gmp library to be built and used. 30arranges for the included mini-gmp library to be built and used.
31The new 'configure' option '--without-libgmp' uses mini-gmp even if a 31The new configure option '--without-libgmp' uses mini-gmp even if a
32suitable libgmp is available. 32suitable libgmp is available.
33 33
34--- 34---
@@ -132,7 +132,7 @@ can enable it when configuring, e.g., './configure CFLAGS="-g3 -O2
132** Emacs now normally uses a C pointer type instead of a C integer 132** Emacs now normally uses a C pointer type instead of a C integer
133type to implement Lisp_Object, which is the fundamental machine word 133type to implement Lisp_Object, which is the fundamental machine word
134type internal to the Emacs Lisp interpreter. This change aims to 134type internal to the Emacs Lisp interpreter. This change aims to
135catch typos and supports '-fcheck-pointer-bounds'. The 'configure' 135catch typos and supports '-fcheck-pointer-bounds'. The configure
136option '--enable-check-lisp-object-type' is therefore no longer as 136option '--enable-check-lisp-object-type' is therefore no longer as
137useful and so is no longer enabled by default in developer builds, 137useful and so is no longer enabled by default in developer builds,
138to reduce differences between developer and production builds. 138to reduce differences between developer and production builds.
@@ -868,7 +868,7 @@ to allow controlling how the conversion to text is done.
868 868
869+++ 869+++
870*** The prefix key 's' was changed to 'c' for slicing commands 870*** The prefix key 's' was changed to 'c' for slicing commands
871to avoid conflicts with image-mode key 's'. The new key 'c' still 871to avoid conflicts with 'image-mode' key 's'. The new key 'c' still
872has good mnemonics of "cut", "clip", "crop". 872has good mnemonics of "cut", "clip", "crop".
873 873
874** Ido 874** Ido
@@ -2090,11 +2090,11 @@ variable for remote shells. It still defaults to "/bin/sh".
2090 2090
2091+++ 2091+++
2092*** New values of 'shell-command-dont-erase-buffer'. 2092*** New values of 'shell-command-dont-erase-buffer'.
2093This option can now have the value 'erase' to force to erase the 2093This user option can now have the value 'erase' to force to erase the
2094output buffer before execution of the command, even if the output goes 2094output buffer before execution of the command, even if the output goes
2095to the current buffer. Additional values 'beg-last-out', 2095to the current buffer. Additional values 'beg-last-out',
2096'end-last-out', and 'save-point' control where to put point in the 2096'end-last-out', and 'save-point' control where to put point in the
2097output buffer after inserting the shell-command output. 2097output buffer after inserting the 'shell-command' output.
2098 2098
2099--- 2099---
2100*** The new functions 'shell-command-save-pos-or-erase' and 2100*** The new functions 'shell-command-save-pos-or-erase' and
@@ -3538,9 +3538,9 @@ With a prefix argument, 'image-rotate' now rotates the image at point
3538By default, the image will resize upon first display and whenever the 3538By default, the image will resize upon first display and whenever the
3539window's dimensions change. Two user options 'image-auto-resize' and 3539window's dimensions change. Two user options 'image-auto-resize' and
3540'image-auto-resize-on-window-resize' control the resizing behavior 3540'image-auto-resize-on-window-resize' control the resizing behavior
3541(including the possibility to disable auto-resizing). A new key 3541(including the possibility to disable auto-resizing). A new prefix
3542prefix 's' contains the commands that can be used to fit the image to 3542key 's' contains the commands that can be used to fit the image to the
3543the window manually. 3543window manually.
3544 3544
3545--- 3545---
3546*** Some 'image-mode' variables are now buffer-local. 3546*** Some 'image-mode' variables are now buffer-local.
diff --git a/lisp/env.el b/lisp/env.el
index ca2a9773b4e..6de90385a35 100644
--- a/lisp/env.el
+++ b/lisp/env.el
@@ -68,10 +68,10 @@ with a character not a letter, digit or underscore; otherwise, enclose
68the entire variable name in braces. For instance, in `ab$cd-x', 68the entire variable name in braces. For instance, in `ab$cd-x',
69`$cd' is treated as an environment variable. 69`$cd' is treated as an environment variable.
70 70
71If WHEN-DEFINED is nil, references to undefined environment variables 71If WHEN-UNDEFINED is omitted or nil, references to undefined environment
72are replaced by the empty string; if it is a function, the function is called 72variables are replaced by the empty string; if it is a function, the
73with the variable name as argument and should return the text with which 73function is called with the variable's name as argument, and should return
74to replace it or nil to leave it unchanged. 74the text with which to replace it, or nil to leave it unchanged.
75If it is non-nil and not a function, references to undefined variables are 75If it is non-nil and not a function, references to undefined variables are
76left unchanged. 76left unchanged.
77 77
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index 57c8e730b83..1e2526f35ce 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -466,7 +466,8 @@ If this is set to nil, never try to reconnect."
466The length is specified in `erc-split-line-length'. 466The length is specified in `erc-split-line-length'.
467 467
468Currently this is called by `erc-send-input'." 468Currently this is called by `erc-send-input'."
469 (let ((charset (car (erc-coding-system-for-target nil)))) 469 (let* ((coding (erc-coding-system-for-target nil))
470 (charset (if (consp coding) (car coding) coding)))
470 (with-temp-buffer 471 (with-temp-buffer
471 (insert longline) 472 (insert longline)
472 ;; The line lengths are in octets, not characters (because these 473 ;; The line lengths are in octets, not characters (because these
diff --git a/lisp/image-mode.el b/lisp/image-mode.el
index 3ee185a0dc5..480b2e6b26e 100644
--- a/lisp/image-mode.el
+++ b/lisp/image-mode.el
@@ -505,16 +505,22 @@ call."
505 "--" 505 "--"
506 ["Fit Frame to Image" image-mode-fit-frame :active t 506 ["Fit Frame to Image" image-mode-fit-frame :active t
507 :help "Resize frame to match image"] 507 :help "Resize frame to match image"]
508 ["Fit Image to Window (Best Fit)" image-transform-fit-both
509 :help "Resize image to match the window height and width"]
508 ["Fit to Window Height" image-transform-fit-to-height 510 ["Fit to Window Height" image-transform-fit-to-height
509 :help "Resize image to match the window height"] 511 :help "Resize image to match the window height"]
510 ["Fit to Window Width" image-transform-fit-to-width 512 ["Fit to Window Width" image-transform-fit-to-width
511 :help "Resize image to match the window width"] 513 :help "Resize image to match the window width"]
512 ["Fit to Window Height and Width" image-transform-fit-both 514 ["Zoom In" image-increase-size
513 :help "Resize image to match the window height and width"] 515 :help "Enlarge the image"]
516 ["Zoom Out" image-decrease-size
517 :help "Shrink the image"]
514 ["Set Scale..." image-transform-set-scale 518 ["Set Scale..." image-transform-set-scale
515 :help "Resize image by specified scale factor"] 519 :help "Resize image by specified scale factor"]
516 ["Rotate Image..." image-transform-set-rotation 520 ["Rotate Clockwise" image-rotate
517 :help "Rotate the image"] 521 :help "Rotate the image"]
522 ["Set Rotation..." image-transform-set-rotation
523 :help "Set rotation angle of the image"]
518 ["Reset Transformations" image-transform-reset 524 ["Reset Transformations" image-transform-reset
519 :help "Reset all image transformations"] 525 :help "Reset all image transformations"]
520 "--" 526 "--"
@@ -524,10 +530,10 @@ call."
524 (image-dired default-directory)) 530 (image-dired default-directory))
525 :active default-directory 531 :active default-directory
526 :help "Show thumbnails for all images in this directory"] 532 :help "Show thumbnails for all images in this directory"]
527 ["Next Image" image-next-file :active buffer-file-name
528 :help "Move to next image in this directory"]
529 ["Previous Image" image-previous-file :active buffer-file-name 533 ["Previous Image" image-previous-file :active buffer-file-name
530 :help "Move to previous image in this directory"] 534 :help "Move to previous image in this directory"]
535 ["Next Image" image-next-file :active buffer-file-name
536 :help "Move to next image in this directory"]
531 ["Copy File Name" image-mode-copy-file-name-as-kill 537 ["Copy File Name" image-mode-copy-file-name-as-kill
532 :active buffer-file-name 538 :active buffer-file-name
533 :help "Copy the current file name to the kill ring"] 539 :help "Copy the current file name to the kill ring"]
@@ -565,10 +571,10 @@ call."
565 ["Reset Animation Speed" image-reset-speed 571 ["Reset Animation Speed" image-reset-speed
566 :active image-multi-frame 572 :active image-multi-frame
567 :help "Reset the speed of this image's animation"] 573 :help "Reset the speed of this image's animation"]
568 ["Next Frame" image-next-frame :active image-multi-frame
569 :help "Show the next frame of this image"]
570 ["Previous Frame" image-previous-frame :active image-multi-frame 574 ["Previous Frame" image-previous-frame :active image-multi-frame
571 :help "Show the previous frame of this image"] 575 :help "Show the previous frame of this image"]
576 ["Next Frame" image-next-frame :active image-multi-frame
577 :help "Show the next frame of this image"]
572 ["Goto Frame..." image-goto-frame :active image-multi-frame 578 ["Goto Frame..." image-goto-frame :active image-multi-frame
573 :help "Show a specific frame of this image"] 579 :help "Show a specific frame of this image"]
574 )) 580 ))
diff --git a/lisp/isearch.el b/lisp/isearch.el
index e13a4dda83f..81e83d79509 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -319,7 +319,7 @@ this variable is set to the symbol `all-windows'."
319 "Show match numbers in the search prompt. 319 "Show match numbers in the search prompt.
320When both this option and `isearch-lazy-highlight' are non-nil, 320When both this option and `isearch-lazy-highlight' are non-nil,
321show the current match number and the total number of matches 321show the current match number and the total number of matches
322in the buffer (or its restriction)." 322in the buffer (or its restriction), including all hidden matches."
323 :type 'boolean 323 :type 'boolean
324 :group 'lazy-count 324 :group 'lazy-count
325 :group 'isearch 325 :group 'isearch
@@ -3869,7 +3869,10 @@ Attempt to do the search exactly the way the pending Isearch would."
3869 (isearch-regexp-lax-whitespace 3869 (isearch-regexp-lax-whitespace
3870 isearch-lazy-highlight-regexp-lax-whitespace) 3870 isearch-lazy-highlight-regexp-lax-whitespace)
3871 (isearch-forward isearch-lazy-highlight-forward) 3871 (isearch-forward isearch-lazy-highlight-forward)
3872 (search-invisible nil) ; don't match invisible text 3872 ;; Don't match invisible text unless it can be opened
3873 ;; or when counting matches and user can visit hidden matches
3874 (search-invisible (or (eq search-invisible 'open)
3875 (and isearch-lazy-count search-invisible)))
3873 (retry t) 3876 (retry t)
3874 (success nil)) 3877 (success nil))
3875 ;; Use a loop like in `isearch-search'. 3878 ;; Use a loop like in `isearch-search'.
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 30ed1a4cf68..ce6d8c33dd1 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -87,10 +87,11 @@
87 87
88 88
89(defcustom tab-bar-select-tab-modifiers '() 89(defcustom tab-bar-select-tab-modifiers '()
90 "List of key modifiers for selecting a tab by its index digit. 90 "List of modifier keys for selecting a tab by its index digit.
91Possible modifiers are `control', `meta', `shift', `hyper', `super' and 91Possible modifier keys are `control', `meta', `shift', `hyper', `super' and
92`alt'." 92`alt'. To help you to select a tab by its number, you can customize
93 :type '(set :tag "Tab selection key modifiers" 93`tab-bar-tab-hints' that will show tab numbers alongside the tab name."
94 :type '(set :tag "Tab selection modifier keys"
94 (const control) 95 (const control)
95 (const meta) 96 (const meta)
96 (const shift) 97 (const shift)
@@ -310,7 +311,8 @@ If nil, don't show it at all."
310 311
311(defcustom tab-bar-tab-hints nil 312(defcustom tab-bar-tab-hints nil
312 "Show absolute numbers on tabs in the tab bar before the tab name. 313 "Show absolute numbers on tabs in the tab bar before the tab name.
313This helps to select the tab by its number using `tab-bar-select-tab'." 314This helps to select the tab by its number using `tab-bar-select-tab'
315and `tab-bar-select-tab-modifiers'."
314 :type 'boolean 316 :type 'boolean
315 :initialize 'custom-initialize-default 317 :initialize 'custom-initialize-default
316 :set (lambda (sym val) 318 :set (lambda (sym val)
@@ -563,9 +565,10 @@ Return its existing value or a new value."
563 565
564(defun tab-bar-select-tab (&optional arg) 566(defun tab-bar-select-tab (&optional arg)
565 "Switch to the tab by its absolute position ARG in the tab bar. 567 "Switch to the tab by its absolute position ARG in the tab bar.
566When this command is bound to a numeric key (with a prefix or modifier), 568When this command is bound to a numeric key (with a prefix or modifier key
567calling it without an argument will translate its bound numeric key 569using `tab-bar-select-tab-modifiers'), calling it without an argument
568to the numeric argument. ARG counts from 1." 570will translate its bound numeric key to the numeric argument.
571ARG counts from 1."
569 (interactive "P") 572 (interactive "P")
570 (unless (integerp arg) 573 (unless (integerp arg)
571 (let ((key (event-basic-type last-command-event))) 574 (let ((key (event-basic-type last-command-event)))
@@ -664,7 +667,10 @@ to the numeric argument. ARG counts from 1."
664 (message "No more recent tabs")))) 667 (message "No more recent tabs"))))
665 668
666(defun tab-bar-switch-to-tab (name) 669(defun tab-bar-switch-to-tab (name)
667 "Switch to the tab by NAME." 670 "Switch to the tab by NAME.
671Default values are tab names sorted by recency, so you can use \
672\\<minibuffer-local-map>\\[next-history-element]
673to get the name of the last visited tab, the second last, and so on."
668 (interactive 674 (interactive
669 (let* ((recent-tabs (mapcar (lambda (tab) 675 (let* ((recent-tabs (mapcar (lambda (tab)
670 (alist-get 'name tab)) 676 (alist-get 'name tab))
@@ -789,7 +795,7 @@ After the tab is created, the hooks in
789 (pcase tab-bar-new-tab-to 795 (pcase tab-bar-new-tab-to
790 ('leftmost 0) 796 ('leftmost 0)
791 ('rightmost (length tabs)) 797 ('rightmost (length tabs))
792 ('left (1- (or from-index 1))) 798 ('left (or from-index 1))
793 ('right (1+ (or from-index 0))) 799 ('right (1+ (or from-index 0)))
794 ((pred functionp) 800 ((pred functionp)
795 (funcall tab-bar-new-tab-to)))))) 801 (funcall tab-bar-new-tab-to))))))
@@ -920,7 +926,7 @@ for the last tab on a frame is determined by
920 ;; Select another tab before deleting the current tab 926 ;; Select another tab before deleting the current tab
921 (let ((to-index (or (if to-index (1- to-index)) 927 (let ((to-index (or (if to-index (1- to-index))
922 (pcase tab-bar-close-tab-select 928 (pcase tab-bar-close-tab-select
923 ('left (1- current-index)) 929 ('left (1- (if (< current-index 1) 2 current-index)))
924 ('right (if (> (length tabs) (1+ current-index)) 930 ('right (if (> (length tabs) (1+ current-index))
925 (1+ current-index) 931 (1+ current-index)
926 (1- current-index))) 932 (1- current-index)))
@@ -1004,7 +1010,7 @@ for the last tab on a frame is determined by
1004 (unless (eq frame (selected-frame)) 1010 (unless (eq frame (selected-frame))
1005 (select-frame-set-input-focus frame)) 1011 (select-frame-set-input-focus frame))
1006 1012
1007 (let ((tabs (tab-bar-tabs))) 1013 (let ((tabs (funcall tab-bar-tabs-function)))
1008 (setq index (max 0 (min index (length tabs)))) 1014 (setq index (max 0 (min index (length tabs))))
1009 (cl-pushnew tab (nthcdr index tabs)) 1015 (cl-pushnew tab (nthcdr index tabs))
1010 (when (eq index 0) 1016 (when (eq index 0)
@@ -1102,6 +1108,8 @@ function `tab-bar-tab-name-function'."
1102 (setq tab-bar-history-omit nil))) 1108 (setq tab-bar-history-omit nil)))
1103 1109
1104(defun tab-bar-history-back () 1110(defun tab-bar-history-back ()
1111 "Restore a previous window configuration used in the current tab.
1112This navigates back in the history of window configurations."
1105 (interactive) 1113 (interactive)
1106 (setq tab-bar-history-omit t) 1114 (setq tab-bar-history-omit t)
1107 (let* ((history (pop (gethash (selected-frame) tab-bar-history-back))) 1115 (let* ((history (pop (gethash (selected-frame) tab-bar-history-back)))
@@ -1119,6 +1127,8 @@ function `tab-bar-tab-name-function'."
1119 (message "No more tab back history")))) 1127 (message "No more tab back history"))))
1120 1128
1121(defun tab-bar-history-forward () 1129(defun tab-bar-history-forward ()
1130 "Cancel restoration of the previous window configuration.
1131This navigates forward in the history of window configurations."
1122 (interactive) 1132 (interactive)
1123 (setq tab-bar-history-omit t) 1133 (setq tab-bar-history-omit t)
1124 (let* ((history (pop (gethash (selected-frame) tab-bar-history-forward))) 1134 (let* ((history (pop (gethash (selected-frame) tab-bar-history-forward)))
@@ -1136,7 +1146,9 @@ function `tab-bar-tab-name-function'."
1136 (message "No more tab forward history")))) 1146 (message "No more tab forward history"))))
1137 1147
1138(define-minor-mode tab-bar-history-mode 1148(define-minor-mode tab-bar-history-mode
1139 "Toggle tab history mode for the tab bar." 1149 "Toggle tab history mode for the tab bar.
1150Tab history mode remembers window configurations used in every tab,
1151and can restore them."
1140 :global t :group 'tab-bar 1152 :global t :group 'tab-bar
1141 (if tab-bar-history-mode 1153 (if tab-bar-history-mode
1142 (progn 1154 (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'."
474 "Template for displaying tab line for selected window." 474 "Template for displaying tab line for selected window."
475 (let* ((tabs (funcall tab-line-tabs-function)) 475 (let* ((tabs (funcall tab-line-tabs-function))
476 (cache-key (list tabs 476 (cache-key (list tabs
477 ;; handle buffer renames
477 (buffer-name (window-buffer)) 478 (buffer-name (window-buffer))
478 (window-parameter nil 'tab-line-hscroll))) 479 ;; handle tab-line scrolling
480 (window-parameter nil 'tab-line-hscroll)
481 ;; for setting face 'tab-line-tab-current'
482 (eq (selected-window) (old-selected-window))))
479 (cache (window-parameter nil 'tab-line-cache))) 483 (cache (window-parameter nil 'tab-line-cache)))
480 ;; Enable auto-hscroll again after it was disabled on manual scrolling. 484 ;; Enable auto-hscroll again after it was disabled on manual scrolling.
481 ;; The moment to enable it is when the window-buffer was updated. 485 ;; The moment to enable it is when the window-buffer was updated.
diff --git a/src/term.c b/src/term.c
index a3aef31ec25..94bf013f4a0 100644
--- a/src/term.c
+++ b/src/term.c
@@ -563,8 +563,8 @@ encode_terminal_code (struct glyph *src, int src_len,
563 { 563 {
564 cmp = composition_table[src->u.cmp.id]; 564 cmp = composition_table[src->u.cmp.id];
565 required = cmp->glyph_len; 565 required = cmp->glyph_len;
566 required *= MAX_MULTIBYTE_LENGTH;
567 } 566 }
567 required *= MAX_MULTIBYTE_LENGTH;
568 568
569 if (encode_terminal_src_size - nbytes < required) 569 if (encode_terminal_src_size - nbytes < required)
570 { 570 {
diff --git a/test/lisp/simple-tests.el b/test/lisp/simple-tests.el
index fa71e26d21e..88be74fd2cc 100644
--- a/test/lisp/simple-tests.el
+++ b/test/lisp/simple-tests.el
@@ -757,7 +757,7 @@ See Bug#21722."
757;;; Tests for shell-command-dont-erase-buffer 757;;; Tests for shell-command-dont-erase-buffer
758 758
759(defmacro with-shell-command-dont-erase-buffer (str output-buffer-is-current &rest body) 759(defmacro with-shell-command-dont-erase-buffer (str output-buffer-is-current &rest body)
760 (declare (debug (form &body)) (indent 2)) 760 (declare (debug (sexp form body)) (indent 2))
761 (let ((expected (make-symbol "expected")) 761 (let ((expected (make-symbol "expected"))
762 (command (make-symbol "command")) 762 (command (make-symbol "command"))
763 (caller-buf (make-symbol "caller-buf")) 763 (caller-buf (make-symbol "caller-buf"))
@@ -766,8 +766,9 @@ See Bug#21722."
766 (,output-buf (if ,output-buffer-is-current ,caller-buf 766 (,output-buf (if ,output-buffer-is-current ,caller-buf
767 (generate-new-buffer "output-buf"))) 767 (generate-new-buffer "output-buf")))
768 (emacs (expand-file-name invocation-name invocation-directory)) 768 (emacs (expand-file-name invocation-name invocation-directory))
769 (,command (format "%s -Q --batch --eval \"(princ \\\"%s\\\")\"" 769 (,command
770 emacs ,str)) 770 (format "%s -Q --batch --eval %s"
771 emacs (shell-quote-argument (format "(princ %S)" ,str))))
771 (inhibit-message t)) 772 (inhibit-message t))
772 (unwind-protect 773 (unwind-protect
773 ;; Feature must work the same regardless how we specify the 2nd arg of `shell-command', ie, 774 ;; Feature must work the same regardless how we specify the 2nd arg of `shell-command', ie,
@@ -787,7 +788,7 @@ See Bug#21722."
787 788
788(ert-deftest simple-tests-shell-command-39067 () 789(ert-deftest simple-tests-shell-command-39067 ()
789 "The output buffer is erased or not according to `shell-command-dont-erase-buffer'." 790 "The output buffer is erased or not according to `shell-command-dont-erase-buffer'."
790 (let ((str "foo\n")) 791 (let ((str "foo\\n"))
791 (dolist (output-current '(t nil)) 792 (dolist (output-current '(t nil))
792 (with-shell-command-dont-erase-buffer str output-current 793 (with-shell-command-dont-erase-buffer str output-current
793 (let ((expected (cond ((eq shell-command-dont-erase-buffer 'erase) str) 794 (let ((expected (cond ((eq shell-command-dont-erase-buffer 'erase) str)
@@ -799,7 +800,7 @@ See Bug#21722."
799 800
800(ert-deftest simple-tests-shell-command-dont-erase-buffer () 801(ert-deftest simple-tests-shell-command-dont-erase-buffer ()
801 "The point is set at the expected position after execution of the command." 802 "The point is set at the expected position after execution of the command."
802 (let* ((str "foo\n") 803 (let* ((str "foo\\n")
803 (expected-point `((beg-last-out . ,(1+ (length str))) 804 (expected-point `((beg-last-out . ,(1+ (length str)))
804 (end-last-out . ,(1+ (* 2 (length str)))) 805 (end-last-out . ,(1+ (* 2 (length str))))
805 (save-point . 1)))) 806 (save-point . 1))))