aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Morris2018-07-07 09:27:44 -0700
committerGlenn Morris2018-07-07 09:27:44 -0700
commitd3e0fdc24f85de3b33de007b8e1ca24560559d9b (patch)
tree751ecc26bd89a0b0d6b9b7a49f299c43fff0a445
parent77166e0da2d58f2f6436989b7059d913be5b3439 (diff)
parenta427de9c86ed31b1fd7599664b3fea0733e633ee (diff)
downloademacs-d3e0fdc24f85de3b33de007b8e1ca24560559d9b.tar.gz
emacs-d3e0fdc24f85de3b33de007b8e1ca24560559d9b.zip
Merge from origin/emacs-26
a427de9 (origin/emacs-26) Fix bug #11732 3a04e15 Improve documentation of 'emacs-lock-mode' 9d6ca5a * lisp/imenu.el (imenu-generic-expression): Doc fix. (Bug#32... fdd7e7d Improve indexing of 'eval-defun' in ELisp manual 10af989 Fix (length CIRCULAR) documentation 271d1f7 Tramp editorials 4abf94f Clarify and improve doc strings of 'eval-last-sexp' and friends 6cfc7a7 Automate upload of Emacs manuals to gnu.org b73cde5 Fix MH-E mail composition with GNU Mailutils (SF#485) 0dce5e5 Speed up 'replace-buffer-contents' some more 00fdce0 * doc/emacs/docstyle.texi: Avoid messing up the html output. Conflicts: admin/make-tarball.txt
-rw-r--r--admin/admin.el16
-rwxr-xr-xadmin/make-manuals214
-rw-r--r--admin/make-tarball.txt42
-rwxr-xr-xadmin/upload-manuals376
-rw-r--r--doc/emacs/docstyle.texi2
-rw-r--r--doc/lispref/customize.texi1
-rw-r--r--doc/lispref/debugging.texi1
-rw-r--r--doc/lispref/display.texi1
-rw-r--r--doc/lispref/sequences.texi6
-rw-r--r--doc/lispref/variables.texi1
-rw-r--r--doc/misc/tramp.texi4
-rw-r--r--lisp/emacs-lock.el10
-rw-r--r--lisp/imenu.el6
-rw-r--r--lisp/mh-e/mh-comp.el6
-rw-r--r--lisp/net/tramp-sh.el2
-rw-r--r--lisp/progmodes/elisp-mode.el10
-rw-r--r--lisp/simple.el8
-rw-r--r--src/editfns.c9
-rw-r--r--src/w32fns.c14
19 files changed, 655 insertions, 74 deletions
diff --git a/admin/admin.el b/admin/admin.el
index dab61bb9166..3cb5dbc2d92 100644
--- a/admin/admin.el
+++ b/admin/admin.el
@@ -261,8 +261,12 @@ ROOT should be the root of an Emacs source tree."
261ROOT should be the root of an Emacs source tree. 261ROOT should be the root of an Emacs source tree.
262Interactively with a prefix argument, prompt for TYPE. 262Interactively with a prefix argument, prompt for TYPE.
263Optional argument TYPE is type of output (nil means all)." 263Optional argument TYPE is type of output (nil means all)."
264 (interactive (let ((root (read-directory-name "Emacs root directory: " 264 (interactive (let ((root
265 source-directory nil t))) 265 (if noninteractive
266 (or (pop command-line-args-left)
267 default-directory)
268 (read-directory-name "Emacs root directory: "
269 source-directory nil t))))
266 (list root 270 (list root
267 (if current-prefix-arg 271 (if current-prefix-arg
268 (completing-read 272 (completing-read
@@ -717,8 +721,12 @@ style=\"text-align:left\">")
717ROOT should be the root of an Emacs source tree. 721ROOT should be the root of an Emacs source tree.
718Interactively with a prefix argument, prompt for TYPE. 722Interactively with a prefix argument, prompt for TYPE.
719Optional argument TYPE is type of output (nil means all)." 723Optional argument TYPE is type of output (nil means all)."
720 (interactive (let ((root (read-directory-name "Emacs root directory: " 724 (interactive (let ((root
721 source-directory nil t))) 725 (if noninteractive
726 (or (pop command-line-args-left)
727 default-directory)
728 (read-directory-name "Emacs root directory: "
729 source-directory nil t))))
722 (list root 730 (list root
723 (if current-prefix-arg 731 (if current-prefix-arg
724 (completing-read 732 (completing-read
diff --git a/admin/make-manuals b/admin/make-manuals
new file mode 100755
index 00000000000..7b9f6a28718
--- /dev/null
+++ b/admin/make-manuals
@@ -0,0 +1,214 @@
1#!/bin/bash
2### make-manuals - create the Emacs manuals to upload to the gnu.org website
3
4## Copyright 2018 Free Software Foundation, Inc.
5
6## Author: Glenn Morris <rgm@gnu.org>
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## This is a helper script to create the Emacs manuals as used on the
26## gnu.org website. After this, use upload-manuals to upload them.
27##
28## Usage:
29## Call from the top-level directory of an Emacs source tree.
30## This should normally be a release.
31## The info files should exist.
32
33### Code:
34
35die () # write error to stderr and exit
36{
37 [ $# -gt 0 ] && echo "$PN: $@" >&2
38 exit 1
39}
40
41PN=${0##*/} # basename of script
42
43usage ()
44{
45 cat 1>&2 <<EOF
46Usage: ${PN} [-c] [-e emacs]
47Create the Emacs manuals for the gnu.org website.
48Call this script from the top-level of the Emacs source tree that
49contains the manuals you want to use (normally a release).
50The admin/ directory is required.
51Options:
52-c: do not delete any pre-existing $outdir/ directory
53-e: Emacs executable to use (default $emacs)
54EOF
55 exit 1
56}
57
58
59## Defaults.
60continue=
61emacs=emacs
62
63## Parameters.
64outdir=manual
65gzip="gzip --best --no-name"
66tar="tar --numeric-owner --owner=0 --group=0 --mode=go+u,go-w"
67## Requires GNU tar >= 1.28 so that the tarballs are more reproducible.
68## (Personally I think this is way OOT. I'm not even sure if anyone
69## uses these tarfiles, let alone cares whether they are reproducible.)
70tar --help | grep -- '--sort.*name' >& /dev/null && tar="$tar --sort=name"
71
72while getopts ":hce:" option ; do
73 case $option in
74 (h) usage ;;
75
76 (c) continue=t ;;
77
78 (e) emacs=$OPTARG ;;
79
80 (\?) die "Bad option -$OPTARG" ;;
81
82 (:) die "Option -$OPTARG requires an argument" ;;
83
84 (*) die "getopts error" ;;
85 esac
86done
87shift $(( --OPTIND ))
88OPTIND=1
89
90[ $# -eq 0 ] || usage
91
92
93[ -e admin/admin.el ] || die "admin/admin.el not found"
94
95
96tempfile=/tmp/$PN.$$
97trap "rm -f $tempfile 2> /dev/null" EXIT
98
99
100[ "$continue" ] || rm -rf $outdir
101
102if [ -e $outdir ]; then
103 ## Speed up repeat invocation.
104 echo "Re-using existing $outdir/ directory"
105
106else
107
108 ## This creates the manuals in a manual/ directory.
109 ## Note makeinfo >= 5 is much slower than makeinfo 4.
110 echo "Making manuals (slow)..."
111 $emacs --batch -Q -l admin/admin.el -f make-manuals \
112 >| $tempfile 2>&1 || {
113 cat $tempfile 1>&2
114
115 die "error running make-manuals"
116 }
117fi
118
119find $outdir -name '*~' -exec rm {} +
120
121
122echo "Adding compressed html files..."
123for f in emacs elisp; do
124 $tar -C $outdir/html_node -cf - $f | $gzip \
125 > $outdir/$f.html_node.tar.gz || die "error for $f"
126done
127
128
129echo "Making manual tarfiles..."
130$emacs --batch -Q -l admin/admin.el -f make-manuals-dist \
131 >| $tempfile || {
132
133 cat $tempfile 1>&2
134
135 die "error running make-manuals-dist"
136}
137
138o=$outdir/texi
139mkdir -p $o
140
141for f in $outdir/*.tar; do
142 of=${f##*/}
143 of=${of#emacs-}
144 of=${of%%-[0-9]*}.texi.tar
145 of=${of/lispintro/eintr}
146 of=${of/lispref/elisp}
147 of=${of/manual/emacs}
148 of=$o/$of
149 mv $f $of
150 $gzip $of || die "error compressing $f"
151done
152
153
154echo "Making refcards..."
155make -C etc/refcards dist >| $tempfile 2>&1 || {
156 cat $tempfile 1>&2
157 die "failed make dist"
158}
159
160## This may hang if eg german.sty is missing.
161make -k -C etc/refcards pdf >| $tempfile 2>&1 || {
162 cat $tempfile 1>&2
163 echo "Warning: ignored failure(s) from make pdf"
164}
165
166## Newer Texlive only provide mex (used by pl refcards) for pdf, AFAICS.
167make -k -C etc/refcards ps >| $tempfile 2>&1 || {
168 cat $tempfile 1>&2
169 echo "Warning: ignored failure(s) from make ps"
170}
171
172## Note that in the website, refcards/ is not a subdirectory of manual/.
173refdir=$outdir/refcards
174
175mkdir -p $refdir
176
177mv etc/refcards/emacs-refcards.tar $refdir
178$gzip $refdir/emacs-refcards.tar
179
180for fmt in pdf ps; do
181
182 o=$refdir/$fmt
183
184 mkdir -p $o
185
186 [ $fmt = pdf ] && {
187 cp etc/refcards/*.$fmt $o
188 rm $o/gnus-logo.pdf
189 continue
190 }
191
192 for f in etc/refcards/*.$fmt; do
193 $gzip < $f > $o/${f##*/}.gz
194 done
195done
196
197make -C etc/refcards extraclean > /dev/null
198
199
200echo "Adding compressed info files..."
201
202o=$outdir/info
203mkdir -p $o
204
205for f in eintr.info elisp.info emacs.info; do
206
207 $gzip < info/$f > $o/$f.gz || die "error for $f"
208done
209
210
211echo "Finished OK, you might want to run upload-manuals now"
212
213
214exit 0
diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt
index 62aa31bad82..28e369f61d3 100644
--- a/admin/make-tarball.txt
+++ b/admin/make-tarball.txt
@@ -202,50 +202,14 @@ The pages to update are:
202 202
203emacs.html (for a new major release, a more thorough update is needed) 203emacs.html (for a new major release, a more thorough update is needed)
204history.html 204history.html
205add the new NEWS file as news/NEWS.xx.y
205 206
206For every new release, a banner is displayed on top of the emacs.html 207For every new release, a banner is displayed on top of the emacs.html
207page. Uncomment and the release banner in emacs.html. Keep it on the 208page. Uncomment and the release banner in emacs.html. Keep it on the
208page for about a month, then comment it again. 209page for about a month, then comment it again.
209 210
210Use M-x make-manuals from admin/admin.el to regenerate the html 211Regenerate the various manuals in manual/.
211manuals in manual/. If there are new manuals, add appropriate index 212The scripts admin/make-manuals and admin/upload-manuals summarize the process.
212pages in manual/ and add them to manual/index.html. In the
213manual/html_node directory, delete any old manual pages that are no
214longer present.
215
216Tar up the generated html_node/emacs/ and elisp/ directories and update
217the files manual/elisp.html_node.tar.gz and emacs.html_node.tar.gz.
218Use GNU Tar 1.28 or later so that the tarballs are more reproducible,
219as follows:
220
221 cd manual
222 tar='tar --numeric-owner --owner=0 --group=0 --mode=go+u,go-w --sort=name'
223 gzip='gzip --best --no-name'
224 $tar -cf - html_node/emacs | $gzip >emacs.html_node.tar.gz
225 $tar -cf - html_node/elisp | $gzip >elisp.html_node.tar.gz
226
227Use M-x make-manuals-dist from admin/admin.el to update the
228manual/*.tar files.
229
230Add compressed copies of the main info pages from the tarfile to manual/info/
231as follows:
232
233 cd manual
234 mkdir info
235 gzip --best --no-name <../info/eintr.info >info/eintr.info.gz
236 gzip --best --no-name <../info/elisp.info >info/elisp.info.gz
237 gzip --best --no-name <../info/emacs.info >info/emacs.info.gz
238
239Update the refcards/pdf/ and ps/ directories, and also
240refcards/emacs-refcards.tar.gz (use make -C etc/refcards pdf ps dist).
241
242FIXME: The above instructions are not quite complete, as they do not
243specify the manual procedure used to copy the generated files in the
244'manual' directory to the corresponding web files, and to cvs remove
245and add files as needed. Also, they are missing some files, e.g.,
246they generate manual/html_mono/ada-mode.html but do not generate the
247top-level ada-mode.html file for the one-node-per-page version; this
248is currently done by hand.
249 213
250Browsing <https://web.cvs.savannah.gnu.org/viewvc/?root=emacs> is one 214Browsing <https://web.cvs.savannah.gnu.org/viewvc/?root=emacs> is one
251way to check for any files that still need updating. 215way to check for any files that still need updating.
diff --git a/admin/upload-manuals b/admin/upload-manuals
new file mode 100755
index 00000000000..1aa7d8be32d
--- /dev/null
+++ b/admin/upload-manuals
@@ -0,0 +1,376 @@
1#!/bin/bash
2
3### upload-manuals - upload the Emacs manuals to the gnu.org website
4
5## Copyright 2018 Free Software Foundation, Inc.
6
7## Author: Glenn Morris <rgm@gnu.org>
8
9## This file is part of GNU Emacs.
10
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
13## the Free Software Foundation, either version 3 of the License, or
14## (at your option) any later version.
15
16## GNU Emacs is distributed in the hope that it will be useful,
17## but WITHOUT ANY WARRANTY; without even the implied warranty of
18## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19## GNU General Public License for more details.
20
21## You should have received a copy of the GNU General Public License
22## along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
23
24### Commentary:
25
26## Run this on the output of make-manuals.
27
28## We assume you have already checked out a local copy of the website
29## following the instructions at
30## https://savannah.gnu.org/cvs/?group=emacs
31
32## Usage:
33## Call from the manual/ directory created by make-manual.
34## upload-manuals /path/to/cvs/checkout
35
36### Code:
37
38
39die () # write error to stderr and exit
40{
41 [ $# -gt 0 ] && echo "$PN: $@" >&2
42 exit 1
43}
44
45PN=${0##*/} # basename of script
46
47usage ()
48{
49 cat 1>&2 <<EOF
50Usage: ${PN} [-m message] [-n] /path/to/cvs/checkout
51Upload the Emacs manuals to the gnu.org website.
52Call this script from the manual/ directory created by make-manuals.
53This script destructively modifies the source directory.
54Options:
55-m: commit message to use (default "$message")
56-n: dry-run (do not commit files)
57EOF
58 exit 1
59}
60
61
62## Parameters
63version=$(gunzip -c info/emacs.info.gz 2> /dev/null | sed -n '0,/updated for Emacs version/s/.*updated for Emacs version \([0-9.]*\).*\.$/\1/p')
64
65## Defaults
66cvs=cvs
67message="Regenerate manuals for Emacs $version"
68umessage=
69
70while getopts ":hm:n" option ; do
71 case $option in
72 (h) usage ;;
73
74 (m) umessage=t ; message="$OPTARG" ;;
75
76 (n) cvs="echo $cvs" ;;
77
78 (\?) die "Bad option -$OPTARG" ;;
79
80 (:) die "Option -$OPTARG requires an argument" ;;
81
82 (*) die "getopts error" ;;
83 esac
84done
85shift $(( --OPTIND ))
86OPTIND=1
87
88[ $# -eq 1 ] || usage
89
90[ "$version$umessage" ] || \
91 die "Could not get version to use for commit message"
92
93webdir=$1
94
95[ -e $webdir/CVS/Entries ] && [ -e $webdir/refcards/pdf/refcard.pdf ] || \
96 die "$webdir does not look like a checkout of the Emacs webpages"
97
98[ -e html_mono/emacs.html ] && [ -e html_node/emacs/index.html ] || \
99 die "Current directory does not like the manual/ directory"
100
101
102echo "Doing refcards..."
103
104mv refcards/emacs-refcards.tar.gz $webdir/refcards/
105(
106 cd $webdir/refcards
107 $cvs commit -m "$message" emacs-refcards.tar.gz || die "commit error"
108)
109
110## For refcards, we assume a missing file is due to a tex failure,
111## rather than a refcard that should be deleted.
112for fmt in pdf ps.gz; do
113
114 clist=
115
116 for f in $webdir/refcards/${fmt%.gz}/*.$fmt; do
117
118 s=${f#$webdir/}
119
120 if [ -e $s ]; then
121 mv $s $f
122 clist="$clist ${f##*/}"
123 else
124 echo "$s seems to be missing"
125 fi
126 done
127
128
129 ## Check for new files.
130 new=
131 for f in refcards/${fmt%.gz}/*.$fmt; do
132 [ -e $f ] || break
133 new="$new $f"
134 clist="$clist ${f##*/}"
135 done
136
137 [ "$new" ] && mv $new $webdir/refcards/${fmt%.gz}/
138
139 [ "$clist" ] && (
140 cd $webdir
141 [ "$new" ] && {
142 echo "Adding new files: $new"
143 $cvs add -kb $new || die "add error"
144 echo "Remember to add new refcards to refcards/index.html"
145 }
146 cd refcards/${fmt%.gz}
147 $cvs commit -m "$message" $clist || die "commit error"
148 )
149
150done # $fmt
151
152
153echo "Doing non-html manuals..."
154
155for fmt in info pdf ps texi; do
156
157 clist=
158
159 for f in $webdir/manual/$fmt/*; do
160
161 [ ${f##*/} = CVS ] && continue
162
163 s=$fmt/${f##*/}
164
165 if [ -e $s ]; then
166 mv $s $f
167 clist="$clist ${f##*/}"
168 else
169 case ${f##*/} in
170 *_7x9*.pdf) continue ;;
171 esac
172
173 echo "$s seems to be missing"
174 fi
175 done
176
177 ## Check for new files.
178 new=
179 for f in $fmt/*.$fmt*; do
180 [ -e $f ] || break
181 new="$new $f"
182 clist="$clist ${f##*/}"
183 done
184
185 [ "$new" ] && mv $new $webdir/manual/$fmt/
186
187 [ "$clist" ] && (
188 cd $webdir/manual
189 [ "$new" ] && {
190 echo "Adding new files: $new"
191 $cvs add $new || die "add error"
192 echo "Remember to add new files to the appropriate index pages"
193 }
194 cd $fmt
195 $cvs commit -m "$message" $clist || die "commit error"
196 )
197
198done
199
200
201echo "Doing tarred html..."
202
203clist=
204
205for f in $webdir/manual/*html*.tar*; do
206
207 s=${f##*/}
208
209 if [ -e $s ]; then
210 mv $s $f
211 clist="$clist ${f##*/}"
212 else
213 echo "$s seems to be missing"
214 fi
215done
216
217## Check for new files.
218new=
219for f in *html*.tar*; do
220 [ -e $f ] || break
221 new="$new $f"
222 clist="$clist ${f##*/}"
223done
224
225[ "$new" ] && mv $new $webdir/manual
226
227[ "$clist" ] && (
228 cd $webdir/manual
229 [ "$new" ] && {
230 echo "Adding new files: $new"
231 $cvs add -kb $new || die "add error"
232 echo "Remember to add new files to the appropriate index pages"
233 }
234 $cvs commit -m "$message" $clist || die "commit error"
235)
236
237
238## This happens so rarely it would be less effort to do by hand...
239new_manual () {
240 local t=eww
241 local i=$webdir/manual/$t.html # template
242
243 [ -r $i ] || die "Cannot read template $i"
244
245 local name o mono title
246
247 for name; do
248
249 name=${name##*/}
250 name=${name%.html}
251
252 o=$webdir/manual/$name.html
253
254 [ -e $o ] && die "$o already exists"
255
256 mono=$webdir/manual/html_mono/$name.html
257
258 [ -r $mono ] || die "Cannot read $mono"
259
260 title=$(sed -n 's|^<title>\(.*\)</title>|\1|p' $mono)
261
262 : ${title:?}
263
264 echo "$title" | grep -qi "Emacs" || title="Emacs $title"
265 echo "$title" | grep -qi "manual" || title="$title Manual"
266
267 ## It is a pain to extract and insert a good "documenting...".
268 ## Improve it by hand if you care.
269 sed -e "s|^<title>.*\( - GNU Project\)|<title>$title\1|" \
270 -e "s|^<h2>.*|<h2>$title</h2>|" \
271 -e "s/^documenting.*/documenting \"$title\"./" \
272 -e "s/$t/$name/" \
273 -e "s/&copy;.* Free/\&copy; $(date +%Y) Free/" $i > $o
274
275 (
276 cd $webdir/manual
277 $cvs add ${o##*/} || die "add error for $o"
278 )
279 done
280
281 return 0
282}
283
284
285echo "Doing html_mono..."
286
287clist=
288
289for f in $webdir/manual/html_mono/*.html; do
290
291 s=${f##*manual/}
292
293 if [ -e $s ]; then
294 mv $s $f
295 clist="$clist ${f##*/}"
296 else
297 echo "$s seems to be missing"
298 fi
299done
300
301## Check for new files.
302new=
303for f in html_mono/*.html; do
304 [ -e $f ] || break
305 new="$new $f"
306 clist="$clist ${f##*/}"
307done
308
309[ "$new" ] && mv $new $webdir/manual/html_mono/
310
311## TODO: check for removed manuals.
312
313[ "$clist" ] && (
314 cd $webdir/manual/html_mono
315 [ "$new" ] && {
316 echo "Adding new files: $new"
317 $cvs add $new || die "add error"
318 new_manual $new || die
319 echo "Remember to add new entries to manual/index.html"
320 }
321 $cvs commit -m "$message" $clist || die "commit error"
322)
323
324
325echo "Doing html_node..."
326
327for d in html_node/*; do
328
329 [ -e $d ] || break
330
331 echo "Doing $d..."
332
333 [ -e $webdir/manual/$d ] || {
334 echo "New directory: $d"
335 mkdir $webdir/manual/$d
336 $cvs add $webdir/manual/$d || die "add error"
337 }
338
339 new=
340 for f in $d/*.html; do
341 [ -e $webdir/manual/$f ] || new="$new ${f##*/}"
342 done
343
344 stale=
345 for f in $webdir/manual/$d/*.html; do
346 [ -e ${f#$webdir/manual/} ] || stale="$stale ${f##*/}"
347 done
348
349 mv $d/*.html $webdir/manual/$d/
350
351 (
352 cd $webdir/manual/$d
353 [ "$new" ] && {
354 echo "Adding new files: $new"
355 $cvs add $new || die "add error"
356 }
357
358 [ "$stale" ] && {
359 echo "Removing stale files: $stale"
360 $cvs remove -f $stale || die "remove error"
361 }
362
363 ## -f: create a new revision even if no change.
364 $cvs commit -f -m "$message" *.html $stale || die "commit error"
365 )
366
367done
368
369
370echo "Checking for stray files..."
371find -type f
372
373
374echo "Finished"
375
376exit 0
diff --git a/doc/emacs/docstyle.texi b/doc/emacs/docstyle.texi
index f682e3d82be..5bdcd079d91 100644
--- a/doc/emacs/docstyle.texi
+++ b/doc/emacs/docstyle.texi
@@ -8,9 +8,11 @@
8@end ignore 8@end ignore
9@set txicodequoteundirected 9@set txicodequoteundirected
10@set txicodequotebacktick 10@set txicodequotebacktick
11@iftex
11@c It turns out TeX sometimes fails to hyphenate, so we help it here 12@c It turns out TeX sometimes fails to hyphenate, so we help it here
12@hyphenation{au-to-mat-i-cal-ly} 13@hyphenation{au-to-mat-i-cal-ly}
13@hyphenation{spec-i-fied} 14@hyphenation{spec-i-fied}
14@hyphenation{work-a-round} 15@hyphenation{work-a-round}
15@hyphenation{work-a-rounds} 16@hyphenation{work-a-rounds}
16@hyphenation{un-marked} 17@hyphenation{un-marked}
18@end iftex
diff --git a/doc/lispref/customize.texi b/doc/lispref/customize.texi
index 02fcd80fa33..b3528b12d57 100644
--- a/doc/lispref/customize.texi
+++ b/doc/lispref/customize.texi
@@ -321,6 +321,7 @@ If a @code{defcustom} does not specify any @code{:group}, the last group
321defined with @code{defgroup} in the same file will be used. This way, most 321defined with @code{defgroup} in the same file will be used. This way, most
322@code{defcustom} do not need an explicit @code{:group}. 322@code{defcustom} do not need an explicit @code{:group}.
323 323
324@cindex @code{eval-defun}, and @code{defcustom} forms
324When you evaluate a @code{defcustom} form with @kbd{C-M-x} in Emacs Lisp 325When you evaluate a @code{defcustom} form with @kbd{C-M-x} in Emacs Lisp
325mode (@code{eval-defun}), a special feature of @code{eval-defun} 326mode (@code{eval-defun}), a special feature of @code{eval-defun}
326arranges to set the variable unconditionally, without testing whether 327arranges to set the variable unconditionally, without testing whether
diff --git a/doc/lispref/debugging.texi b/doc/lispref/debugging.texi
index 2daa8a5578f..1b1f87465db 100644
--- a/doc/lispref/debugging.texi
+++ b/doc/lispref/debugging.texi
@@ -336,6 +336,7 @@ which is not currently set up to break on change.
336@cindex debugger, explicit entry 336@cindex debugger, explicit entry
337@cindex force entry to debugger 337@cindex force entry to debugger
338 338
339@cindex @code{eval-defun}, and explicit entry to debugger
339 You can cause the debugger to be called at a certain point in your 340 You can cause the debugger to be called at a certain point in your
340program by writing the expression @code{(debug)} at that point. To do 341program by writing the expression @code{(debug)} at that point. To do
341this, visit the source file, insert the text @samp{(debug)} at the 342this, visit the source file, insert the text @samp{(debug)} at the
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index a3dca1cd9c9..fef51881977 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -2531,6 +2531,7 @@ However, if the customizations are subsequently removed, the
2531appearance of @var{face} will again be determined by its default face 2531appearance of @var{face} will again be determined by its default face
2532spec. 2532spec.
2533 2533
2534@cindex @code{eval-defun}, and @code{defface} forms
2534As an exception, if you evaluate a @code{defface} form with 2535As an exception, if you evaluate a @code{defface} form with
2535@kbd{C-M-x} in Emacs Lisp mode (@code{eval-defun}), a special feature 2536@kbd{C-M-x} in Emacs Lisp mode (@code{eval-defun}), a special feature
2536of @code{eval-defun} overrides any custom face specs on the face, 2537of @code{eval-defun} overrides any custom face specs on the face,
diff --git a/doc/lispref/sequences.texi b/doc/lispref/sequences.texi
index 566ba8de18f..777b1cbbffb 100644
--- a/doc/lispref/sequences.texi
+++ b/doc/lispref/sequences.texi
@@ -75,9 +75,9 @@ string, bool-vector, or char-table, @code{nil} otherwise.
75@anchor{Definition of length} 75@anchor{Definition of length}
76This function returns the number of elements in @var{sequence}. If 76This function returns the number of elements in @var{sequence}. If
77@var{sequence} is a dotted list, a @code{wrong-type-argument} error is 77@var{sequence} is a dotted list, a @code{wrong-type-argument} error is
78signaled. Circular lists may cause an infinite loop. For a 78signaled; if it is a circular list, a @code{circular-list} error is
79char-table, the value returned is always one more than the maximum 79signaled. For a char-table, the value returned is always one more
80Emacs character code. 80than the maximum Emacs character code.
81 81
82@xref{Definition of safe-length}, for the related function @code{safe-length}. 82@xref{Definition of safe-length}, for the related function @code{safe-length}.
83 83
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index af1bed461c0..6560660120b 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -461,6 +461,7 @@ form occurs in a @code{let} form with lexical binding enabled), then
461@code{defvar} sets the dynamic value. The lexical binding remains in 461@code{defvar} sets the dynamic value. The lexical binding remains in
462effect until its binding construct exits. @xref{Variable Scoping}. 462effect until its binding construct exits. @xref{Variable Scoping}.
463 463
464@cindex @code{eval-defun}, and @code{defvar} forms
464When you evaluate a top-level @code{defvar} form with @kbd{C-M-x} in 465When you evaluate a top-level @code{defvar} form with @kbd{C-M-x} in
465Emacs Lisp mode (@code{eval-defun}), a special feature of 466Emacs Lisp mode (@code{eval-defun}), a special feature of
466@code{eval-defun} arranges to set the variable unconditionally, without 467@code{eval-defun} arranges to set the variable unconditionally, without
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index a9de1fddc66..d8f4b41e2f2 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -2097,8 +2097,8 @@ installed. Usually, it is sufficient to open the file
2097@file{@trampfn{adb,,/}}. Then you can navigate in the filesystem via 2097@file{@trampfn{adb,,/}}. Then you can navigate in the filesystem via
2098@code{dired}. 2098@code{dired}.
2099 2099
2100Alternatively, applications such as @code{SSHDroid} that run 2100Alternatively, applications such as @code{Termux} or @code{SSHDroid}
2101@command{sshd} process on the Android device can accept any 2101that run @command{sshd} process on the Android device can accept any
2102@option{ssh}-based methods provided these settings are adjusted: 2102@option{ssh}-based methods provided these settings are adjusted:
2103 2103
2104@itemize 2104@itemize
diff --git a/lisp/emacs-lock.el b/lisp/emacs-lock.el
index 0733c3326c9..1ff69cc7fc7 100644
--- a/lisp/emacs-lock.el
+++ b/lisp/emacs-lock.el
@@ -97,7 +97,10 @@ It can be one of the following values:
97 exit -- Emacs cannot exit while the buffer is locked 97 exit -- Emacs cannot exit while the buffer is locked
98 kill -- the buffer cannot be killed, but Emacs can exit as usual 98 kill -- the buffer cannot be killed, but Emacs can exit as usual
99 all -- the buffer is locked against both actions 99 all -- the buffer is locked against both actions
100 nil -- the buffer is not locked") 100 nil -- the buffer is not locked
101
102See also `emacs-lock-unlockable-modes', which exempts buffers under
103some major modes from being locked under some circumstances.")
101(put 'emacs-lock-mode 'permanent-local t) 104(put 'emacs-lock-mode 'permanent-local t)
102 105
103(defvar-local emacs-lock--old-mode nil 106(defvar-local emacs-lock--old-mode nil
@@ -202,7 +205,10 @@ When called from Elisp code, ARG can be any locking mode:
202 kill -- the buffer cannot be killed, but Emacs can exit as usual 205 kill -- the buffer cannot be killed, but Emacs can exit as usual
203 all -- the buffer is locked against both actions 206 all -- the buffer is locked against both actions
204 207
205Other values are interpreted as usual." 208Other values are interpreted as usual.
209
210See also `emacs-lock-unlockable-modes', which exempts buffers under
211some major modes from being locked under some circumstances."
206 :init-value nil 212 :init-value nil
207 :lighter ("" 213 :lighter (""
208 (emacs-lock--try-unlocking " locked:" " Locked:") 214 (emacs-lock--try-unlocking " locked:" " Locked:")
diff --git a/lisp/imenu.el b/lisp/imenu.el
index 7d4363993de..c0103dbc4c2 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -200,9 +200,9 @@ string (which specifies the title of a submenu into which the
200matches are put). 200matches are put).
201REGEXP is a regular expression matching a definition construct 201REGEXP is a regular expression matching a definition construct
202which is to be displayed in the menu. REGEXP may also be a 202which is to be displayed in the menu. REGEXP may also be a
203function, called without arguments. It is expected to search 203function of no arguments. If REGEXP is a function, it is
204backwards. It must return true and set `match-data' if it finds 204expected to search backwards, return non-nil if it finds a
205another element. 205definition construct, and set `match-data' for that construct.
206INDEX is an integer specifying which subexpression of REGEXP 206INDEX is an integer specifying which subexpression of REGEXP
207matches the definition's name; this subexpression is displayed as 207matches the definition's name; this subexpression is displayed as
208the menu item. 208the menu item.
diff --git a/lisp/mh-e/mh-comp.el b/lisp/mh-e/mh-comp.el
index 1a77daff9b7..2b49fae2a6d 100644
--- a/lisp/mh-e/mh-comp.el
+++ b/lisp/mh-e/mh-comp.el
@@ -927,8 +927,10 @@ CONFIG is the window configuration before sending mail."
927 (list "-form" mh-comp-formfile))) 927 (list "-form" mh-comp-formfile)))
928 (setq new (make-temp-file "comp.")) 928 (setq new (make-temp-file "comp."))
929 (rename-file (concat temp-folder "/" "1") new t) 929 (rename-file (concat temp-folder "/" "1") new t)
930 (delete-file (concat temp-folder "/" ".mh_sequences")) 930 ;; The temp folder could contain various metadata files. Rather
931 (delete-directory temp-folder) 931 ;; than trying to enumerate all the known files, just do a
932 ;; recursive delete on the directory.
933 (delete-directory temp-folder t)
932 new)) 934 new))
933 935
934(defun mh-read-draft (use initial-contents delete-contents-file) 936(defun mh-read-draft (use initial-contents delete-contents-file)
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index a400a3c5277..2d253506dde 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -544,7 +544,7 @@ The PATH environment variable should be set via `tramp-remote-path'.
544The TERM environment variable should be set via `tramp-terminal-type'. 544The TERM environment variable should be set via `tramp-terminal-type'.
545 545
546The INSIDE_EMACS environment variable will automatically be set 546The INSIDE_EMACS environment variable will automatically be set
547based on the TRAMP and Emacs versions, and should not be set here." 547based on the Tramp and Emacs versions, and should not be set here."
548 :group 'tramp 548 :group 'tramp
549 :version "26.1" 549 :version "26.1"
550 :type '(repeat string)) 550 :type '(repeat string))
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 8eded03b9c4..58a58b46395 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -1191,11 +1191,11 @@ current buffer.
1191Normally, this function truncates long output according to the 1191Normally, this function truncates long output according to the
1192value of the variables `eval-expression-print-length' and 1192value of the variables `eval-expression-print-length' and
1193`eval-expression-print-level'. With a prefix argument of zero, 1193`eval-expression-print-level'. With a prefix argument of zero,
1194however, there is no such truncation. Such a prefix argument 1194however, there is no such truncation.
1195also causes integers to be printed in several additional formats 1195Integer values are printed in several formats (decimal, octal,
1196\(octal, hexadecimal, and character when the prefix argument is 1196and hexadecimal). When the prefix argument is -1 or the value
1197-1 or the integer is `eval-expression-print-maximum-character' or 1197doesn't exceed `eval-expression-print-maximum-character', an
1198less). 1198integer value is also printed as a character of that codepoint.
1199 1199
1200If `eval-expression-debug-on-error' is non-nil, which is the default, 1200If `eval-expression-debug-on-error' is non-nil, which is the default,
1201this command arranges for all errors to enter the debugger." 1201this command arranges for all errors to enter the debugger."
diff --git a/lisp/simple.el b/lisp/simple.el
index e98cea78d4f..6459531a4ec 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -1528,9 +1528,9 @@ This affects printing by `eval-expression' (via
1528 :version "26.1") 1528 :version "26.1")
1529 1529
1530(defun eval-expression-print-format (value) 1530(defun eval-expression-print-format (value)
1531 "If VALUE in an integer, return a specially formatted string. 1531 "If VALUE is an integer, return a specially formatted string.
1532This string will typically look like \" (#o1, #x1, ?\\C-a)\". 1532This string will typically look like \" (#o1, #x1, ?\\C-a)\".
1533If VALUE is not an integer, nil is returned. 1533If VALUE is not an integer, return nil.
1534This function is used by commands like `eval-expression' that 1534This function is used by commands like `eval-expression' that
1535display the result of expression evaluation." 1535display the result of expression evaluation."
1536 (when (integerp value) 1536 (when (integerp value)
@@ -1591,11 +1591,11 @@ non-nil (interactively, with a prefix argument of zero), however,
1591there is no such truncation. 1591there is no such truncation.
1592 1592
1593If the resulting value is an integer, and CHAR-PRINT-LIMIT is 1593If the resulting value is an integer, and CHAR-PRINT-LIMIT is
1594non-nil (interactively, unless given a positive prefix argument) 1594non-nil (interactively, unless given a non-zero prefix argument)
1595it will be printed in several additional formats (octal, 1595it will be printed in several additional formats (octal,
1596hexadecimal, and character). The character format is only used 1596hexadecimal, and character). The character format is only used
1597if the value is below CHAR-PRINT-LIMIT (interactively, if the 1597if the value is below CHAR-PRINT-LIMIT (interactively, if the
1598prefix argument is -1 or the value is below 1598prefix argument is -1 or the value doesn't exceed
1599`eval-expression-print-maximum-character'). 1599`eval-expression-print-maximum-character').
1600 1600
1601Runs the hook `eval-expression-minibuffer-setup-hook' on entering the 1601Runs the hook `eval-expression-minibuffer-setup-hook' on entering the
diff --git a/src/editfns.c b/src/editfns.c
index e16a554de20..4dbf4805721 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -3139,6 +3139,9 @@ static unsigned short rbc_quitcounter;
3139 /* Buffers to compare. */ \ 3139 /* Buffers to compare. */ \
3140 struct buffer *buffer_a; \ 3140 struct buffer *buffer_a; \
3141 struct buffer *buffer_b; \ 3141 struct buffer *buffer_b; \
3142 /* BEGV of each buffer */ \
3143 ptrdiff_t beg_a; \
3144 ptrdiff_t beg_b; \
3142 /* Whether each buffer is unibyte/plain-ASCII or not. */ \ 3145 /* Whether each buffer is unibyte/plain-ASCII or not. */ \
3143 bool a_unibyte; \ 3146 bool a_unibyte; \
3144 bool b_unibyte; \ 3147 bool b_unibyte; \
@@ -3222,6 +3225,8 @@ differences between the two buffers. */)
3222 struct context ctx = { 3225 struct context ctx = {
3223 .buffer_a = a, 3226 .buffer_a = a,
3224 .buffer_b = b, 3227 .buffer_b = b,
3228 .beg_a = min_a,
3229 .beg_b = min_b,
3225 .a_unibyte = BUF_ZV (a) == BUF_ZV_BYTE (a), 3230 .a_unibyte = BUF_ZV (a) == BUF_ZV_BYTE (a),
3226 .b_unibyte = BUF_ZV (b) == BUF_ZV_BYTE (b), 3231 .b_unibyte = BUF_ZV (b) == BUF_ZV_BYTE (b),
3227 .deletions = SAFE_ALLOCA (del_bytes), 3232 .deletions = SAFE_ALLOCA (del_bytes),
@@ -3361,8 +3366,8 @@ static bool
3361buffer_chars_equal (struct context *ctx, 3366buffer_chars_equal (struct context *ctx,
3362 ptrdiff_t pos_a, ptrdiff_t pos_b) 3367 ptrdiff_t pos_a, ptrdiff_t pos_b)
3363{ 3368{
3364 pos_a += BUF_BEGV (ctx->buffer_a); 3369 pos_a += ctx->beg_a;
3365 pos_b += BUF_BEGV (ctx->buffer_b); 3370 pos_b += ctx->beg_b;
3366 3371
3367 /* Allow the user to escape out of a slow compareseq call. */ 3372 /* Allow the user to escape out of a slow compareseq call. */
3368 rarely_quit (++rbc_quitcounter); 3373 rarely_quit (++rbc_quitcounter);
diff --git a/src/w32fns.c b/src/w32fns.c
index 7f7e1a404ce..760801cd1db 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -4550,13 +4550,13 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
4550 set_ime_composition_window_fn (context, &form); 4550 set_ime_composition_window_fn (context, &form);
4551 release_ime_context_fn (hwnd, context); 4551 release_ime_context_fn (hwnd, context);
4552 } 4552 }
4553 /* We should "goto dflt" here to pass WM_IME_STARTCOMPOSITION to 4553 /* FIXME: somehow "goto dflt" here instead of "break" causes
4554 DefWindowProc, so that the composition window will actually 4554 popup dialogs, such as the ones shown by File->Open File and
4555 be displayed. But doing so causes trouble with displaying 4555 w32-select-font, to become hidden behind their parent frame,
4556 dialog boxes, such as the file selection dialog or font 4556 when focus-follows-mouse is in effect. See bug#11732. But
4557 selection dialog. So something else is needed to fix the 4557 if we don't "goto dflt", users of IME cannot type text
4558 former without breaking the latter. See bug#11732. */ 4558 supported by the input method... */
4559 break; 4559 goto dflt;
4560 4560
4561 case WM_IME_ENDCOMPOSITION: 4561 case WM_IME_ENDCOMPOSITION:
4562 ignore_ime_char = 0; 4562 ignore_ime_char = 0;