aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Morris2021-10-04 08:13:11 -0700
committerGlenn Morris2021-10-04 08:13:11 -0700
commite0fdb68f8ccb1c870bfb8c3cd2bf786a0bb312b6 (patch)
treec196f5f691ae5ad5d732f49af358768eaf9141ef
parentf0e6b47ef0a5ee15568e0b3992352d00d1055f46 (diff)
parent3b8dda6c903e8e103a26ce812fc9400b301a09ae (diff)
downloademacs-e0fdb68f8ccb1c870bfb8c3cd2bf786a0bb312b6.tar.gz
emacs-e0fdb68f8ccb1c870bfb8c3cd2bf786a0bb312b6.zip
Merge from origin/emacs-28
3b8dda6c90 Add safety check in x_menu_show e1fb731393 Tweak x_connection_closed when I/O error 595e506c82 * lisp/erc/erc.el (erc-user-mode): Set "+i" by default. d00f3d4c05 Port unused decls to C2x 317eb2d5b5 Improve structure of TODO c0793cd9de Don't use some obsolete names in documentation 87153cc915 Tweak x_hide_tip for consistency 7e871dcd27 Remove encode_terminal_code UNINITs 2a00634880 Port pdumper.c maybe_unused to C2x 6d9b3c0eaa Port systhreads.h to C2x fd274d7d24 Pacify -Wanalyzer-null-argument in lisp_malloc cc3fc94f09 Pacify gcc 11.2.1 -Wanalyzer-null-argument d3a832a61a Simplify hack-read-symbol-shorthands again (bug#50946) 4831426158 Fix recipe for 'native-lisp' directory 0bb42ef803 ; * lisp/time-stamp.el (time-stamp-format): Doc string. 732c70a0d9 Simplify socket symlink-attack checking fc32a3bd95 ; * doc/lispref/files.texi (Reading from Files): Fix wording. 3cc77aa976 Clarify (elisp) insert-file-contents with BEG or END not o... 5deeb0947d * src/Makefile.in: Simplify conditionals. 121a5abeae Move context-menu selection items Defun/List/Symbol to pro... 0c341e6e84 * lisp/tab-bar.el (tab-bar-detach-tab): Handle frame selec... 931a7276c0 * lisp/tab-line.el (tab-line-format): Add face-modified to... 3863919a00 Fix unmounting in Tramp 7a6d34cd1f * etc/themes/light-blue-theme.el: Add "Maintainer: emacs-d... c1b1e1f545 Define HAVE_NATIVE_COMP in src/Makefile.in 137fa2d716 Rename elisp-shorthands to read-symbol-shorthands e6fbc45b7b Font-lock shorthands in elisp-mode for quick visual recogn... 17e6f3bee5 ; Fix last change in tramp-sshfs.el 3dae1e33d1 Suppress superfluous error messages in Tramp b228ec9fab Fix reading the tail of a file in shorthands.el 7fb2789509 Fix substitution of pretty quotes in code in easy-mmode b47d7ce1b8 Fix agent directory deletion b1a8a66fb0 ; * etc/TODO: Fix previous commit; delete the right thing. 6c01a21365 Clarify the purpose of internal--format-docstring-line 55dadbc57e * lisp/net/dictionary.el (context-menu-dictionary): Move m... bb209cd5ab Update to Org 9.5-30-g10dc9d 4341e79a5f Remove bogus ":safe t" custom properties b6f6b593c6 Fix 'apropos-compact-layout' 62d6cecfcd Remove bogus ":safe nil" custom properties f9111d8784 The safe-local-variable property is a function (bug#50944) 3dc094abee ; Some minor tweaks to TODO a5b4356d37 Revert "; * etc/TODO: Move elpa.gnu.org items to the end." 7bc0cee115 Revert "* etc/TODO: Rearrange to start with "Simple tasks"." 3489471417 Fix selection of fonts for Arabic on Posix platforms 13e5943386 ; Fix a typo in a doc string bd60fca2fa Fix ox-koma-letter compilation warnings 340e527bed Preload paren.el a9052248da Improve documentation of 'shift-select-mode' d505971894 ; Standardize some license headers 9307889d68 Simplify shorthand injection (bug#50946) 5c77cc9584 ; * admin/release-branch.txt: Tweak previous. # Conflicts: # etc/NEWS # test/lisp/subr-tests.el
-rw-r--r--admin/notes/bugtracker2
-rw-r--r--admin/notes/multi-tty2
-rw-r--r--admin/release-branch.txt3
-rw-r--r--doc/emacs/mark.texi7
-rw-r--r--doc/lispintro/emacs-lisp-intro.texi7
-rw-r--r--doc/lispref/files.texi21
-rw-r--r--doc/lispref/hooks.texi1
-rw-r--r--doc/lispref/symbols.texi18
-rw-r--r--doc/misc/efaq.texi3
-rw-r--r--doc/misc/gnus.texi4
-rw-r--r--doc/misc/reftex.texi26
-rw-r--r--doc/misc/speedbar.texi6
-rw-r--r--doc/misc/tramp.texi5
-rw-r--r--etc/NEWS.285
-rw-r--r--etc/TODO77
-rw-r--r--etc/org/csl/README10
-rw-r--r--etc/org/csl/chicago-author-date.csl658
-rw-r--r--etc/org/csl/locales-en-US.xml357
-rw-r--r--etc/themes/light-blue-theme.el1
-rw-r--r--lib-src/emacsclient.c13
-rw-r--r--lisp/Makefile.in15
-rw-r--r--lisp/emacs-lisp/cl-macs.el8
-rw-r--r--lisp/emacs-lisp/easy-mmode.el6
-rw-r--r--lisp/erc/erc.el6
-rw-r--r--lisp/files.el2
-rw-r--r--lisp/gnus/gnus-agent.el31
-rw-r--r--lisp/international/fontset.el4
-rw-r--r--lisp/international/mule.el55
-rw-r--r--lisp/loadup.el6
-rw-r--r--lisp/mouse.el13
-rw-r--r--lisp/net/dictionary.el8
-rw-r--r--lisp/net/tramp-cache.el28
-rw-r--r--lisp/net/tramp-fuse.el51
-rw-r--r--lisp/net/tramp-rclone.el1
-rw-r--r--lisp/net/tramp-sshfs.el14
-rw-r--r--lisp/net/tramp.el28
-rw-r--r--lisp/org/ob-gnuplot.el2
-rw-r--r--lisp/org/ob-julia.el50
-rw-r--r--lisp/org/oc-basic.el20
-rw-r--r--lisp/org/oc-biblatex.el10
-rw-r--r--lisp/org/oc-csl.el51
-rw-r--r--lisp/org/oc-natbib.el11
-rw-r--r--lisp/org/oc.el31
-rw-r--r--lisp/org/ol-doi.el10
-rw-r--r--lisp/org/ol.el18
-rw-r--r--lisp/org/org-keys.el5
-rw-r--r--lisp/org/org-macs.el9
-rw-r--r--lisp/org/org-num.el3
-rw-r--r--lisp/org/org-src.el19
-rw-r--r--lisp/org/org-version.el2
-rw-r--r--lisp/org/org.el3
-rw-r--r--lisp/org/ox-html.el4
-rw-r--r--lisp/org/ox-koma-letter.el8
-rw-r--r--lisp/org/ox-latex.el4
-rw-r--r--lisp/progmodes/elisp-mode.el12
-rw-r--r--lisp/progmodes/prog-mode.el22
-rw-r--r--lisp/progmodes/which-func.el3
-rw-r--r--lisp/shorthands.el80
-rw-r--r--lisp/subr.el4
-rw-r--r--lisp/tab-bar.el26
-rw-r--r--lisp/tab-line.el5
-rw-r--r--lisp/textmodes/etc-authors-mode.el8
-rw-r--r--lisp/textmodes/fill.el2
-rw-r--r--lisp/textmodes/reftex-cite.el4
-rw-r--r--lisp/textmodes/reftex-ref.el4
-rw-r--r--lisp/textmodes/text-mode.el25
-rw-r--r--lisp/textmodes/tildify.el4
-rw-r--r--lisp/time-stamp.el2
-rw-r--r--src/Makefile.in25
-rw-r--r--src/alloc.c5
-rw-r--r--src/conf_post.h1
-rw-r--r--src/gtkutil.c5
-rw-r--r--src/lread.c26
-rw-r--r--src/pdumper.c20
-rw-r--r--src/process.c2
-rw-r--r--src/systhread.h13
-rw-r--r--src/term.c7
-rw-r--r--src/unexcw.c6
-rw-r--r--src/xfns.c16
-rw-r--r--src/xmenu.c8
-rw-r--r--src/xterm.c5
-rw-r--r--test/lisp/net/tramp-tests.el6
-rw-r--r--test/lisp/progmodes/elisp-mode-resources/simple-shorthand-test.el16
-rw-r--r--test/lisp/progmodes/elisp-mode-tests.el4
-rw-r--r--test/lisp/subr-tests.el15
85 files changed, 1670 insertions, 473 deletions
diff --git a/admin/notes/bugtracker b/admin/notes/bugtracker
index 9eb65e1f864..deb06f552cc 100644
--- a/admin/notes/bugtracker
+++ b/admin/notes/bugtracker
@@ -84,7 +84,7 @@ generate a new report. The only time to send mail to the bug list
84address is to create a new report. 84address is to create a new report.
85 85
86Gnus users can add the following to message-dont-reply-to-names; 86Gnus users can add the following to message-dont-reply-to-names;
87similarly with Rmail and rmail-dont-reply-to-names: 87similarly with Rmail and mail-dont-reply-to-names:
88 88
89"\\(emacs-pretest-bug\\|bug-gnu-emacs\\|bug-\\(e\\|gnu\\)macs\\)@gnu\\.org\\|\ 89"\\(emacs-pretest-bug\\|bug-gnu-emacs\\|bug-\\(e\\|gnu\\)macs\\)@gnu\\.org\\|\
90\\(submit\\|control\\|owner\\)@debbugs\\.gnu\\.org" 90\\(submit\\|control\\|owner\\)@debbugs\\.gnu\\.org"
diff --git a/admin/notes/multi-tty b/admin/notes/multi-tty
index 1a337b9d799..fa4df820ae4 100644
--- a/admin/notes/multi-tty
+++ b/admin/notes/multi-tty
@@ -474,7 +474,7 @@ THINGS TO DO
474 definition. 474 definition.
475 475
476 Exceptions found so far: x-select-text and 476 Exceptions found so far: x-select-text and
477 x-cut-buffer-or-selection-value. 477 x-selection-value (old name: x-cut-buffer-or-selection-value).
478 478
479** Have a look at fatal_error_hook. 479** Have a look at fatal_error_hook.
480 480
diff --git a/admin/release-branch.txt b/admin/release-branch.txt
index 3318d8de806..0c393a9eccb 100644
--- a/admin/release-branch.txt
+++ b/admin/release-branch.txt
@@ -3,7 +3,8 @@ Instructions for cutting the Emacs release branch
31. In the clone of the Emacs Git repository, switch to the 'master' 31. In the clone of the Emacs Git repository, switch to the 'master'
4 branch, "git pull", and build it (using 'make bootstrap') to make 4 branch, "git pull", and build it (using 'make bootstrap') to make
5 sure it's not broken. Run 'make check-expensive' and ensure all 5 sure it's not broken. Run 'make check-expensive' and ensure all
6 tests pass. 6 tests pass. (Alternatively, verify that the automated build
7 servers are showing success for the latest revision.)
7 8
82. Create the release branch and switch to it. Assuming that it is 92. Create the release branch and switch to it. Assuming that it is
9 for releasing Emacs versions XY.1, XY.2, etc., the command is: 10 for releasing Emacs versions XY.1, XY.2, etc., the command is:
diff --git a/doc/emacs/mark.texi b/doc/emacs/mark.texi
index 20cb8ee2c65..2461cb0f6af 100644
--- a/doc/emacs/mark.texi
+++ b/doc/emacs/mark.texi
@@ -409,9 +409,14 @@ region by dragging the mouse, you can continue to extend the region
409using shifted cursor motion commands. In either case, any unshifted 409using shifted cursor motion commands. In either case, any unshifted
410cursor motion command deactivates the mark. 410cursor motion command deactivates the mark.
411 411
412@vindex shift-select-mode
412 To turn off shift-selection, set @code{shift-select-mode} to 413 To turn off shift-selection, set @code{shift-select-mode} to
413@code{nil}. Doing so does not disable setting the mark via mouse 414@code{nil}. Doing so does not disable setting the mark via mouse
414commands. 415commands. If you set @code{shift-select-mode} to the value
416@code{permanent}, cursor motion keys that were not shift-translated
417will not deactivate the mark, so, for example, the region set by prior
418commands can be extended by shift-selection, and unshifted cursor
419motion keys will extend the region set by shift-selection.
415 420
416@node Disabled Transient Mark 421@node Disabled Transient Mark
417@section Disabling Transient Mark Mode 422@section Disabling Transient Mark Mode
diff --git a/doc/lispintro/emacs-lisp-intro.texi b/doc/lispintro/emacs-lisp-intro.texi
index 7c7005b3483..9dbf854171c 100644
--- a/doc/lispintro/emacs-lisp-intro.texi
+++ b/doc/lispintro/emacs-lisp-intro.texi
@@ -4201,7 +4201,7 @@ times.
4201 4201
4202The part of the buffer between point and mark is called @dfn{the 4202The part of the buffer between point and mark is called @dfn{the
4203region}. Numerous commands work on the region, including 4203region}. Numerous commands work on the region, including
4204@code{center-region}, @code{count-lines-region}, @code{kill-region}, and 4204@code{center-region}, @code{count-words-region}, @code{kill-region}, and
4205@code{print-region}. 4205@code{print-region}.
4206 4206
4207The @code{save-excursion} special form saves the location of point and 4207The @code{save-excursion} special form saves the location of point and
@@ -4214,7 +4214,7 @@ evaluated.
4214 4214
4215In Emacs, a function frequently moves point as part of its internal 4215In Emacs, a function frequently moves point as part of its internal
4216workings even though a user would not expect this. For example, 4216workings even though a user would not expect this. For example,
4217@code{count-lines-region} moves point. To prevent the user from being 4217@code{count-words-region} moves point. To prevent the user from being
4218bothered by jumps that are both unexpected and (from the user's point of 4218bothered by jumps that are both unexpected and (from the user's point of
4219view) unnecessary, @code{save-excursion} is often used to keep point in 4219view) unnecessary, @code{save-excursion} is often used to keep point in
4220the location expected by the user. The use of 4220the location expected by the user. The use of
@@ -13473,8 +13473,7 @@ The template for an interactive function definition is, as always:
13473 13473
13474What we need to do is fill in the slots. 13474What we need to do is fill in the slots.
13475 13475
13476The name of the function should be self-explanatory and similar to the 13476The name of the function should be self-explanatory and easy
13477existing @code{count-lines-region} name. This makes the name easier
13478to remember. @code{count-words-region} is the obvious choice. Since 13477to remember. @code{count-words-region} is the obvious choice. Since
13479that name is now used for the standard Emacs command to count words, we 13478that name is now used for the standard Emacs command to count words, we
13480will name our implementation @code{@value{COUNT-WORDS}}. 13479will name our implementation @code{@value{COUNT-WORDS}}.
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index 2dc808e6945..1e05153f3c0 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -563,7 +563,17 @@ In this case, @var{visit} must be @code{nil}. For example,
563@end example 563@end example
564 564
565@noindent 565@noindent
566inserts the first 500 characters of a file. 566inserts the characters coded by the first 500 bytes of a file.
567
568If @var{beg} or @var{end} happens to be in the middle of a character's
569multibyte sequence, Emacs's character code conversion will insert one
570or more eight-bit characters (a.k.a.@: ``raw bytes'')
571(@pxref{Character Sets}) into the buffer. If you want to read part of
572a file this way, we recommend to bind @code{coding-system-for-read} to
573a suitable value around the call to this function (@pxref{Specifying
574Coding Systems}), and to write Lisp code which will check for raw
575bytes at the boundaries, read the entire sequence of these bytes, and
576convert them back to valid characters.
567 577
568If the argument @var{replace} is non-@code{nil}, it means to replace the 578If the argument @var{replace} is non-@code{nil}, it means to replace the
569contents of the buffer (actually, just the accessible portion) with the 579contents of the buffer (actually, just the accessible portion) with the
@@ -577,10 +587,11 @@ with @code{insert-file-contents}, as long as @var{replace} and
577@end defun 587@end defun
578 588
579@defun insert-file-contents-literally filename &optional visit beg end replace 589@defun insert-file-contents-literally filename &optional visit beg end replace
580This function works like @code{insert-file-contents} except that it 590This function works like @code{insert-file-contents} except that each
581does not run @code{after-insert-file-functions}, and does not do 591byte in the file is handled separately, being converted into an
582format decoding, character code conversion, automatic uncompression, 592eight-bit character if needed. It does not run
583and so on. 593@code{after-insert-file-functions}, and does not do format decoding,
594character code conversion, automatic uncompression, and so on.
584@end defun 595@end defun
585 596
586If you want to pass a file name to another process so that another 597If you want to pass a file name to another process so that another
diff --git a/doc/lispref/hooks.texi b/doc/lispref/hooks.texi
index 394928454b0..feec8b24f46 100644
--- a/doc/lispref/hooks.texi
+++ b/doc/lispref/hooks.texi
@@ -262,7 +262,6 @@ after-set-visited-file-name-hook
262auto-coding-functions 262auto-coding-functions
263choose-completion-string-functions 263choose-completion-string-functions
264completing-read-function 264completing-read-function
265completion-annotate-function
266completion-at-point-functions 265completion-at-point-functions
267completion-list-insert-choice-function 266completion-list-insert-choice-function
268deactivate-current-input-method-function 267deactivate-current-input-method-function
diff --git a/doc/lispref/symbols.texi b/doc/lispref/symbols.texi
index 8ae2d1fc88b..9c33e2c8ec2 100644
--- a/doc/lispref/symbols.texi
+++ b/doc/lispref/symbols.texi
@@ -666,7 +666,7 @@ different things. However, this practice commonly originates very
666long symbols names, which are inconvenient to type and read after a 666long symbols names, which are inconvenient to type and read after a
667while. Shorthands solve these issues in a clean way. 667while. Shorthands solve these issues in a clean way.
668 668
669@defvar elisp-shorthands 669@defvar read-symbol-shorthands
670This variable's value is an alist whose elements have the form 670This variable's value is an alist whose elements have the form
671@code{(@var{shorthand-prefix} . @var{longhand-prefix})}. Each element 671@code{(@var{shorthand-prefix} . @var{longhand-prefix})}. Each element
672instructs the Lisp reader to read every symbol form which starts with 672instructs the Lisp reader to read every symbol form which starts with
@@ -704,7 +704,7 @@ alleviate that.
704 (snu-split "\\(\r\n\\|[\n\r]\\)" s)) 704 (snu-split "\\(\r\n\\|[\n\r]\\)" s))
705 705
706;; Local Variables: 706;; Local Variables:
707;; elisp-shorthands: (("snu-" . "some-nice-string-utils-")) 707;; read-symbol-shorthands: (("snu-" . "some-nice-string-utils-"))
708;; End: 708;; End:
709@end lisp 709@end lisp
710 710
@@ -719,19 +719,19 @@ waiting for ElDoc (@pxref{Lisp Doc, , Local Variables in Files, emacs,
719The GNU Emacs Manual}) to hint at the true full name of the symbol 719The GNU Emacs Manual}) to hint at the true full name of the symbol
720under point in the echo area. 720under point in the echo area.
721 721
722Since @code{elisp-shorthands} is a file-local variable, it is possible 722Since @code{read-symbol-shorthands} is a file-local variable, it is
723that multiple libraries depending on 723possible that multiple libraries depending on
724@file{some-nice-string-utils-lines.el} refer to the same symbols under 724@file{some-nice-string-utils-lines.el} refer to the same symbols under
725@emph{different} shorthands, or not using shorthands at all. In the 725@emph{different} shorthands, or not using shorthands at all. In the
726next example, the @file{my-tricks.el} library refers to the 726next example, the @file{my-tricks.el} library refers to the symbol
727symbol @code{some-nice-string-utils-lines} using the 727@code{some-nice-string-utils-lines} using the @code{sns-} prefix
728@code{sns-} prefix instead of @code{snu-}. 728instead of @code{snu-}.
729 729
730@example 730@example
731(defun t-reverse-lines (s) (string-join (reverse (sns-lines s)) "\n") 731(defun t-reverse-lines (s) (string-join (reverse (sns-lines s)) "\n")
732 732
733;; Local Variables: 733;; Local Variables:
734;; elisp-shorthands: (("t-" . "my-tricks-") 734;; read-symbol-shorthands: (("t-" . "my-tricks-")
735;; ("sns-" . "some-nice-string-utils-")) 735;; ("sns-" . "some-nice-string-utils-"))
736;; End: 736;; End:
737@end example 737@end example
diff --git a/doc/misc/efaq.texi b/doc/misc/efaq.texi
index f80ccc080a0..18342e65b0a 100644
--- a/doc/misc/efaq.texi
+++ b/doc/misc/efaq.texi
@@ -4136,9 +4136,6 @@ You can get the old behavior by binding @kbd{SPC} to
4136@lisp 4136@lisp
4137(define-key minibuffer-local-filename-completion-map (kbd "SPC") 4137(define-key minibuffer-local-filename-completion-map (kbd "SPC")
4138 'minibuffer-complete-word) 4138 'minibuffer-complete-word)
4139
4140(define-key minibuffer-local-filename-must-match-map (kbd "SPC")
4141 'minibuffer-complete-word)
4142@end lisp 4139@end lisp
4143 4140
4144@c ------------------------------------------------------------ 4141@c ------------------------------------------------------------
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 9e433e11c81..0c065584c45 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -13875,11 +13875,9 @@ present in this hook.
13875@item nntp-authinfo-function 13875@item nntp-authinfo-function
13876@vindex nntp-authinfo-function 13876@vindex nntp-authinfo-function
13877@findex nntp-send-authinfo 13877@findex nntp-send-authinfo
13878@vindex nntp-authinfo-file
13879This function will be used to send @samp{AUTHINFO} to the @acronym{NNTP} 13878This function will be used to send @samp{AUTHINFO} to the @acronym{NNTP}
13880server. The default function is @code{nntp-send-authinfo}, which looks 13879server. The default function is @code{nntp-send-authinfo}, which looks
13881through your @file{~/.authinfo} (or whatever you've set the 13880through your @file{~/.authinfo} for applicable entries. If none
13882@code{nntp-authinfo-file} variable to) for applicable entries. If none
13883are found, it will prompt you for a login name and a password. The 13881are found, it will prompt you for a login name and a password. The
13884format of the @file{~/.authinfo} file is (almost) the same as the 13882format of the @file{~/.authinfo} file is (almost) the same as the
13885@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp} 13883@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
diff --git a/doc/misc/reftex.texi b/doc/misc/reftex.texi
index 8ca5fcca5ba..8bde241e18f 100644
--- a/doc/misc/reftex.texi
+++ b/doc/misc/reftex.texi
@@ -658,9 +658,9 @@ variable @code{reftex-auto-recenter-toc}.
658 658
659@end table 659@end table
660 660
661@vindex reftex-toc-map 661@vindex reftex-toc-mode-map
662In order to define additional commands for the @file{*toc*} buffer, the 662In order to define additional commands for the @file{*toc*} buffer, the
663keymap @code{reftex-toc-map} may be used. 663keymap @code{reftex-toc-mode-map} may be used.
664 664
665@findex reftex-toc-recenter 665@findex reftex-toc-recenter
666@vindex reftex-auto-recenter-toc 666@vindex reftex-auto-recenter-toc
@@ -1021,9 +1021,9 @@ document and let you select a label from there (@pxref{LaTeX xr Package,,xr}).
1021 1021
1022@end table 1022@end table
1023 1023
1024@vindex reftex-select-label-map 1024@vindex reftex-select-label-mode-map
1025In order to define additional commands for the selection process, the 1025In order to define additional commands for the selection process, the
1026keymap @code{reftex-select-label-map} may be used. 1026keymap @code{reftex-select-label-mode-map} may be used.
1027 1027
1028@node Builtin Label Environments 1028@node Builtin Label Environments
1029@section Builtin Label Environments 1029@section Builtin Label Environments
@@ -1871,9 +1871,9 @@ entries.
1871 1871
1872@end table 1872@end table
1873 1873
1874@vindex reftex-select-bib-map 1874@vindex reftex-select-bib-mode-map
1875In order to define additional commands for this selection process, the 1875In order to define additional commands for this selection process, the
1876keymap @code{reftex-select-bib-map} may be used. 1876keymap @code{reftex-select-bib-mode-map} may be used.
1877 1877
1878Note that if you do not use Emacs to edit the @BibTeX{} database files, 1878Note that if you do not use Emacs to edit the @BibTeX{} database files,
1879@RefTeX{} will ask if the related buffers should be updated once it 1879@RefTeX{} will ask if the related buffers should be updated once it
@@ -3960,7 +3960,7 @@ Normal hook which is run when a @file{*toc*} buffer is
3960created. 3960created.
3961@end deffn 3961@end deffn
3962 3962
3963@deffn Keymap reftex-toc-map 3963@deffn Keymap reftex-toc-mode-map
3964The keymap which is active in the @file{*toc*} buffer. 3964The keymap which is active in the @file{*toc*} buffer.
3965(@pxref{Table of Contents}). 3965(@pxref{Table of Contents}).
3966@end deffn 3966@end deffn
@@ -4425,7 +4425,7 @@ Normal hook which is run when a selection buffer enters
4425@code{reftex-select-label-mode}. 4425@code{reftex-select-label-mode}.
4426@end deffn 4426@end deffn
4427 4427
4428@deffn Keymap reftex-select-label-map 4428@deffn Keymap reftex-select-label-mode-map
4429The keymap which is active in the labels selection process 4429The keymap which is active in the labels selection process
4430(@pxref{Referencing Labels}). 4430(@pxref{Referencing Labels}).
4431@end deffn 4431@end deffn
@@ -4586,7 +4586,7 @@ Normal hook which is run when a selection buffer enters
4586@code{reftex-select-bib-mode}. 4586@code{reftex-select-bib-mode}.
4587@end deffn 4587@end deffn
4588 4588
4589@deffn Keymap reftex-select-bib-map 4589@deffn Keymap reftex-select-bib-mode-map
4590The keymap which is active in the citation-key selection process 4590The keymap which is active in the citation-key selection process
4591(@pxref{Creating Citations}). 4591(@pxref{Creating Citations}).
4592@end deffn 4592@end deffn
@@ -4792,7 +4792,7 @@ into blocks. Sorting will then preserve blocks, so that lines are
4792re-arranged only within blocks. 4792re-arranged only within blocks.
4793@end defopt 4793@end defopt
4794 4794
4795@defopt reftex-index-phrases-map 4795@defopt reftex-index-phrases-mode-map
4796Keymap for the Index Phrases buffer. 4796Keymap for the Index Phrases buffer.
4797@end defopt 4797@end defopt
4798 4798
@@ -4824,7 +4824,7 @@ the document. This flag can be toggled from within the @file{*Index*}
4824buffer with the @kbd{f} key. 4824buffer with the @kbd{f} key.
4825@end defopt 4825@end defopt
4826 4826
4827@deffn Keymap reftex-index-map 4827@deffn Keymap reftex-index-mode-map
4828The keymap which is active in the @file{*Index*} buffer 4828The keymap which is active in the @file{*Index*} buffer
4829(@pxref{Index Support}). 4829(@pxref{Index Support}).
4830@end deffn 4830@end deffn
@@ -5813,8 +5813,8 @@ buffer).
5813@noindent @b{Version 3.12} 5813@noindent @b{Version 3.12}
5814@itemize @bullet 5814@itemize @bullet
5815@item 5815@item
5816There are 3 new keymaps for customization: @code{reftex-toc-map}, 5816There are 3 new keymaps for customization: @code{reftex-toc-mode-map},
5817@code{reftex-select-label-map}, @code{reftex-select-bib-map}. 5817@code{reftex-select-label-mode-map}, @code{reftex-select-bib-mode-map}.
5818@item 5818@item
5819Refontification uses more standard font-lock stuff. 5819Refontification uses more standard font-lock stuff.
5820@item 5820@item
diff --git a/doc/misc/speedbar.texi b/doc/misc/speedbar.texi
index 9991917b3fd..70d4b054166 100644
--- a/doc/misc/speedbar.texi
+++ b/doc/misc/speedbar.texi
@@ -896,7 +896,7 @@ augmented with speedbar.
896 896
897@enumerate 897@enumerate
898@item 898@item
899Create the keymap variable @code{@var{name}-speedbar-key-map}. 899Create the keymap variable @code{@var{name}-speedbar-mode-map}.
900 900
901@item 901@item
902Create a function, named whatever you like, which assigns values into your 902Create a function, named whatever you like, which assigns values into your
@@ -904,7 +904,7 @@ keymap. Use this command to create the keymap before assigning
904bindings: 904bindings:
905 905
906@smallexample 906@smallexample
907 (setq @var{name}-speedbar-key-map (speedbar-make-specialized-keymap)) 907 (setq @var{name}-speedbar-mode-map (speedbar-make-specialized-keymap))
908@end smallexample 908@end smallexample
909 909
910This function creates a special keymap for use in speedbar. 910This function creates a special keymap for use in speedbar.
@@ -977,7 +977,7 @@ Next, register your extension like this;
977@example 977@example
978 (speedbar-add-expansion-list '("MyExtension" 978 (speedbar-add-expansion-list '("MyExtension"
979 MyExtension-speedbar-menu-items 979 MyExtension-speedbar-menu-items
980 MyExtension-speedbar-key-map 980 MyExtension-speedbar-mode-map
981 MyExtension-speedbar-buttons)) 981 MyExtension-speedbar-buttons))
982@end example 982@end example
983 983
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index e1bf2f2bae5..95c744eef6e 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -2629,6 +2629,11 @@ Example:
2629@end group 2629@end group
2630@end lisp 2630@end lisp
2631 2631
2632@vindex tramp-fuse-unmount-on-cleanup
2633The user option @code{tramp-fuse-unmount-on-cleanup}, when set to
2634non-@code{nil}, controls, whether a mount point is unmounted on
2635connection cleanup or on Emacs exiting.
2636
2632 2637
2633@anchor{Setup of rclone method} 2638@anchor{Setup of rclone method}
2634@subsection @option{rclone} setup 2639@subsection @option{rclone} setup
diff --git a/etc/NEWS.28 b/etc/NEWS.28
index f8c045f014f..cff306e2440 100644
--- a/etc/NEWS.28
+++ b/etc/NEWS.28
@@ -989,11 +989,12 @@ further tweak whether to complete or indent.
989--- 989---
990** 'indent-tabs-mode' is now a global minor mode instead of just a variable. 990** 'indent-tabs-mode' is now a global minor mode instead of just a variable.
991 991
992--- 992+++
993** New choice 'permanent' for 'shift-select-mode'. 993** New choice 'permanent' for 'shift-select-mode'.
994When the mark was activated by shifted motion keys, non-shifted motion 994When the mark was activated by shifted motion keys, non-shifted motion
995keys don't deactivate the mark after customizing 'shift-select-mode' 995keys don't deactivate the mark after customizing 'shift-select-mode'
996to 'permanent'. 996to 'permanent'. Similarly, the active mark will not be deactivated by
997typing shifted motion keys.
997 998
998+++ 999+++
999** The "Edit => Clear" menu item now obeys a rectangular region. 1000** The "Edit => Clear" menu item now obeys a rectangular region.
diff --git a/etc/TODO b/etc/TODO
index d9149a521fb..540d8a7ff54 100644
--- a/etc/TODO
+++ b/etc/TODO
@@ -29,6 +29,27 @@ are the ones we consider more important, but these also may be
29difficult to fix. Bugs with severity "minor" may be simpler, but this 29difficult to fix. Bugs with severity "minor" may be simpler, but this
30is not always true. 30is not always true.
31 31
32* High Priority Items
33
34** Things related to elpa.gnu.org.
35We need to figure out how to best include GNU ELPA packages in the
36Emacs tarball before doing any of the items below.
37
38*** Move idlwave to elpa.gnu.org
39Need to sync up the Emacs and external versions.
40See <https://lists.gnu.org/r/emacs-devel/2014-07/msg00008.html>
41<https://debbugs.gnu.org/39992>
42
43*** Move Org mode to elpa.gnu.org
44See <https://lists.gnu.org/r/emacs-devel/2014-08/msg00300.html>
45<https://lists.gnu.org/r/emacs-devel/2014-11/msg00257.html>
46
47*** Move verilog-mode to elpa.gnu.org
48See <https://lists.gnu.org/r/emacs-devel/2015-02/msg01180.html>
49
50*** Move vhdl-mode to elpa.gnu.org
51See <https://lists.gnu.org/r/emacs-devel/2015-02/msg01180.html>
52
32* Simple tasks 53* Simple tasks
33These don't require much Emacs knowledge and are suitable for anyone 54These don't require much Emacs knowledge and are suitable for anyone
34from beginners to experts. 55from beginners to experts.
@@ -168,7 +189,7 @@ defsubst can often end up generating things like
168(let ((arg actual)) (body)) but should additionally get optimized further 189(let ((arg actual)) (body)) but should additionally get optimized further
169when 'actual' is a constant/copyable expression. 190when 'actual' is a constant/copyable expression.
170 191
171*** Add an "indirect goto" byte-code 192** Add an "indirect goto" byte-code
172Such a byte-code can be used for local lambda expressions. 193Such a byte-code can be used for local lambda expressions.
173E.g. when you have code like 194E.g. when you have code like
174 195
@@ -339,6 +360,11 @@ should invoke the 'shape' method. 'hbfont_shape' should be extended
339to pass to 'hb_shape_full' the required array of features, as 360to pass to 'hb_shape_full' the required array of features, as
340mentioned in the above HarfBuzz discussion. 361mentioned in the above HarfBuzz discussion.
341 362
363** Concurrency
364Stefan Monnier writes: "Including it as an 'experimental' compile-time
365option sounds good. Of course there might still be big questions
366around 'which form of concurrency' we'll want."
367
342** Better support for displaying Emoji 368** Better support for displaying Emoji
343Emacs is capable of displaying Emoji and some of the Emoji sequences, 369Emacs is capable of displaying Emoji and some of the Emoji sequences,
344provided that its fontsets are configured with a suitable font. To 370provided that its fontsets are configured with a suitable font. To
@@ -446,15 +472,6 @@ consistency checks that make sure the new code computes the same results
446as the old code. And once that works well, we can remove the old code 472as the old code. And once that works well, we can remove the old code
447and old fields. 473and old fields.
448 474
449** Better support for dynamic embedded graphics
450I like this idea (my mpc.el code could use it for the volume widget),
451though I wonder if the resulting efficiency will be sufficient.
452
453** Concurrency
454Including it as an "experimental" compile-time option sounds good. Of
455course there might still be big questions around "which form of
456concurrency" we'll want.
457
458** FFI (foreign function interface) 475** FFI (foreign function interface)
459See eg https://lists.gnu.org/r/emacs-devel/2013-10/msg00246.html 476See eg https://lists.gnu.org/r/emacs-devel/2013-10/msg00246.html
460 477
@@ -625,6 +642,13 @@ could also be a button that you could use to view the advice.
625 642
626** Add a function to get the insertion-type of the markers in an overlay 643** Add a function to get the insertion-type of the markers in an overlay
627 644
645** Improve VC
646Yes, there's a lot of work to be done there :-(
647
648** Improve the "code snippets" support
649Consolidate skeleton.el, tempo.el, and expand.el (any other?) and then
650advertise/use/improve it.
651
628** ange-ftp 652** ange-ftp
629 653
630*** Make ange-ftp understand sftp 654*** Make ange-ftp understand sftp
@@ -862,17 +886,10 @@ The idea is to add an "X" of some kind, that when clicked deletes the
862window associated with that modeline. 886window associated with that modeline.
863https://lists.gnu.org/r/emacs-devel/2007-09/msg02416.html 887https://lists.gnu.org/r/emacs-devel/2007-09/msg02416.html
864 888
865** Improve the "code snippets" support 889** Random things that were planned for Emacs-24
866Consolidate skeleton.el, tempo.el, and expand.el (any other?) and then
867advertise/use/improve it.
868
869** Improve VC
870Yes, there's a lot of work to be done there :-(
871
872** Spread Semantic
873 890
874** Random things that crossed Stefan Monnier's mind for Emacs 24 891Stefan Monnier writes: "Random things that cross my mind right now
875Stefan Monnier writes: "Some of them from my local hacks, but it's not 892that I'd like to see. Some of them from my local hacks, but it's not
876obvious at all whether they'll make it." 893obvious at all whether they'll make it."
877 894
878*** Prog-mode could/should provide a better fill-paragraph default 895*** Prog-mode could/should provide a better fill-paragraph default
@@ -1741,26 +1758,6 @@ Add a standard button-class named "link", and make all other link-like
1741button classes inherit from it. Set the default face of the "link" 1758button classes inherit from it. Set the default face of the "link"
1742button class to the standard "link" face. 1759button class to the standard "link" face.
1743 1760
1744* Things related to elpa.gnu.org.
1745
1746We need to figure out how to best include GNU ELPA packages in the
1747Emacs tarball before doing any of the items below.
1748
1749** Move idlwave to elpa.gnu.org
1750Need to sync up the Emacs and external versions.
1751See <https://lists.gnu.org/r/emacs-devel/2014-07/msg00008.html>
1752<https://debbugs.gnu.org/39992>
1753
1754** Move Org mode to elpa.gnu.org
1755See <https://lists.gnu.org/r/emacs-devel/2014-08/msg00300.html>
1756<https://lists.gnu.org/r/emacs-devel/2014-11/msg00257.html>
1757
1758** Move verilog-mode to elpa.gnu.org
1759See <https://lists.gnu.org/r/emacs-devel/2015-02/msg01180.html>
1760
1761** Move vhdl-mode to elpa.gnu.org
1762See <https://lists.gnu.org/r/emacs-devel/2015-02/msg01180.html>
1763
1764* Wishlist items 1761* Wishlist items
1765 1762
1766** Maybe replace etags.c with a Lisp implementation. 1763** Maybe replace etags.c with a Lisp implementation.
diff --git a/etc/org/csl/README b/etc/org/csl/README
new file mode 100644
index 00000000000..a9212207ccf
--- /dev/null
+++ b/etc/org/csl/README
@@ -0,0 +1,10 @@
1These data files are used by Org's oc-csl.el library.
2
3LICENSE INFORMATION
4
5chicago-author-date.csl
6locales-en-US.xml
7
8 Both of these files are part of the Citation Style Language (CSL)
9 project (<https://citationstyles.org/>) and are released under the
10 Creative Commons Attribution-ShareAlike 3.0 Unported license.
diff --git a/etc/org/csl/chicago-author-date.csl b/etc/org/csl/chicago-author-date.csl
new file mode 100644
index 00000000000..8c133354b38
--- /dev/null
+++ b/etc/org/csl/chicago-author-date.csl
@@ -0,0 +1,658 @@
1<?xml version="1.0" encoding="utf-8"?>
2<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="display-and-sort" page-range-format="chicago">
3 <info>
4 <title>Chicago Manual of Style 17th edition (author-date)</title>
5 <id>http://www.zotero.org/styles/chicago-author-date</id>
6 <link href="http://www.zotero.org/styles/chicago-author-date" rel="self"/>
7 <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
8 <author>
9 <name>Julian Onions</name>
10 <email>julian.onions@gmail.com</email>
11 </author>
12 <contributor>
13 <name>Sebastian Karcher</name>
14 </contributor>
15 <contributor>
16 <name>Richard Karnesky</name>
17 <email>karnesky+zotero@gmail.com</email>
18 <uri>http://arc.nucapt.northwestern.edu/Richard_Karnesky</uri>
19 </contributor>
20 <contributor>
21 <name>Andrew Dunning</name>
22 <email>andrew.dunning@utoronto.ca</email>
23 <uri>https://orcid.org/0000-0003-0464-5036</uri>
24 </contributor>
25 <contributor>
26 <name>Matthew Roth</name>
27 <email>matthew.g.roth@yale.edu</email>
28 <uri> https://orcid.org/0000-0001-7902-6331</uri>
29 </contributor>
30 <contributor>
31 <name>Brenton M. Wiernik</name>
32 </contributor>
33 <category citation-format="author-date"/>
34 <category field="generic-base"/>
35 <summary>The author-date variant of the Chicago style</summary>
36 <updated>2018-01-24T12:00:00+00:00</updated>
37 <rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
38 </info>
39 <locale xml:lang="en">
40 <terms>
41 <term name="editor" form="verb-short">ed.</term>
42 <term name="container-author" form="verb">by</term>
43 <term name="translator" form="verb-short">trans.</term>
44 <term name="editortranslator" form="verb">edited and translated by</term>
45 <term name="translator" form="short">trans.</term>
46 </terms>
47 </locale>
48 <macro name="secondary-contributors">
49 <choose>
50 <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="none">
51 <group delimiter=". ">
52 <names variable="editor translator" delimiter=". ">
53 <label form="verb" text-case="capitalize-first" suffix=" "/>
54 <name and="text" delimiter=", "/>
55 </names>
56 <names variable="director" delimiter=". ">
57 <label form="verb" text-case="capitalize-first" suffix=" "/>
58 <name and="text" delimiter=", "/>
59 </names>
60 </group>
61 </if>
62 </choose>
63 </macro>
64 <macro name="container-contributors">
65 <choose>
66 <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">
67 <group prefix=", " delimiter=", ">
68 <names variable="container-author" delimiter=", ">
69 <label form="verb" suffix=" "/>
70 <name and="text" delimiter=", "/>
71 </names>
72 <names variable="editor translator" delimiter=", ">
73 <label form="verb" suffix=" "/>
74 <name and="text" delimiter=", "/>
75 </names>
76 </group>
77 </if>
78 </choose>
79 </macro>
80 <macro name="editor">
81 <names variable="editor">
82 <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
83 <label form="short" prefix=", "/>
84 </names>
85 </macro>
86 <macro name="translator">
87 <names variable="translator">
88 <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
89 <label form="short" prefix=", "/>
90 </names>
91 </macro>
92 <macro name="recipient">
93 <choose>
94 <if type="personal_communication">
95 <choose>
96 <if variable="genre">
97 <text variable="genre" text-case="capitalize-first"/>
98 </if>
99 <else>
100 <text term="letter" text-case="capitalize-first"/>
101 </else>
102 </choose>
103 </if>
104 </choose>
105 <names variable="recipient" delimiter=", ">
106 <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
107 <name and="text" delimiter=", "/>
108 </names>
109 </macro>
110 <macro name="substitute-title">
111 <choose>
112 <if type="article-magazine article-newspaper review review-book" match="any">
113 <text macro="container-title"/>
114 </if>
115 </choose>
116 </macro>
117 <macro name="contributors">
118 <group delimiter=". ">
119 <names variable="author">
120 <name and="text" name-as-sort-order="first" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
121 <label form="short" prefix=", "/>
122 <substitute>
123 <names variable="editor"/>
124 <names variable="translator"/>
125 <names variable="director"/>
126 <text macro="substitute-title"/>
127 <text macro="title"/>
128 </substitute>
129 </names>
130 <text macro="recipient"/>
131 </group>
132 </macro>
133 <macro name="contributors-short">
134 <names variable="author">
135 <name form="short" and="text" delimiter=", " initialize-with=". "/>
136 <substitute>
137 <names variable="editor"/>
138 <names variable="translator"/>
139 <names variable="director"/>
140 <text macro="substitute-title"/>
141 <text macro="title"/>
142 </substitute>
143 </names>
144 </macro>
145 <macro name="interviewer">
146 <names variable="interviewer" delimiter=", ">
147 <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
148 <name and="text" delimiter=", "/>
149 </names>
150 </macro>
151 <macro name="archive">
152 <group delimiter=". ">
153 <text variable="archive_location" text-case="capitalize-first"/>
154 <text variable="archive"/>
155 <text variable="archive-place"/>
156 </group>
157 </macro>
158 <macro name="access">
159 <group delimiter=". ">
160 <choose>
161 <if type="graphic report" match="any">
162 <text macro="archive"/>
163 </if>
164 <else-if type="article-journal bill book chapter legal_case legislation motion_picture paper-conference" match="none">
165 <text macro="archive"/>
166 </else-if>
167 </choose>
168 <choose>
169 <if type="webpage post-weblog" match="any">
170 <date variable="issued" form="text"/>
171 </if>
172 </choose>
173 <choose>
174 <if variable="issued" match="none">
175 <group delimiter=" ">
176 <text term="accessed" text-case="capitalize-first"/>
177 <date variable="accessed" form="text"/>
178 </group>
179 </if>
180 </choose>
181 <choose>
182 <if type="legal_case" match="none">
183 <choose>
184 <if variable="DOI">
185 <text variable="DOI" prefix="https://doi.org/"/>
186 </if>
187 <else>
188 <text variable="URL"/>
189 </else>
190 </choose>
191 </if>
192 </choose>
193 </group>
194 </macro>
195 <macro name="title">
196 <choose>
197 <if variable="title" match="none">
198 <choose>
199 <if type="personal_communication" match="none">
200 <text variable="genre" text-case="capitalize-first"/>
201 </if>
202 </choose>
203 </if>
204 <else-if type="bill book graphic legislation motion_picture song" match="any">
205 <text variable="title" text-case="title" font-style="italic"/>
206 <group prefix=" (" suffix=")" delimiter=" ">
207 <text term="version"/>
208 <text variable="version"/>
209 </group>
210 </else-if>
211 <else-if variable="reviewed-author">
212 <choose>
213 <if variable="reviewed-title">
214 <group delimiter=". ">
215 <text variable="title" text-case="title" quotes="true"/>
216 <group delimiter=", ">
217 <text variable="reviewed-title" text-case="title" font-style="italic" prefix="Review of "/>
218 <names variable="reviewed-author">
219 <label form="verb-short" text-case="lowercase" suffix=" "/>
220 <name and="text" delimiter=", "/>
221 </names>
222 </group>
223 </group>
224 </if>
225 <else>
226 <group delimiter=", ">
227 <text variable="title" text-case="title" font-style="italic" prefix="Review of "/>
228 <names variable="reviewed-author">
229 <label form="verb-short" text-case="lowercase" suffix=" "/>
230 <name and="text" delimiter=", "/>
231 </names>
232 </group>
233 </else>
234 </choose>
235 </else-if>
236 <else-if type="legal_case interview patent" match="any">
237 <text variable="title"/>
238 </else-if>
239 <else>
240 <text variable="title" text-case="title" quotes="true"/>
241 </else>
242 </choose>
243 </macro>
244 <macro name="edition">
245 <choose>
246 <if type="bill book graphic legal_case legislation motion_picture report song" match="any">
247 <choose>
248 <if is-numeric="edition">
249 <group delimiter=" " prefix=". ">
250 <number variable="edition" form="ordinal"/>
251 <text term="edition" form="short" strip-periods="true"/>
252 </group>
253 </if>
254 <else>
255 <text variable="edition" text-case="capitalize-first" prefix=". "/>
256 </else>
257 </choose>
258 </if>
259 <else-if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">
260 <choose>
261 <if is-numeric="edition">
262 <group delimiter=" " prefix=", ">
263 <number variable="edition" form="ordinal"/>
264 <text term="edition" form="short"/>
265 </group>
266 </if>
267 <else>
268 <text variable="edition" prefix=", "/>
269 </else>
270 </choose>
271 </else-if>
272 </choose>
273 </macro>
274 <macro name="locators">
275 <choose>
276 <if type="article-journal">
277 <choose>
278 <if variable="volume">
279 <text variable="volume" prefix=" "/>
280 <group prefix=" (" suffix=")">
281 <choose>
282 <if variable="issue">
283 <text variable="issue"/>
284 </if>
285 <else>
286 <date variable="issued">
287 <date-part name="month"/>
288 </date>
289 </else>
290 </choose>
291 </group>
292 </if>
293 <else-if variable="issue">
294 <group delimiter=" " prefix=", ">
295 <text term="issue" form="short"/>
296 <text variable="issue"/>
297 <date variable="issued" prefix="(" suffix=")">
298 <date-part name="month"/>
299 </date>
300 </group>
301 </else-if>
302 <else>
303 <date variable="issued" prefix=", ">
304 <date-part name="month"/>
305 </date>
306 </else>
307 </choose>
308 </if>
309 <else-if type="legal_case">
310 <text variable="volume" prefix=", "/>
311 <text variable="container-title" prefix=" "/>
312 <text variable="page" prefix=" "/>
313 </else-if>
314 <else-if type="bill book graphic legal_case legislation motion_picture report song" match="any">
315 <group prefix=". " delimiter=". ">
316 <group>
317 <text term="volume" form="short" text-case="capitalize-first" suffix=" "/>
318 <number variable="volume" form="numeric"/>
319 </group>
320 <group>
321 <number variable="number-of-volumes" form="numeric"/>
322 <text term="volume" form="short" prefix=" " plural="true"/>
323 </group>
324 </group>
325 </else-if>
326 <else-if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">
327 <choose>
328 <if variable="page" match="none">
329 <group prefix=". ">
330 <text term="volume" form="short" text-case="capitalize-first" suffix=" "/>
331 <number variable="volume" form="numeric"/>
332 </group>
333 </if>
334 </choose>
335 </else-if>
336 </choose>
337 </macro>
338 <macro name="locators-chapter">
339 <choose>
340 <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">
341 <choose>
342 <if variable="page">
343 <group prefix=", ">
344 <text variable="volume" suffix=":"/>
345 <text variable="page"/>
346 </group>
347 </if>
348 </choose>
349 </if>
350 </choose>
351 </macro>
352 <macro name="locators-article">
353 <choose>
354 <if type="article-newspaper">
355 <group prefix=", " delimiter=", ">
356 <group delimiter=" ">
357 <text variable="edition"/>
358 <text term="edition"/>
359 </group>
360 <group>
361 <text term="section" form="short" suffix=" "/>
362 <text variable="section"/>
363 </group>
364 </group>
365 </if>
366 <else-if type="article-journal">
367 <choose>
368 <if variable="volume issue" match="any">
369 <text variable="page" prefix=": "/>
370 </if>
371 <else>
372 <text variable="page" prefix=", "/>
373 </else>
374 </choose>
375 </else-if>
376 </choose>
377 </macro>
378 <macro name="point-locators">
379 <choose>
380 <if variable="locator">
381 <choose>
382 <if locator="page" match="none">
383 <choose>
384 <if type="bill book graphic legal_case legislation motion_picture report song" match="any">
385 <choose>
386 <if variable="volume">
387 <group>
388 <text term="volume" form="short" suffix=" "/>
389 <number variable="volume" form="numeric"/>
390 <label variable="locator" form="short" prefix=", " suffix=" "/>
391 </group>
392 </if>
393 <else>
394 <label variable="locator" form="short" suffix=" "/>
395 </else>
396 </choose>
397 </if>
398 <else>
399 <label variable="locator" form="short" suffix=" "/>
400 </else>
401 </choose>
402 </if>
403 <else-if type="bill book graphic legal_case legislation motion_picture report song" match="any">
404 <number variable="volume" form="numeric" suffix=":"/>
405 </else-if>
406 </choose>
407 <text variable="locator"/>
408 </if>
409 </choose>
410 </macro>
411 <macro name="container-prefix">
412 <text term="in" text-case="capitalize-first"/>
413 </macro>
414 <macro name="container-title">
415 <choose>
416 <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">
417 <text macro="container-prefix" suffix=" "/>
418 </if>
419 </choose>
420 <choose>
421 <if type="webpage">
422 <text variable="container-title" text-case="title"/>
423 </if>
424 <else-if type="legal_case" match="none">
425 <group delimiter=" ">
426 <text variable="container-title" text-case="title" font-style="italic"/>
427 <choose>
428 <if type="post-weblog">
429 <text value="(blog)"/>
430 </if>
431 </choose>
432 </group>
433 </else-if>
434 </choose>
435 </macro>
436 <macro name="publisher">
437 <group delimiter=": ">
438 <text variable="publisher-place"/>
439 <text variable="publisher"/>
440 </group>
441 </macro>
442 <macro name="date">
443 <choose>
444 <if variable="issued">
445 <group delimiter=" ">
446 <date variable="original-date" form="text" date-parts="year" prefix="(" suffix=")"/>
447 <date variable="issued">
448 <date-part name="year"/>
449 </date>
450 </group>
451 </if>
452 <else-if variable="status">
453 <text variable="status" text-case="capitalize-first"/>
454 </else-if>
455 <else>
456 <text term="no date" form="short"/>
457 </else>
458 </choose>
459 </macro>
460 <macro name="date-in-text">
461 <choose>
462 <if variable="issued">
463 <group delimiter=" ">
464 <date variable="original-date" form="text" date-parts="year" prefix="[" suffix="]"/>
465 <date variable="issued">
466 <date-part name="year"/>
467 </date>
468 </group>
469 </if>
470 <else-if variable="status">
471 <text variable="status"/>
472 </else-if>
473 <else>
474 <text term="no date" form="short"/>
475 </else>
476 </choose>
477 </macro>
478 <macro name="day-month">
479 <date variable="issued">
480 <date-part name="month"/>
481 <date-part name="day" prefix=" "/>
482 </date>
483 </macro>
484 <macro name="collection-title">
485 <choose>
486 <if match="none" type="article-journal">
487 <choose>
488 <if match="none" is-numeric="collection-number">
489 <group delimiter=", ">
490 <text variable="collection-title" text-case="title"/>
491 <text variable="collection-number"/>
492 </group>
493 </if>
494 <else>
495 <group delimiter=" ">
496 <text variable="collection-title" text-case="title"/>
497 <text variable="collection-number"/>
498 </group>
499 </else>
500 </choose>
501 </if>
502 </choose>
503 </macro>
504 <macro name="collection-title-journal">
505 <choose>
506 <if type="article-journal">
507 <group delimiter=" ">
508 <text variable="collection-title"/>
509 <text variable="collection-number"/>
510 </group>
511 </if>
512 </choose>
513 </macro>
514 <macro name="event">
515 <group delimiter=" ">
516 <choose>
517 <if variable="genre">
518 <text term="presented at"/>
519 </if>
520 <else>
521 <text term="presented at" text-case="capitalize-first"/>
522 </else>
523 </choose>
524 <text variable="event"/>
525 </group>
526 </macro>
527 <macro name="description">
528 <choose>
529 <if variable="interviewer" type="interview" match="any">
530 <group delimiter=". ">
531 <text macro="interviewer"/>
532 <text variable="medium" text-case="capitalize-first"/>
533 </group>
534 </if>
535 <else-if type="patent">
536 <group delimiter=" " prefix=". ">
537 <text variable="authority"/>
538 <text variable="number"/>
539 </group>
540 </else-if>
541 <else>
542 <text variable="medium" text-case="capitalize-first" prefix=". "/>
543 </else>
544 </choose>
545 <choose>
546 <if variable="title" match="none"/>
547 <else-if type="thesis personal_communication speech" match="any"/>
548 <else>
549 <group delimiter=" " prefix=". ">
550 <text variable="genre" text-case="capitalize-first"/>
551 <choose>
552 <if type="report">
553 <text variable="number"/>
554 </if>
555 </choose>
556 </group>
557 </else>
558 </choose>
559 </macro>
560 <macro name="issue">
561 <choose>
562 <if type="legal_case">
563 <text variable="authority" prefix=". "/>
564 </if>
565 <else-if type="speech">
566 <group prefix=". " delimiter=", ">
567 <group delimiter=" ">
568 <text variable="genre" text-case="capitalize-first"/>
569 <text macro="event"/>
570 </group>
571 <text variable="event-place"/>
572 <text macro="day-month"/>
573 </group>
574 </else-if>
575 <else-if type="article-newspaper article-magazine personal_communication" match="any">
576 <date variable="issued" form="text" prefix=", "/>
577 </else-if>
578 <else-if type="patent">
579 <group delimiter=", " prefix=", ">
580 <group delimiter=" ">
581 <!--Needs Localization-->
582 <text value="filed"/>
583 <date variable="submitted" form="text"/>
584 </group>
585 <group delimiter=" ">
586 <choose>
587 <if variable="issued submitted" match="all">
588 <text term="and"/>
589 </if>
590 </choose>
591 <!--Needs Localization-->
592 <text value="issued"/>
593 <date variable="issued" form="text"/>
594 </group>
595 </group>
596 </else-if>
597 <else-if type="article-journal" match="any"/>
598 <else>
599 <group prefix=". " delimiter=", ">
600 <choose>
601 <if type="thesis">
602 <text variable="genre" text-case="capitalize-first"/>
603 </if>
604 </choose>
605 <text macro="publisher"/>
606 </group>
607 </else>
608 </choose>
609 </macro>
610 <citation et-al-min="4" et-al-use-first="1" disambiguate-add-year-suffix="true" disambiguate-add-names="true" disambiguate-add-givenname="true" givenname-disambiguation-rule="primary-name" collapse="year" after-collapse-delimiter="; ">
611 <layout prefix="(" suffix=")" delimiter="; ">
612 <group delimiter=", ">
613 <choose>
614 <if variable="issued accessed" match="any">
615 <group delimiter=" ">
616 <text macro="contributors-short"/>
617 <text macro="date-in-text"/>
618 </group>
619 </if>
620 <!---comma before forthcoming and n.d.-->
621 <else>
622 <group delimiter=", ">
623 <text macro="contributors-short"/>
624 <text macro="date-in-text"/>
625 </group>
626 </else>
627 </choose>
628 <text macro="point-locators"/>
629 </group>
630 </layout>
631 </citation>
632 <bibliography hanging-indent="true" et-al-min="11" et-al-use-first="7" subsequent-author-substitute="&#8212;&#8212;&#8212;" entry-spacing="0">
633 <sort>
634 <key macro="contributors"/>
635 <key variable="issued"/>
636 <key variable="title"/>
637 </sort>
638 <layout suffix=".">
639 <group delimiter=". ">
640 <text macro="contributors"/>
641 <text macro="date"/>
642 <text macro="title"/>
643 </group>
644 <text macro="description"/>
645 <text macro="secondary-contributors" prefix=". "/>
646 <text macro="container-title" prefix=". "/>
647 <text macro="container-contributors"/>
648 <text macro="edition"/>
649 <text macro="locators-chapter"/>
650 <text macro="collection-title-journal" prefix=", " suffix=", "/>
651 <text macro="locators"/>
652 <text macro="collection-title" prefix=". "/>
653 <text macro="issue"/>
654 <text macro="locators-article"/>
655 <text macro="access" prefix=". "/>
656 </layout>
657 </bibliography>
658</style>
diff --git a/etc/org/csl/locales-en-US.xml b/etc/org/csl/locales-en-US.xml
new file mode 100644
index 00000000000..be78c5e81fd
--- /dev/null
+++ b/etc/org/csl/locales-en-US.xml
@@ -0,0 +1,357 @@
1<?xml version="1.0" encoding="utf-8"?>
2<locale xmlns="http://purl.org/net/xbiblio/csl" version="1.0" xml:lang="en-US">
3 <info>
4 <translator>
5 <name>Andrew Dunning</name>
6 </translator>
7 <translator>
8 <name>Sebastian Karcher</name>
9 </translator>
10 <translator>
11 <name>Rintze M. Zelle</name>
12 </translator>
13 <rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
14 <updated>2015-10-10T23:31:02+00:00</updated>
15 </info>
16 <style-options punctuation-in-quote="true"/>
17 <date form="text">
18 <date-part name="month" suffix=" "/>
19 <date-part name="day" suffix=", "/>
20 <date-part name="year"/>
21 </date>
22 <date form="numeric">
23 <date-part name="month" form="numeric-leading-zeros" suffix="/"/>
24 <date-part name="day" form="numeric-leading-zeros" suffix="/"/>
25 <date-part name="year"/>
26 </date>
27 <terms>
28 <term name="accessed">accessed</term>
29 <term name="and">and</term>
30 <term name="and others">and others</term>
31 <term name="anonymous">anonymous</term>
32 <term name="anonymous" form="short">anon.</term>
33 <term name="at">at</term>
34 <term name="available at">available at</term>
35 <term name="by">by</term>
36 <term name="circa">circa</term>
37 <term name="circa" form="short">c.</term>
38 <term name="cited">cited</term>
39 <term name="edition">
40 <single>edition</single>
41 <multiple>editions</multiple>
42 </term>
43 <term name="edition" form="short">ed.</term>
44 <term name="et-al">et al.</term>
45 <term name="forthcoming">forthcoming</term>
46 <term name="from">from</term>
47 <term name="ibid">ibid.</term>
48 <term name="in">in</term>
49 <term name="in press">in press</term>
50 <term name="internet">internet</term>
51 <term name="interview">interview</term>
52 <term name="letter">letter</term>
53 <term name="no date">no date</term>
54 <term name="no date" form="short">n.d.</term>
55 <term name="online">online</term>
56 <term name="presented at">presented at the</term>
57 <term name="reference">
58 <single>reference</single>
59 <multiple>references</multiple>
60 </term>
61 <term name="reference" form="short">
62 <single>ref.</single>
63 <multiple>refs.</multiple>
64 </term>
65 <term name="retrieved">retrieved</term>
66 <term name="scale">scale</term>
67 <term name="version">version</term>
68
69 <!-- ANNO DOMINI; BEFORE CHRIST -->
70 <term name="ad">AD</term>
71 <term name="bc">BC</term>
72
73 <!-- PUNCTUATION -->
74 <term name="open-quote">“</term>
75 <term name="close-quote">”</term>
76 <term name="open-inner-quote">‘</term>
77 <term name="close-inner-quote">’</term>
78 <term name="page-range-delimiter">–</term>
79
80 <!-- ORDINALS -->
81 <term name="ordinal">th</term>
82 <term name="ordinal-01">st</term>
83 <term name="ordinal-02">nd</term>
84 <term name="ordinal-03">rd</term>
85 <term name="ordinal-11">th</term>
86 <term name="ordinal-12">th</term>
87 <term name="ordinal-13">th</term>
88
89 <!-- LONG ORDINALS -->
90 <term name="long-ordinal-01">first</term>
91 <term name="long-ordinal-02">second</term>
92 <term name="long-ordinal-03">third</term>
93 <term name="long-ordinal-04">fourth</term>
94 <term name="long-ordinal-05">fifth</term>
95 <term name="long-ordinal-06">sixth</term>
96 <term name="long-ordinal-07">seventh</term>
97 <term name="long-ordinal-08">eighth</term>
98 <term name="long-ordinal-09">ninth</term>
99 <term name="long-ordinal-10">tenth</term>
100
101 <!-- LONG LOCATOR FORMS -->
102 <term name="book">
103 <single>book</single>
104 <multiple>books</multiple>
105 </term>
106 <term name="chapter">
107 <single>chapter</single>
108 <multiple>chapters</multiple>
109 </term>
110 <term name="column">
111 <single>column</single>
112 <multiple>columns</multiple>
113 </term>
114 <term name="figure">
115 <single>figure</single>
116 <multiple>figures</multiple>
117 </term>
118 <term name="folio">
119 <single>folio</single>
120 <multiple>folios</multiple>
121 </term>
122 <term name="issue">
123 <single>number</single>
124 <multiple>numbers</multiple>
125 </term>
126 <term name="line">
127 <single>line</single>
128 <multiple>lines</multiple>
129 </term>
130 <term name="note">
131 <single>note</single>
132 <multiple>notes</multiple>
133 </term>
134 <term name="opus">
135 <single>opus</single>
136 <multiple>opera</multiple>
137 </term>
138 <term name="page">
139 <single>page</single>
140 <multiple>pages</multiple>
141 </term>
142 <term name="number-of-pages">
143 <single>page</single>
144 <multiple>pages</multiple>
145 </term>
146 <term name="paragraph">
147 <single>paragraph</single>
148 <multiple>paragraphs</multiple>
149 </term>
150 <term name="part">
151 <single>part</single>
152 <multiple>parts</multiple>
153 </term>
154 <term name="section">
155 <single>section</single>
156 <multiple>sections</multiple>
157 </term>
158 <term name="sub verbo">
159 <single>sub verbo</single>
160 <multiple>sub verbis</multiple>
161 </term>
162 <term name="verse">
163 <single>verse</single>
164 <multiple>verses</multiple>
165 </term>
166 <term name="volume">
167 <single>volume</single>
168 <multiple>volumes</multiple>
169 </term>
170
171 <!-- SHORT LOCATOR FORMS -->
172 <term name="book" form="short">
173 <single>bk.</single>
174 <multiple>bks.</multiple>
175 </term>
176 <term name="chapter" form="short">
177 <single>chap.</single>
178 <multiple>chaps.</multiple>
179 </term>
180 <term name="column" form="short">
181 <single>col.</single>
182 <multiple>cols.</multiple>
183 </term>
184 <term name="figure" form="short">
185 <single>fig.</single>
186 <multiple>figs.</multiple>
187 </term>
188 <term name="folio" form="short">
189 <single>fol.</single>
190 <multiple>fols.</multiple>
191 </term>
192 <term name="issue" form="short">
193 <single>no.</single>
194 <multiple>nos.</multiple>
195 </term>
196 <term name="line" form="short">
197 <single>l.</single>
198 <multiple>ll.</multiple>
199 </term>
200 <term name="note" form="short">
201 <single>n.</single>
202 <multiple>nn.</multiple>
203 </term>
204 <term name="opus" form="short">
205 <single>op.</single>
206 <multiple>opp.</multiple>
207 </term>
208 <term name="page" form="short">
209 <single>p.</single>
210 <multiple>pp.</multiple>
211 </term>
212 <term name="number-of-pages" form="short">
213 <single>p.</single>
214 <multiple>pp.</multiple>
215 </term>
216 <term name="paragraph" form="short">
217 <single>para.</single>
218 <multiple>paras.</multiple>
219 </term>
220 <term name="part" form="short">
221 <single>pt.</single>
222 <multiple>pts.</multiple>
223 </term>
224 <term name="section" form="short">
225 <single>sec.</single>
226 <multiple>secs.</multiple>
227 </term>
228 <term name="sub verbo" form="short">
229 <single>s.v.</single>
230 <multiple>s.vv.</multiple>
231 </term>
232 <term name="verse" form="short">
233 <single>v.</single>
234 <multiple>vv.</multiple>
235 </term>
236 <term name="volume" form="short">
237 <single>vol.</single>
238 <multiple>vols.</multiple>
239 </term>
240
241 <!-- SYMBOL LOCATOR FORMS -->
242 <term name="paragraph" form="symbol">
243 <single>¶</single>
244 <multiple>¶¶</multiple>
245 </term>
246 <term name="section" form="symbol">
247 <single>§</single>
248 <multiple>§§</multiple>
249 </term>
250
251 <!-- LONG ROLE FORMS -->
252 <term name="director">
253 <single>director</single>
254 <multiple>directors</multiple>
255 </term>
256 <term name="editor">
257 <single>editor</single>
258 <multiple>editors</multiple>
259 </term>
260 <term name="editorial-director">
261 <single>editor</single>
262 <multiple>editors</multiple>
263 </term>
264 <term name="illustrator">
265 <single>illustrator</single>
266 <multiple>illustrators</multiple>
267 </term>
268 <term name="translator">
269 <single>translator</single>
270 <multiple>translators</multiple>
271 </term>
272 <term name="editortranslator">
273 <single>editor &amp; translator</single>
274 <multiple>editors &amp; translators</multiple>
275 </term>
276
277 <!-- SHORT ROLE FORMS -->
278 <term name="director" form="short">
279 <single>dir.</single>
280 <multiple>dirs.</multiple>
281 </term>
282 <term name="editor" form="short">
283 <single>ed.</single>
284 <multiple>eds.</multiple>
285 </term>
286 <term name="editorial-director" form="short">
287 <single>ed.</single>
288 <multiple>eds.</multiple>
289 </term>
290 <term name="illustrator" form="short">
291 <single>ill.</single>
292 <multiple>ills.</multiple>
293 </term>
294 <term name="translator" form="short">
295 <single>tran.</single>
296 <multiple>trans.</multiple>
297 </term>
298 <term name="editortranslator" form="short">
299 <single>ed. &amp; tran.</single>
300 <multiple>eds. &amp; trans.</multiple>
301 </term>
302
303 <!-- VERB ROLE FORMS -->
304 <term name="container-author" form="verb">by</term>
305 <term name="director" form="verb">directed by</term>
306 <term name="editor" form="verb">edited by</term>
307 <term name="editorial-director" form="verb">edited by</term>
308 <term name="illustrator" form="verb">illustrated by</term>
309 <term name="interviewer" form="verb">interview by</term>
310 <term name="recipient" form="verb">to</term>
311 <term name="reviewed-author" form="verb">by</term>
312 <term name="translator" form="verb">translated by</term>
313 <term name="editortranslator" form="verb">edited &amp; translated by</term>
314
315 <!-- SHORT VERB ROLE FORMS -->
316 <term name="director" form="verb-short">dir. by</term>
317 <term name="editor" form="verb-short">ed. by</term>
318 <term name="editorial-director" form="verb-short">ed. by</term>
319 <term name="illustrator" form="verb-short">illus. by</term>
320 <term name="translator" form="verb-short">trans. by</term>
321 <term name="editortranslator" form="verb-short">ed. &amp; trans. by</term>
322
323 <!-- LONG MONTH FORMS -->
324 <term name="month-01">January</term>
325 <term name="month-02">February</term>
326 <term name="month-03">March</term>
327 <term name="month-04">April</term>
328 <term name="month-05">May</term>
329 <term name="month-06">June</term>
330 <term name="month-07">July</term>
331 <term name="month-08">August</term>
332 <term name="month-09">September</term>
333 <term name="month-10">October</term>
334 <term name="month-11">November</term>
335 <term name="month-12">December</term>
336
337 <!-- SHORT MONTH FORMS -->
338 <term name="month-01" form="short">Jan.</term>
339 <term name="month-02" form="short">Feb.</term>
340 <term name="month-03" form="short">Mar.</term>
341 <term name="month-04" form="short">Apr.</term>
342 <term name="month-05" form="short">May</term>
343 <term name="month-06" form="short">Jun.</term>
344 <term name="month-07" form="short">Jul.</term>
345 <term name="month-08" form="short">Aug.</term>
346 <term name="month-09" form="short">Sep.</term>
347 <term name="month-10" form="short">Oct.</term>
348 <term name="month-11" form="short">Nov.</term>
349 <term name="month-12" form="short">Dec.</term>
350
351 <!-- SEASONS -->
352 <term name="season-01">Spring</term>
353 <term name="season-02">Summer</term>
354 <term name="season-03">Autumn</term>
355 <term name="season-04">Winter</term>
356 </terms>
357</locale>
diff --git a/etc/themes/light-blue-theme.el b/etc/themes/light-blue-theme.el
index 8f4502a0cb3..547d2df04c0 100644
--- a/etc/themes/light-blue-theme.el
+++ b/etc/themes/light-blue-theme.el
@@ -3,6 +3,7 @@
3;; Copyright (C) 2011-2021 Free Software Foundation, Inc. 3;; Copyright (C) 2011-2021 Free Software Foundation, Inc.
4 4
5;; Author: Drew Adams <drew.adams@oracle.com> 5;; Author: Drew Adams <drew.adams@oracle.com>
6;; Maintainer: emacs-devel@gnu.org
6 7
7;; This file is part of GNU Emacs. 8;; This file is part of GNU Emacs.
8 9
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 018e81e4222..cff3cec2a79 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -80,9 +80,6 @@ char *w32_getenv (const char *);
80#include <sys/stat.h> 80#include <sys/stat.h>
81#include <unistd.h> 81#include <unistd.h>
82 82
83#ifndef WINDOWSNT
84# include <acl.h>
85#endif
86#include <filename.h> 83#include <filename.h>
87#include <intprops.h> 84#include <intprops.h>
88#include <min-max.h> 85#include <min-max.h>
@@ -94,10 +91,6 @@ char *w32_getenv (const char *);
94# pragma GCC diagnostic ignored "-Wformat-truncation=2" 91# pragma GCC diagnostic ignored "-Wformat-truncation=2"
95#endif 92#endif
96 93
97#if !defined O_PATH && !defined WINDOWSNT
98# define O_PATH O_SEARCH
99#endif
100
101 94
102/* Name used to invoke this program. */ 95/* Name used to invoke this program. */
103static char const *progname; 96static char const *progname;
@@ -1135,6 +1128,12 @@ process_grouping (void)
1135 1128
1136#ifdef SOCKETS_IN_FILE_SYSTEM 1129#ifdef SOCKETS_IN_FILE_SYSTEM
1137 1130
1131# include <acl.h>
1132
1133# ifndef O_PATH
1134# define O_PATH O_SEARCH
1135# endif
1136
1138/* A local socket address. The union avoids the need to cast. */ 1137/* A local socket address. The union avoids the need to cast. */
1139union local_sockaddr 1138union local_sockaddr
1140{ 1139{
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 60d1d10e5b2..3e764c5a787 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -91,8 +91,19 @@ COMPILE_FIRST = \
91 $(lisp)/emacs-lisp/byte-opt.elc \ 91 $(lisp)/emacs-lisp/byte-opt.elc \
92 $(lisp)/emacs-lisp/bytecomp.elc 92 $(lisp)/emacs-lisp/bytecomp.elc
93ifeq ($(HAVE_NATIVE_COMP),yes) 93ifeq ($(HAVE_NATIVE_COMP),yes)
94COMPILE_FIRST += $(lisp)/emacs-lisp/comp.elc 94COMPILE_FIRST += \
95COMPILE_FIRST += $(lisp)/emacs-lisp/comp-cstr.elc 95 $(lisp)/emacs-lisp/comp.elc \
96 $(lisp)/emacs-lisp/comp-cstr.elc \
97 $(lisp)/emacs-lisp/cl-macs.elc \
98 $(lisp)/emacs-lisp/rx.elc \
99 $(lisp)/emacs-lisp/cl-seq.elc \
100 $(lisp)/help-mode.elc \
101 $(lisp)/emacs-lisp/cl-extra.elc \
102 $(lisp)/emacs-lisp/gv.elc \
103 $(lisp)/emacs-lisp/seq.elc \
104 $(lisp)/emacs-lisp/cl-lib.elc \
105 $(lisp)/emacs-lisp/warnings.elc \
106 $(lisp)/emacs-lisp/subr-x.elc
96endif 107endif
97COMPILE_FIRST += $(lisp)/emacs-lisp/autoload.elc 108COMPILE_FIRST += $(lisp)/emacs-lisp/autoload.elc
98 109
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index 527720c6e8d..1852471bcbb 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -3087,6 +3087,14 @@ To see the documentation for a defined struct type, use
3087 ;; and pred-check, so changing it is not straightforward. 3087 ;; and pred-check, so changing it is not straightforward.
3088 (push `(,defsym ,accessor (cl-x) 3088 (push `(,defsym ,accessor (cl-x)
3089 ,(concat 3089 ,(concat
3090 ;; NB. This will produce incorrect results
3091 ;; in some cases, as our coding conventions
3092 ;; says that the first line must be a full
3093 ;; sentence. However, if we don't word wrap
3094 ;; we will have byte-compiler warnings about
3095 ;; overly long docstrings. So we can't have
3096 ;; a perfect result here, and choose to avoid
3097 ;; the byte-compiler warnings.
3090 (internal--format-docstring-line 3098 (internal--format-docstring-line
3091 "Access slot \"%s\" of `%s' struct CL-X." slot name) 3099 "Access slot \"%s\" of `%s' struct CL-X." slot name)
3092 (if doc (concat "\n" doc) "")) 3100 (if doc (concat "\n" doc) ""))
diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el
index d37bca24a0f..f752861d80a 100644
--- a/lisp/emacs-lisp/easy-mmode.el
+++ b/lisp/emacs-lisp/easy-mmode.el
@@ -93,7 +93,7 @@ Enable the mode if ARG is nil, omitted, or is a positive number.
93Disable the mode if ARG is a negative number. 93Disable the mode if ARG is a negative number.
94 94
95To check whether the minor mode is enabled in the current buffer, 95To check whether the minor mode is enabled in the current buffer,
96evaluate `%S'. 96evaluate `%s'.
97 97
98The mode's hook is called both when the mode is enabled and when 98The mode's hook is called both when the mode is enabled and when
99it is disabled.") 99it is disabled.")
@@ -109,7 +109,9 @@ it is disabled.")
109 (docs-fc (bound-and-true-p emacs-lisp-docstring-fill-column)) 109 (docs-fc (bound-and-true-p emacs-lisp-docstring-fill-column))
110 (fill-column (if (integerp docs-fc) docs-fc 65)) 110 (fill-column (if (integerp docs-fc) docs-fc 65))
111 (argdoc (format easy-mmode--arg-docstring mode-pretty-name 111 (argdoc (format easy-mmode--arg-docstring mode-pretty-name
112 getter)) 112 ;; Avoid having quotes turn into pretty quotes.
113 (string-replace "'" "\\\\='"
114 (format "%S" getter))))
113 (filled (if (fboundp 'fill-region) 115 (filled (if (fboundp 'fill-region)
114 (with-temp-buffer 116 (with-temp-buffer
115 (insert argdoc) 117 (insert argdoc)
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index c4077d48ab0..308812f0eb2 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -188,10 +188,12 @@ parameters and authentication."
188It is not strictly necessary to provide this, since ERC will 188It is not strictly necessary to provide this, since ERC will
189prompt you for it.") 189prompt you for it.")
190 190
191(defcustom erc-user-mode nil 191(defcustom erc-user-mode "+i"
192 ;; +i "Invisible". Hides user from global /who and /names.
192 "Initial user modes to be set after a connection is established." 193 "Initial user modes to be set after a connection is established."
193 :group 'erc 194 :group 'erc
194 :type '(choice (const nil) string function)) 195 :type '(choice (const nil) string function)
196 :version "28.1")
195 197
196 198
197(defcustom erc-prompt-for-password t 199(defcustom erc-prompt-for-password t
diff --git a/lisp/files.el b/lisp/files.el
index 50ca49409f1..7213a6eae5f 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -3897,7 +3897,7 @@ inhibited."
3897 (hack-local-variables-apply)))))) 3897 (hack-local-variables-apply))))))
3898 3898
3899(defun hack-local-variables--find-variables (&optional handle-mode) 3899(defun hack-local-variables--find-variables (&optional handle-mode)
3900 "Return all local variables in the ucrrent buffer. 3900 "Return all local variables in the current buffer.
3901If HANDLE-MODE is nil, we gather all the specified local 3901If HANDLE-MODE is nil, we gather all the specified local
3902variables. If HANDLE-MODE is neither nil nor t, we do the same, 3902variables. If HANDLE-MODE is neither nil nor t, we do the same,
3903except that any settings of `mode' are ignored. 3903except that any settings of `mode' are ignored.
diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el
index 19d05120045..6426d825465 100644
--- a/lisp/gnus/gnus-agent.el
+++ b/lisp/gnus/gnus-agent.el
@@ -3553,32 +3553,13 @@ articles in every agentized group? "))
3553 (when (and to-remove 3553 (when (and to-remove
3554 (or gnus-expert-user 3554 (or gnus-expert-user
3555 (gnus-y-or-n-p 3555 (gnus-y-or-n-p
3556 "gnus-agent-expire has identified local directories that are\ 3556 "gnus-agent-expire has identified local directories that are
3557 not currently required by any agentized group. Do you wish to consider\ 3557not currently required by any agentized group. Do you wish to consider
3558 deleting them?"))) 3558deleting them?")))
3559 (while to-remove 3559 (dolist (dir to-remove)
3560 (let ((dir (pop to-remove))) 3560 (when (or gnus-expert-user
3561 (if (or gnus-expert-user
3562 (gnus-y-or-n-p (format "Delete %s? " dir))) 3561 (gnus-y-or-n-p (format "Delete %s? " dir)))
3563 (let* (delete-recursive 3562 (delete-directory dir t)))))))
3564 files f
3565 (delete-recursive
3566 (lambda (f-or-d)
3567 (ignore-errors
3568 (if (file-directory-p f-or-d)
3569 (condition-case nil
3570 (delete-directory f-or-d)
3571 (file-error
3572 (setq files (directory-files f-or-d))
3573 (while files
3574 (setq f (pop files))
3575 (or (member f '("." ".."))
3576 (funcall delete-recursive
3577 (nnheader-concat
3578 f-or-d f))))
3579 (delete-directory f-or-d)))
3580 (delete-file f-or-d))))))
3581 (funcall delete-recursive dir)))))))))
3582 3563
3583;;;###autoload 3564;;;###autoload
3584(defun gnus-agent-batch () 3565(defun gnus-agent-batch ()
diff --git a/lisp/international/fontset.el b/lisp/international/fontset.el
index 4ec641dca8f..f0ead8a2744 100644
--- a/lisp/international/fontset.el
+++ b/lisp/international/fontset.el
@@ -157,7 +157,9 @@
157 (armenian #x531) 157 (armenian #x531)
158 (hebrew #x5D0) 158 (hebrew #x5D0)
159 (vai #xA500) 159 (vai #xA500)
160 (arabic #x628) 160 ;; U+06C1 prevents us from using bad fonts, like DejaVu Sans,
161 ;; for Arabic text.
162 (arabic #x628 #x6C1)
161 (syriac #x710) 163 (syriac #x710)
162 (thaana #x78C) 164 (thaana #x78C)
163 (devanagari #x915) 165 (devanagari #x915)
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index 2298af42b28..5022a17db5a 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -294,30 +294,8 @@ attribute."
294 294
295 (apply 'define-charset-internal name (mapcar 'cdr attrs)))) 295 (apply 'define-charset-internal name (mapcar 'cdr attrs))))
296 296
297(defun hack-elisp-shorthands (fullname) 297(defvar hack-read-symbol-shorthands-function nil
298 "Return value of the `elisp-shorthands' file-local variable in FULLNAME. 298 "Holds function to compute `read-symbol-shorthands'.")
299FULLNAME is the absolute file name of an Elisp .el file which
300potentially specifies a file-local value for `elisp-shorthands'.
301The Elisp code in FULLNAME isn't read or evaluated in any way, except
302for extraction of the buffer-local value of `elisp-shorthands'."
303 (let ((size (nth 7 (file-attributes fullname))))
304 (with-temp-buffer
305 (insert-file-contents fullname nil (max 0 (- size 3000)) size)
306 (goto-char (point-max))
307 (let* ((found (search-backward-regexp "elisp-shorthands:[ \t]*" 0 t))
308 (val (and found
309 (goto-char (match-end 0))
310 (ignore-errors (read (current-buffer)))))
311 (probe val)
312 aux)
313 (catch 'done
314 (when (consp probe)
315 (while (setq aux (pop probe))
316 (unless (and (consp aux)
317 (stringp (car aux))
318 (stringp (cdr aux)))
319 (throw 'done nil)))
320 val))))))
321 299
322(defun load-with-code-conversion (fullname file &optional noerror nomessage) 300(defun load-with-code-conversion (fullname file &optional noerror nomessage)
323 "Execute a file of Lisp code named FILE whose absolute name is FULLNAME. 301 "Execute a file of Lisp code named FILE whose absolute name is FULLNAME.
@@ -344,7 +322,8 @@ Return t if file exists."
344 (let ((load-true-file-name fullname) 322 (let ((load-true-file-name fullname)
345 (load-file-name fullname) 323 (load-file-name fullname)
346 (set-auto-coding-for-load t) 324 (set-auto-coding-for-load t)
347 (inhibit-file-name-operation nil)) 325 (inhibit-file-name-operation nil)
326 shorthands)
348 (with-current-buffer buffer 327 (with-current-buffer buffer
349 ;; So that we don't get completely screwed if the 328 ;; So that we don't get completely screwed if the
350 ;; file is encoded in some complicated character set, 329 ;; file is encoded in some complicated character set,
@@ -353,6 +332,13 @@ Return t if file exists."
353 ;; Don't let deactivate-mark remain set. 332 ;; Don't let deactivate-mark remain set.
354 (let (deactivate-mark) 333 (let (deactivate-mark)
355 (insert-file-contents fullname)) 334 (insert-file-contents fullname))
335 (setq shorthands
336 ;; We need this indirection because hacking local
337 ;; variables in too early seems to have cause
338 ;; recursive load loops (bug#50946). Thus it
339 ;; remains nil until it is save to do so.
340 (and hack-read-symbol-shorthands-function
341 (funcall hack-read-symbol-shorthands-function)))
356 ;; If the loaded file was inserted with no-conversion or 342 ;; If the loaded file was inserted with no-conversion or
357 ;; raw-text coding system, make the buffer unibyte. 343 ;; raw-text coding system, make the buffer unibyte.
358 ;; Otherwise, eval-buffer might try to interpret random 344 ;; Otherwise, eval-buffer might try to interpret random
@@ -363,11 +349,13 @@ Return t if file exists."
363 (set-buffer-multibyte nil)) 349 (set-buffer-multibyte nil))
364 ;; Make `kill-buffer' quiet. 350 ;; Make `kill-buffer' quiet.
365 (set-buffer-modified-p nil)) 351 (set-buffer-modified-p nil))
366 ;; Have the original buffer current while we eval. 352 ;; Have the original buffer current while we eval,
367 (eval-buffer buffer nil 353 ;; but consider shorthands of the eval'ed one.
368 ;; This is compatible with what `load' does. 354 (let ((read-symbol-shorthands shorthands))
369 (if dump-mode file fullname) 355 (eval-buffer buffer nil
370 nil t)) 356 ;; This is compatible with what `load' does.
357 (if dump-mode file fullname)
358 nil t)))
371 (let (kill-buffer-hook kill-buffer-query-functions) 359 (let (kill-buffer-hook kill-buffer-query-functions)
372 (kill-buffer buffer))) 360 (kill-buffer buffer)))
373 (do-after-load-evaluation fullname) 361 (do-after-load-evaluation fullname)
@@ -378,13 +366,6 @@ Return t if file exists."
378 (message "Loading %s...done" file))) 366 (message "Loading %s...done" file)))
379 t))) 367 t)))
380 368
381(defun load-with-shorthands-and-code-conversion (fullname file noerror nomessage)
382 "Like `load-with-code-conversion', but also consider Elisp shorthands.
383This function uses shorthands defined in the file FULLNAME's local
384value of `elisp-shorthands', when it processes that file's Elisp code."
385 (let ((elisp-shorthands (hack-elisp-shorthands fullname)))
386 (load-with-code-conversion fullname file noerror nomessage)))
387
388(defun charset-info (charset) 369(defun charset-info (charset)
389 "Return a vector of information of CHARSET. 370 "Return a vector of information of CHARSET.
390This function is provided for backward compatibility. 371This function is provided for backward compatibility.
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 942057c838f..3a55d2c8057 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -151,7 +151,7 @@
151;; variable its advertised default value (it starts as nil, see 151;; variable its advertised default value (it starts as nil, see
152;; xdisp.c). 152;; xdisp.c).
153(setq resize-mini-windows 'grow-only) 153(setq resize-mini-windows 'grow-only)
154(setq load-source-file-function #'load-with-shorthands-and-code-conversion) 154(setq load-source-file-function #'load-with-code-conversion)
155(load "files") 155(load "files")
156 156
157;; Load-time macro-expansion can only take effect after setting 157;; Load-time macro-expansion can only take effect after setting
@@ -352,6 +352,10 @@
352(load "vc/ediff-hook") 352(load "vc/ediff-hook")
353(load "uniquify") 353(load "uniquify")
354(load "electric") 354(load "electric")
355(load "paren")
356
357(load "shorthands")
358
355(load "emacs-lisp/eldoc") 359(load "emacs-lisp/eldoc")
356(load "cus-start") ;Late to reduce customize-rogue (needs loaddefs.el anyway) 360(load "cus-start") ;Late to reduce customize-rogue (needs loaddefs.el anyway)
357(if (not (eq system-type 'ms-dos)) 361(if (not (eq system-type 'ms-dos))
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 5d4e05fa25e..bb47d04a3a8 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -290,6 +290,7 @@ and should return the same menu with changes such as added new menu items."
290 :type '(repeat 290 :type '(repeat
291 (choice (function-item context-menu-undo) 291 (choice (function-item context-menu-undo)
292 (function-item context-menu-region) 292 (function-item context-menu-region)
293 (function-item context-menu-middle-separator)
293 (function-item context-menu-toolbar) 294 (function-item context-menu-toolbar)
294 (function-item context-menu-global) 295 (function-item context-menu-global)
295 (function-item context-menu-local) 296 (function-item context-menu-local)
@@ -478,14 +479,6 @@ Some context functions add menu items below the separator."
478 `(menu-item "All" 479 `(menu-item "All"
479 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'buffer)) 480 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'buffer))
480 :help "Mark the whole buffer for a subsequent cut/copy")) 481 :help "Mark the whole buffer for a subsequent cut/copy"))
481 (define-key-after submenu [mark-defun]
482 `(menu-item "Defun"
483 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'defun))
484 :help "Mark the defun at click for a subsequent cut/copy"))
485 (define-key-after submenu [mark-list]
486 `(menu-item "List"
487 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'list))
488 :help "Mark the list at click for a subsequent cut/copy"))
489 (when (let* ((pos (posn-point (event-end click))) 482 (when (let* ((pos (posn-point (event-end click)))
490 (char (when pos (char-after pos)))) 483 (char (when pos (char-after pos))))
491 (or (and char (eq (char-syntax char) ?\")) 484 (or (and char (eq (char-syntax char) ?\"))
@@ -498,10 +491,6 @@ Some context functions add menu items below the separator."
498 `(menu-item "Line" 491 `(menu-item "Line"
499 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'line)) 492 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'line))
500 :help "Mark the line at click for a subsequent cut/copy")) 493 :help "Mark the line at click for a subsequent cut/copy"))
501 (define-key-after submenu [mark-symbol]
502 `(menu-item "Symbol"
503 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'symbol))
504 :help "Mark the symbol at click for a subsequent cut/copy"))
505 (when (region-active-p) 494 (when (region-active-p)
506 (define-key-after submenu [mark-none] 495 (define-key-after submenu [mark-none]
507 `(menu-item "None" 496 `(menu-item "None"
diff --git a/lisp/net/dictionary.el b/lisp/net/dictionary.el
index 86447c2c351..1d07989ef57 100644
--- a/lisp/net/dictionary.el
+++ b/lisp/net/dictionary.el
@@ -1382,10 +1382,12 @@ When you add this function to `context-menu-functions',
1382the context menu will contain an item that searches 1382the context menu will contain an item that searches
1383the word at mouse click." 1383the word at mouse click."
1384 (when (thing-at-mouse click 'word) 1384 (when (thing-at-mouse click 'word)
1385 (define-key menu [dictionary-separator] menu-bar-separator) 1385 (define-key-after menu [dictionary-separator] menu-bar-separator
1386 (define-key menu [dictionary-search-word-at-mouse] 1386 'middle-separator)
1387 (define-key-after menu [dictionary-search-word-at-mouse]
1387 '(menu-item "Dictionary Search" dictionary-search-word-at-mouse 1388 '(menu-item "Dictionary Search" dictionary-search-word-at-mouse
1388 :help "Search the word at mouse click in dictionary"))) 1389 :help "Search the word at mouse click in dictionary")
1390 'dictionary-separator))
1389 menu) 1391 menu)
1390 1392
1391(provide 'dictionary) 1393(provide 'dictionary)
diff --git a/lisp/net/tramp-cache.el b/lisp/net/tramp-cache.el
index 5a00915f4f0..f1c656ec209 100644
--- a/lisp/net/tramp-cache.el
+++ b/lisp/net/tramp-cache.el
@@ -319,12 +319,7 @@ KEY identifies the connection, it is either a process or a
319used to cache connection properties of the local machine. 319used to cache connection properties of the local machine.
320If KEY is `tramp-cache-undefined', or if the value is not set for 320If KEY is `tramp-cache-undefined', or if the value is not set for
321the connection, return DEFAULT." 321the connection, return DEFAULT."
322 ;; Unify key by removing localname and hop from `tramp-file-name' 322 (setq key (tramp-file-name-unify key))
323 ;; structure. Work with a copy in order to avoid side effects.
324 (when (tramp-file-name-p key)
325 (setq key (copy-tramp-file-name key))
326 (setf (tramp-file-name-localname key) nil
327 (tramp-file-name-hop key) nil))
328 (let* ((hash (tramp-get-hash-table key)) 323 (let* ((hash (tramp-get-hash-table key))
329 (cached (if (hash-table-p hash) 324 (cached (if (hash-table-p hash)
330 (gethash property hash tramp-cache-undefined) 325 (gethash property hash tramp-cache-undefined)
@@ -350,12 +345,7 @@ used to cache connection properties of the local machine. If KEY
350is `tramp-cache-undefined', nothing is set. 345is `tramp-cache-undefined', nothing is set.
351PROPERTY is set persistent when KEY is a `tramp-file-name' structure. 346PROPERTY is set persistent when KEY is a `tramp-file-name' structure.
352Return VALUE." 347Return VALUE."
353 ;; Unify key by removing localname and hop from `tramp-file-name' 348 (setq key (tramp-file-name-unify key))
354 ;; structure. Work with a copy in order to avoid side effects.
355 (when (tramp-file-name-p key)
356 (setq key (copy-tramp-file-name key))
357 (setf (tramp-file-name-localname key) nil
358 (tramp-file-name-hop key) nil))
359 (when-let ((hash (tramp-get-hash-table key))) 349 (when-let ((hash (tramp-get-hash-table key)))
360 (puthash property value hash)) 350 (puthash property value hash))
361 (setq tramp-cache-data-changed 351 (setq tramp-cache-data-changed
@@ -379,12 +369,7 @@ KEY identifies the connection, it is either a process or a
379`tramp-file-name' structure. A special case is nil, which is 369`tramp-file-name' structure. A special case is nil, which is
380used to cache connection properties of the local machine. 370used to cache connection properties of the local machine.
381PROPERTY is set persistent when KEY is a `tramp-file-name' structure." 371PROPERTY is set persistent when KEY is a `tramp-file-name' structure."
382 ;; Unify key by removing localname and hop from `tramp-file-name' 372 (setq key (tramp-file-name-unify key))
383 ;; structure. Work with a copy in order to avoid side effects.
384 (when (tramp-file-name-p key)
385 (setq key (copy-tramp-file-name key))
386 (setf (tramp-file-name-localname key) nil
387 (tramp-file-name-hop key) nil))
388 (when-let ((hash (tramp-get-hash-table key))) 373 (when-let ((hash (tramp-get-hash-table key)))
389 (remhash property hash)) 374 (remhash property hash))
390 (setq tramp-cache-data-changed 375 (setq tramp-cache-data-changed
@@ -397,12 +382,7 @@ PROPERTY is set persistent when KEY is a `tramp-file-name' structure."
397KEY identifies the connection, it is either a process or a 382KEY identifies the connection, it is either a process or a
398`tramp-file-name' structure. A special case is nil, which is 383`tramp-file-name' structure. A special case is nil, which is
399used to cache connection properties of the local machine." 384used to cache connection properties of the local machine."
400 ;; Unify key by removing localname and hop from `tramp-file-name' 385 (setq key (tramp-file-name-unify key))
401 ;; structure. Work with a copy in order to avoid side effects.
402 (when (tramp-file-name-p key)
403 (setq key (copy-tramp-file-name key))
404 (setf (tramp-file-name-localname key) nil
405 (tramp-file-name-hop key) nil))
406 (tramp-message 386 (tramp-message
407 key 7 "%s %s" key 387 key 7 "%s %s" key
408 (when-let ((hash (gethash key tramp-cache-data))) 388 (when-let ((hash (gethash key tramp-cache-data)))
diff --git a/lisp/net/tramp-fuse.el b/lisp/net/tramp-fuse.el
index 8c5afa7cf93..d2bac2d0ee2 100644
--- a/lisp/net/tramp-fuse.el
+++ b/lisp/net/tramp-fuse.el
@@ -175,15 +175,30 @@
175 mount) 175 mount)
176 (match-string 1 mount))))))) 176 (match-string 1 mount)))))))
177 177
178(defun tramp-fuse-get-fusermount ()
179 "Determine the local `fusermount' command."
180 ;; We use key nil for local connection properties.
181 (with-tramp-connection-property nil "fusermount"
182 (or (executable-find "fusermount3")
183 (executable-find "fusermount"))))
184
185(defvar tramp-fuse-mount-points nil
186 "List of fuse volume determined by a VEC.")
187
178(defun tramp-fuse-unmount (vec) 188(defun tramp-fuse-unmount (vec)
179 "Unmount fuse volume determined by VEC." 189 "Unmount fuse volume determined by VEC."
180 (let ((default-directory tramp-compat-temporary-file-directory) 190 (let* ((default-directory tramp-compat-temporary-file-directory)
181 (command (format "fusermount3 -u %s" (tramp-fuse-mount-point vec)))) 191 (mount-point (tramp-fuse-mount-point vec))
192 (command (format "%s -u %s" (tramp-fuse-get-fusermount) mount-point)))
182 (tramp-message vec 6 "%s\n%s" command (shell-command-to-string command)) 193 (tramp-message vec 6 "%s\n%s" command (shell-command-to-string command))
183 (tramp-flush-connection-property 194 (tramp-flush-connection-property
184 (tramp-get-connection-process vec) "mounted") 195 (tramp-get-connection-process vec) "mounted")
196 (setq tramp-fuse-mount-points
197 (delete (tramp-file-name-unify vec) tramp-fuse-mount-points))
185 ;; Give the caches a chance to expire. 198 ;; Give the caches a chance to expire.
186 (sleep-for 1))) 199 (sleep-for 1)
200 (when (tramp-compat-directory-empty-p mount-point)
201 (delete-directory mount-point))))
187 202
188(defun tramp-fuse-local-file-name (filename) 203(defun tramp-fuse-local-file-name (filename)
189 "Return local mount name of FILENAME." 204 "Return local mount name of FILENAME."
@@ -205,6 +220,36 @@
205 (substring localname 1) localname) 220 (substring localname 1) localname)
206 (tramp-fuse-mount-point v))))))) 221 (tramp-fuse-mount-point v)))))))
207 222
223(defcustom tramp-fuse-unmount-on-cleanup nil
224 "Whether fuse volumes shall be unmounted on cleanup."
225 :group 'tramp
226 :version "28.1"
227 :type 'boolean)
228
229(defun tramp-fuse-cleanup (vec)
230 "Cleanup fuse volume determined by VEC."
231 (and tramp-fuse-unmount-on-cleanup
232 (member (tramp-file-name-unify vec) tramp-fuse-mount-points)
233 (tramp-fuse-unmount vec)))
234
235(defun tramp-fuse-cleanup-all ()
236 "Unmount all fuse volumes used by Tramp."
237 (and tramp-fuse-unmount-on-cleanup
238 (mapc #'tramp-fuse-unmount tramp-fuse-mount-points)))
239
240;; Add cleanup hooks.
241(add-hook 'tramp-cleanup-connection-hook #'tramp-fuse-cleanup)
242(add-hook 'tramp-cleanup-all-connections-hook #'tramp-fuse-cleanup-all)
243(add-hook 'kill-emacs-hook #'tramp-fuse-cleanup-all)
244(add-hook 'tramp-fuse-unload-hook
245 (lambda ()
246 (remove-hook 'tramp-cleanup-connection-hook
247 #'tramp-fuse-cleanup)
248 (remove-hook 'tramp-cleanup-all-connections-hook
249 #'tramp-fuse-cleanup-all)
250 (remove-hook 'kill-emacs-hook
251 #'tramp-fuse-cleanup-all)))
252
208(add-hook 'tramp-unload-hook 253(add-hook 'tramp-unload-hook
209 (lambda () 254 (lambda ()
210 (unload-feature 'tramp-fuse 'force))) 255 (unload-feature 'tramp-fuse 'force)))
diff --git a/lisp/net/tramp-rclone.el b/lisp/net/tramp-rclone.el
index 49e366c01c6..812e06f3f11 100644
--- a/lisp/net/tramp-rclone.el
+++ b/lisp/net/tramp-rclone.el
@@ -386,6 +386,7 @@ connection if a previous connection has died for some reason."
386 (tramp-cleanup-connection vec 'keep-debug 'keep-password)) 386 (tramp-cleanup-connection vec 'keep-debug 'keep-password))
387 387
388 ;; Mark it as connected. 388 ;; Mark it as connected.
389 (add-to-list 'tramp-fuse-mount-points (tramp-file-name-unify vec))
389 (tramp-set-connection-property 390 (tramp-set-connection-property
390 (tramp-get-connection-process vec) "connected" t)))) 391 (tramp-get-connection-process vec) "connected" t))))
391 392
diff --git a/lisp/net/tramp-sshfs.el b/lisp/net/tramp-sshfs.el
index 0019ac014f8..2be0485fbf1 100644
--- a/lisp/net/tramp-sshfs.el
+++ b/lisp/net/tramp-sshfs.el
@@ -222,11 +222,14 @@ arguments to pass to the OPERATION."
222(defun tramp-sshfs-handle-insert-file-contents 222(defun tramp-sshfs-handle-insert-file-contents
223 (filename &optional visit beg end replace) 223 (filename &optional visit beg end replace)
224 "Like `insert-file-contents' for Tramp files." 224 "Like `insert-file-contents' for Tramp files."
225 (let ((result 225 (setq filename (expand-file-name filename))
226 (insert-file-contents 226 (let (signal-hook-function result)
227 (tramp-fuse-local-file-name filename) visit beg end replace))) 227 (unwind-protect
228 (when visit (setq buffer-file-name filename)) 228 (setq result
229 (cons (expand-file-name filename) (cdr result)))) 229 (insert-file-contents
230 (tramp-fuse-local-file-name filename) visit beg end replace))
231 (when visit (setq buffer-file-name filename))
232 (cons filename (cdr result)))))
230 233
231(defun tramp-sshfs-handle-process-file 234(defun tramp-sshfs-handle-process-file
232 (program &optional infile destination display &rest args) 235 (program &optional infile destination display &rest args)
@@ -368,6 +371,7 @@ connection if a previous connection has died for some reason."
368 vec 'file-error "Error mounting %s" (tramp-fuse-mount-spec vec)))) 371 vec 'file-error "Error mounting %s" (tramp-fuse-mount-spec vec))))
369 372
370 ;; Mark it as connected. 373 ;; Mark it as connected.
374 (add-to-list 'tramp-fuse-mount-points (tramp-file-name-unify vec))
371 (tramp-set-connection-property 375 (tramp-set-connection-property
372 (tramp-get-connection-process vec) "connected" t))) 376 (tramp-get-connection-process vec) "connected" t)))
373 377
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 62628363b77..c0f1cb161ec 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -1450,16 +1450,24 @@ If nil, return `tramp-default-port'."
1450 1450
1451(put #'tramp-file-name-port-or-default 'tramp-suppress-trace t) 1451(put #'tramp-file-name-port-or-default 'tramp-suppress-trace t)
1452 1452
1453(defun tramp-file-name-unify (vec)
1454 "Unify VEC by removing localname and hop from `tramp-file-name' structure.
1455Objects returned by this function compare `equal' if they refer to the
1456same connection. Make a copy in order to avoid side effects."
1457 (when (tramp-file-name-p vec)
1458 (setq vec (copy-tramp-file-name vec))
1459 (setf (tramp-file-name-localname vec) nil
1460 (tramp-file-name-hop vec) nil))
1461 vec)
1462
1463(put #'tramp-file-name-unify 'tramp-suppress-trace t)
1464
1453;; Comparison of file names is performed by `tramp-equal-remote'. 1465;; Comparison of file names is performed by `tramp-equal-remote'.
1454(defun tramp-file-name-equal-p (vec1 vec2) 1466(defun tramp-file-name-equal-p (vec1 vec2)
1455 "Check, whether VEC1 and VEC2 denote the same `tramp-file-name'." 1467 "Check, whether VEC1 and VEC2 denote the same `tramp-file-name'."
1456 (and (tramp-file-name-p vec1) (tramp-file-name-p vec2) 1468 (and (tramp-file-name-p vec1) (tramp-file-name-p vec2)
1457 (string-equal (tramp-file-name-method vec1) 1469 (equal (tramp-file-name-unify vec1)
1458 (tramp-file-name-method vec2)) 1470 (tramp-file-name-unify vec2))))
1459 (string-equal (tramp-file-name-user-domain vec1)
1460 (tramp-file-name-user-domain vec2))
1461 (string-equal (tramp-file-name-host-port vec1)
1462 (tramp-file-name-host-port vec2))))
1463 1471
1464(defun tramp-get-method-parameter (vec param) 1472(defun tramp-get-method-parameter (vec param)
1465 "Return the method parameter PARAM. 1473 "Return the method parameter PARAM.
@@ -3743,7 +3751,8 @@ User is always nil."
3743 (with-parsed-tramp-file-name filename nil 3751 (with-parsed-tramp-file-name filename nil
3744 (unwind-protect 3752 (unwind-protect
3745 (if (not (file-exists-p filename)) 3753 (if (not (file-exists-p filename))
3746 (tramp-compat-file-missing v filename) 3754 (let ((tramp-verbose (if visit 0 tramp-verbose)))
3755 (tramp-compat-file-missing v filename))
3747 3756
3748 (with-tramp-progress-reporter 3757 (with-tramp-progress-reporter
3749 v 3 (format-message "Inserting `%s'" filename) 3758 v 3 (format-message "Inserting `%s'" filename)
@@ -3845,7 +3854,7 @@ User is always nil."
3845 (delete-file (tramp-make-tramp-file-name v remote-copy 'nohop)))) 3854 (delete-file (tramp-make-tramp-file-name v remote-copy 'nohop))))
3846 3855
3847 ;; Result. 3856 ;; Result.
3848 (cons (expand-file-name filename) (cdr result))))) 3857 (cons filename (cdr result)))))
3849 3858
3850(defun tramp-get-lock-file (file) 3859(defun tramp-get-lock-file (file)
3851 "Read lockfile info of FILE. 3860 "Read lockfile info of FILE.
@@ -3920,7 +3929,8 @@ Return nil when there is no lockfile."
3920 (tramp-error v 'file-error "Unsafe lock file name"))) 3929 (tramp-error v 'file-error "Unsafe lock file name")))
3921 3930
3922 ;; Do the lock. 3931 ;; Do the lock.
3923 (let (create-lockfiles signal-hook-function) 3932 (let ((tramp-verbose 0)
3933 create-lockfiles signal-hook-function)
3924 (condition-case nil 3934 (condition-case nil
3925 (make-symbolic-link info lockname 'ok-if-already-exists) 3935 (make-symbolic-link info lockname 'ok-if-already-exists)
3926 (error 3936 (error
diff --git a/lisp/org/ob-gnuplot.el b/lisp/org/ob-gnuplot.el
index 3c84e4da14f..8c4a5957b99 100644
--- a/lisp/org/ob-gnuplot.el
+++ b/lisp/org/ob-gnuplot.el
@@ -290,7 +290,7 @@ Pass PARAMS through to `orgtbl-to-generic' when exporting TABLE."
290 (orgtbl-to-generic 290 (orgtbl-to-generic
291 table 291 table
292 (org-combine-plists 292 (org-combine-plists
293 '(:sep "\t" :fmt org-babel-gnuplot-quote-tsv-field) 293 '(:sep "\t" :fmt org-babel-gnuplot-quote-tsv-field :raw t :backend ascii)
294 params))))) 294 params)))))
295 data-file) 295 data-file)
296 296
diff --git a/lisp/org/ob-julia.el b/lisp/org/ob-julia.el
index 5ff6a7ca0a7..4fae0d142b2 100644
--- a/lisp/org/ob-julia.el
+++ b/lisp/org/ob-julia.el
@@ -6,20 +6,20 @@
6;; Keywords: literate programming, reproducible research, scientific computing 6;; Keywords: literate programming, reproducible research, scientific computing
7;; Homepage: https://github.com/phrb/ob-julia 7;; Homepage: https://github.com/phrb/ob-julia
8 8
9;; This file is not part of GNU Emacs. 9;; This file is part of GNU Emacs.
10 10
11;; This program is free software; you can redistribute it and/or modify 11;; GNU Emacs is free software: you can redistribute it and/or modify
12;; it under the terms of the GNU General Public License as published by 12;; it under the terms of the GNU General Public License as published by
13;; the Free Software Foundation, either version 3 of the License, or 13;; the Free Software Foundation, either version 3 of the License, or
14;; (at your option) any later version. 14;; (at your option) any later version.
15 15
16;; This program is distributed in the hope that it will be useful, 16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of 17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details. 19;; GNU General Public License for more details.
20 20
21;; You should have received a copy of the GNU General Public License 21;; You should have received a copy of the GNU General Public License
22;; along with this program. If not, see <https://www.gnu.org/licenses/>. 22;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
23 23
24;;; Commentary: 24;;; Commentary:
25 25
@@ -90,18 +90,13 @@ This function is called by `org-babel-execute-src-block'."
90 (graphics-file (and (member "graphics" (assq :result-params params)) 90 (graphics-file (and (member "graphics" (assq :result-params params))
91 (org-babel-graphical-output-file params))) 91 (org-babel-graphical-output-file params)))
92 (colnames-p (unless graphics-file (cdr (assq :colnames params)))) 92 (colnames-p (unless graphics-file (cdr (assq :colnames params))))
93 ;; (rownames-p (unless graphics-file (cdr (assq :rownames params))))
94 (full-body (org-babel-expand-body:julia body params graphics-file)) 93 (full-body (org-babel-expand-body:julia body params graphics-file))
95 (result 94 (result
96 (org-babel-julia-evaluate 95 (org-babel-julia-evaluate
97 session full-body result-type result-params 96 session full-body result-type result-params
98 (or (equal "yes" colnames-p) 97 (or (equal "yes" colnames-p)
99 (org-babel-pick-name 98 (org-babel-pick-name
100 (cdr (assq :colname-names params)) colnames-p)) 99 (cdr (assq :colname-names params)) colnames-p)))))
101 ;; (or (equal "yes" rownames-p)
102 ;; (org-babel-pick-name
103 ;; (cdr (assq :rowname-names params)) rownames-p))
104 )))
105 (if graphics-file nil result)))) 100 (if graphics-file nil result))))
106 101
107(defun org-babel-normalize-newline (result) 102(defun org-babel-normalize-newline (result)
@@ -135,12 +130,7 @@ This function is called by `org-babel-execute-src-block'."
135 "Return list of julia statements assigning the block's variables." 130 "Return list of julia statements assigning the block's variables."
136 (let ((vars (org-babel--get-vars params))) 131 (let ((vars (org-babel--get-vars params)))
137 (mapcar 132 (mapcar
138 (lambda (pair) 133 (lambda (pair) (org-babel-julia-assign-elisp (car pair) (cdr pair)))
139 (org-babel-julia-assign-elisp
140 (car pair) (cdr pair)
141 ;; (equal "yes" (cdr (assq :colnames params)))
142 ;; (equal "yes" (cdr (assq :rownames params)))
143 ))
144 (mapcar 134 (mapcar
145 (lambda (i) 135 (lambda (i)
146 (cons (car (nth i vars)) 136 (cons (car (nth i vars))
@@ -156,7 +146,7 @@ This function is called by `org-babel-execute-src-block'."
156 (concat "\"" (mapconcat #'identity (split-string s "\"") "\"\"") "\"") 146 (concat "\"" (mapconcat #'identity (split-string s "\"") "\"\"") "\"")
157 (format "%S" s))) 147 (format "%S" s)))
158 148
159(defun org-babel-julia-assign-elisp (name value) ;; colnames-p rownames-p 149(defun org-babel-julia-assign-elisp (name value)
160 "Construct julia code assigning the elisp VALUE to a variable named NAME." 150 "Construct julia code assigning the elisp VALUE to a variable named NAME."
161 (if (listp value) 151 (if (listp value)
162 (let* ((lengths (mapcar #'length (cl-remove-if-not #'sequencep value))) 152 (let* ((lengths (mapcar #'length (cl-remove-if-not #'sequencep value)))
@@ -164,11 +154,7 @@ This function is called by `org-babel-execute-src-block'."
164 (min (if lengths (apply #'min lengths) 0))) 154 (min (if lengths (apply #'min lengths) 0)))
165 ;; Ensure VALUE has an orgtbl structure (depth of at least 2). 155 ;; Ensure VALUE has an orgtbl structure (depth of at least 2).
166 (unless (listp (car value)) (setq value (list value))) 156 (unless (listp (car value)) (setq value (list value)))
167 (let ((file (orgtbl-to-csv value '(:fmt org-babel-julia-quote-csv-field))) 157 (let ((file (orgtbl-to-csv value '(:fmt org-babel-julia-quote-csv-field))))
168 ;; (header (if (or (eq (nth 1 value) 'hline) colnames-p)
169 ;; "TRUE" "FALSE"))
170 ;; (row-names (if rownames-p "1" "NULL"))
171 )
172 (if (= max min) 158 (if (= max min)
173 (format "%s = begin 159 (format "%s = begin
174 using CSV 160 using CSV
@@ -188,7 +174,7 @@ end"
188 (let ((session (or session "*Julia*")) 174 (let ((session (or session "*Julia*"))
189 (ess-ask-for-ess-directory 175 (ess-ask-for-ess-directory
190 (and (bound-and-true-p ess-ask-for-ess-directory) 176 (and (bound-and-true-p ess-ask-for-ess-directory)
191 (not (cdr (assq :dir params)))))) 177 (not (cdr (assq :dir params))))))
192 (if (org-babel-comint-buffer-livep session) 178 (if (org-babel-comint-buffer-livep session)
193 session 179 session
194 ;; FIXME: Depending on `display-buffer-alist', (julia) may end up 180 ;; FIXME: Depending on `display-buffer-alist', (julia) may end up
@@ -209,14 +195,6 @@ end"
209 (buffer-name)))) 195 (buffer-name))))
210 (current-buffer)))))) 196 (current-buffer))))))
211 197
212 ; (defun org-babel-julia-associate-session (session)
213 ; "Associate julia code buffer with a julia session.
214 ; Make SESSION be the inferior ESS process associated with the
215 ; current code buffer."
216 ; (setq ess-local-process-name
217 ; (process-name (get-buffer-process session)))
218 ; (ess-make-buffer-current))
219
220(defun org-babel-julia-graphical-output-file (params) 198(defun org-babel-julia-graphical-output-file (params)
221 "Name of file to which julia should send graphical output." 199 "Name of file to which julia should send graphical output."
222 (and (member "graphics" (cdr (assq :result-params params))) 200 (and (member "graphics" (cdr (assq :result-params params)))
@@ -259,16 +237,16 @@ end"
259end") 237end")
260 238
261(defun org-babel-julia-evaluate 239(defun org-babel-julia-evaluate
262 (session body result-type result-params column-names-p) ;; row-names-p 240 (session body result-type result-params column-names-p)
263 "Evaluate julia code in BODY." 241 "Evaluate julia code in BODY."
264 (if session 242 (if session
265 (org-babel-julia-evaluate-session 243 (org-babel-julia-evaluate-session
266 session body result-type result-params column-names-p) ;; row-names-p 244 session body result-type result-params column-names-p)
267 (org-babel-julia-evaluate-external-process 245 (org-babel-julia-evaluate-external-process
268 body result-type result-params column-names-p))) ;; row-names-p 246 body result-type result-params column-names-p)))
269 247
270(defun org-babel-julia-evaluate-external-process 248(defun org-babel-julia-evaluate-external-process
271 (body result-type result-params column-names-p) ;; row-names-p 249 (body result-type result-params column-names-p)
272 "Evaluate BODY in external julia process. 250 "Evaluate BODY in external julia process.
273If RESULT-TYPE equals 'output then return standard output as a 251If RESULT-TYPE equals 'output then return standard output as a
274string. If RESULT-TYPE equals 'value then return the value of the 252string. If RESULT-TYPE equals 'value then return the value of the
@@ -292,7 +270,7 @@ last statement in BODY, as elisp."
292 (output (org-babel-eval org-babel-julia-command body)))) 270 (output (org-babel-eval org-babel-julia-command body))))
293 271
294(defun org-babel-julia-evaluate-session 272(defun org-babel-julia-evaluate-session
295 (session body result-type result-params column-names-p) ;; row-names-p 273 (session body result-type result-params column-names-p)
296 "Evaluate BODY in SESSION. 274 "Evaluate BODY in SESSION.
297If RESULT-TYPE equals 'output then return standard output as a 275If RESULT-TYPE equals 'output then return standard output as a
298string. If RESULT-TYPE equals 'value then return the value of the 276string. If RESULT-TYPE equals 'value then return the value of the
diff --git a/lisp/org/oc-basic.el b/lisp/org/oc-basic.el
index 3b589908e04..98242f3b841 100644
--- a/lisp/org/oc-basic.el
+++ b/lisp/org/oc-basic.el
@@ -4,18 +4,20 @@
4 4
5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr> 5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>
6 6
7;; This program is free software; you can redistribute it and/or modify 7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software: you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by 10;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or 11;; the Free Software Foundation, either version 3 of the License, or
10;; (at your option) any later version. 12;; (at your option) any later version.
11 13
12;; This program is distributed in the hope that it will be useful, 14;; GNU Emacs is distributed in the hope that it will be useful,
13;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;; GNU General Public License for more details. 17;; GNU General Public License for more details.
16 18
17;; You should have received a copy of the GNU General Public License 19;; You should have received a copy of the GNU General Public License
18;; along with this program. If not, see <https://www.gnu.org/licenses/>. 20;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
19 21
20;;; Commentary: 22;;; Commentary:
21 23
@@ -87,42 +89,42 @@
87 :group 'org-cite 89 :group 'org-cite
88 :package-version '(Org . "9.5") 90 :package-version '(Org . "9.5")
89 :type 'symbol 91 :type 'symbol
90 :safe t) 92 :safe #'symbolp)
91 93
92(defcustom org-cite-basic-author-year-separator ", " 94(defcustom org-cite-basic-author-year-separator ", "
93 "String used to separate cites in an author-year configuration." 95 "String used to separate cites in an author-year configuration."
94 :group 'org-cite 96 :group 'org-cite
95 :package-version '(Org . "9.5") 97 :package-version '(Org . "9.5")
96 :type 'string 98 :type 'string
97 :safe t) 99 :safe #'stringp)
98 100
99(defcustom org-cite-basic-max-key-distance 2 101(defcustom org-cite-basic-max-key-distance 2
100 "Maximum (Levenshtein) distance between a wrong key and its suggestions." 102 "Maximum (Levenshtein) distance between a wrong key and its suggestions."
101 :group 'org-cite 103 :group 'org-cite
102 :package-version '(Org . "9.5") 104 :package-version '(Org . "9.5")
103 :type 'integer 105 :type 'integer
104 :safe t) 106 :safe #'integerp)
105 107
106(defcustom org-cite-basic-author-column-end 25 108(defcustom org-cite-basic-author-column-end 25
107 "Column where author field ends in completion table, as an integer." 109 "Column where author field ends in completion table, as an integer."
108 :group 'org-cite 110 :group 'org-cite
109 :package-version '(Org . "9.5") 111 :package-version '(Org . "9.5")
110 :type 'integer 112 :type 'integer
111 :safe t) 113 :safe #'integerp)
112 114
113(defcustom org-cite-basic-column-separator " " 115(defcustom org-cite-basic-column-separator " "
114 "Column separator in completion table, as a string." 116 "Column separator in completion table, as a string."
115 :group 'org-cite 117 :group 'org-cite
116 :package-version '(Org . "9.5") 118 :package-version '(Org . "9.5")
117 :type 'string 119 :type 'string
118 :safe t) 120 :safe #'stringp)
119 121
120(defcustom org-cite-basic-mouse-over-key-face 'highlight 122(defcustom org-cite-basic-mouse-over-key-face 'highlight
121 "Face used when mouse is over a citation key." 123 "Face used when mouse is over a citation key."
122 :group 'org-cite 124 :group 'org-cite
123 :package-version '(Org . "9.5") 125 :package-version '(Org . "9.5")
124 :type 'face 126 :type 'face
125 :safe t) 127 :safe #'facep)
126 128
127 129
128;;; Internal variables 130;;; Internal variables
diff --git a/lisp/org/oc-biblatex.el b/lisp/org/oc-biblatex.el
index a27f9e9bf10..f517e391398 100644
--- a/lisp/org/oc-biblatex.el
+++ b/lisp/org/oc-biblatex.el
@@ -4,18 +4,20 @@
4 4
5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr> 5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>
6 6
7;; This program is free software; you can redistribute it and/or modify 7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software: you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by 10;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or 11;; the Free Software Foundation, either version 3 of the License, or
10;; (at your option) any later version. 12;; (at your option) any later version.
11 13
12;; This program is distributed in the hope that it will be useful, 14;; GNU Emacs is distributed in the hope that it will be useful,
13;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;; GNU General Public License for more details. 17;; GNU General Public License for more details.
16 18
17;; You should have received a copy of the GNU General Public License 19;; You should have received a copy of the GNU General Public License
18;; along with this program. If not, see <https://www.gnu.org/licenses/>. 20;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
19 21
20;;; Commentary: 22;;; Commentary:
21 23
@@ -78,7 +80,7 @@ If \"biblatex\" package is already required in the document, e.g., through
78 :type '(choice 80 :type '(choice
79 (string :tag "Options (key=value,key2=value2...)") 81 (string :tag "Options (key=value,key2=value2...)")
80 (const :tag "No option" nil)) 82 (const :tag "No option" nil))
81 :safe t) 83 :safe #'string-or-null-p)
82 84
83 85
84;;; Internal functions 86;;; Internal functions
diff --git a/lisp/org/oc-csl.el b/lisp/org/oc-csl.el
index 5623efcc1b3..3d138807592 100644
--- a/lisp/org/oc-csl.el
+++ b/lisp/org/oc-csl.el
@@ -4,18 +4,20 @@
4 4
5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr> 5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>
6 6
7;; This program is free software; you can redistribute it and/or modify 7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software: you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by 10;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or 11;; the Free Software Foundation, either version 3 of the License, or
10;; (at your option) any later version. 12;; (at your option) any later version.
11 13
12;; This program is distributed in the hope that it will be useful, 14;; GNU Emacs is distributed in the hope that it will be useful,
13;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;; GNU General Public License for more details. 17;; GNU General Public License for more details.
16 18
17;; You should have received a copy of the GNU General Public License 19;; You should have received a copy of the GNU General Public License
18;; along with this program. If not, see <https://www.gnu.org/licenses/>. 20;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
19 21
20;;; Commentary: 22;;; Commentary:
21 23
@@ -125,7 +127,9 @@ If nil then only the fallback en-US locale will be available."
125 :type '(choice 127 :type '(choice
126 (directory :tag "Locales directory") 128 (directory :tag "Locales directory")
127 (const :tag "Use en-US locale only" nil)) 129 (const :tag "Use en-US locale only" nil))
128 :safe t) 130 ;; It's not obvious to me that arbitrary locations are safe.
131;;; :safe #'string-or-null-p
132 )
129 133
130(defcustom org-cite-csl-styles-dir nil 134(defcustom org-cite-csl-styles-dir nil
131 "Directory of CSL style files. 135 "Directory of CSL style files.
@@ -136,7 +140,9 @@ directory. This variable is ignored when style file is absolute."
136 :type '(choice 140 :type '(choice
137 (directory :tag "Styles directory") 141 (directory :tag "Styles directory")
138 (const :tag "Use absolute file names" nil)) 142 (const :tag "Use absolute file names" nil))
139 :safe t) 143 ;; It's not obvious to me that arbitrary locations are safe.
144;;; :safe #'string-or-null-p
145 )
140 146
141;;;; Citelinks 147;;;; Citelinks
142(defcustom org-cite-csl-link-cites t 148(defcustom org-cite-csl-link-cites t
@@ -144,7 +150,7 @@ directory. This variable is ignored when style file is absolute."
144 :group 'org-cite 150 :group 'org-cite
145 :package-version '(Org . "9.5") 151 :package-version '(Org . "9.5")
146 :type 'boolean 152 :type 'boolean
147 :safe t) 153 :safe #'booleanp)
148 154
149(defcustom org-cite-csl-no-citelinks-backends '(ascii) 155(defcustom org-cite-csl-no-citelinks-backends '(ascii)
150 "List of export back-ends for which cite linking is disabled. 156 "List of export back-ends for which cite linking is disabled.
@@ -152,8 +158,7 @@ Cite linking for export back-ends derived from any of the back-ends listed here,
152is also disabled." 158is also disabled."
153 :group 'org-cite 159 :group 'org-cite
154 :package-version '(Org . "9.5") 160 :package-version '(Org . "9.5")
155 :type '(repeat symbol) 161 :type '(repeat symbol))
156 :safe t)
157 162
158;;;; Output-specific variables 163;;;; Output-specific variables
159(defcustom org-cite-csl-html-hanging-indent "1.5em" 164(defcustom org-cite-csl-html-hanging-indent "1.5em"
@@ -161,7 +166,7 @@ is also disabled."
161 :group 'org-cite 166 :group 'org-cite
162 :package-version '(Org . "9.5") 167 :package-version '(Org . "9.5")
163 :type 'string 168 :type 'string
164 :safe t) 169 :safe #'stringp)
165 170
166(defcustom org-cite-csl-html-label-width-per-char "0.6em" 171(defcustom org-cite-csl-html-label-width-per-char "0.6em"
167 "Character width in CSS units for calculating entry label widths. 172 "Character width in CSS units for calculating entry label widths.
@@ -169,27 +174,33 @@ Used only when `second-field-align' is activated by the used CSL style."
169 :group 'org-cite 174 :group 'org-cite
170 :package-version '(Org . "9.5") 175 :package-version '(Org . "9.5")
171 :type 'string 176 :type 'string
172 :safe t) 177 :safe #'stringp)
173 178
174(defcustom org-cite-csl-latex-hanging-indent "1.5em" 179(defcustom org-cite-csl-latex-hanging-indent "1.5em"
175 "Size of hanging-indent for LaTeX output in valid LaTeX units." 180 "Size of hanging-indent for LaTeX output in valid LaTeX units."
176 :group 'org-cite 181 :group 'org-cite
177 :package-version '(Org . "9.5") 182 :package-version '(Org . "9.5")
178 :type 'string 183 :type 'string
179 :safe t) 184 :safe #'stringp)
180 185
181 186
182;;; Internal variables 187;;; Internal variables
183(defconst org-cite-csl--etc-dir 188(defconst org-cite-csl--etc-dir
184 (let* ((oc-root (file-name-directory (locate-library "oc"))) 189 (let ((oc-root (file-name-directory (locate-library "oc"))))
185 (oc-etc-dir-1 (expand-file-name "../etc/csl/" oc-root))) 190 (cond
186 ;; package.el and straight will put all of org-mode/lisp/ in org-mode/. 191 ;; First check whether it looks like we're running from the main
187 ;; This will cause .. to resolve to the directory above Org. 192 ;; Org repository.
188 ;; To make life easier for people using package.el or straight, we can 193 ((let ((csl-org (expand-file-name "../etc/csl/" oc-root)))
189 ;; check to see if ../etc/csl exists, and if it doesn't try ./etc/csl. 194 (and (file-directory-p csl-org) csl-org)))
190 (if (file-exists-p oc-etc-dir-1) oc-etc-dir-1 195 ;; Next look for the directory alongside oc.el because package.el
191 (expand-file-name "etc/csl/" oc-root))) 196 ;; and straight will put all of org-mode/lisp/ in org-mode/.
192 "Directory \"etc/\" from repository.") 197 ((let ((csl-pkg (expand-file-name "etc/csl/" oc-root)))
198 (and (file-directory-p csl-pkg) csl-pkg)))
199 ;; Finally fall back the location used by shared system installs
200 ;; and when running directly from Emacs repository.
201 (t
202 (expand-file-name "org/csl/" data-directory))))
203 "Directory containing CSL-related data files.")
193 204
194(defconst org-cite-csl--fallback-locales-dir org-cite-csl--etc-dir 205(defconst org-cite-csl--fallback-locales-dir org-cite-csl--etc-dir
195 "Fallback CSL locale files directory.") 206 "Fallback CSL locale files directory.")
diff --git a/lisp/org/oc-natbib.el b/lisp/org/oc-natbib.el
index 7e2127bd8d9..13cac9ed0b9 100644
--- a/lisp/org/oc-natbib.el
+++ b/lisp/org/oc-natbib.el
@@ -4,18 +4,20 @@
4 4
5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr> 5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>
6 6
7;; This program is free software; you can redistribute it and/or modify 7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software: you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by 10;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or 11;; the Free Software Foundation, either version 3 of the License, or
10;; (at your option) any later version. 12;; (at your option) any later version.
11 13
12;; This program is distributed in the hope that it will be useful, 14;; GNU Emacs is distributed in the hope that it will be useful,
13;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;; GNU General Public License for more details. 17;; GNU General Public License for more details.
16 18
17;; You should have received a copy of the GNU General Public License 19;; You should have received a copy of the GNU General Public License
18;; along with this program. If not, see <https://www.gnu.org/licenses/>. 20;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
19 21
20;;; Commentary: 22;;; Commentary:
21 23
@@ -69,8 +71,7 @@ If \"natbib\" package is already required in the document, e.g., through
69 (const :tag "order as above, but numerical citations are compressed if possible" sort&compress) 71 (const :tag "order as above, but numerical citations are compressed if possible" sort&compress)
70 (const :tag "display full author list on first citation, abbreviate the others" longnamesfirst) 72 (const :tag "display full author list on first citation, abbreviate the others" longnamesfirst)
71 (const :tag "redefine \\thebibliography to issue \\section* instead of \\chapter*" sectionbib) 73 (const :tag "redefine \\thebibliography to issue \\section* instead of \\chapter*" sectionbib)
72 (const :tag "keep all the authors' names in a citation on one line" nonamebreak)) 74 (const :tag "keep all the authors' names in a citation on one line" nonamebreak)))
73 :safe t)
74 75
75 76
76;;; Internal functions 77;;; Internal functions
diff --git a/lisp/org/oc.el b/lisp/org/oc.el
index eb2b7a16953..bbf2195fbd8 100644
--- a/lisp/org/oc.el
+++ b/lisp/org/oc.el
@@ -4,18 +4,20 @@
4 4
5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr> 5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>
6 6
7;; This program is free software; you can redistribute it and/or modify 7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software: you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by 10;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or 11;; the Free Software Foundation, either version 3 of the License, or
10;; (at your option) any later version. 12;; (at your option) any later version.
11 13
12;; This program is distributed in the hope that it will be useful, 14;; GNU Emacs is distributed in the hope that it will be useful,
13;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;; GNU General Public License for more details. 17;; GNU General Public License for more details.
16 18
17;; You should have received a copy of the GNU General Public License 19;; You should have received a copy of the GNU General Public License
18;; along with this program. If not, see <https://www.gnu.org/licenses/>. 20;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
19 21
20;;; Commentary: 22;;; Commentary:
21 23
@@ -125,16 +127,14 @@ File names must be absolute."
125 :package-version '(Org . "9.5") 127 :package-version '(Org . "9.5")
126 :type '(choice (const :tag "No global bibliography" nil) 128 :type '(choice (const :tag "No global bibliography" nil)
127 (repeat :tag "List of bibliography files" 129 (repeat :tag "List of bibliography files"
128 (file :tag "Bibliography"))) 130 (file :tag "Bibliography"))))
129 :safe t)
130 131
131(defcustom org-cite-activate-processor 'basic 132(defcustom org-cite-activate-processor 'basic
132 "Processor used for activating citations, as a symbol." 133 "Processor used for activating citations, as a symbol."
133 :group 'org-cite 134 :group 'org-cite
134 :package-version '(Org . "9.5") 135 :package-version '(Org . "9.5")
135 :type '(choice (const :tag "Default fontification" nil) 136 :type '(choice (const :tag "Default fontification" nil)
136 (symbol :tag "Citation processor")) 137 (symbol :tag "Citation processor")))
137 :safe nil)
138 138
139(defcustom org-cite-export-processors '((t basic)) 139(defcustom org-cite-export-processors '((t basic))
140 "Processor used for exporting citations, as a triplet, or nil. 140 "Processor used for exporting citations, as a triplet, or nil.
@@ -198,24 +198,21 @@ back-end."
198 (string :tag "Use specific bibliography style")) 198 (string :tag "Use specific bibliography style"))
199 (choice 199 (choice
200 (const :tag "Default citation style" nil) 200 (const :tag "Default citation style" nil)
201 (string :tag "Use specific citation style"))))) 201 (string :tag "Use specific citation style"))))))
202 :safe nil)
203 202
204(defcustom org-cite-follow-processor 'basic 203(defcustom org-cite-follow-processor 'basic
205 "Processor used for following citations, as a symbol." 204 "Processor used for following citations, as a symbol."
206 :group 'org-cite 205 :group 'org-cite
207 :package-version '(Org . "9.5") 206 :package-version '(Org . "9.5")
208 :type '(choice (const :tag "No following" nil) 207 :type '(choice (const :tag "No following" nil)
209 (symbol :tag "Citation processor")) 208 (symbol :tag "Citation processor")))
210 :safe nil)
211 209
212(defcustom org-cite-insert-processor 'basic 210(defcustom org-cite-insert-processor 'basic
213 "Processor used for inserting citations, as a symbol." 211 "Processor used for inserting citations, as a symbol."
214 :group 'org-cite 212 :group 'org-cite
215 :package-version '(Org . "9.5") 213 :package-version '(Org . "9.5")
216 :type '(choice (const :tag "No insertion" nil) 214 :type '(choice (const :tag "No insertion" nil)
217 (symbol :tag "Citation processor")) 215 (symbol :tag "Citation processor")))
218 :safe nil)
219 216
220(defcustom org-cite-adjust-note-numbers t 217(defcustom org-cite-adjust-note-numbers t
221 "When non-nil, allow process to modify location of note numbers. 218 "When non-nil, allow process to modify location of note numbers.
@@ -232,7 +229,7 @@ When nil, the note number is not moved."
232 :package-version '(Org . "9.5") 229 :package-version '(Org . "9.5")
233 :type '(choice (const :tag "Automatic note number location" t) 230 :type '(choice (const :tag "Automatic note number location" t)
234 (const :tag "Place note numbers manually" nil)) 231 (const :tag "Place note numbers manually" nil))
235 :safe t) 232 :safe #'booleanp)
236 233
237(defcustom org-cite-note-rules 234(defcustom org-cite-note-rules
238 '(("en-us" inside outside after) 235 '(("en-us" inside outside after)
@@ -297,8 +294,7 @@ This roughly follows the Oxford Guide to Style recommendations."
297 (const :tag "Citation next to punctuation" same)) 294 (const :tag "Citation next to punctuation" same))
298 (choice :tag "Order of citation and punctuation" 295 (choice :tag "Order of citation and punctuation"
299 (const :tag "Citation first" before) 296 (const :tag "Citation first" before)
300 (const :tag "Citation last" after)))) 297 (const :tag "Citation last" after)))))
301 :safe t)
302 298
303(defcustom org-cite-punctuation-marks '("." "," ";" ":" "!" "?") 299(defcustom org-cite-punctuation-marks '("." "," ";" ":" "!" "?")
304 "List of strings that can be moved around when placing note numbers. 300 "List of strings that can be moved around when placing note numbers.
@@ -308,8 +304,7 @@ allowed to shuffle punctuation marks specified in this list in order to
308place note numbers according to rules defined in `org-cite-note-rules'." 304place note numbers according to rules defined in `org-cite-note-rules'."
309 :group 'org-cite 305 :group 'org-cite
310 :package-version '(Org . "9.5") 306 :package-version '(Org . "9.5")
311 :type '(repeat string) 307 :type '(repeat string))
312 :safe t)
313 308
314 309
315;;; Citation processors 310;;; Citation processors
diff --git a/lisp/org/ol-doi.el b/lisp/org/ol-doi.el
index dfde380209f..d2d16b27d51 100644
--- a/lisp/org/ol-doi.el
+++ b/lisp/org/ol-doi.el
@@ -1,21 +1,23 @@
1;;; ol-doi.el --- DOI links support in Org -*- lexical-binding: t; -*- 1;;; ol-doi.el --- DOI links support in Org -*- lexical-binding: t; -*-
2 2
3;; Copyright (C) 2021 Free Software Foundation, Inc. 3;; Copyright (C) 2021 Free Software Foundation, Inc.
4 4
5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr> 5;; Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>
6 6
7;; This program is free software; you can redistribute it and/or modify 7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software: you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by 10;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or 11;; the Free Software Foundation, either version 3 of the License, or
10;; (at your option) any later version. 12;; (at your option) any later version.
11 13
12;; This program is distributed in the hope that it will be useful, 14;; GNU Emacs is distributed in the hope that it will be useful,
13;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;; GNU General Public License for more details. 17;; GNU General Public License for more details.
16 18
17;; You should have received a copy of the GNU General Public License 19;; You should have received a copy of the GNU General Public License
18;; along with this program. If not, see <https://www.gnu.org/licenses/>. 20;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
19 21
20;;; Commentary: 22;;; Commentary:
21 23
diff --git a/lisp/org/ol.el b/lisp/org/ol.el
index e4a5a278dda..aa1849715c3 100644
--- a/lisp/org/ol.el
+++ b/lisp/org/ol.el
@@ -178,8 +178,7 @@ link.
178 :group 'org-link 178 :group 'org-link
179 :package-version '(Org . "9.1") 179 :package-version '(Org . "9.1")
180 :type '(alist :tag "Link display parameters" 180 :type '(alist :tag "Link display parameters"
181 :value-type plist) 181 :value-type plist))
182 :safe nil)
183 182
184(defcustom org-link-descriptive t 183(defcustom org-link-descriptive t
185 "Non-nil means Org displays descriptive links. 184 "Non-nil means Org displays descriptive links.
@@ -335,8 +334,7 @@ another window."
335 (cons (const wl) 334 (cons (const wl)
336 (choice 335 (choice
337 (const wl) 336 (const wl)
338 (const wl-other-frame)))) 337 (const wl-other-frame)))))
339 :safe nil)
340 338
341(defcustom org-link-search-must-match-exact-headline 'query-to-create 339(defcustom org-link-search-must-match-exact-headline 'query-to-create
342 "Non-nil means internal fuzzy links can only match headlines. 340 "Non-nil means internal fuzzy links can only match headlines.
@@ -385,15 +383,13 @@ single keystroke rather than having to type \"yes\"."
385 :type '(choice 383 :type '(choice
386 (const :tag "with yes-or-no (safer)" yes-or-no-p) 384 (const :tag "with yes-or-no (safer)" yes-or-no-p)
387 (const :tag "with y-or-n (faster)" y-or-n-p) 385 (const :tag "with y-or-n (faster)" y-or-n-p)
388 (const :tag "no confirmation (dangerous)" nil)) 386 (const :tag "no confirmation (dangerous)" nil)))
389 :safe nil)
390 387
391(defcustom org-link-shell-skip-confirm-regexp "" 388(defcustom org-link-shell-skip-confirm-regexp ""
392 "Regexp to skip confirmation for shell links." 389 "Regexp to skip confirmation for shell links."
393 :group 'org-link-follow 390 :group 'org-link-follow
394 :version "24.1" 391 :version "24.1"
395 :type 'regexp 392 :type 'regexp)
396 :safe nil)
397 393
398(defcustom org-link-elisp-confirm-function 'yes-or-no-p 394(defcustom org-link-elisp-confirm-function 'yes-or-no-p
399 "Non-nil means ask for confirmation before executing Emacs Lisp links. 395 "Non-nil means ask for confirmation before executing Emacs Lisp links.
@@ -410,15 +406,13 @@ single keystroke rather than having to type \"yes\"."
410 :type '(choice 406 :type '(choice
411 (const :tag "with yes-or-no (safer)" yes-or-no-p) 407 (const :tag "with yes-or-no (safer)" yes-or-no-p)
412 (const :tag "with y-or-n (faster)" y-or-n-p) 408 (const :tag "with y-or-n (faster)" y-or-n-p)
413 (const :tag "no confirmation (dangerous)" nil)) 409 (const :tag "no confirmation (dangerous)" nil)))
414 :safe nil)
415 410
416(defcustom org-link-elisp-skip-confirm-regexp "" 411(defcustom org-link-elisp-skip-confirm-regexp ""
417 "A regexp to skip confirmation for Elisp links." 412 "A regexp to skip confirmation for Elisp links."
418 :group 'org-link-follow 413 :group 'org-link-follow
419 :version "24.1" 414 :version "24.1"
420 :type 'regexp 415 :type 'regexp)
421 :safe nil)
422 416
423(defgroup org-link-store nil 417(defgroup org-link-store nil
424 "Options concerning storing links in Org mode." 418 "Options concerning storing links in Org mode."
diff --git a/lisp/org/org-keys.el b/lisp/org/org-keys.el
index 2984a4f5145..a10db7e6667 100644
--- a/lisp/org/org-keys.el
+++ b/lisp/org/org-keys.el
@@ -279,8 +279,7 @@ before org.el is loaded."
279 :type '(choice 279 :type '(choice
280 (const :tag "A double click follows the link" double) 280 (const :tag "A double click follows the link" double)
281 (const :tag "Unconditionally follow the link with mouse-1" t) 281 (const :tag "Unconditionally follow the link with mouse-1" t)
282 (integer :tag "mouse-1 click does not follow the link if longer than N ms" 450)) 282 (integer :tag "mouse-1 click does not follow the link if longer than N ms" 450)))
283 :safe t)
284 283
285(defcustom org-tab-follows-link nil 284(defcustom org-tab-follows-link nil
286 "Non-nil means on links TAB will follow the link. 285 "Non-nil means on links TAB will follow the link.
@@ -300,7 +299,7 @@ implementation is bad."
300In tables, the special behavior of RET has precedence." 299In tables, the special behavior of RET has precedence."
301 :group 'org-link-follow 300 :group 'org-link-follow
302 :type 'boolean 301 :type 'boolean
303 :safe t) 302 :safe #'booleanp)
304 303
305 304
306;;; Functions 305;;; Functions
diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el
index a8fb79ea3cd..0779c3a82c8 100644
--- a/lisp/org/org-macs.el
+++ b/lisp/org/org-macs.el
@@ -326,17 +326,19 @@ it for output."
326 326
327;;; Indentation 327;;; Indentation
328 328
329(defun org-do-remove-indentation (&optional n) 329(defun org-do-remove-indentation (&optional n skip-fl)
330 "Remove the maximum common indentation from the buffer. 330 "Remove the maximum common indentation from the buffer.
331When optional argument N is a positive integer, remove exactly 331When optional argument N is a positive integer, remove exactly
332that much characters from indentation, if possible. Return nil 332that much characters from indentation, if possible. When
333if it fails." 333optional argument SKIP-FL is non-nil, skip the first
334line. Return nil if it fails."
334 (catch :exit 335 (catch :exit
335 (goto-char (point-min)) 336 (goto-char (point-min))
336 ;; Find maximum common indentation, if not specified. 337 ;; Find maximum common indentation, if not specified.
337 (let ((n (or n 338 (let ((n (or n
338 (let ((min-ind (point-max))) 339 (let ((min-ind (point-max)))
339 (save-excursion 340 (save-excursion
341 (when skip-fl (forward-line))
340 (while (re-search-forward "^[ \t]*\\S-" nil t) 342 (while (re-search-forward "^[ \t]*\\S-" nil t)
341 (let ((ind (current-indentation))) 343 (let ((ind (current-indentation)))
342 (if (zerop ind) (throw :exit nil) 344 (if (zerop ind) (throw :exit nil)
@@ -344,6 +346,7 @@ if it fails."
344 min-ind)))) 346 min-ind))))
345 (if (zerop n) (throw :exit nil) 347 (if (zerop n) (throw :exit nil)
346 ;; Remove exactly N indentation, but give up if not possible. 348 ;; Remove exactly N indentation, but give up if not possible.
349 (when skip-fl (forward-line))
347 (while (not (eobp)) 350 (while (not (eobp))
348 (let ((ind (progn (skip-chars-forward " \t") (current-column)))) 351 (let ((ind (progn (skip-chars-forward " \t") (current-column))))
349 (cond ((eolp) (delete-region (line-beginning-position) (point))) 352 (cond ((eolp) (delete-region (line-beginning-position) (point)))
diff --git a/lisp/org/org-num.el b/lisp/org/org-num.el
index 408b86ff411..f00e6c463b8 100644
--- a/lisp/org/org-num.el
+++ b/lisp/org/org-num.el
@@ -99,8 +99,7 @@ Any `face' text property on the returned string overrides
99`org-num-face'." 99`org-num-face'."
100 :group 'org-appearance 100 :group 'org-appearance
101 :package-version '(Org . "9.3") 101 :package-version '(Org . "9.3")
102 :type 'function 102 :type 'function)
103 :safe nil)
104 103
105(defcustom org-num-max-level nil 104(defcustom org-num-max-level nil
106 "Level below which headlines are not numbered. 105 "Level below which headlines are not numbered.
diff --git a/lisp/org/org-src.el b/lisp/org/org-src.el
index 91a3d415dfa..8d02cf43450 100644
--- a/lisp/org/org-src.el
+++ b/lisp/org/org-src.el
@@ -38,6 +38,7 @@
38(require 'org-keys) 38(require 'org-keys)
39 39
40(declare-function org-mode "org" ()) 40(declare-function org-mode "org" ())
41(declare-function org--get-expected-indentation "org" (element contentsp))
41(declare-function org-element-at-point "org-element" ()) 42(declare-function org-element-at-point "org-element" ())
42(declare-function org-element-class "org-element" (datum &optional parent)) 43(declare-function org-element-class "org-element" (datum &optional parent))
43(declare-function org-element-context "org-element" (&optional element)) 44(declare-function org-element-context "org-element" (&optional element))
@@ -327,7 +328,8 @@ a cons cell (LINE . COLUMN) or symbol `end'. See also
327 (if (>= pos end) 'end 328 (if (>= pos end) 'end
328 (org-with-wide-buffer 329 (org-with-wide-buffer
329 (goto-char (max beg pos)) 330 (goto-char (max beg pos))
330 (cons (count-lines beg (line-beginning-position)) 331 (cons (count-lines (save-excursion (goto-char beg) (line-beginning-position))
332 (line-beginning-position))
331 ;; Column is relative to the end of line to avoid problems of 333 ;; Column is relative to the end of line to avoid problems of
332 ;; comma escaping or colons appended in front of the line. 334 ;; comma escaping or colons appended in front of the line.
333 (- (point) (min end (line-end-position))))))) 335 (- (point) (min end (line-end-position)))))))
@@ -445,6 +447,7 @@ Assume point is in the corresponding edit buffer."
445 org-src--content-indentation 447 org-src--content-indentation
446 0)))) 448 0))))
447 (use-tabs? (and (> org-src--tab-width 0) t)) 449 (use-tabs? (and (> org-src--tab-width 0) t))
450 (preserve-fl (eq org-src--source-type 'latex-fragment))
448 (source-tab-width org-src--tab-width) 451 (source-tab-width org-src--tab-width)
449 (contents (org-with-wide-buffer 452 (contents (org-with-wide-buffer
450 (let ((eol (line-end-position))) 453 (let ((eol (line-end-position)))
@@ -466,7 +469,8 @@ Assume point is in the corresponding edit buffer."
466 ;; Add INDENTATION-OFFSET to every line in buffer, 469 ;; Add INDENTATION-OFFSET to every line in buffer,
467 ;; unless indentation is meant to be preserved. 470 ;; unless indentation is meant to be preserved.
468 (when (> indentation-offset 0) 471 (when (> indentation-offset 0)
469 (while (not (eobp)) 472 (when preserve-fl (forward-line))
473 (while (not (eobp))
470 (skip-chars-forward " \t") 474 (skip-chars-forward " \t")
471 (when (or (not (eolp)) ; not a blank line 475 (when (or (not (eolp)) ; not a blank line
472 (and (eq (point) (marker-position marker)) ; current line 476 (and (eq (point) (marker-position marker)) ; current line
@@ -518,7 +522,13 @@ Leave point in edit buffer."
518 (source-tab-width (if indent-tabs-mode tab-width 0)) 522 (source-tab-width (if indent-tabs-mode tab-width 0))
519 (type (org-element-type datum)) 523 (type (org-element-type datum))
520 (block-ind (org-with-point-at (org-element-property :begin datum) 524 (block-ind (org-with-point-at (org-element-property :begin datum)
521 (current-indentation))) 525 (cond
526 ((save-excursion (skip-chars-backward " \t") (bolp))
527 (current-indentation))
528 ((org-element-property :parent datum)
529 (org--get-expected-indentation
530 (org-element-property :parent datum) nil))
531 (t (current-indentation)))))
522 (content-ind org-edit-src-content-indentation) 532 (content-ind org-edit-src-content-indentation)
523 (blank-line (save-excursion (beginning-of-line) 533 (blank-line (save-excursion (beginning-of-line)
524 (looking-at-p "^[[:space:]]*$"))) 534 (looking-at-p "^[[:space:]]*$")))
@@ -548,7 +558,8 @@ Leave point in edit buffer."
548 (insert contents) 558 (insert contents)
549 (remove-text-properties (point-min) (point-max) 559 (remove-text-properties (point-min) (point-max)
550 '(display nil invisible nil intangible nil)) 560 '(display nil invisible nil intangible nil))
551 (unless preserve-ind (org-do-remove-indentation)) 561 (let ((lf (eq type 'latex-fragment)))
562 (unless preserve-ind (org-do-remove-indentation (and lf block-ind) lf)))
552 (set-buffer-modified-p nil) 563 (set-buffer-modified-p nil)
553 (setq buffer-file-name nil) 564 (setq buffer-file-name nil)
554 ;; Initialize buffer. 565 ;; Initialize buffer.
diff --git a/lisp/org/org-version.el b/lisp/org/org-version.el
index ef363dc3901..5bccbe497cc 100644
--- a/lisp/org/org-version.el
+++ b/lisp/org/org-version.el
@@ -11,7 +11,7 @@ Inserted by installing Org mode or when a release is made."
11(defun org-git-version () 11(defun org-git-version ()
12 "The Git version of Org mode. 12 "The Git version of Org mode.
13Inserted by installing Org or when a release is made." 13Inserted by installing Org or when a release is made."
14 (let ((org-git-version "release_9.5")) 14 (let ((org-git-version "release_9.5-30-g10dc9d"))
15 org-git-version)) 15 org-git-version))
16 16
17(provide 'org-version) 17(provide 'org-version)
diff --git a/lisp/org/org.el b/lisp/org/org.el
index 2ec6566c0b0..bc0ea24bee7 100644
--- a/lisp/org/org.el
+++ b/lisp/org/org.el
@@ -3630,7 +3630,7 @@ When this is non-nil, the headline after the keyword is set to the
3630 :group 'org-appearance 3630 :group 'org-appearance
3631 :package-version '(Org . "9.4") 3631 :package-version '(Org . "9.4")
3632 :type 'boolean 3632 :type 'boolean
3633 :safe t) 3633 :safe #'booleanp)
3634 3634
3635(defcustom org-fontify-done-headline t 3635(defcustom org-fontify-done-headline t
3636 "Non-nil means change the face of a headline if it is marked DONE. 3636 "Non-nil means change the face of a headline if it is marked DONE.
@@ -5113,6 +5113,7 @@ stacked delimiters is N. Escaping delimiters is not possible."
5113 '(invisible t)) 5113 '(invisible t))
5114 (add-text-properties (match-beginning 3) (match-end 3) 5114 (add-text-properties (match-beginning 3) (match-end 3)
5115 '(invisible t))) 5115 '(invisible t)))
5116 (goto-char (match-end 0))
5116 (throw :exit t)))))))) 5117 (throw :exit t))))))))
5117 5118
5118(defun org-emphasize (&optional char) 5119(defun org-emphasize (&optional char)
diff --git a/lisp/org/ox-html.el b/lisp/org/ox-html.el
index 60bb77d8188..a150b1fdb87 100644
--- a/lisp/org/ox-html.el
+++ b/lisp/org/ox-html.el
@@ -795,7 +795,7 @@ Most common values are:
795 :group 'org-export-html 795 :group 'org-export-html
796 :package-version '(Org . "9.4") 796 :package-version '(Org . "9.4")
797 :type 'string 797 :type 'string
798 :safe t) 798 :safe #'stringp)
799 799
800(defcustom org-html-with-latex org-export-with-latex 800(defcustom org-html-with-latex org-export-with-latex
801 "Non-nil means process LaTeX math snippets. 801 "Non-nil means process LaTeX math snippets.
@@ -903,7 +903,7 @@ numbers are enabled."
903 :group 'org-export-html 903 :group 'org-export-html
904 :package-version '(Org . "9.3") 904 :package-version '(Org . "9.3")
905 :type 'boolean 905 :type 'boolean
906 :safe t) 906 :safe #'booleanp)
907 907
908;;;; Table 908;;;; Table
909 909
diff --git a/lisp/org/ox-koma-letter.el b/lisp/org/ox-koma-letter.el
index 96704dbb985..6a895a6a24d 100644
--- a/lisp/org/ox-koma-letter.el
+++ b/lisp/org/ox-koma-letter.el
@@ -11,12 +11,12 @@
11 11
12;; This file is part of GNU Emacs. 12;; This file is part of GNU Emacs.
13 13
14;; This program is free software: you can redistribute it and/or modify 14;; GNU Emacs is free software: you can redistribute it and/or modify
15;; it under the terms of the GNU General Public License as published by 15;; it under the terms of the GNU General Public License as published by
16;; the Free Software Foundation, either version 3 of the License, or 16;; the Free Software Foundation, either version 3 of the License, or
17;; (at your option) any later version. 17;; (at your option) any later version.
18 18
19;; This program is distributed in the hope that it will be useful, 19;; GNU Emacs is distributed in the hope that it will be useful,
20;; but WITHOUT ANY WARRANTY; without even the implied warranty of 20;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22;; GNU General Public License for more details. 22;; GNU General Public License for more details.
@@ -594,7 +594,7 @@ such as the one tagged with PS."
594 594
595;;;; Export Block 595;;;; Export Block
596 596
597(defun org-koma-letter-export-block (export-block contents info) 597(defun org-koma-letter-export-block (export-block _contents _info)
598 "Transcode an EXPORT-BLOCK element into KOMA Scrlttr2 code. 598 "Transcode an EXPORT-BLOCK element into KOMA Scrlttr2 code.
599CONTENTS is nil. INFO is a plist used as a communication 599CONTENTS is nil. INFO is a plist used as a communication
600channel." 600channel."
@@ -604,7 +604,7 @@ channel."
604 604
605;;;; Export Snippet 605;;;; Export Snippet
606 606
607(defun org-koma-letter-export-snippet (export-snippet contents info) 607(defun org-koma-letter-export-snippet (export-snippet _contents _info)
608 "Transcode an EXPORT-SNIPPET object into KOMA Scrlttr2 code. 608 "Transcode an EXPORT-SNIPPET object into KOMA Scrlttr2 code.
609CONTENTS is nil. INFO is a plist used as a communication 609CONTENTS is nil. INFO is a plist used as a communication
610channel." 610channel."
diff --git a/lisp/org/ox-latex.el b/lisp/org/ox-latex.el
index 993c2c6431d..3e3967033a5 100644
--- a/lisp/org/ox-latex.el
+++ b/lisp/org/ox-latex.el
@@ -413,7 +413,7 @@ to \"\\autoref{%s}\" or \"\\cref{%s}\" for example."
413 :group 'org-export-latex 413 :group 'org-export-latex
414 :type 'string 414 :type 'string
415 :package-version '(Org . "9.5") 415 :package-version '(Org . "9.5")
416 :safe t) 416 :safe #'stringp)
417 417
418;;;; Preamble 418;;;; Preamble
419 419
@@ -793,7 +793,7 @@ default we use here encompasses both."
793 :group 'org-export-latex 793 :group 'org-export-latex
794 :package-version '(Org . "9.5") 794 :package-version '(Org . "9.5")
795 :type 'string 795 :type 'string
796 :safe t) 796 :safe #'stringp)
797 797
798(defcustom org-latex-default-table-mode 'table 798(defcustom org-latex-default-table-mode 'table
799 "Default mode for tables. 799 "Default mode for tables.
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index acf7123225f..c7474b25a78 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -548,7 +548,7 @@ in `completion-at-point-functions' (which see)."
548 (lambda (s) 548 (lambda (s)
549 (push s retval) 549 (push s retval)
550 (cl-loop 550 (cl-loop
551 for (shorthand . longhand) in elisp-shorthands 551 for (shorthand . longhand) in read-symbol-shorthands
552 for full-name = (symbol-name s) 552 for full-name = (symbol-name s)
553 when (string-prefix-p longhand full-name) 553 when (string-prefix-p longhand full-name)
554 do (let ((sym (make-symbol 554 do (let ((sym (make-symbol
@@ -559,17 +559,17 @@ in `completion-at-point-functions' (which see)."
559 (push sym retval) 559 (push sym retval)
560 retval)))) 560 retval))))
561 retval))) 561 retval)))
562 (cond ((null elisp-shorthands) obarray) 562 (cond ((null read-symbol-shorthands) obarray)
563 ((and obarray-cache 563 ((and obarray-cache
564 (gethash (cons (current-buffer) elisp-shorthands) 564 (gethash (cons (current-buffer) read-symbol-shorthands)
565 obarray-cache))) 565 obarray-cache)))
566 (obarray-cache 566 (obarray-cache
567 (puthash (cons (current-buffer) elisp-shorthands) 567 (puthash (cons (current-buffer) read-symbol-shorthands)
568 (obarray-plus-shorthands) 568 (obarray-plus-shorthands)
569 obarray-cache)) 569 obarray-cache))
570 (t 570 (t
571 (setq obarray-cache (make-hash-table :test #'equal)) 571 (setq obarray-cache (make-hash-table :test #'equal))
572 (puthash (cons (current-buffer) elisp-shorthands) 572 (puthash (cons (current-buffer) read-symbol-shorthands)
573 (obarray-plus-shorthands) 573 (obarray-plus-shorthands)
574 obarray-cache))))) 574 obarray-cache)))))
575 575
@@ -2126,7 +2126,7 @@ Runs in a batch-mode Emacs. Interactively use variable
2126 (pp collected))) 2126 (pp collected)))
2127 2127
2128 2128
2129(put 'elisp-shorthands 'safe-local-variable #'consp) 2129(put 'read-symbol-shorthands 'safe-local-variable #'consp)
2130 2130
2131(provide 'elisp-mode) 2131(provide 'elisp-mode)
2132;;; elisp-mode.el ends here 2132;;; elisp-mode.el ends here
diff --git a/lisp/progmodes/prog-mode.el b/lisp/progmodes/prog-mode.el
index 6c09dcf881d..4f15686dc87 100644
--- a/lisp/progmodes/prog-mode.el
+++ b/lisp/progmodes/prog-mode.el
@@ -68,6 +68,28 @@
68 `(menu-item "Find Definition" xref-find-definitions-at-mouse 68 `(menu-item "Find Definition" xref-find-definitions-at-mouse
69 :help ,(format "Find definition of `%s'" identifier)) 69 :help ,(format "Find definition of `%s'" identifier))
70 'prog-separator))) 70 'prog-separator)))
71
72 (when (thing-at-mouse click 'symbol)
73 (define-key-after menu [select-region mark-symbol]
74 `(menu-item "Symbol"
75 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'symbol))
76 :help "Mark the symbol at click for a subsequent cut/copy")
77 'mark-whole-buffer))
78 (define-key-after menu [select-region mark-list]
79 `(menu-item "List"
80 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'list))
81 :help "Mark the list at click for a subsequent cut/copy")
82 'mark-whole-buffer)
83 (define-key-after menu [select-region mark-defun]
84 `(menu-item "Defun"
85 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'defun))
86 :help "Mark the defun at click for a subsequent cut/copy")
87 'mark-whole-buffer)
88
89 ;; Include text-mode select menu only in strings and comments.
90 (when (nth 8 (save-excursion (syntax-ppss (posn-point (event-end click)))))
91 (text-mode-menu menu click))
92
71 menu) 93 menu)
72 94
73(defvar prog-mode-map 95(defvar prog-mode-map
diff --git a/lisp/progmodes/which-func.el b/lisp/progmodes/which-func.el
index 8946e2c3f42..176f599649f 100644
--- a/lisp/progmodes/which-func.el
+++ b/lisp/progmodes/which-func.el
@@ -185,7 +185,8 @@ and you want to simplify them for the mode line
185 185
186(defvar-local which-func-mode nil 186(defvar-local which-func-mode nil
187 "Non-nil means display current function name in mode line. 187 "Non-nil means display current function name in mode line.
188This makes a difference only if `which-function-mode' is non-nil.") 188This makes a difference only if variable `which-function-mode' is
189non-nil.")
189 190
190(add-hook 'after-change-major-mode-hook #'which-func-ff-hook t) 191(add-hook 'after-change-major-mode-hook #'which-func-ff-hook t)
191 192
diff --git a/lisp/shorthands.el b/lisp/shorthands.el
new file mode 100644
index 00000000000..e9f5880ab29
--- /dev/null
+++ b/lisp/shorthands.el
@@ -0,0 +1,80 @@
1;;; shorthands.el --- Read code considering Elisp shorthands -*- lexical-binding: t; -*-
2
3;; Copyright (C) 2021 Free Software Foundation, Inc.
4
5;; Author: João Távora <joaotavora@gmail.com>
6;; Keywords: lisp
7
8;; This file is part of GNU Emacs.
9
10;; GNU Emacs is free software: you can redistribute it and/or modify
11;; it under the terms of the GNU General Public License as published by
12;; the Free Software Foundation, either version 3 of the License, or
13;; (at your option) any later version.
14
15;; GNU Emacs is distributed in the hope that it will be useful,
16;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18;; GNU General Public License for more details.
19
20;; You should have received a copy of the GNU General Public License
21;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
22
23;;; Commentary:
24
25;; Basic helpers for loading files with Shorthands.
26
27;;; Code:
28(require 'files)
29(require 'mule)
30(eval-when-compile (require 'cl-lib))
31
32(defun hack-read-symbol-shorthands ()
33 "Compute `read-symbol-shorthands' from Local Variables section."
34 ;; FIXME: relies on the `hack-local-variables--find-variables'
35 ;; detail of files.el. That function should be exported,
36 ;; possibly be refactored into two parts, since we're only
37 ;; interested in basic "Local Variables" parsing.
38 (alist-get 'read-symbol-shorthands (hack-local-variables--find-variables)))
39
40(setq hack-read-symbol-shorthands-function #'hack-read-symbol-shorthands)
41
42
43;; FIXME: move this all to progmodes/elisp-mode.el? OTOH it'd make
44;; more sense there, OTOH all the elisp font-lock stuff is actually in
45;; lisp/emacs-lisp/lisp-mode.el, which isn't right either. So
46;; shorthand font-locking logic is probably better here for now.
47
48(defface elisp-shorthand-font-lock-face
49 '((t :inherit font-lock-keyword-face :foreground "cyan"))
50 "Face for highlighting shorthands in Emacs Lisp."
51 :version "28.1"
52 :group 'font-lock-faces)
53
54(defun shorthands--mismatch-from-end (str1 str2)
55 (cl-loop with l1 = (length str1) with l2 = (length str2)
56 for i from 1
57 for i1 = (- l1 i) for i2 = (- l2 i)
58 while (and (>= i1 0) (>= i2 0) (eq (aref str1 i1) (aref str2 i2)))
59 finally (return (1- i))))
60
61(defun shorthands-font-lock-shorthands (limit)
62 (when read-symbol-shorthands
63 (while (re-search-forward
64 (eval-when-compile
65 (concat "\\_<\\(" lisp-mode-symbol-regexp "\\)\\_>"))
66 limit t)
67 (let* ((existing (get-text-property (match-beginning 1) 'face))
68 (probe (and (not (memq existing '(font-lock-comment-face
69 font-lock-string-face)))
70 (intern-soft (match-string 1))))
71 (sname (and probe (symbol-name probe)))
72 (mm (and sname (shorthands--mismatch-from-end
73 (match-string 1) sname))))
74 (unless (or (null mm) (= mm (length sname)))
75 (add-face-text-property (match-beginning 1) (1+ (- (match-end 1) mm))
76 'elisp-shorthand-font-lock-face))))))
77
78(font-lock-add-keywords 'emacs-lisp-mode '((shorthands-font-lock-shorthands)) t)
79
80;;; shorthands.el ends here
diff --git a/lisp/subr.el b/lisp/subr.el
index 6473c5ac11b..c3dbe8df800 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -6437,7 +6437,9 @@ of fill.el (for example `fill-region')."
6437(defun internal--format-docstring-line (string &rest objects) 6437(defun internal--format-docstring-line (string &rest objects)
6438 "Format a single line from a documentation string out of STRING and OBJECTS. 6438 "Format a single line from a documentation string out of STRING and OBJECTS.
6439Signal an error if STRING contains a newline. 6439Signal an error if STRING contains a newline.
6440This is intended for internal use only." 6440This is intended for internal use only. Avoid using this for the
6441first line of a docstring; the first line should be a complete
6442sentence (see Info node `(elisp) Documentation Tips')."
6441 (when (string-match "\n" string) 6443 (when (string-match "\n" string)
6442 (error "Unable to fill string containing newline: %S" string)) 6444 (error "Unable to fill string containing newline: %S" string))
6443 (internal--fill-string-single-line (apply #'format string objects))) 6445 (internal--fill-string-single-line (apply #'format string objects)))
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 634328e223b..68afb539fa3 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -1211,13 +1211,26 @@ Interactively, ARG selects the ARGth different frame to move to."
1211 "Detach tab number FROM-NUMBER to a new frame. 1211 "Detach tab number FROM-NUMBER to a new frame.
1212Interactively or without argument, detach current tab." 1212Interactively or without argument, detach current tab."
1213 (interactive (list (1+ (tab-bar--current-tab-index)))) 1213 (interactive (list (1+ (tab-bar--current-tab-index))))
1214 (let* ((tab (nth (1- (or from-number 1)) (funcall tab-bar-tabs-function))) 1214 (let* ((tabs (funcall tab-bar-tabs-function))
1215 (tab-name (alist-get 'name tab)) 1215 (tab-index (1- (or from-number (1+ (tab-bar--current-tab-index tabs)))))
1216 (tab-name (alist-get 'name (nth tab-index tabs)))
1217 ;; On some window managers, `make-frame' selects the new frame,
1218 ;; so previously selected frame is saved to `from-frame'.
1219 (from-frame (selected-frame))
1216 (new-frame (make-frame `((name . ,tab-name))))) 1220 (new-frame (make-frame `((name . ,tab-name)))))
1217 (tab-bar-move-tab-to-frame nil nil from-number new-frame nil) 1221 (tab-bar-move-tab-to-frame nil from-frame from-number new-frame nil)
1218 (with-selected-frame new-frame 1222 (with-selected-frame new-frame
1219 (tab-bar-close-tab)))) 1223 (tab-bar-close-tab))))
1220 1224
1225(defun tab-bar-move-window-to-tab ()
1226 "Detach the selected window to a new tab."
1227 (interactive)
1228 (let ((tab-bar-new-tab-choice 'window))
1229 (tab-bar-new-tab))
1230 (tab-bar-switch-to-recent-tab)
1231 (delete-window)
1232 (tab-bar-switch-to-recent-tab))
1233
1221 1234
1222(defcustom tab-bar-new-tab-to 'right 1235(defcustom tab-bar-new-tab-to 'right
1223 "Defines where to create a new tab. 1236 "Defines where to create a new tab.
@@ -1264,9 +1277,10 @@ After the tab is created, the hooks in
1264 (select-window (minibuffer-selected-window))) 1277 (select-window (minibuffer-selected-window)))
1265 (let ((ignore-window-parameters t)) 1278 (let ((ignore-window-parameters t))
1266 (delete-other-windows)) 1279 (delete-other-windows))
1267 ;; Create a new window to get rid of old window parameters 1280 (unless (eq tab-bar-new-tab-choice 'window)
1268 ;; (e.g. prev/next buffers) of old window. 1281 ;; Create a new window to get rid of old window parameters
1269 (split-window) (delete-window) 1282 ;; (e.g. prev/next buffers) of old window.
1283 (split-window) (delete-window))
1270 (let ((buffer 1284 (let ((buffer
1271 (if (functionp tab-bar-new-tab-choice) 1285 (if (functionp tab-bar-new-tab-choice)
1272 (funcall tab-bar-new-tab-choice) 1286 (funcall tab-bar-new-tab-choice)
diff --git a/lisp/tab-line.el b/lisp/tab-line.el
index 4a751b384e5..890d1243e73 100644
--- a/lisp/tab-line.el
+++ b/lisp/tab-line.el
@@ -574,7 +574,10 @@ For use in `tab-line-tab-face-functions'."
574 ;; handle tab-line scrolling 574 ;; handle tab-line scrolling
575 (window-parameter nil 'tab-line-hscroll) 575 (window-parameter nil 'tab-line-hscroll)
576 ;; for setting face 'tab-line-tab-current' 576 ;; for setting face 'tab-line-tab-current'
577 (eq (selected-window) (old-selected-window)))) 577 (eq (selected-window) (old-selected-window))
578 (and (memq 'tab-line-tab-face-modified
579 tab-line-tab-face-functions)
580 (buffer-file-name) (buffer-modified-p))))
578 (cache (window-parameter nil 'tab-line-cache))) 581 (cache (window-parameter nil 'tab-line-cache)))
579 ;; Enable auto-hscroll again after it was disabled on manual scrolling. 582 ;; Enable auto-hscroll again after it was disabled on manual scrolling.
580 ;; The moment to enable it is when the window-buffer was updated. 583 ;; The moment to enable it is when the window-buffer was updated.
diff --git a/lisp/textmodes/etc-authors-mode.el b/lisp/textmodes/etc-authors-mode.el
index a591b2db978..8b5fefd3b7d 100644
--- a/lisp/textmodes/etc-authors-mode.el
+++ b/lisp/textmodes/etc-authors-mode.el
@@ -5,18 +5,20 @@
5;; Author: Stefan Kangas <stefan@marxist.se> 5;; Author: Stefan Kangas <stefan@marxist.se>
6;; Keywords: internal 6;; Keywords: internal
7 7
8;; This program is free software; you can redistribute it and/or modify 8;; This file is part of GNU Emacs.
9
10;; GNU Emacs is free software: you can redistribute it and/or modify
9;; it under the terms of the GNU General Public License as published by 11;; it under the terms of the GNU General Public License as published by
10;; the Free Software Foundation, either version 3 of the License, or 12;; the Free Software Foundation, either version 3 of the License, or
11;; (at your option) any later version. 13;; (at your option) any later version.
12 14
13;; This program is distributed in the hope that it will be useful, 15;; GNU Emacs is distributed in the hope that it will be useful,
14;; but WITHOUT ANY WARRANTY; without even the implied warranty of 16;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16;; GNU General Public License for more details. 18;; GNU General Public License for more details.
17 19
18;; You should have received a copy of the GNU General Public License 20;; You should have received a copy of the GNU General Public License
19;; along with this program. If not, see <https://www.gnu.org/licenses/>. 21;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
20 22
21;;; Commentary: 23;;; Commentary:
22 24
diff --git a/lisp/textmodes/fill.el b/lisp/textmodes/fill.el
index 81d908c95e7..decce88573b 100644
--- a/lisp/textmodes/fill.el
+++ b/lisp/textmodes/fill.el
@@ -768,7 +768,7 @@ space does not end a sentence, so don't break a line there."
768 (setq first nil 768 (setq first nil
769 linebeg (+ (point) (length actual-fill-prefix)))) 769 linebeg (+ (point) (length actual-fill-prefix))))
770 (move-to-column (current-fill-column)) 770 (move-to-column (current-fill-column))
771 (if (when (< (point) to) 771 (if (when (and (< (point) to) (< linebeg to))
772 ;; Find the position where we'll break the line. 772 ;; Find the position where we'll break the line.
773 ;; Use an immediately following space, if any. 773 ;; Use an immediately following space, if any.
774 ;; However, note that `move-to-column' may overshoot 774 ;; However, note that `move-to-column' may overshoot
diff --git a/lisp/textmodes/reftex-cite.el b/lisp/textmodes/reftex-cite.el
index 8a54b1a301f..e1475934ddb 100644
--- a/lisp/textmodes/reftex-cite.el
+++ b/lisp/textmodes/reftex-cite.el
@@ -814,7 +814,7 @@ in order to only add another reference in the same cite command."
814 (interactive) 814 (interactive)
815 (reftex-citation nil ?t)) 815 (reftex-citation nil ?t))
816 816
817(defvar reftex-select-bib-map) 817(defvar reftex-select-bib-mode-map)
818(defvar reftex--found-list) 818(defvar reftex--found-list)
819(defun reftex-offer-bib-menu () 819(defun reftex-offer-bib-menu ()
820 "Offer bib menu and return list of selected items." 820 "Offer bib menu and return list of selected items."
@@ -870,7 +870,7 @@ in order to only add another reference in the same cite command."
870 (reftex-select-item 870 (reftex-select-item
871 reftex-citation-prompt 871 reftex-citation-prompt
872 reftex-citation-help 872 reftex-citation-help
873 reftex-select-bib-map 873 reftex-select-bib-mode-map
874 nil 874 nil
875 'reftex-bibtex-selection-callback nil)) 875 'reftex-bibtex-selection-callback nil))
876 (setq key (car rtn) 876 (setq key (car rtn)
diff --git a/lisp/textmodes/reftex-ref.el b/lisp/textmodes/reftex-ref.el
index 9d5bc5a8f0f..a5d83c34d67 100644
--- a/lisp/textmodes/reftex-ref.el
+++ b/lisp/textmodes/reftex-ref.el
@@ -533,7 +533,7 @@ When called with 2 \\[universal-argument] prefix args, disable magic word recogn
533 (cons (cdr cell) (- (match-end 0) (match-end 1))) 533 (cons (cdr cell) (- (match-end 0) (match-end 1)))
534 nil))) 534 nil)))
535 535
536(defvar reftex-select-label-map) 536(defvar reftex-select-label-mode-map)
537(defun reftex-offer-label-menu (typekey) 537(defun reftex-offer-label-menu (typekey)
538 ;; Offer a menu with the appropriate labels. 538 ;; Offer a menu with the appropriate labels.
539 (let* ((buf (current-buffer)) 539 (let* ((buf (current-buffer))
@@ -605,7 +605,7 @@ When called with 2 \\[universal-argument] prefix args, disable magic word recogn
605 (reftex-select-item 605 (reftex-select-item
606 reftex-select-label-prompt 606 reftex-select-label-prompt
607 reftex-select-label-help 607 reftex-select-label-help
608 reftex-select-label-map 608 reftex-select-label-mode-map
609 offset 609 offset
610 'reftex-show-label-location follow)) 610 'reftex-show-label-location follow))
611 (setq key (car rtn) 611 (setq key (car rtn)
diff --git a/lisp/textmodes/text-mode.el b/lisp/textmodes/text-mode.el
index 74c6d412a65..3243bd31c4c 100644
--- a/lisp/textmodes/text-mode.el
+++ b/lisp/textmodes/text-mode.el
@@ -95,6 +95,28 @@ inherit all the commands defined in this map.")
95 :style toggle 95 :style toggle
96 :selected (memq 'turn-on-auto-fill text-mode-hook)])) 96 :selected (memq 'turn-on-auto-fill text-mode-hook)]))
97 97
98(defun text-mode-menu (menu click)
99 "Populate MENU with text selection commands at CLICK."
100
101 (when (thing-at-mouse click 'word)
102 (define-key-after menu [select-region mark-word]
103 `(menu-item "Word"
104 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'word))
105 :help "Mark the word at click for a subsequent cut/copy")
106 'mark-whole-buffer))
107 (define-key-after menu [select-region mark-sentence]
108 `(menu-item "Sentence"
109 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'sentence))
110 :help "Mark the sentence at click for a subsequent cut/copy")
111 'mark-whole-buffer)
112 (define-key-after menu [select-region mark-paragraph]
113 `(menu-item "Paragraph"
114 ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'paragraph))
115 :help "Mark the paragraph at click for a subsequent cut/copy")
116 'mark-whole-buffer)
117
118 menu)
119
98 120
99(define-derived-mode text-mode nil "Text" 121(define-derived-mode text-mode nil "Text"
100 "Major mode for editing text written for humans to read. 122 "Major mode for editing text written for humans to read.
@@ -104,7 +126,8 @@ You can thus get the full benefit of adaptive filling
104\\{text-mode-map} 126\\{text-mode-map}
105Turning on Text mode runs the normal hook `text-mode-hook'." 127Turning on Text mode runs the normal hook `text-mode-hook'."
106 (setq-local text-mode-variant t) 128 (setq-local text-mode-variant t)
107 (setq-local require-final-newline mode-require-final-newline)) 129 (setq-local require-final-newline mode-require-final-newline)
130 (add-hook 'context-menu-functions 'text-mode-menu 10 t))
108 131
109(define-derived-mode paragraph-indent-text-mode text-mode "Parindent" 132(define-derived-mode paragraph-indent-text-mode text-mode "Parindent"
110 "Major mode for editing text, with leading spaces starting a paragraph. 133 "Major mode for editing text, with leading spaces starting a paragraph.
diff --git a/lisp/textmodes/tildify.el b/lisp/textmodes/tildify.el
index 01e2ad72d88..2a4c8cff8f0 100644
--- a/lisp/textmodes/tildify.el
+++ b/lisp/textmodes/tildify.el
@@ -67,7 +67,7 @@ matching the white space). The pattern is matched case-sensitive regardless of
67the value of `case-fold-search' setting." 67the value of `case-fold-search' setting."
68 :version "25.1" 68 :version "25.1"
69 :type 'regexp 69 :type 'regexp
70 :safe t) 70 :safe #'stringp)
71 71
72(defcustom tildify-pattern-alist () 72(defcustom tildify-pattern-alist ()
73 "Alist specifying where to insert hard spaces. 73 "Alist specifying where to insert hard spaces.
@@ -112,7 +112,7 @@ If nil, current major mode has no way to represent a hard space."
112 " ") 112 " ")
113 (const :tag "No-break space (U+00A0)" "\u00A0") 113 (const :tag "No-break space (U+00A0)" "\u00A0")
114 (string :tag "Custom string")) 114 (string :tag "Custom string"))
115 :safe t) 115 :safe #'string-or-null-p)
116 116
117(defcustom tildify-string-alist () 117(defcustom tildify-string-alist ()
118 "Alist specifying what is a hard space in the current major mode. 118 "Alist specifying what is a hard space in the current major mode.
diff --git a/lisp/time-stamp.el b/lisp/time-stamp.el
index e1ea922d040..178e490fb7d 100644
--- a/lisp/time-stamp.el
+++ b/lisp/time-stamp.el
@@ -59,7 +59,7 @@ with %, as follows.
59%#p `am' or `pm' %P gives uppercase: `AM' or `PM' 59%#p `am' or `pm' %P gives uppercase: `AM' or `PM'
60%02S seconds 60%02S seconds
61%w day number of week, Sunday is 0 61%w day number of week, Sunday is 0
62%02y 2-digit year: `03' %Y 4-digit year: `2003' 62%02y 2-digit year %Y 4-digit year
63%Z time zone name: `EST' %#Z gives lowercase: `est' 63%Z time zone name: `EST' %#Z gives lowercase: `est'
64%5z time zone offset: `-0500' (since Emacs 27; see note below) 64%5z time zone offset: `-0500' (since Emacs 27; see note below)
65 65
diff --git a/src/Makefile.in b/src/Makefile.in
index 34335cfa96d..25c7865d4a1 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -55,6 +55,8 @@ lwlibdir = ../lwlib
55# Configuration files for .o files to depend on. 55# Configuration files for .o files to depend on.
56config_h = config.h $(srcdir)/conf_post.h 56config_h = config.h $(srcdir)/conf_post.h
57 57
58HAVE_NATIVE_COMP = @HAVE_NATIVE_COMP@
59
58## ns-app if NS self contained app, else empty. 60## ns-app if NS self contained app, else empty.
59OTHER_FILES = @OTHER_FILES@ 61OTHER_FILES = @OTHER_FILES@
60 62
@@ -448,14 +450,9 @@ FIRSTFILE_OBJ=@FIRSTFILE_OBJ@
448ALLOBJS = $(FIRSTFILE_OBJ) $(VMLIMIT_OBJ) $(obj) $(otherobj) 450ALLOBJS = $(FIRSTFILE_OBJ) $(VMLIMIT_OBJ) $(obj) $(otherobj)
449 451
450# Must be first, before dep inclusion! 452# Must be first, before dep inclusion!
451ifeq ($(HAVE_NATIVE_COMP),yes)
452ifeq ($(NATIVE_DISABLED),)
453all: emacs$(EXEEXT) $(pdmp) $(OTHER_FILES) ../native-lisp
454else
455all: emacs$(EXEEXT) $(pdmp) $(OTHER_FILES)
456endif
457else
458all: emacs$(EXEEXT) $(pdmp) $(OTHER_FILES) 453all: emacs$(EXEEXT) $(pdmp) $(OTHER_FILES)
454ifeq ($(HAVE_NATIVE_COMP):$(NATIVE_DISABLED),yes:)
455all: ../native-lisp
459endif 456endif
460.PHONY: all 457.PHONY: all
461 458
@@ -783,8 +780,7 @@ tags: TAGS ../lisp/TAGS $(lwlibdir)/TAGS
783 @$(MAKE) $(AM_V_NO_PD) -C ../lisp EMACS="$(bootstrap_exe)"\ 780 @$(MAKE) $(AM_V_NO_PD) -C ../lisp EMACS="$(bootstrap_exe)"\
784 THEFILE=$< $<c 781 THEFILE=$< $<c
785 782
786ifeq ($(HAVE_NATIVE_COMP),yes) 783ifeq ($(HAVE_NATIVE_COMP):$(NATIVE_DISABLED),yes:)
787ifeq ($(NATIVE_DISABLED),)
788## The following rules are used only when building a source tarball 784## The following rules are used only when building a source tarball
789## for the first time, when the native-lisp/ directory doesn't yet 785## for the first time, when the native-lisp/ directory doesn't yet
790## exist and needs to be created and populated with the preloaded 786## exist and needs to be created and populated with the preloaded
@@ -808,11 +804,12 @@ elnlisp := $(addprefix ${lispsource}/,${elnlisp}) $(lisp:.elc=.eln)
808 THEFILE=$< $<n 804 THEFILE=$< $<n
809 805
810../native-lisp: | $(pdmp) 806../native-lisp: | $(pdmp)
811 mkdir $@ && $(MAKE) $(AM_V_NO_PD) $(elnlisp) 807 if test ! -d $@; then \
812 LC_ALL=C $(RUN_TEMACS) -batch $(BUILD_DETAILS) -l loadup --temacs=pdump \ 808 mkdir $@ && $(MAKE) $(AM_V_NO_PD) $(elnlisp); \
813 --bin-dest $(BIN_DESTDIR) --eln-dest $(ELN_DESTDIR) 809 LC_ALL=C $(RUN_TEMACS) -batch $(BUILD_DETAILS) -l loadup --temacs=pdump \
814 cp -f $@ $(bootstrap_pdmp) 810 --bin-dest $(BIN_DESTDIR) --eln-dest $(ELN_DESTDIR); \
815endif 811 cp -f $@ $(bootstrap_pdmp); \
812 fi
816endif 813endif
817 814
818## VCSWITNESS points to the file that holds info about the current checkout. 815## VCSWITNESS points to the file that holds info about the current checkout.
diff --git a/src/alloc.c b/src/alloc.c
index 0895a0f52aa..0c04d5cde05 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -988,7 +988,8 @@ record_xmalloc (size_t size)
988 988
989/* Like malloc but used for allocating Lisp data. NBYTES is the 989/* Like malloc but used for allocating Lisp data. NBYTES is the
990 number of bytes to allocate, TYPE describes the intended use of the 990 number of bytes to allocate, TYPE describes the intended use of the
991 allocated memory block (for strings, for conses, ...). */ 991 allocated memory block (for strings, for conses, ...).
992 NBYTES must be positive. */
992 993
993#if ! USE_LSB_TAG 994#if ! USE_LSB_TAG
994void *lisp_malloc_loser EXTERNALLY_VISIBLE; 995void *lisp_malloc_loser EXTERNALLY_VISIBLE;
@@ -1030,7 +1031,7 @@ lisp_malloc (size_t nbytes, bool clearit, enum mem_type type)
1030#endif 1031#endif
1031 1032
1032 MALLOC_UNBLOCK_INPUT; 1033 MALLOC_UNBLOCK_INPUT;
1033 if (!val && nbytes) 1034 if (!val)
1034 memory_full (nbytes); 1035 memory_full (nbytes);
1035 MALLOC_PROBE (nbytes); 1036 MALLOC_PROBE (nbytes);
1036 return val; 1037 return val;
diff --git a/src/conf_post.h b/src/conf_post.h
index 8558dc466cc..2c6fbb0dba5 100644
--- a/src/conf_post.h
+++ b/src/conf_post.h
@@ -293,7 +293,6 @@ extern int emacs_setenv_TZ (char const *);
293 ATTRIBUTE_FORMAT ((PRINTF_ARCHETYPE, string_index, first_to_check)) 293 ATTRIBUTE_FORMAT ((PRINTF_ARCHETYPE, string_index, first_to_check))
294 294
295#define ARG_NONNULL ATTRIBUTE_NONNULL 295#define ARG_NONNULL ATTRIBUTE_NONNULL
296#define ATTRIBUTE_UNUSED MAYBE_UNUSED
297 296
298/* Declare NAME to be a pointer to an object of type TYPE, initialized 297/* Declare NAME to be a pointer to an object of type TYPE, initialized
299 to the address ADDR, which may be of a different type. Accesses 298 to the address ADDR, which may be of a different type. Accesses
diff --git a/src/gtkutil.c b/src/gtkutil.c
index 313cfc82c26..e87845caf70 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -2932,8 +2932,9 @@ xg_item_label_same_p (GtkMenuItem *witem, const char *label)
2932 char *utf8_label = get_utf8_string (label); 2932 char *utf8_label = get_utf8_string (label);
2933 const char *old_label = witem ? xg_get_menu_item_label (witem) : 0; 2933 const char *old_label = witem ? xg_get_menu_item_label (witem) : 0;
2934 2934
2935 bool is_same = (!old_label == !utf8_label 2935 bool is_same = (old_label
2936 && (!old_label || strcmp (utf8_label, old_label) == 0)); 2936 ? utf8_label && strcmp (utf8_label, old_label) == 0
2937 : !utf8_label);
2937 2938
2938 if (utf8_label) g_free (utf8_label); 2939 if (utf8_label) g_free (utf8_label);
2939 2940
diff --git a/src/lread.c b/src/lread.c
index af0a7994592..07580d11d13 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4626,29 +4626,29 @@ oblookup (Lisp_Object obarray, register const char *ptr, ptrdiff_t size, ptrdiff
4626 return tem; 4626 return tem;
4627} 4627}
4628 4628
4629/* Like 'oblookup', but considers 'Velisp_shorthands', potentially 4629/* Like 'oblookup', but considers 'Vread_symbol_shorthands',
4630 recognizing that IN is shorthand for some other longhand name, 4630 potentially recognizing that IN is shorthand for some other
4631 which is then then placed in OUT. In that case, memory is 4631 longhand name, which is then then placed in OUT. In that case,
4632 malloc'ed for OUT (which the caller must free) while SIZE_OUT and 4632 memory is malloc'ed for OUT (which the caller must free) while
4633 SIZE_BYTE_OUT respectively hold the character and byte sizes of the 4633 SIZE_OUT and SIZE_BYTE_OUT respectively hold the character and byte
4634 transformed symbol name. If IN is not recognized shorthand for any 4634 sizes of the transformed symbol name. If IN is not recognized
4635 other symbol, OUT is set to point to NULL and 'oblookup' is 4635 shorthand for any other symbol, OUT is set to point to NULL and
4636 called. */ 4636 'oblookup' is called. */
4637 4637
4638Lisp_Object 4638Lisp_Object
4639oblookup_considering_shorthand (Lisp_Object obarray, const char *in, 4639oblookup_considering_shorthand (Lisp_Object obarray, const char *in,
4640 ptrdiff_t size, ptrdiff_t size_byte, char **out, 4640 ptrdiff_t size, ptrdiff_t size_byte, char **out,
4641 ptrdiff_t *size_out, ptrdiff_t *size_byte_out) 4641 ptrdiff_t *size_out, ptrdiff_t *size_byte_out)
4642{ 4642{
4643 Lisp_Object tail = Velisp_shorthands; 4643 Lisp_Object tail = Vread_symbol_shorthands;
4644 4644
4645 /* First, assume no transformation will take place. */ 4645 /* First, assume no transformation will take place. */
4646 *out = NULL; 4646 *out = NULL;
4647 /* Then, iterate each pair in Velisp_shorthands. */ 4647 /* Then, iterate each pair in Vread_symbol_shorthands. */
4648 FOR_EACH_TAIL_SAFE (tail) 4648 FOR_EACH_TAIL_SAFE (tail)
4649 { 4649 {
4650 Lisp_Object pair = XCAR (tail); 4650 Lisp_Object pair = XCAR (tail);
4651 /* Be lenient to 'elisp-shorthands': if some element isn't a 4651 /* Be lenient to 'read-symbol-shorthands': if some element isn't a
4652 cons, or some member of that cons isn't a string, just skip 4652 cons, or some member of that cons isn't a string, just skip
4653 to the next element. */ 4653 to the next element. */
4654 if (!CONSP (pair)) 4654 if (!CONSP (pair))
@@ -5446,10 +5446,10 @@ that are loaded before your customizations are read! */);
5446 5446
5447 DEFSYM (Qchar_from_name, "char-from-name"); 5447 DEFSYM (Qchar_from_name, "char-from-name");
5448 5448
5449 DEFVAR_LISP ("elisp-shorthands", Velisp_shorthands, 5449 DEFVAR_LISP ("read-symbol-shorthands", Vread_symbol_shorthands,
5450 doc: /* Alist of known symbol-name shorthands. 5450 doc: /* Alist of known symbol-name shorthands.
5451This variable's value can only be set via file-local variables. 5451This variable's value can only be set via file-local variables.
5452See Info node `(elisp)Shorthands' for more details. */); 5452See Info node `(elisp)Shorthands' for more details. */);
5453 Velisp_shorthands = Qnil; 5453 Vread_symbol_shorthands = Qnil;
5454 DEFSYM (Qobarray_cache, "obarray-cache"); 5454 DEFSYM (Qobarray_cache, "obarray-cache");
5455} 5455}
diff --git a/src/pdumper.c b/src/pdumper.c
index 2291fced5d7..11c680d77b7 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -799,7 +799,7 @@ dump_tailq_length (const struct dump_tailq *tailq)
799 return tailq->length; 799 return tailq->length;
800} 800}
801 801
802static void ATTRIBUTE_UNUSED 802static void
803dump_tailq_prepend (struct dump_tailq *tailq, Lisp_Object value) 803dump_tailq_prepend (struct dump_tailq *tailq, Lisp_Object value)
804{ 804{
805 Lisp_Object link = Fcons (value, tailq->head); 805 Lisp_Object link = Fcons (value, tailq->head);
@@ -809,24 +809,6 @@ dump_tailq_prepend (struct dump_tailq *tailq, Lisp_Object value)
809 tailq->length += 1; 809 tailq->length += 1;
810} 810}
811 811
812static void ATTRIBUTE_UNUSED
813dump_tailq_append (struct dump_tailq *tailq, Lisp_Object value)
814{
815 Lisp_Object link = Fcons (value, Qnil);
816 if (NILP (tailq->head))
817 {
818 eassert (NILP (tailq->tail));
819 tailq->head = tailq->tail = link;
820 }
821 else
822 {
823 eassert (!NILP (tailq->tail));
824 XSETCDR (tailq->tail, link);
825 tailq->tail = link;
826 }
827 tailq->length += 1;
828}
829
830static bool 812static bool
831dump_tailq_empty_p (struct dump_tailq *tailq) 813dump_tailq_empty_p (struct dump_tailq *tailq)
832{ 814{
diff --git a/src/process.c b/src/process.c
index 58347a154a3..221d4c7f6c3 100644
--- a/src/process.c
+++ b/src/process.c
@@ -4004,7 +4004,7 @@ usage: (make-network-process &rest ARGS) */)
4004 4004
4005 if (!NILP (host)) 4005 if (!NILP (host))
4006 { 4006 {
4007 ptrdiff_t portstringlen ATTRIBUTE_UNUSED; 4007 MAYBE_UNUSED ptrdiff_t portstringlen;
4008 4008
4009 /* SERVICE can either be a string or int. 4009 /* SERVICE can either be a string or int.
4010 Convert to a C string for later use by getaddrinfo. */ 4010 Convert to a C string for later use by getaddrinfo. */
diff --git a/src/systhread.h b/src/systhread.h
index 0f47d7c1a8a..601505f4f86 100644
--- a/src/systhread.h
+++ b/src/systhread.h
@@ -101,14 +101,11 @@ extern void sys_cond_signal (sys_cond_t *);
101extern void sys_cond_broadcast (sys_cond_t *); 101extern void sys_cond_broadcast (sys_cond_t *);
102extern void sys_cond_destroy (sys_cond_t *); 102extern void sys_cond_destroy (sys_cond_t *);
103 103
104extern sys_thread_t sys_thread_self (void) 104NODISCARD extern sys_thread_t sys_thread_self (void);
105 NODISCARD; 105NODISCARD extern bool sys_thread_equal (sys_thread_t, sys_thread_t);
106extern bool sys_thread_equal (sys_thread_t, sys_thread_t) 106
107 NODISCARD; 107NODISCARD extern bool sys_thread_create (sys_thread_t *,
108 108 thread_creation_function *, void *);
109extern bool sys_thread_create (sys_thread_t *, thread_creation_function *,
110 void *)
111 NODISCARD;
112 109
113extern void sys_thread_yield (void); 110extern void sys_thread_yield (void);
114extern void sys_thread_set_name (const char *); 111extern void sys_thread_set_name (const char *);
diff --git a/src/term.c b/src/term.c
index 7d9fe8cee30..0858f816851 100644
--- a/src/term.c
+++ b/src/term.c
@@ -549,13 +549,14 @@ encode_terminal_code (struct glyph *src, int src_len,
549 { 549 {
550 if (src->type == COMPOSITE_GLYPH) 550 if (src->type == COMPOSITE_GLYPH)
551 { 551 {
552 struct composition *cmp UNINIT; 552 struct composition *cmp;
553 Lisp_Object gstring UNINIT; 553 Lisp_Object gstring;
554 int i; 554 int i;
555 555
556 nbytes = buf - encode_terminal_src; 556 nbytes = buf - encode_terminal_src;
557 if (src->u.cmp.automatic) 557 if (src->u.cmp.automatic)
558 { 558 {
559 cmp = NULL;
559 gstring = composition_gstring_from_id (src->u.cmp.id); 560 gstring = composition_gstring_from_id (src->u.cmp.id);
560 required = src->slice.cmp.to - src->slice.cmp.from + 1; 561 required = src->slice.cmp.to - src->slice.cmp.from + 1;
561 } 562 }
@@ -575,7 +576,7 @@ encode_terminal_code (struct glyph *src, int src_len,
575 buf = encode_terminal_src + nbytes; 576 buf = encode_terminal_src + nbytes;
576 } 577 }
577 578
578 if (src->u.cmp.automatic) 579 if (!cmp)
579 for (i = src->slice.cmp.from; i <= src->slice.cmp.to; i++) 580 for (i = src->slice.cmp.from; i <= src->slice.cmp.to; i++)
580 { 581 {
581 Lisp_Object g = LGSTRING_GLYPH (gstring, i); 582 Lisp_Object g = LGSTRING_GLYPH (gstring, i);
diff --git a/src/unexcw.c b/src/unexcw.c
index 7a80b05963b..157e9f45607 100644
--- a/src/unexcw.c
+++ b/src/unexcw.c
@@ -48,7 +48,7 @@ static exe_header_t *
48read_exe_header (int fd, exe_header_t * exe_header_buffer) 48read_exe_header (int fd, exe_header_t * exe_header_buffer)
49{ 49{
50 int i; 50 int i;
51 int ret ATTRIBUTE_UNUSED; 51 MAYBE_UNUSED int ret;
52 52
53 assert (fd >= 0); 53 assert (fd >= 0);
54 assert (exe_header_buffer != 0); 54 assert (exe_header_buffer != 0);
@@ -111,7 +111,7 @@ fixup_executable (int fd)
111 exe_header_t exe_header_buffer; 111 exe_header_t exe_header_buffer;
112 exe_header_t *exe_header; 112 exe_header_t *exe_header;
113 int i; 113 int i;
114 int ret ATTRIBUTE_UNUSED; 114 MAYBE_UNUSED int ret;
115 int found_data = 0; 115 int found_data = 0;
116 int found_bss = 0; 116 int found_bss = 0;
117 117
@@ -269,7 +269,7 @@ unexec (const char *outfile, const char *infile)
269 int fd_in; 269 int fd_in;
270 int fd_out; 270 int fd_out;
271 int ret; 271 int ret;
272 int ret2 ATTRIBUTE_UNUSED; 272 MAYBE_UNUSED int ret2;
273 273
274 infile = add_exe_suffix_if_necessary (infile, infile_buffer); 274 infile = add_exe_suffix_if_necessary (infile, infile_buffer);
275 outfile = add_exe_suffix_if_necessary (outfile, outfile_buffer); 275 outfile = add_exe_suffix_if_necessary (outfile, outfile_buffer);
diff --git a/src/xfns.c b/src/xfns.c
index 0d0335c2997..785ae3baca5 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -6222,7 +6222,7 @@ Otherwise, the return value is a vector with the following fields:
6222static void compute_tip_xy (struct frame *, Lisp_Object, Lisp_Object, 6222static void compute_tip_xy (struct frame *, Lisp_Object, Lisp_Object,
6223 Lisp_Object, int, int, int *, int *); 6223 Lisp_Object, int, int, int *, int *);
6224 6224
6225/* The frame of the currently visible tooltip. */ 6225/* The frame of the currently visible tooltip, or nil if none. */
6226static Lisp_Object tip_frame; 6226static Lisp_Object tip_frame;
6227 6227
6228/* The window-system window corresponding to the frame of the 6228/* The window-system window corresponding to the frame of the
@@ -6710,7 +6710,7 @@ x_hide_tip (bool delete)
6710 if ((NILP (tip_last_frame) && NILP (tip_frame)) 6710 if ((NILP (tip_last_frame) && NILP (tip_frame))
6711 || (!x_gtk_use_system_tooltips 6711 || (!x_gtk_use_system_tooltips
6712 && !delete 6712 && !delete
6713 && FRAMEP (tip_frame) 6713 && !NILP (tip_frame)
6714 && FRAME_LIVE_P (XFRAME (tip_frame)) 6714 && FRAME_LIVE_P (XFRAME (tip_frame))
6715 && !FRAME_VISIBLE_P (XFRAME (tip_frame)))) 6715 && !FRAME_VISIBLE_P (XFRAME (tip_frame))))
6716 /* Either there's no tooltip to hide or it's an already invisible 6716 /* Either there's no tooltip to hide or it's an already invisible
@@ -6727,7 +6727,7 @@ x_hide_tip (bool delete)
6727 specbind (Qinhibit_quit, Qt); 6727 specbind (Qinhibit_quit, Qt);
6728 6728
6729 /* Try to hide the GTK+ system tip first. */ 6729 /* Try to hide the GTK+ system tip first. */
6730 if (FRAMEP (tip_last_frame)) 6730 if (!NILP (tip_last_frame))
6731 { 6731 {
6732 struct frame *f = XFRAME (tip_last_frame); 6732 struct frame *f = XFRAME (tip_last_frame);
6733 6733
@@ -6745,7 +6745,7 @@ x_hide_tip (bool delete)
6745 tip_last_frame = Qnil; 6745 tip_last_frame = Qnil;
6746 6746
6747 /* Now look whether there's an Emacs tip around. */ 6747 /* Now look whether there's an Emacs tip around. */
6748 if (FRAMEP (tip_frame)) 6748 if (!NILP (tip_frame))
6749 { 6749 {
6750 struct frame *f = XFRAME (tip_frame); 6750 struct frame *f = XFRAME (tip_frame);
6751 6751
@@ -6775,7 +6775,7 @@ x_hide_tip (bool delete)
6775#else /* not USE_GTK */ 6775#else /* not USE_GTK */
6776 if (NILP (tip_frame) 6776 if (NILP (tip_frame)
6777 || (!delete 6777 || (!delete
6778 && FRAMEP (tip_frame) 6778 && !NILP (tip_frame)
6779 && FRAME_LIVE_P (XFRAME (tip_frame)) 6779 && FRAME_LIVE_P (XFRAME (tip_frame))
6780 && !FRAME_VISIBLE_P (XFRAME (tip_frame)))) 6780 && !FRAME_VISIBLE_P (XFRAME (tip_frame))))
6781 return Qnil; 6781 return Qnil;
@@ -6788,7 +6788,7 @@ x_hide_tip (bool delete)
6788 specbind (Qinhibit_redisplay, Qt); 6788 specbind (Qinhibit_redisplay, Qt);
6789 specbind (Qinhibit_quit, Qt); 6789 specbind (Qinhibit_quit, Qt);
6790 6790
6791 if (FRAMEP (tip_frame)) 6791 if (!NILP (tip_frame))
6792 { 6792 {
6793 struct frame *f = XFRAME (tip_frame); 6793 struct frame *f = XFRAME (tip_frame);
6794 6794
@@ -6931,7 +6931,7 @@ Text larger than the specified size is clipped. */)
6931 } 6931 }
6932#endif /* USE_GTK */ 6932#endif /* USE_GTK */
6933 6933
6934 if (FRAMEP (tip_frame) && FRAME_LIVE_P (XFRAME (tip_frame))) 6934 if (!NILP (tip_frame) && FRAME_LIVE_P (XFRAME (tip_frame)))
6935 { 6935 {
6936 if (FRAME_VISIBLE_P (XFRAME (tip_frame)) 6936 if (FRAME_VISIBLE_P (XFRAME (tip_frame))
6937 && EQ (frame, tip_last_frame) 6937 && EQ (frame, tip_last_frame)
@@ -7016,7 +7016,7 @@ Text larger than the specified size is clipped. */)
7016 tip_last_string = string; 7016 tip_last_string = string;
7017 tip_last_parms = parms; 7017 tip_last_parms = parms;
7018 7018
7019 if (!FRAMEP (tip_frame) || !FRAME_LIVE_P (XFRAME (tip_frame))) 7019 if (NILP (tip_frame) || !FRAME_LIVE_P (XFRAME (tip_frame)))
7020 { 7020 {
7021 /* Add default values to frame parameters. */ 7021 /* Add default values to frame parameters. */
7022 if (NILP (Fassq (Qname, parms))) 7022 if (NILP (Fassq (Qname, parms)))
diff --git a/src/xmenu.c b/src/xmenu.c
index a6762236bc4..709e455dd05 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -1603,6 +1603,14 @@ x_menu_show (struct frame *f, int x, int y, int menuflags,
1603 STRINGP (help) ? help : Qnil); 1603 STRINGP (help) ? help : Qnil);
1604 if (prev_wv) 1604 if (prev_wv)
1605 prev_wv->next = wv; 1605 prev_wv->next = wv;
1606 else if (!save_wv)
1607 {
1608 /* This call to 'abort' pacifies gcc 11.2.1 when Emacs
1609 is configured with --enable-gcc-warnings. FIXME: If
1610 save_wv can be null, do something better; otherwise,
1611 explain why save_wv cannot be null. */
1612 abort ();
1613 }
1606 else 1614 else
1607 save_wv->contents = wv; 1615 save_wv->contents = wv;
1608 if (!NILP (descrip)) 1616 if (!NILP (descrip))
diff --git a/src/xterm.c b/src/xterm.c
index ae3af598da6..89885e0d889 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -4049,7 +4049,7 @@ x_delete_glyphs (struct frame *f, int n)
4049/* Like XClearArea, but check that WIDTH and HEIGHT are reasonable. 4049/* Like XClearArea, but check that WIDTH and HEIGHT are reasonable.
4050 If they are <= 0, this is probably an error. */ 4050 If they are <= 0, this is probably an error. */
4051 4051
4052static ATTRIBUTE_UNUSED void 4052MAYBE_UNUSED static void
4053x_clear_area1 (Display *dpy, Window window, 4053x_clear_area1 (Display *dpy, Window window,
4054 int x, int y, int width, int height, int exposures) 4054 int x, int y, int width, int height, int exposures)
4055{ 4055{
@@ -10133,8 +10133,9 @@ x_connection_closed (Display *dpy, const char *error_message, bool ioerror)
10133 frame on it. */ 10133 frame on it. */
10134 dpyinfo->reference_count++; 10134 dpyinfo->reference_count++;
10135 dpyinfo->terminal->reference_count++; 10135 dpyinfo->terminal->reference_count++;
10136 if (ioerror)
10137 dpyinfo->display = 0;
10136 } 10138 }
10137 if (ioerror) dpyinfo->display = 0;
10138 10139
10139 /* First delete frames whose mini-buffers are on frames 10140 /* First delete frames whose mini-buffers are on frames
10140 that are on the dead display. */ 10141 that are on the dead display. */
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index 9a1c9d659b4..ebedbaf45f2 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -69,6 +69,7 @@
69(defvar tramp-connection-properties) 69(defvar tramp-connection-properties)
70(defvar tramp-copy-size-limit) 70(defvar tramp-copy-size-limit)
71(defvar tramp-display-escape-sequence-regexp) 71(defvar tramp-display-escape-sequence-regexp)
72(defvar tramp-fuse-unmount-on-cleanup)
72(defvar tramp-inline-compress-start-size) 73(defvar tramp-inline-compress-start-size)
73(defvar tramp-persistency-file-name) 74(defvar tramp-persistency-file-name)
74(defvar tramp-remote-path) 75(defvar tramp-remote-path)
@@ -5884,10 +5885,7 @@ Use direct async.")
5884 tramp-allow-unsafe-temporary-files 5885 tramp-allow-unsafe-temporary-files
5885 (inhibit-message t) 5886 (inhibit-message t)
5886 ;; tramp-rclone.el and tramp-sshfs.el cache the mounted files. 5887 ;; tramp-rclone.el and tramp-sshfs.el cache the mounted files.
5887 (tramp-cleanup-connection-hook 5888 (tramp-fuse-unmount-on-cleanup t)
5888 (append
5889 (and (tramp--test-fuse-p) '(tramp-fuse-unmount))
5890 tramp-cleanup-connection-hook))
5891 auto-save-default 5889 auto-save-default
5892 noninteractive) 5890 noninteractive)
5893 5891
diff --git a/test/lisp/progmodes/elisp-mode-resources/simple-shorthand-test.el b/test/lisp/progmodes/elisp-mode-resources/simple-shorthand-test.el
index ec568093af2..14c8e845d11 100644
--- a/test/lisp/progmodes/elisp-mode-resources/simple-shorthand-test.el
+++ b/test/lisp/progmodes/elisp-mode-resources/simple-shorthand-test.el
@@ -1,23 +1,31 @@
1(defun f-test () 1(defun f-test ()
2 (let ((elisp-shorthands '(("foo-" . "bar-")))) 2 (let ((read-symbol-shorthands '(("foo-" . "bar-"))))
3 (with-temp-buffer 3 (with-temp-buffer
4 (insert "(foo-bar)") 4 (insert "(foo-bar)")
5 (goto-char (point-min)) 5 (goto-char (point-min))
6 (read (current-buffer))))) 6 (read (current-buffer)))))
7 7
8(defun f-test2 () 8(defun f-test2 ()
9 (let ((elisp-shorthands '(("foo-" . "bar-")))) 9 (let ((read-symbol-shorthands '(("foo-" . "bar-"))))
10 (read-from-string "(foo-bar)"))) 10 (read-from-string "(foo-bar)")))
11 11
12 12
13(defun f-test3 () 13(defun f-test3 ()
14 (let ((elisp-shorthands '(("foo-" . "bar-")))) 14 (let ((read-symbol-shorthands '(("foo-" . "bar-"))))
15 (intern "foo-bar"))) 15 (intern "foo-bar")))
16 16
17(defvar f-test-complete-me 42) 17(defvar f-test-complete-me 42)
18 18
19(elisp--foo-test3)
20
19(defun #_f-test4--- () 84) 21(defun #_f-test4--- () 84)
20 22
23(defmacro f-define-test-5 ())
24
25;; should be font locked with both shorthand
26;; highlighting _and_ macro highlighting.
27(f-define-test-5)
28
21(when nil 29(when nil
22 (f-test3) 30 (f-test3)
23 (f-test2) 31 (f-test2)
@@ -26,5 +34,5 @@
26 34
27 35
28;; Local Variables: 36;; Local Variables:
29;; elisp-shorthands: (("f-" . "elisp--foo-")) 37;; read-symbol-shorthands: (("f-" . "elisp--foo-"))
30;; End: 38;; End:
diff --git a/test/lisp/progmodes/elisp-mode-tests.el b/test/lisp/progmodes/elisp-mode-tests.el
index 7d30987176f..3856dcd717a 100644
--- a/test/lisp/progmodes/elisp-mode-tests.el
+++ b/test/lisp/progmodes/elisp-mode-tests.el
@@ -1015,7 +1015,7 @@ evaluation of BODY."
1015 (shorthand-sname (format "s-%s" gsym)) 1015 (shorthand-sname (format "s-%s" gsym))
1016 (expected (intern (format "shorthand-longhand-%s" gsym)))) 1016 (expected (intern (format "shorthand-longhand-%s" gsym))))
1017 (cl-assert (not (intern-soft shorthand-sname))) 1017 (cl-assert (not (intern-soft shorthand-sname)))
1018 (should (equal (let ((elisp-shorthands 1018 (should (equal (let ((read-symbol-shorthands
1019 '(("s-" . "shorthand-longhand-")))) 1019 '(("s-" . "shorthand-longhand-"))))
1020 (with-temp-buffer 1020 (with-temp-buffer
1021 (insert shorthand-sname) 1021 (insert shorthand-sname)
@@ -1029,7 +1029,7 @@ evaluation of BODY."
1029 (shorthand-sname (format "s-%s" gsym)) 1029 (shorthand-sname (format "s-%s" gsym))
1030 (expected (intern (format "shorthand-longhand-%s" gsym)))) 1030 (expected (intern (format "shorthand-longhand-%s" gsym))))
1031 (cl-assert (not (intern-soft shorthand-sname))) 1031 (cl-assert (not (intern-soft shorthand-sname)))
1032 (should (equal (let ((elisp-shorthands 1032 (should (equal (let ((read-symbol-shorthands
1033 '(("s-" . "shorthand-longhand-")))) 1033 '(("s-" . "shorthand-longhand-"))))
1034 (car (read-from-string shorthand-sname))) 1034 (car (read-from-string shorthand-sname)))
1035 expected)) 1035 expected))
diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el
index 5c4e0b9de93..32c0bc3ed3c 100644
--- a/test/lisp/subr-tests.el
+++ b/test/lisp/subr-tests.el
@@ -769,15 +769,14 @@ See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=19350."
769 769
770(ert-deftest subr-test-internal--format-docstring-line () 770(ert-deftest subr-test-internal--format-docstring-line ()
771 (should 771 (should
772 (string= (let ((fill-column 60)) 772 (string= (let ((fill-column 70))
773 (internal--format-docstring-line 773 (internal--format-docstring-line
774 "Emacs is the advanced, extensible, customizable, \ 774 "In addition to any hooks its parent mode might have run, this \
775self-documenting editor. This manual describes how to edit with Emacs and \ 775mode runs the hook ‘foo-bar-baz-very-long-name-indeed-mode-hook’, as the final \
776some of the ways to customize it; it corresponds to GNU Emacs version 28.1.")) 776or penultimate step during initialization."))
777 "Emacs is the advanced, extensible, customizable, 777 "In addition to any hooks its parent mode might have run, this mode
778self-documenting editor. This manual describes how to edit 778runs the hook ‘foo-bar-baz-very-long-name-indeed-mode-hook’, as the
779with Emacs and some of the ways to customize it; it 779final or penultimate step during initialization."))
780corresponds to GNU Emacs version 28.1."))
781 (should-error (internal--format-docstring-line "foo\nbar"))) 780 (should-error (internal--format-docstring-line "foo\nbar")))
782 781
783(ert-deftest test-ensure-list () 782(ert-deftest test-ensure-list ()