summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Whitton <spwhitton@spwhitton.name>2022-08-17 10:54:44 -0700
committerSean Whitton <spwhitton@spwhitton.name>2022-08-17 10:54:44 -0700
commit0027dc47edddf5d3fc6e8e4127b9631d7a1191cc (patch)
tree89084227d2170064d0a31b80d1b1fe48e6e4c901
parent736075bab9e0299fdfe4384030ca54c31fb358fb (diff)
parentb24f7667ad686093c2b013bc58e2f1234d7487fd (diff)
downloademacs-0027dc47edddf5d3fc6e8e4127b9631d7a1191cc.tar.gz
Merge remote-tracking branch 'origin/master' into athena/unstable
-rw-r--r--.gitignore6
-rw-r--r--CONTRIBUTE5
-rw-r--r--ChangeLog.3416
-rw-r--r--Makefile.in9
-rw-r--r--admin/MAINTAINERS1
-rw-r--r--admin/authors.el3
-rwxr-xr-xadmin/automerge2
-rwxr-xr-xadmin/check-doc-strings8
-rw-r--r--admin/coccinelle/window.cocci6
-rwxr-xr-xadmin/emake3
-rw-r--r--admin/make-tarball.txt13
-rw-r--r--admin/unidata/unidata-gen.el4
-rwxr-xr-xadmin/update_autogen14
-rw-r--r--configure.ac8
-rw-r--r--doc/emacs/custom.texi6
-rw-r--r--doc/emacs/display.texi34
-rw-r--r--doc/emacs/emacs.texi1
-rw-r--r--doc/emacs/glossary.texi4
-rw-r--r--doc/emacs/mini.texi13
-rw-r--r--doc/emacs/misc.texi96
-rw-r--r--doc/emacs/msdos.texi6
-rw-r--r--doc/emacs/search.texi17
-rw-r--r--doc/emacs/trouble.texi59
-rw-r--r--doc/emacs/xresources.texi10
-rw-r--r--doc/lispintro/emacs-lisp-intro.texi47
-rw-r--r--doc/lispref/buffers.texi3
-rw-r--r--doc/lispref/commands.texi5
-rw-r--r--doc/lispref/compile.texi4
-rw-r--r--doc/lispref/customize.texi4
-rw-r--r--doc/lispref/debugging.texi44
-rw-r--r--doc/lispref/display.texi175
-rw-r--r--doc/lispref/frames.texi12
-rw-r--r--doc/lispref/functions.texi38
-rw-r--r--doc/lispref/hash.texi10
-rw-r--r--doc/lispref/hooks.texi1
-rw-r--r--doc/lispref/keymaps.texi7
-rw-r--r--doc/lispref/lists.texi38
-rw-r--r--doc/lispref/loading.texi29
-rw-r--r--doc/lispref/maps.texi4
-rw-r--r--doc/lispref/modes.texi9
-rw-r--r--doc/lispref/objects.texi3
-rw-r--r--doc/lispref/os.texi21
-rw-r--r--doc/lispref/positions.texi12
-rw-r--r--doc/lispref/processes.texi91
-rw-r--r--doc/lispref/strings.texi27
-rw-r--r--doc/lispref/text.texi7
-rw-r--r--doc/lispref/tips.texi16
-rw-r--r--doc/lispref/windows.texi4
-rw-r--r--doc/misc/auth.texi10
-rw-r--r--doc/misc/autotype.texi26
-rw-r--r--doc/misc/calc.texi2
-rw-r--r--doc/misc/ede.texi4
-rw-r--r--doc/misc/ediff.texi11
-rw-r--r--doc/misc/efaq-w32.texi6
-rw-r--r--doc/misc/efaq.texi28
-rw-r--r--doc/misc/emacs-mime.texi6
-rw-r--r--doc/misc/eshell.texi82
-rw-r--r--doc/misc/eudc.texi21
-rw-r--r--doc/misc/gnus-faq.texi224
-rw-r--r--doc/misc/gnus.texi269
-rw-r--r--doc/misc/htmlfontify.texi10
-rw-r--r--doc/misc/idlwave.texi49
-rw-r--r--doc/misc/message.texi18
-rw-r--r--doc/misc/mh-e.texi103
-rw-r--r--doc/misc/modus-themes.org449
-rw-r--r--doc/misc/reftex.texi8
-rw-r--r--doc/misc/texinfo.tex2
-rw-r--r--doc/misc/tramp.texi43
-rw-r--r--doc/misc/transient.texi802
-rw-r--r--doc/misc/url.texi1
-rw-r--r--doc/misc/viper.texi4
-rw-r--r--doc/misc/vtable.texi6
-rw-r--r--etc/AUTHORS28
-rw-r--r--etc/NEWS538
-rw-r--r--etc/NEWS.1-17860
-rw-r--r--etc/NEWS.18512
-rw-r--r--etc/NEWS.191695
-rw-r--r--etc/NEWS.201318
-rw-r--r--etc/NEWS.211785
-rw-r--r--etc/NEWS.222577
-rw-r--r--etc/NEWS.231212
-rw-r--r--etc/NEWS.242264
-rw-r--r--etc/NEWS.256
-rw-r--r--etc/NEWS.2614
-rw-r--r--etc/NEWS.2714
-rw-r--r--etc/NEWS.284
-rw-r--r--etc/PROBLEMS79
-rw-r--r--etc/TODO31
-rw-r--r--etc/emacs_lldb.py26
-rw-r--r--etc/publicsuffix.txt8
-rw-r--r--etc/themes/modus-operandi-theme.el4
-rw-r--r--etc/themes/modus-themes.el411
-rw-r--r--etc/themes/modus-vivendi-theme.el4
-rw-r--r--lib-src/Makefile.in3
-rw-r--r--lib-src/etags.c8
-rw-r--r--lib-src/make-docfile.c360
-rw-r--r--lisp/ChangeLog.122
-rw-r--r--lisp/ChangeLog.54
-rw-r--r--lisp/Makefile.in70
-rw-r--r--lisp/allout.el18
-rw-r--r--lisp/apropos.el99
-rw-r--r--lisp/arc-mode.el27
-rw-r--r--lisp/array.el87
-rw-r--r--lisp/auth-source.el64
-rw-r--r--lisp/battery.el16
-rw-r--r--lisp/bindings.el224
-rw-r--r--lisp/bookmark.el47
-rw-r--r--lisp/bs.el13
-rw-r--r--lisp/button.el14
-rw-r--r--lisp/calc/calc-vec.el4
-rw-r--r--lisp/calc/calc.el12
-rw-r--r--lisp/calendar/diary-lib.el4
-rw-r--r--lisp/calendar/time-date.el18
-rw-r--r--lisp/calendar/timeclock.el2
-rw-r--r--lisp/cedet/cedet.el6
-rw-r--r--lisp/cedet/ede.el9
-rw-r--r--lisp/cedet/ede/auto.el1
-rw-r--r--lisp/cedet/ede/base.el8
-rw-r--r--lisp/cedet/ede/config.el4
-rw-r--r--lisp/cedet/ede/custom.el10
-rw-r--r--lisp/cedet/ede/emacs.el1
-rw-r--r--lisp/cedet/ede/files.el5
-rw-r--r--lisp/cedet/ede/speedbar.el4
-rw-r--r--lisp/cedet/ede/system.el2
-rw-r--r--lisp/cedet/semantic.el6
-rw-r--r--lisp/cedet/semantic/bovine.el4
-rw-r--r--lisp/cedet/semantic/complete.el94
-rw-r--r--lisp/cedet/semantic/db-file.el2
-rw-r--r--lisp/cedet/semantic/db-typecache.el2
-rw-r--r--lisp/cedet/semantic/db.el11
-rw-r--r--lisp/cedet/semantic/tag-file.el102
-rw-r--r--lisp/cedet/semantic/util.el3
-rw-r--r--lisp/cedet/semantic/wisent/comp.el16
-rw-r--r--lisp/cedet/semantic/wisent/python.el6
-rw-r--r--lisp/cedet/srecode.el4
-rw-r--r--lisp/cedet/srecode/compile.el10
-rw-r--r--lisp/cedet/srecode/insert.el4
-rw-r--r--lisp/cedet/srecode/table.el10
-rw-r--r--lisp/comint.el15
-rw-r--r--lisp/cus-dep.el2
-rw-r--r--lisp/cus-edit.el313
-rw-r--r--lisp/cus-start.el5
-rw-r--r--lisp/custom.el3
-rw-r--r--lisp/descr-text.el4
-rw-r--r--lisp/desktop.el14
-rw-r--r--lisp/dired-aux.el11
-rw-r--r--lisp/dired.el62
-rw-r--r--lisp/edmacro.el9
-rw-r--r--lisp/electric.el19
-rw-r--r--lisp/emacs-lisp/advice.el27
-rw-r--r--lisp/emacs-lisp/byte-opt.el471
-rw-r--r--lisp/emacs-lisp/byte-run.el19
-rw-r--r--lisp/emacs-lisp/bytecomp.el64
-rw-r--r--lisp/emacs-lisp/chart.el2
-rw-r--r--lisp/emacs-lisp/checkdoc.el25
-rw-r--r--lisp/emacs-lisp/cl-extra.el3
-rw-r--r--lisp/emacs-lisp/cl-lib.el4
-rw-r--r--lisp/emacs-lisp/cl-macs.el35
-rw-r--r--lisp/emacs-lisp/comp.el2
-rw-r--r--lisp/emacs-lisp/derived.el5
-rw-r--r--lisp/emacs-lisp/edebug.el2
-rw-r--r--lisp/emacs-lisp/eieio-base.el46
-rw-r--r--lisp/emacs-lisp/eieio.el1
-rw-r--r--lisp/emacs-lisp/eldoc.el15
-rw-r--r--lisp/emacs-lisp/ert.el5
-rw-r--r--lisp/emacs-lisp/helper.el1
-rw-r--r--lisp/emacs-lisp/icons.el265
-rw-r--r--lisp/emacs-lisp/lisp-mode.el73
-rw-r--r--lisp/emacs-lisp/lisp.el9
-rw-r--r--lisp/emacs-lisp/loaddefs-gen.el167
-rw-r--r--lisp/emacs-lisp/macroexp.el2
-rw-r--r--lisp/emacs-lisp/nadvice.el24
-rw-r--r--lisp/emacs-lisp/package.el45
-rw-r--r--lisp/emacs-lisp/pcase.el13
-rw-r--r--lisp/emacs-lisp/regi.el1
-rw-r--r--lisp/emacs-lisp/ring.el4
-rw-r--r--lisp/emacs-lisp/rx.el6
-rw-r--r--lisp/emacs-lisp/seq.el59
-rw-r--r--lisp/emacs-lisp/shadow.el7
-rw-r--r--lisp/emacs-lisp/shortdoc.el11
-rw-r--r--lisp/emacs-lisp/subr-x.el31
-rw-r--r--lisp/emacs-lisp/timer.el70
-rw-r--r--lisp/emacs-lisp/trace.el8
-rw-r--r--lisp/emacs-lisp/warnings.el55
-rw-r--r--lisp/emulation/cua-base.el18
-rw-r--r--lisp/emulation/viper-ex.el2
-rw-r--r--lisp/emulation/viper-init.el2
-rw-r--r--lisp/emulation/viper-keym.el86
-rw-r--r--lisp/emulation/viper-util.el53
-rw-r--r--lisp/emulation/viper.el27
-rw-r--r--lisp/env.el2
-rw-r--r--lisp/epa-ks.el6
-rw-r--r--lisp/epg.el4
-rw-r--r--lisp/erc/erc-backend.el53
-rw-r--r--lisp/erc/erc-compat.el6
-rw-r--r--lisp/erc/erc-dcc.el40
-rw-r--r--lisp/erc/erc-networks.el3
-rw-r--r--lisp/erc/erc-speedbar.el27
-rw-r--r--lisp/erc/erc.el40
-rw-r--r--lisp/eshell/em-alias.el2
-rw-r--r--lisp/eshell/em-extpipe.el4
-rw-r--r--lisp/eshell/em-hist.el1
-rw-r--r--lisp/eshell/em-unix.el6
-rw-r--r--lisp/eshell/esh-arg.el2
-rw-r--r--lisp/eshell/esh-cmd.el92
-rw-r--r--lisp/eshell/esh-io.el77
-rw-r--r--lisp/eshell/esh-mode.el3
-rw-r--r--lisp/eshell/esh-proc.el123
-rw-r--r--lisp/eshell/esh-util.el2
-rw-r--r--lisp/eshell/esh-var.el4
-rw-r--r--lisp/ezimage.el5
-rw-r--r--lisp/faces.el48
-rw-r--r--lisp/ffap.el131
-rw-r--r--lisp/files.el56
-rw-r--r--lisp/filesets.el57
-rw-r--r--lisp/find-dired.el23
-rw-r--r--lisp/find-lisp.el2
-rw-r--r--lisp/finder.el16
-rw-r--r--lisp/font-core.el2
-rw-r--r--lisp/font-lock.el112
-rw-r--r--lisp/fringe.el12
-rw-r--r--lisp/gnus/ChangeLog.32
-rw-r--r--lisp/gnus/deuglify.el1
-rw-r--r--lisp/gnus/gnus-art.el20
-rw-r--r--lisp/gnus/gnus-demon.el2
-rw-r--r--lisp/gnus/gnus-diary.el6
-rw-r--r--lisp/gnus/gnus-group.el8
-rw-r--r--lisp/gnus/gnus-int.el5
-rw-r--r--lisp/gnus/gnus-srvr.el1
-rw-r--r--lisp/gnus/gnus-sum.el4
-rw-r--r--lisp/gnus/gnus-util.el42
-rw-r--r--lisp/gnus/gnus-uu.el3
-rw-r--r--lisp/gnus/gnus.el24
-rw-r--r--lisp/gnus/message.el55
-rw-r--r--lisp/gnus/mm-decode.el9
-rw-r--r--lisp/gnus/mm-util.el1
-rw-r--r--lisp/gnus/mml.el12
-rw-r--r--lisp/gnus/mml2015.el2
-rw-r--r--lisp/gnus/nnagent.el1
-rw-r--r--lisp/gnus/nnbabyl.el1
-rw-r--r--lisp/gnus/nndiary.el2
-rw-r--r--lisp/gnus/nndir.el1
-rw-r--r--lisp/gnus/nndoc.el1
-rw-r--r--lisp/gnus/nndraft.el1
-rw-r--r--lisp/gnus/nneething.el4
-rw-r--r--lisp/gnus/nnfolder.el4
-rw-r--r--lisp/gnus/nnheader.el12
-rw-r--r--lisp/gnus/nnimap.el3
-rw-r--r--lisp/gnus/nnmaildir.el22
-rw-r--r--lisp/gnus/nnmbox.el1
-rw-r--r--lisp/gnus/nnmh.el12
-rw-r--r--lisp/gnus/nnml.el1
-rw-r--r--lisp/gnus/nnrss.el7
-rw-r--r--lisp/gnus/nnspool.el1
-rw-r--r--lisp/gnus/nntp.el47
-rw-r--r--lisp/gnus/nnvirtual.el1
-rw-r--r--lisp/gnus/spam-stat.el3
-rw-r--r--lisp/gnus/spam.el6
-rw-r--r--lisp/help-fns.el114
-rw-r--r--lisp/help-mode.el42
-rw-r--r--lisp/help.el54
-rw-r--r--lisp/hex-util.el8
-rw-r--r--lisp/htmlfontify.el11
-rw-r--r--lisp/ibuf-ext.el82
-rw-r--r--lisp/ibuf-macs.el9
-rw-r--r--lisp/ibuffer.el30
-rw-r--r--lisp/image-dired.el14
-rw-r--r--lisp/image.el3
-rw-r--r--lisp/image/exif.el4
-rw-r--r--lisp/info-look.el1
-rw-r--r--lisp/info.el4
-rw-r--r--lisp/international/characters.el23
-rw-r--r--lisp/international/iso-transl.el2
-rw-r--r--lisp/international/ja-dic-utl.el8
-rw-r--r--lisp/international/latin1-disp.el1
-rw-r--r--lisp/international/mule-cmds.el5
-rw-r--r--lisp/international/mule-diag.el62
-rw-r--r--lisp/international/quail.el8
-rw-r--r--lisp/international/titdic-cnv.el7
-rw-r--r--lisp/isearch.el8
-rw-r--r--lisp/keymap.el18
-rw-r--r--lisp/kmacro.el1
-rw-r--r--lisp/language/european.el2
-rw-r--r--lisp/language/misc-lang.el9
-rw-r--r--lisp/ldefs-boot.el5293
-rw-r--r--lisp/leim/quail/hangul.el33
-rw-r--r--lisp/leim/quail/indian.el2
-rw-r--r--lisp/loadhist.el2
-rw-r--r--lisp/loadup.el21
-rw-r--r--lisp/ls-lisp.el8
-rw-r--r--lisp/mail/binhex.el4
-rw-r--r--lisp/mail/feedmail.el8
-rw-r--r--lisp/mail/footnote.el30
-rw-r--r--lisp/mail/ietf-drums.el13
-rw-r--r--lisp/mail/mail-parse.el8
-rw-r--r--lisp/mail/mailabbrev.el2
-rw-r--r--lisp/mail/mspools.el19
-rw-r--r--lisp/mail/rfc2047.el3
-rw-r--r--lisp/mail/rmail.el3
-rw-r--r--lisp/mail/rmailedit.el11
-rw-r--r--lisp/mail/rmailsum.el14
-rw-r--r--lisp/mail/sendmail.el7
-rw-r--r--lisp/mail/smtpmail.el6
-rw-r--r--lisp/mail/supercite.el137
-rw-r--r--lisp/man.el3
-rw-r--r--lisp/menu-bar.el4
-rw-r--r--lisp/mh-e/mh-acros.el18
-rw-r--r--lisp/mh-e/mh-alias.el5
-rw-r--r--lisp/mh-e/mh-buffers.el1
-rw-r--r--lisp/mh-e/mh-comp.el1
-rw-r--r--lisp/mh-e/mh-e.el34
-rw-r--r--lisp/mh-e/mh-folder.el3
-rw-r--r--lisp/mh-e/mh-funcs.el1
-rw-r--r--lisp/mh-e/mh-gnus.el12
-rw-r--r--lisp/mh-e/mh-identity.el13
-rw-r--r--lisp/mh-e/mh-inc.el1
-rw-r--r--lisp/mh-e/mh-junk.el1
-rw-r--r--lisp/mh-e/mh-letter.el22
-rw-r--r--lisp/mh-e/mh-limit.el1
-rw-r--r--lisp/mh-e/mh-mime.el44
-rw-r--r--lisp/mh-e/mh-print.el1
-rw-r--r--lisp/mh-e/mh-scan.el1
-rw-r--r--lisp/mh-e/mh-search.el3
-rw-r--r--lisp/mh-e/mh-seq.el1
-rw-r--r--lisp/mh-e/mh-show.el1
-rw-r--r--lisp/mh-e/mh-speed.el1
-rw-r--r--lisp/mh-e/mh-thread.el1
-rw-r--r--lisp/mh-e/mh-tool-bar.el1
-rw-r--r--lisp/mh-e/mh-utils.el8
-rw-r--r--lisp/mh-e/mh-xface.el1
-rw-r--r--lisp/minibuffer.el60
-rw-r--r--lisp/misc.el37
-rw-r--r--lisp/mouse.el4
-rw-r--r--lisp/mpc.el91
-rw-r--r--lisp/net/ange-ftp.el8
-rw-r--r--lisp/net/browse-url.el5
-rw-r--r--lisp/net/dbus.el4
-rw-r--r--lisp/net/dictionary.el15
-rw-r--r--lisp/net/dig.el33
-rw-r--r--lisp/net/eudc-hotlist.el15
-rw-r--r--lisp/net/eudc-vars.el17
-rw-r--r--lisp/net/eudc.el1
-rw-r--r--lisp/net/eudcb-macos-contacts.el201
-rw-r--r--lisp/net/eww.el6
-rw-r--r--lisp/net/mailcap.el6
-rw-r--r--lisp/net/net-utils.el9
-rw-r--r--lisp/net/newst-backend.el8
-rw-r--r--lisp/net/newst-treeview.el11
-rw-r--r--lisp/net/rcirc.el18
-rw-r--r--lisp/net/shr.el73
-rw-r--r--lisp/net/tramp-adb.el597
-rw-r--r--lisp/net/tramp-archive.el40
-rw-r--r--lisp/net/tramp-cache.el170
-rw-r--r--lisp/net/tramp-cmds.el4
-rw-r--r--lisp/net/tramp-compat.el61
-rw-r--r--lisp/net/tramp-crypt.el238
-rw-r--r--lisp/net/tramp-fuse.el52
-rw-r--r--lisp/net/tramp-gvfs.el204
-rw-r--r--lisp/net/tramp-rclone.el79
-rw-r--r--lisp/net/tramp-sh.el1677
-rw-r--r--lisp/net/tramp-smb.el635
-rw-r--r--lisp/net/tramp-sshfs.el13
-rw-r--r--lisp/net/tramp-sudoedit.el188
-rw-r--r--lisp/net/tramp.el603
-rw-r--r--lisp/nxml/rng-dt.el2
-rw-r--r--lisp/nxml/rng-loc.el8
-rw-r--r--lisp/nxml/rng-match.el2
-rw-r--r--lisp/nxml/rng-parse.el2
-rw-r--r--lisp/nxml/rng-util.el15
-rw-r--r--lisp/nxml/rng-valid.el4
-rw-r--r--lisp/obsolete/autoload.el (renamed from lisp/emacs-lisp/autoload.el)18
-rw-r--r--lisp/obsolete/fast-lock.el730
-rw-r--r--lisp/obsolete/gs.el2
-rw-r--r--lisp/obsolete/info-edit.el11
-rw-r--r--lisp/obsolete/lazy-lock.el1025
-rw-r--r--lisp/obsolete/longlines.el (renamed from lisp/longlines.el)1
-rw-r--r--lisp/obsolete/makesum.el (renamed from lisp/makesum.el)8
-rw-r--r--lisp/obsolete/mh-compat.el (renamed from lisp/mh-e/mh-compat.el)21
-rw-r--r--lisp/obsolete/netrc.el (renamed from lisp/net/netrc.el)15
-rw-r--r--lisp/obsolete/ps-def.el54
-rw-r--r--lisp/obsolete/quickurl.el (renamed from lisp/net/quickurl.el)1
-rw-r--r--lisp/obsolete/rcompile.el2
-rw-r--r--lisp/obsolete/url-about.el (renamed from lisp/url/url-about.el)5
-rw-r--r--lisp/obsolete/url-dired.el (renamed from lisp/url/url-dired.el)3
-rw-r--r--lisp/org/ob-core.el21
-rw-r--r--lisp/org/ob-lilypond.el1
-rw-r--r--lisp/org/ob-tangle.el5
-rw-r--r--lisp/org/oc-basic.el1
-rw-r--r--lisp/org/ol.el4
-rw-r--r--lisp/org/org-compat.el19
-rw-r--r--lisp/org/org-lint.el6
-rw-r--r--lisp/org/org-plot.el9
-rw-r--r--lisp/org/org-src.el4
-rw-r--r--lisp/org/org-version.el2
-rw-r--r--lisp/org/org.el18
-rw-r--r--lisp/org/ox-ascii.el18
-rw-r--r--lisp/org/ox-md.el10
-rw-r--r--lisp/org/ox.el20
-rw-r--r--lisp/outline.el131
-rw-r--r--lisp/pgtk-dnd.el22
-rw-r--r--lisp/pixel-scroll.el78
-rw-r--r--lisp/play/5x5.el12
-rw-r--r--lisp/play/bubbles.el9
-rw-r--r--lisp/play/cookie1.el3
-rw-r--r--lisp/play/doctor.el24
-rw-r--r--lisp/play/dunnet.el2
-rw-r--r--lisp/play/fortune.el56
-rw-r--r--lisp/play/hanoi.el44
-rw-r--r--lisp/play/mpuz.el2
-rw-r--r--lisp/printing.el66
-rw-r--r--lisp/progmodes/antlr-mode.el9
-rw-r--r--lisp/progmodes/autoconf.el2
-rw-r--r--lisp/progmodes/cc-cmds.el3
-rw-r--r--lisp/progmodes/cc-defs.el59
-rw-r--r--lisp/progmodes/cc-engine.el10
-rw-r--r--lisp/progmodes/cc-fonts.el77
-rw-r--r--lisp/progmodes/cc-langs.el2
-rw-r--r--lisp/progmodes/cc-mode.el15
-rw-r--r--lisp/progmodes/compile.el155
-rw-r--r--lisp/progmodes/cperl-mode.el14
-rw-r--r--lisp/progmodes/ebnf2ps.el56
-rw-r--r--lisp/progmodes/f90.el7
-rw-r--r--lisp/progmodes/flymake-proc.el5
-rw-r--r--lisp/progmodes/fortran.el12
-rw-r--r--lisp/progmodes/gdb-mi.el32
-rw-r--r--lisp/progmodes/grep.el6
-rw-r--r--lisp/progmodes/gud.el13
-rw-r--r--lisp/progmodes/hideif.el3
-rw-r--r--lisp/progmodes/idlwave.el17
-rw-r--r--lisp/progmodes/js.el43
-rw-r--r--lisp/progmodes/meta-mode.el24
-rw-r--r--lisp/progmodes/opascal.el1
-rw-r--r--lisp/progmodes/perl-mode.el5
-rw-r--r--lisp/progmodes/prolog.el95
-rw-r--r--lisp/progmodes/ps-mode.el8
-rw-r--r--lisp/progmodes/python.el122
-rw-r--r--lisp/progmodes/verilog-mode.el10
-rw-r--r--lisp/progmodes/which-func.el3
-rw-r--r--lisp/progmodes/xref.el5
-rw-r--r--lisp/progmodes/xscheme.el23
-rw-r--r--lisp/ps-def.el134
-rw-r--r--lisp/ps-print.el110
-rw-r--r--lisp/rect.el48
-rw-r--r--lisp/replace.el104
-rw-r--r--lisp/saveplace.el11
-rw-r--r--lisp/select.el33
-rw-r--r--lisp/simple.el71
-rw-r--r--lisp/speedbar.el10
-rw-r--r--lisp/startup.el6
-rw-r--r--lisp/subr.el177
-rw-r--r--lisp/tab-bar.el6
-rw-r--r--lisp/tar-mode.el78
-rw-r--r--lisp/term.el2
-rw-r--r--lisp/term/haiku-win.el119
-rw-r--r--lisp/term/x-win.el3
-rw-r--r--lisp/textmodes/bib-mode.el79
-rw-r--r--lisp/textmodes/bibtex.el29
-rw-r--r--lisp/textmodes/dns-mode.el26
-rw-r--r--lisp/textmodes/emacs-authors-mode.el145
-rw-r--r--lisp/textmodes/emacs-news-mode.el24
-rw-r--r--lisp/textmodes/etc-authors-mode.el133
-rw-r--r--lisp/textmodes/flyspell.el3
-rw-r--r--lisp/textmodes/ispell.el7
-rw-r--r--lisp/textmodes/nroff-mode.el23
-rw-r--r--lisp/textmodes/picture.el1
-rw-r--r--lisp/textmodes/refbib.el11
-rw-r--r--lisp/textmodes/reftex-cite.el52
-rw-r--r--lisp/textmodes/reftex-index.el6
-rw-r--r--lisp/textmodes/reftex-ref.el6
-rw-r--r--lisp/textmodes/reftex-sel.el12
-rw-r--r--lisp/textmodes/reftex-toc.el6
-rw-r--r--lisp/textmodes/remember.el4
-rw-r--r--lisp/textmodes/sgml-mode.el15
-rw-r--r--lisp/textmodes/tex-mode.el6
-rw-r--r--lisp/textmodes/texinfo.el3
-rw-r--r--lisp/textmodes/text-mode.el16
-rw-r--r--lisp/thingatpt.el13
-rw-r--r--lisp/tool-bar.el4
-rw-r--r--lisp/transient.el1000
-rw-r--r--lisp/type-break.el30
-rw-r--r--lisp/uniquify.el4
-rw-r--r--lisp/url/url-file.el11
-rw-r--r--lisp/url/url-http.el21
-rw-r--r--lisp/url/url-privacy.el11
-rw-r--r--lisp/url/url-util.el41
-rw-r--r--lisp/url/url-vars.el3
-rw-r--r--lisp/vc/add-log.el14
-rw-r--r--lisp/vc/diff-mode.el18
-rw-r--r--lisp/vc/ediff-help.el6
-rw-r--r--lisp/vc/ediff-hook.el14
-rw-r--r--lisp/vc/ediff-init.el138
-rw-r--r--lisp/vc/ediff-mult.el36
-rw-r--r--lisp/vc/ediff-ptch.el4
-rw-r--r--lisp/vc/ediff-util.el100
-rw-r--r--lisp/vc/ediff-wind.el38
-rw-r--r--lisp/vc/ediff.el16
-rw-r--r--lisp/vc/emerge.el2
-rw-r--r--lisp/vc/pcvs-util.el8
-rw-r--r--lisp/vc/vc-annotate.el30
-rw-r--r--lisp/vc/vc-bzr.el24
-rw-r--r--lisp/vc/vc-cvs.el2
-rw-r--r--lisp/vc/vc-dir.el16
-rw-r--r--lisp/vc/vc-dispatcher.el37
-rw-r--r--lisp/vc/vc-git.el57
-rw-r--r--lisp/vc/vc-hg.el15
-rw-r--r--lisp/vc/vc-hooks.el62
-rw-r--r--lisp/vc/vc.el2
-rw-r--r--lisp/wdired.el1
-rw-r--r--lisp/whitespace.el8
-rw-r--r--lisp/wid-browse.el9
-rw-r--r--lisp/wid-edit.el8
-rw-r--r--lisp/windmove.el16
-rw-r--r--lisp/woman.el16
-rw-r--r--lisp/x-dnd.el410
-rw-r--r--lisp/xwidget.el19
-rw-r--r--lwlib/xlwmenu.c423
-rw-r--r--lwlib/xlwmenu.h4
-rw-r--r--lwlib/xlwmenuP.h18
-rw-r--r--nextstep/Makefile.in7
-rw-r--r--src/Makefile.in29
-rw-r--r--src/buffer.c63
-rw-r--r--src/buffer.h11
-rw-r--r--src/callint.c118
-rw-r--r--src/callproc.c39
-rw-r--r--src/coding.c2
-rw-r--r--src/comp.c4
-rw-r--r--src/composite.c67
-rw-r--r--src/data.c13
-rw-r--r--src/dispextern.h16
-rw-r--r--src/editfns.c100
-rw-r--r--src/eval.c71
-rw-r--r--src/fns.c58
-rw-r--r--src/frame.c6
-rw-r--r--src/fringe.c15
-rw-r--r--src/ftcrfont.c8
-rw-r--r--src/haiku_support.cc233
-rw-r--r--src/haiku_support.h2
-rw-r--r--src/haikufns.c46
-rw-r--r--src/haikumenu.c5
-rw-r--r--src/haikuselect.c51
-rw-r--r--src/haikuterm.c95
-rw-r--r--src/haikuterm.h6
-rw-r--r--src/indent.c76
-rw-r--r--src/insdel.c19
-rw-r--r--src/keyboard.c129
-rw-r--r--src/lisp.h27
-rw-r--r--src/lread.c158
-rw-r--r--src/macfont.m3
-rw-r--r--src/marker.c5
-rw-r--r--src/nsfns.m32
-rw-r--r--src/nsterm.m136
-rw-r--r--src/pdumper.c3
-rw-r--r--src/pgtkfns.c28
-rw-r--r--src/print.c352
-rw-r--r--src/process.c181
-rw-r--r--src/process.h5
-rw-r--r--src/puresize.h2
-rw-r--r--src/search.c2
-rw-r--r--src/sheap.h2
-rw-r--r--src/sysdep.c5
-rw-r--r--src/terminal.c12
-rw-r--r--src/textprop.c2
-rw-r--r--src/timefns.c140
-rw-r--r--src/w32.c23
-rw-r--r--src/w32fns.c21
-rw-r--r--src/w32proc.c17
-rw-r--r--src/window.c45
-rw-r--r--src/window.h11
-rw-r--r--src/xdisp.c692
-rw-r--r--src/xfns.c286
-rw-r--r--src/xmenu.c49
-rw-r--r--src/xselect.c36
-rw-r--r--src/xsettings.c7
-rw-r--r--src/xsettings.h2
-rw-r--r--src/xterm.c2965
-rw-r--r--src/xterm.h141
-rw-r--r--test/lisp/auth-source-resources/authinfo (renamed from test/lisp/net/netrc-resources/authinfo)0
-rw-r--r--test/lisp/auth-source-resources/netrc-folding (renamed from test/lisp/net/netrc-resources/netrc-folding)0
-rw-r--r--test/lisp/auth-source-tests.el26
-rw-r--r--test/lisp/calc/calc-tests.el4
-rw-r--r--test/lisp/calendar/icalendar-tests.el4
-rw-r--r--test/lisp/cedet/semantic-utest-c.el8
-rw-r--r--test/lisp/comint-tests.el4
-rw-r--r--test/lisp/emacs-lisp/icons-tests.el63
-rw-r--r--test/lisp/emacs-lisp/lisp-mode-tests.el23
-rw-r--r--test/lisp/emacs-lisp/package-tests.el15
-rw-r--r--test/lisp/emacs-lisp/seq-tests.el47
-rw-r--r--test/lisp/emacs-lisp/subr-x-tests.el5
-rw-r--r--test/lisp/emacs-lisp/syntax-tests.el4
-rw-r--r--test/lisp/env-tests.el40
-rw-r--r--test/lisp/erc/erc-scenarios-misc.el39
-rw-r--r--test/lisp/erc/erc-tests.el82
-rw-r--r--test/lisp/erc/resources/dcc/chat/accept-dcc.eld3
-rw-r--r--test/lisp/erc/resources/dcc/chat/accept.eld23
-rw-r--r--test/lisp/erc/resources/erc-d/erc-d-tests.el27
-rw-r--r--test/lisp/erc/resources/erc-d/erc-d.el68
-rw-r--r--test/lisp/erc/resources/erc-d/resources/foreign.eld5
-rw-r--r--test/lisp/erc/resources/erc-scenarios-common.el4
-rw-r--r--test/lisp/eshell/em-alias-tests.el28
-rw-r--r--test/lisp/eshell/em-basic-tests.el18
-rw-r--r--test/lisp/eshell/em-dirs-tests.el56
-rw-r--r--test/lisp/eshell/em-extpipe-tests.el18
-rw-r--r--test/lisp/eshell/em-pred-tests.el2
-rw-r--r--test/lisp/eshell/em-script-tests.el20
-rw-r--r--test/lisp/eshell/esh-cmd-tests.el275
-rw-r--r--test/lisp/eshell/esh-proc-tests.el48
-rw-r--r--test/lisp/eshell/esh-var-tests.el504
-rw-r--r--test/lisp/eshell/eshell-tests-helpers.el59
-rw-r--r--test/lisp/eshell/eshell-tests.el128
-rw-r--r--test/lisp/ffap-tests.el24
-rw-r--r--test/lisp/help-fns-tests.el6
-rw-r--r--test/lisp/help-tests.el4
-rw-r--r--test/lisp/ibuffer-tests.el2
-rw-r--r--test/lisp/international/ccl-tests.el36
-rw-r--r--test/lisp/international/ucs-normalize-tests.el2
-rw-r--r--test/lisp/misc-tests.el38
-rw-r--r--test/lisp/net/netrc-resources/services6
-rw-r--r--test/lisp/net/netrc-tests.el60
-rw-r--r--test/lisp/net/shr-tests.el15
-rw-r--r--test/lisp/net/tramp-archive-tests.el2
-rw-r--r--test/lisp/net/tramp-tests.el372
-rw-r--r--test/lisp/obsolete/makesum-tests.el (renamed from test/lisp/makesum-tests.el)0
-rw-r--r--test/lisp/progmodes/python-tests.el287
-rw-r--r--test/lisp/saveplace-tests.el2
-rw-r--r--test/lisp/subr-tests.el42
-rw-r--r--test/lisp/textmodes/reftex-tests.el135
-rw-r--r--test/lisp/url/url-util-tests.el20
-rw-r--r--test/lisp/whitespace-tests.el5
-rw-r--r--test/lisp/x-dnd-tests.el9
-rw-r--r--test/lisp/xml-tests.el4
-rw-r--r--test/src/buffer-tests.el20
-rw-r--r--test/src/callint-tests.el13
-rw-r--r--test/src/coding-tests.el25
-rw-r--r--test/src/data-tests.el17
-rw-r--r--test/src/fns-tests.el49
-rw-r--r--test/src/font-tests.el7
-rw-r--r--test/src/image-tests.el2
-rw-r--r--test/src/keymap-tests.el12
-rw-r--r--test/src/lread-resources/lazydoc.elbin0 -> 171 bytes
-rw-r--r--test/src/lread-tests.el17
-rw-r--r--test/src/print-tests.el14
-rw-r--r--test/src/process-tests.el176
642 files changed, 27817 insertions, 22895 deletions
diff --git a/.gitignore b/.gitignore
index 1cc5e3e4de9..b35439604fb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -329,3 +329,9 @@ lib-src/seccomp-filter-exec.pfc
# Ignore directory made by admin/make-manuals.
manual/
+
+# Ignore Finder files on MacOS.
+.DS_Store
+
+# Ignore a directory used by dap-mode.
+.vscode
diff --git a/CONTRIBUTE b/CONTRIBUTE
index d624fe85245..94d757daafe 100644
--- a/CONTRIBUTE
+++ b/CONTRIBUTE
@@ -347,7 +347,10 @@ tests:
If committing changes written by someone else, commit in their name,
not yours. You can use 'git commit --author="AUTHOR"' to specify a
-change's author. Note that the validity checks described in the
+change's author. When using Emacs VC to commit, the author can be
+specified in the log-edit buffer by adding an "Author: AUTHOR" header
+line (set 'log-edit-setup-add-author' non-nil to have this header line
+added automatically). Note that the validity checks described in the
previous section are still applied, so you will have to correct any
problems they uncover in the changes submitted by others.
diff --git a/ChangeLog.3 b/ChangeLog.3
index c48c0ab2a3f..700a210f35b 100644
--- a/ChangeLog.3
+++ b/ChangeLog.3
@@ -1,3 +1,410 @@
+2022-07-31 Eli Zaretskii <eliz@gnu.org>
+
+ * src/lisp.h (CHECK_INTEGER): Fix the predicate. (Bug#56856)
+
+2022-07-30 Eli Zaretskii <eliz@gnu.org>
+
+ Improve documentation of column-related functions
+
+ * doc/lispref/text.texi (Primitive Indent, Columns):
+ * src/indent.c (Fcurrent_indentation, Fmove_to_column): Document
+ that column counting ignores invisible text. (Bug#56837)
+
+2022-07-30 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
+
+ * src/macfont.m (macfont_open): Initialize font->space_width. (Bug#56808)
+
+2022-07-30 Eli Zaretskii <eliz@gnu.org>
+
+ Improve indexing of keymap variables
+
+ * doc/lispref/maps.texi (Standard Keymaps):
+ * doc/lispref/display.texi (Button Buffer Commands)
+ (Button Properties):
+ * doc/lispref/keymaps.texi (Translation Keymaps): Improve indexing
+ of keymaps. (Bug#56816)
+
+2022-07-29 Alan Mackenzie <acm@muc.de>
+
+ CC Mode: fontify variables/functions after line comments ending in spaces
+
+ * lisp/progmodes/cc-engine.el (c-forward-comment-minus-1): Take account of
+ spaces preceding a linefeed when scanning a putative line comment end.
+
+2022-07-28 Stefan Kangas <stefan@marxist.se>
+
+ Bump Emacs version to 28.1.91
+
+ * README:
+ * configure.ac:
+ * msdos/sed2v2.inp:
+ * nt/README.W32: Bump Emacs version to 28.1.91.
+
+2022-07-28 Stefan Kangas <stefan@marxist.se>
+
+ Update ChangeLog and AUTHORS for 28.1.91 pretest
+
+ * ChangeLog.3:
+ * etc/AUTHORS: Update.
+
+2022-07-28 Lars Ingebrigtsen <larsi@gnus.org>
+
+ Revert the `...' documentation back to actual usage
+
+ * doc/lispref/tips.texi (Documentation Tips): Document how `...'
+ is really used now (bug#55780). ‘...’ is not really used in the
+ Emacs sources.
+
+ (cherry picked from commit 1ed9c1c7f9fe32ff5123091033350beb1ccae4ca)
+
+2022-07-28 Paul Pogonyshev <pogonyshev@gmail.com>
+
+ Release the desktop lock in 'kill-emacs-hook'
+
+ * lisp/desktop.el: Run 'desktop--on-kill' in 'kill-emacs-hook'.
+ (desktop--on-kill): New function, refactored from 'desktop-kill'.
+ (desktop-kill): Call 'desktop--on-kill'. (Bug#56800)
+
+2022-07-25 Eli Zaretskii <eliz@gnu.org>
+
+ Avoid infloop in 'recenter'
+
+ * src/window.c (Frecenter): Avoid infinite loop in the minibuffer
+ under 'fido-vertical-mode'. (Bug#56765)
+
+2022-07-25 Eli Zaretskii <eliz@gnu.org>
+
+ Fix inaccuracies in "lax search" documentation
+
+ * doc/emacs/search.texi (Lax Search): Update the examples of
+ character folding in search. (Bug#56747)
+
+2022-07-24 Kyle Meyer <kyle@kyleam.com>
+
+ Update to Org 9.5.4-17-g6e991f
+
+2022-07-24 Eugene Ha <eha@posteo.de> (tiny change)
+
+ Find libgccjit.dylib on Homebrew Macos
+
+ * configure.ac: Also find libggcjit on Homebrew (bug#55173).
+
+ (cherry picked from commit faa29fa2c9e9d5a5d7544a1a39b2a89cf57a8439)
+
+2022-07-23 Michael Albinus <michael.albinus@gmx.de>
+
+ Set `default-directory' of Tramp archive connection buffer
+
+ * lisp/net/tramp-archive.el (tramp-archive-file-name-handler):
+ Set `default-directory' of Tramp connection buffer. (Bug#56628)
+
+2022-07-23 Eli Zaretskii <eliz@gnu.org>
+
+ Update the documentation of 'declare' forms
+
+ * doc/lispref/compile.texi (Native-Compilation Variables): Mention
+ the 'declare' alternative for 'native-comp-speed'.
+ * doc/lispref/functions.texi (Declare Form): Document 'declare'
+ forms that were previously undocumented.
+
+2022-07-23 Eli Zaretskii <eliz@gnu.org>
+
+ Fix bookmark support for Help functions in native-compilation builds
+
+ * lisp/help.el (describe-key--helper, describe-function--helper):
+ New helper functions.
+ (describe-key): Call 'describe-key--helper' instead of a
+ lambda-function.
+ * lisp/help-fns.el (describe-function): Call
+ 'describe-function--helper' instead of a lambda-function.
+ (Bug#56643)
+
+2022-07-23 Miha Rihtarsic <miha@kamnitnik.top>
+
+ Fix mode line mouse-1 binding when showing only column numbers
+
+ * lisp/bindings.el (mode-line-position): Fix the mouse-1 binding
+ when showing only column numbers (bug#56694). Do not merge to
+ master.
+
+2022-07-23 Stefan Kangas <stefan@marxist.se>
+
+ Adjust help-fns.el tests for recent change
+
+ * test/lisp/help-fns-tests.el (help-fns-test-lisp-defun)
+ (help-fns-test-lisp-defsubst): Adjust tests for recent change.
+
+2022-07-22 Robert Pluim <rpluim@gmail.com>
+
+ * src/terminal.c (Fframe_terminal): Use active voice
+
+2022-07-22 Robert Pluim <rpluim@gmail.com>
+
+ Improve 'terminal-live-p' docstring some more
+
+ * src/terminal.c (Fterminal_live_p): Improve description of
+ arguments and return value.
+
+2022-07-22 Robert Pluim <rpluim@gmail.com>
+
+ Improve terminal-live-p docstring
+
+ * src/terminal.c (Fterminal_live_p): Explain what happens when the
+ argument is nil.
+
+2022-07-22 Robert Pluim <rpluim@gmail.com>
+
+ * lisp/net/tramp-gvfs.el (tramp-gvfs-dbus-event-vector): Fix grammar
+
+2022-07-21 Stefan Kangas <stefan@marxist.se>
+
+ * lisp/progmodes/cperl-mode.el: Don't mention obsolete archive.
+
+2022-07-21 Eli Zaretskii <eliz@gnu.org>
+
+ Make 'describe-function' say "byte-compiled" when appropriate
+
+ * lisp/help-fns.el (help-fns-function-description-header): Say
+ "byte-compiled" when describing byte-compiled functions.
+
+2022-07-21 Eli Zaretskii <eliz@gnu.org>
+
+ ;Improve documentation of locale-specific string comparison
+
+ * doc/lispref/strings.texi (Text Comparison): Mention the Unicode
+ collation rules and buffer-local case-tables.
+
+2022-07-19 Gerd Moellmann <gerd.moellmann@gmail.com>
+
+ Prevent GC of window referenced from EmacsScroller
+
+ * src/nsterm.m (EmacsScroller.mark, mark_nsterm): New functions.
+ * src/nsterm.h (EmacsScroller.mark, mark_nsterm): Declare.
+ * src/alloc.c (garbage_collect) [MAVE_NS]: Call mark_nsterm.
+ (Bug#56095)
+
+ (cherry picked from commit 5f1bd872478927ad4bc635502e74628d39885286)
+
+2022-07-16 Stefan Kangas <stefan@marxist.se>
+
+ Fix obsoletion of nntp-authinfo-file
+
+ * lisp/gnus/nntp.el (nntp-authinfo-file): Fix obsoletion.
+
+2022-07-15 Philipp Stephani <phst@google.com>
+
+ Build Seccomp filter only if we have a 64-bit userspace (Bug#56549)
+
+ * configure.ac (SIZEOF_LONG): New variable.
+ * lib-src/Makefile.in (SIZEOF_LONG): New variable; added conditional.
+
+2022-07-14 Stefan Kangas <stefan@marxist.se>
+
+ Update the Samaritan's contact details in M-x doctor
+
+ * lisp/play/doctor.el (doctor-death): Update the Samaritans's contact
+ details; anon.twwells.com is no longer valid. Add link to Wikipedia.
+
+2022-07-14 Eli Zaretskii <eliz@gnu.org>
+
+ * etc/PROBLEMS: Describe problems with remote files. (Bug#56499)
+
+2022-07-13 Andrea Corallo <akrl@sdf.org>
+
+ Remove uneffective test
+
+ * test/src/comp-tests.el (45603-1): Remove test.
+ * test/src/comp-resources/comp-test-45603.el: Delete.
+
+2022-07-13 Andrea Corallo <akrl@sdf.org>
+
+ Mark async worker tmp file as utf-8-emacs-unix (bug#48029)
+
+ * lisp/emacs-lisp/comp.el (comp-final): Mark async worker tmp file
+ as utf-8.
+ * test/src/comp-tests.el (48029-1): New test.
+ * test/src/comp-resources/comp-test-funcs.el
+ (comp-test-48029-nonascii-žžž-f): New function.
+
+2022-07-13 Michael Albinus <michael.albinus@gmx.de>
+
+ Adapt Tramp version (don't merge)
+
+ * doc/misc/trampver.texi:
+ * lisp/net/trampver.el: Change version to "2.5.3.28.2".
+ (customize-package-emacs-version-alist):
+ Add Tramp version integrated in Emacs 28.2.
+
+2022-07-13 Michael Albinus <michael.albinus@gmx.de>
+
+ Adapt Tramp doc
+
+ * doc/misc/tramp.texi (Configuration): Mention enable-remote-dir-locals.
+ (Traces and Profiles): Fix tramp-verbose description.
+
+ * lisp/net/tramp.el (tramp-verbose): Fix docstring.
+
+2022-07-12 Stefan Kangas <stefan@marxist.se>
+
+ Don't mention cl-cXXXr aliases in cl-lib manual
+
+ * doc/misc/cl.texi (Lists, List Functions, Efficiency Concerns): Don't
+ mention 'cl-cXXXr' compatibility aliases for built-in 'cXXXr'
+ functions. They shouldn't be used in new code.
+
+2022-07-11 Ken Brown <kbrown@cornell.edu>
+
+ etc/PROBLEMS: Describe issues with native compilation on Cygwin
+
+2022-07-11 Stefan Kangas <stefan@marxist.se>
+
+ * lisp/find-dired.el (find-dired): Doc fix; add crossreference.
+
+2022-07-08 Stefan Kangas <stefan@marxist.se>
+
+ Doc fix; don't mention obsolete variable
+
+ * src/window.c (Fset_window_hscroll): Doc fix; don't mention obsolete
+ variable.
+
+2022-07-05 Stefan Kangas <stefan@marxist.se>
+
+ Add index entry for "ignore case"
+
+ * doc/emacs/glossary.texi (Glossary): Add index entry for "ignore
+ case" pointing to "Case Folding".
+
+2022-07-05 Stefan Kangas <stefan@marxist.se>
+
+ Expand docstrings related to auto-saving
+
+ * lisp/files.el (auto-save-visited-mode):
+ * lisp/simple.el (auto-save-mode): Expand docstring.
+
+2022-07-04 Lars Ingebrigtsen <larsi@gnus.org>
+
+ Don't bug out in manual-html-fix-index-2 on newer makeinfo versions
+
+ Backport from master.
+
+ * admin/admin.el (manual-html-fix-index-2): Don't bug out if the
+ makeinfo version doesn't include <ul>.
+
+ (cherry picked from commit e0e3f2b672bc42da52ac9c7596c7560a88684651)
+
+2022-07-04 Lars Ingebrigtsen <larsi@gnus.org>
+
+ Preserve <title> in the Emacs manuals
+
+ Backport from master.
+
+ * admin/admin.el (manual-html-fix-headers): Preserve the <title>
+ element (bug#48334).
+
+ (cherry picked from commit b778e71af7ca8c59917334b4bb1b34cdb52faca9)
+
+2022-07-03 Eli Zaretskii <eliz@gnu.org>
+
+ Document 'jit-lock-debug-mode'
+
+ * doc/lispref/modes.texi (Other Font Lock Variables): Document
+ 'jit-lock-debug-mode'.
+
+2022-07-02 Alan Mackenzie <acm@muc.de>
+
+ * lisp/progmodes/cc-mode.el (c-common-init): Bind case-fold-search to nil
+
+ Backport: This fixes bug #53605.
+
+2022-07-02 Alan Mackenzie <acm@muc.de>
+
+ CC Mode: Fix a c-backward-token-2 call wrongly jumping back over macros.
+
+ This fixes bug #56256.
+
+ * lisp/progmodes/cc-fonts.el (c-font-lock-c++-lambda-captures): Replace a
+ c-backward-token-2, which could jump back too far leading to an infinite
+ loop, with a save-excursion to remember the point we've got to go back to.
+
+2022-07-02 Stefan Kangas <stefan@marxist.se>
+
+ Doc fixes; don't use obsolete names
+
+ * etc/compilation.txt:
+ * lisp/mh-e/mh-funcs.el (mh-kill-folder): Don't use obsolete
+ names.
+
+2022-07-02 Stefan Kangas <stefan@marxist.se>
+
+ Don't refer to obsolete alias for insert-char
+
+ * lisp/leim/quail/persian.el: Don't refer to obsolete alias for
+ insert-char.
+
+2022-07-02 Stefan Kangas <stefan@marxist.se>
+
+ Don't use obsolete face name in manoj-dark-theme
+
+ * etc/themes/manoj-dark-theme.el (change-log-acknowledgment): Don't
+ use obsolete/non-existent face name.
+
+2022-07-01 Eli Zaretskii <eliz@gnu.org>
+
+ Fix "C-u C-x =" for SPC
+
+ * lisp/descr-text.el (describe-char): Don't report 'nobreak-space'
+ face for SPC. (Bug#56337)
+
+2022-06-30 Stefan Kangas <stefan@marxist.se>
+
+ Doc fixes: don't refer to some obsolete items
+
+ * admin/notes/multi-tty:
+ * lisp/chistory.el (command-history):
+ * lisp/emacs-lisp/nadvice.el:
+ * lisp/vc/diff-mode.el: Doc fix; don't refer to obsolete variables and
+ functions.
+
+2022-06-30 Stefan Kangas <stefan@marxist.se>
+
+ Remove obsolete cust-print from elisp index
+
+ * doc/lispref/edebug.texi (Printing in Edebug): Remove obsolete
+ library "cust-print" from index.
+
+2022-06-30 Stefan Kangas <stefan@marxist.se>
+
+ * admin/make-tarball.txt: Minor clarifications.
+
+2022-06-30 Eli Zaretskii <eliz@gnu.org>
+
+ Fix external image conversion on MS-Windows
+
+ * lisp/image/image-converter.el (image-converter--convert-magick)
+ (image-converter--convert): Force encoding/decoding to avoid any
+ text or EOL conversions, since we are reading/writing binary
+ data. (Bug#56317)
+
+2022-06-29 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * doc/emacs/buffers.texi (Indirect Buffers): Mention modification hook quirk
+
+2022-06-29 Stefan Kangas <stefan@marxist.se>
+
+ Bump Emacs version to 28.1.90
+
+ * README:
+ * configure.ac:
+ * msdos/sed2v2.inp:
+ * nt/README.W32: Bump Emacs version to 28.1.90.
+
+2022-06-29 Stefan Kangas <stefan@marxist.se>
+
+ Update ChangeLog and AUTHORS for 28.1.90 pretest
+
+ * ChangeLog.3:
+ * etc/AUTHORS: Update.
+
2022-06-29 Michael Albinus <michael.albinus@gmx.de>
Update Tramp version (don't merge with master)
@@ -332,7 +739,7 @@
This fixes bug#55684. There, with a minibuffer-only frame at start up,
Emacs tried to switch to this frame, whose selected window was the
mini-window. There is no other active window in this frame, so the
- attempt to swith to another window failed.
+ attempt to switch to another window failed.
* src/frame.c (do_switch_frame): On switching to a frame whose selected
window is as above, before selecting the most recently used window, check
@@ -77358,7 +77765,7 @@
still don't work).
(tramp-crypt-handle-access-file): New defun.
(tramp-crypt-do-copy-or-rename-file): Short track if both files
- are on a crypted remote dir.
+ are on an encrypted remote dir.
* lisp/net/tramp.el (file-notify-rm-watch): Declare.
(tramp-inhibit-progress-reporter): New defvar.
@@ -217680,8 +218087,7 @@
Stick with debbugs-supported tags in triage
* admin/notes/bug-triage: Stick to the tag "unreproducible", which
- debbugs supports, rather than suggesting "doneunreproducible" or
- "unreproducable".
+ debbugs supports.
2016-09-26 Paul Eggert <eggert@cs.ucla.edu>
@@ -236201,7 +236607,7 @@
This file records repository revisions from
commit 9d56a21e6a696ad19ac65c4b405aeca44785884a (exclusive) to
-commit 7f749e44dbd50430e14f319b4c4d3f767740b10b (inclusive).
+commit 78759ddcb0fc7dd75a7a8edfb2c19dc2f1d86ee2 (inclusive).
See ChangeLog.2 for earlier changes.
;; Local Variables:
diff --git a/Makefile.in b/Makefile.in
index 4b749636656..bf0f52b514e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -455,18 +455,11 @@ lisp: src
lib lib-src lisp nt: Makefile
$(MAKE) -C $@ all
-# Ideally, VCSWITNESS should be a file that is modified whenever the
-# repository registers a commit from either a local checkin or a
-# repository pull. In git there is no single file that guarantees
-# this, but the local log for the current head should be close enough.
-#
# Pass an unexpanded $srcdir to src's Makefile, which then
# expands it using its own value of srcdir (which points to the
# source directory of src/).
-dirstate = .git/logs/HEAD
-VCSWITNESS = $(if $(wildcard $(srcdir)/$(dirstate)),$$(srcdir)/../$(dirstate))
src: Makefile
- $(MAKE) -C $@ VCSWITNESS='$(VCSWITNESS)' BIN_DESTDIR='$(BIN_DESTDIR)' \
+ $(MAKE) -C $@ BIN_DESTDIR='$(BIN_DESTDIR)' \
ELN_DESTDIR='$(ELN_DESTDIR)' all
blessmail: Makefile src
diff --git a/admin/MAINTAINERS b/admin/MAINTAINERS
index f0239db0089..6e080d1f5bb 100644
--- a/admin/MAINTAINERS
+++ b/admin/MAINTAINERS
@@ -137,6 +137,7 @@ Andrea Corallo
Stefan Kangas
admin/automerge
+ admin/update_autogen
Po Lu
The Haiku port:
diff --git a/admin/authors.el b/admin/authors.el
index 8a62520d6c5..12fe25fa4e1 100644
--- a/admin/authors.el
+++ b/admin/authors.el
@@ -163,6 +163,7 @@ files.")
("Michael R. Cook" "Michael Cook")
("Michael Sperber" "Mike Sperber" "Michael Sperber \\[Mr. Preprocessor\\]")
("Michalis V" "^mvar")
+ ("Miha Rihtaršič" "Miha Rihtarsic")
("Mikio Nakajima" "Nakajima Mikio")
("Nelson Jose dos Santos Ferreira" "Nelson Ferreira")
("Noorul Islam" "Noorul Islam K M")
@@ -1882,7 +1883,7 @@ list of their contributions.\n")
(insert "\n "))
(insert " " file))
(insert "\n")))))
- (insert "\nLocal" " Variables:\nmode: etc-authors\ncoding: "
+ (insert "\nLocal" " Variables:\nmode: emacs-authors\ncoding: "
(symbol-name authors-coding-system) "\nEnd:\n")
(message "Generating buffer %s... done" buffer-name)
(unless noninteractive
diff --git a/admin/automerge b/admin/automerge
index 415d717a991..99191867367 100755
--- a/admin/automerge
+++ b/admin/automerge
@@ -4,7 +4,7 @@
## Copyright (C) 2018-2022 Free Software Foundation, Inc.
## Author: Glenn Morris <rgm@gnu.org>
-## Maintainer: Stefan Kangas <stefan@marxist.se>
+## Maintainer: Stefan Kangas <stefankangas@gmail.com>
## This file is part of GNU Emacs.
diff --git a/admin/check-doc-strings b/admin/check-doc-strings
index 135090b34ce..b119b50885b 100755
--- a/admin/check-doc-strings
+++ b/admin/check-doc-strings
@@ -290,13 +290,7 @@ while (my $file = <FIND>) {
}
}
-my @pkgs;
-if (-d "../xemacs-packages") {
- @pkgs = qw (libs/edebug libs/xemacs-base comm/eudc oa/edit-utils);
-} else {
- @pkgs = ();
-}
-for (@pkgs) { s@^@../xemacs-packages/@; }
+my @pkgs = ();
open (FIND, "find lisp @pkgs -name '*.el' -print |") or die;
while (my $file = <FIND>) {
my $contents = FileContents $file;
diff --git a/admin/coccinelle/window.cocci b/admin/coccinelle/window.cocci
index 1448febfcc1..4543fb2ce15 100644
--- a/admin/coccinelle/window.cocci
+++ b/admin/coccinelle/window.cocci
@@ -106,9 +106,6 @@ Lisp_Object O;
- W->column_number_displayed
+ WVAR (W, column_number_displayed)
|
-- W->redisplay_end_trigger
-+ WVAR (W, redisplay_end_trigger)
-|
- W->combination_limit
+ WVAR (W, combination_limit)
|
@@ -225,9 +222,6 @@ Lisp_Object O;
- XWINDOW (O)->column_number_displayed
+ WVAR (XWINDOW (O), column_number_displayed)
|
-- XWINDOW (O)->redisplay_end_trigger
-+ WVAR (XWINDOW (O), redisplay_end_trigger)
-|
- XWINDOW (O)->combination_limit
+ WVAR (XWINDOW (O), combination_limit)
|
diff --git a/admin/emake b/admin/emake
index 6c778c85d41..548611c6afc 100755
--- a/admin/emake
+++ b/admin/emake
@@ -29,6 +29,7 @@ s#^Running # Running #
s#^Configured for # Configured for #
s#^./temacs.*# \\& #
s#^make.*Error# \\& #
+s#^Dumping under the name# \\& #
' | \
grep -E --line-buffered -v "^make|\
^Loading|\
@@ -36,13 +37,13 @@ SCRAPE|\
INFO.*Scraping.*[.] ?\$|\
INFO.*Scraping.*done\$|\
GEN.*etc/DOC|\
+GEN.*autoloads|\
^Waiting for git|\
^Finding pointers|\
^Using load-path|\
^Adding name|\
^Dump mode|\
^Dumping finger|\
-^Dumping under the name|\
^Byte counts|\
^Reloc counts|\
^Pure-hashed|\
diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt
index 6990f27bfa0..a60fead2678 100644
--- a/admin/make-tarball.txt
+++ b/admin/make-tarball.txt
@@ -183,9 +183,10 @@ General steps (for each step, check for possible errors):
yourself, find it at <https://alpha.gnu.org/gnu/emacs/pretest>.
Releases are of course at <https://ftp.gnu.org/pub/gnu/emacs/>.
- ./admin/diff-tar-files emacs-OLD.tar.gz emacs-NEW.tar.gz
+ ./admin/diff-tar-files emacs-OLD.tar emacs-NEW.tar
- Alternatively:
+ Alternatively, if you want to use the compressed tarballs (which
+ diff-tar-files doesn't understand):
tar tJf emacs-OLD.tar.xz | sed -e 's,^[^/]*,,' | sort > old_tmp
tar tJf emacs-NEW.tar.xz | sed -e 's,^[^/]*,,' | sort > new_tmp
@@ -203,7 +204,7 @@ General steps (for each step, check for possible errors):
The output of this command might be easier to compare to the
tarball than the one you get from find.
-7. tar -xf emacs-NEW.tar; cd emacs-NEW
+7. tar xf emacs-NEW.tar; cd emacs-NEW
./configure --prefix=/tmp/emacs && make check && make install
Use 'script' or M-x compile to save the compilation log in
@@ -288,7 +289,7 @@ General steps (for each step, check for possible errors):
https://ftp.gnu.org/gnu/emacs/ for a release.
Download them and check the signatures and SHA1/SHA256 checksums.
- Check they build.
+ Check they build (./configure --with-native-compilation).
11. Send an announcement to: emacs-devel, and bcc: info-gnu-emacs@gnu.org.
For a pretest, also bcc: platform-testers@gnu.org.
@@ -309,8 +310,8 @@ General steps (for each step, check for possible errors):
sha1sum emacs-NEW.tar.xz
sha256sum emacs-NEW.tar.xz
- You can optionally sign the announcement email, probably using the
- same PGP key that you used for signing the tarball.
+ You can optionally sign the announcement email, preferably using
+ the same PGP key that you used for signing the tarball.
(Use e.g. `M-x mml-secure-message-sign' in `message-mode' to sign
an email.)
diff --git a/admin/unidata/unidata-gen.el b/admin/unidata/unidata-gen.el
index 0a9fd5108ce..78dd1c37288 100644
--- a/admin/unidata/unidata-gen.el
+++ b/admin/unidata/unidata-gen.el
@@ -1083,8 +1083,8 @@ Property value is a symbol `o' (Open), `c' (Close), or `n' (None)."
(defun unidata--ensure-compiled (&rest funcs)
(dolist (fun funcs)
- (or (byte-code-function-p (symbol-function fun))
- (byte-compile fun))))
+ (unless (compiled-function-p (symbol-function fun))
+ (byte-compile fun))))
(defun unidata-gen-table-name (prop index &rest _ignore)
(let* ((table (unidata-gen-table-word-list prop index 'unidata-split-name))
diff --git a/admin/update_autogen b/admin/update_autogen
index bfbf9d15c24..24513671712 100755
--- a/admin/update_autogen
+++ b/admin/update_autogen
@@ -4,7 +4,7 @@
## Copyright (C) 2011-2022 Free Software Foundation, Inc.
## Author: Glenn Morris <rgm@gnu.org>
-## Maintainer: emacs-devel@gnu.org
+## Maintainer: Stefan Kangas <stefankangas@gmail.com>
## This file is part of GNU Emacs.
@@ -81,7 +81,6 @@ ldefs_flag=1
lboot_flag=
## Parameters.
-ldefs_in=lisp/loaddefs.el
ldefs_out=lisp/ldefs-boot.el
sources="configure.ac lib/Makefile.am"
## Files to copy into autogendir.
@@ -177,8 +176,6 @@ modified=$(status ${autogendir:+$sources} ${ldefs_flag:+lisp}) || die
echo "Running 'make maintainer-clean'..."
make maintainer-clean #|| die "Cleaning error"
-
- rm -f $ldefs_in
}
@@ -289,18 +286,13 @@ make -C src "$@" bootstrap-emacs || die "make src error"
echo "Running lisp/ make..."
-make -C lisp "$@" autoloads EMACS=../src/bootstrap-emacs || die "make src error"
-
+make -C lisp "$@" ldefs-boot.el EMACS=../src/bootstrap-emacs || die "make src error"
-## Ignore comment differences.
-[ ! "$lboot_flag" ] || \
- diff -q -I '^;' $ldefs_in $ldefs_out || \
- cp $ldefs_in $ldefs_out || die "cp ldefs_boot error"
# Refresh the prebuilt grammar-wy.el
grammar_in=lisp/cedet/semantic/grammar-wy.el
grammar_out=lisp/cedet/semantic/grm-wy-boot.el
-make -C admin/grammars/ ../../$grammar_in
+make -C admin/grammars/ ../../$grammar_in EMACS=../../src/bootstrap-emacs
cp $grammar_in $grammar_out || die "cp grm_wy_boot error"
diff --git a/configure.ac b/configure.ac
index 45b62647e71..1a264275bd4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4675,6 +4675,10 @@ if test "${HAVE_X11}" = "yes"; then
AC_DEFINE([HAVE_XSYNC], [1],
[Define to 1 if the X Synchronization Extension is available.])
XSYNC_LIBS="-lXext"
+ OLDLIBS="$LIBS"
+ LIBS="-lXext $LIBS" # Set this temporarily for AC_CHECK_FUNC
+ AC_CHECK_FUNCS([XSyncTriggerFence]) # Check for version 3.1
+ LIBS="$OLDLIBS"
fi
fi
AC_SUBST([XSYNC_LIBS])
@@ -4901,6 +4905,10 @@ AC_SUBST([HAVE_LIBSECCOMP])
AC_SUBST([LIBSECCOMP_LIBS])
AC_SUBST([LIBSECCOMP_CFLAGS])
+AC_CHECK_SIZEOF([long])
+SIZEOF_LONG="$ac_cv_sizeof_long"
+AC_SUBST([SIZEOF_LONG])
+
OLD_LIBS=$LIBS
LIBS="$LIB_PTHREAD $LIB_MATH $LIBS"
AC_CHECK_FUNCS([accept4 fchdir gethostname \
diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index 46a2291b74d..efaf0dfd382 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -511,6 +511,9 @@ Set up a customization buffer for just one user option, @var{option}.
@item M-x customize-face @key{RET} @var{face} @key{RET}
Set up a customization buffer for just one face, @var{face}.
+@item M-x customize-icon @key{RET} @var{face} @key{RET}
+Set up a customization buffer for just one icon, @var{icon}.
+
@item M-x customize-group @key{RET} @var{group} @key{RET}
Set up a customization buffer for just one group, @var{group}.
@@ -2449,6 +2452,9 @@ keys which send non-@acronym{ASCII} characters.
Write a single-quote (@code{'}) followed by the Lisp object you want.
@end table
+ For more information on the Emacs Lisp syntax, @pxref{Introduction,,,
+elisp, The Emacs Lisp Reference Manual}.
+
@node Init Examples
@subsection Init File Examples
diff --git a/doc/emacs/display.texi b/doc/emacs/display.texi
index 96e05a902d6..b7c8825efa2 100644
--- a/doc/emacs/display.texi
+++ b/doc/emacs/display.texi
@@ -24,6 +24,7 @@ the text is displayed.
* Faces:: How to change the display style using faces.
* Colors:: Specifying colors for faces.
* Standard Faces:: The main predefined faces.
+* Icons:: How to change how icons look.
* Text Scale:: Increasing or decreasing text size in a buffer.
* Font Lock:: Minor mode for syntactic highlighting using faces.
* Highlight Interactively:: Tell Emacs what text to highlight.
@@ -851,6 +852,39 @@ This face is used to display on text-mode terminals the menu item that
would be selected if you click a mouse or press @key{RET}.
@end table
+@node Icons
+@section Icons
+@cindex icons, on clickable buttons
+
+Emacs sometimes displays clickable buttons (or other informative
+icons), and you can customize how these look on display.
+
+@vindex icon-preference
+The main customization point here is the @code{icon-preference} user
+option. By using this, you can tell Emacs your overall preferences
+for icons. This is a list of icon types, and the first icon type
+that's supported will be used. The supported types are:
+
+@table @code
+@item image
+Use an image for the icon.
+
+@item emoji
+Use a colorful emoji for the icon.
+
+@item symbol
+Use a monochrome symbol for the icon.
+
+@item text
+Use a simple text for the icon.
+@end table
+
+In addition, each individual icon can be customized with @kbd{M-x
+customize-icon}, and themes can further alter the looks of the icons.
+
+To get a quick description of an icon, use the @kbd{M-x describe-icon}
+command.
+
@node Text Scale
@section Text Scale
diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi
index 5e72699bbe8..b43c966f872 100644
--- a/doc/emacs/emacs.texi
+++ b/doc/emacs/emacs.texi
@@ -1190,7 +1190,6 @@ Dealing with Emacs Trouble
* Crashing:: What Emacs does when it crashes.
* After a Crash:: Recovering editing in an Emacs session that crashed.
* Emergency Escape:: What to do if Emacs stops responding.
-* Long Lines:: Mitigating slowness due to extremely long lines.
* DEL Does Not Delete:: What to do if @key{DEL} doesn't delete.
Reporting Bugs
diff --git a/doc/emacs/glossary.texi b/doc/emacs/glossary.texi
index 5224e313407..9a537019974 100644
--- a/doc/emacs/glossary.texi
+++ b/doc/emacs/glossary.texi
@@ -1457,8 +1457,8 @@ level by aborting (q.v.@:) and quitting (q.v.). @xref{Quitting}.
@item Transient Mark Mode
The default behavior of the mark (q.v.@:) and region (q.v.), in which
setting the mark activates it and highlights the region, is called
-Transient Mark mode. In GNU Emacs 23 and onwards, it is enabled by
-default. @xref{Disabled Transient Mark}.
+Transient Mark mode. It is enabled by default. @xref{Disabled
+Transient Mark}.
@item Transposition
Transposing two units of text means putting each one into the place
diff --git a/doc/emacs/mini.texi b/doc/emacs/mini.texi
index 4e71793b66e..e71d653210a 100644
--- a/doc/emacs/mini.texi
+++ b/doc/emacs/mini.texi
@@ -734,11 +734,14 @@ highlighting. This feature uses the special text property
@section Minibuffer History
@cindex minibuffer history
@cindex history of minibuffer input
-
- Every argument that you enter with the minibuffer is saved in a
-@dfn{minibuffer history list} so you can easily use it again later.
-You can use the following arguments to quickly fetch an earlier
-argument into the minibuffer:
+@cindex completion, walking through candidates
+
+ Everything you type in the minibuffer is saved in a @dfn{minibuffer
+history list} so you can easily use it again later. This includes
+completion candidates (such as file names, buffer names, command
+names, etc.@:) and any other kind of minibuffer input. You can use
+the following commands to quickly fetch an earlier or alternative
+response into the minibuffer:
@table @kbd
@item M-p
diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi
index 841a285520a..da1b87b48bd 100644
--- a/doc/emacs/misc.texi
+++ b/doc/emacs/misc.texi
@@ -1,6 +1,5 @@
@c This is part of the Emacs manual.
-@c Copyright (C) 1985--1987, 1993--1995, 1997, 2000--2022 Free Software
-@c Foundation, Inc.
+@c Copyright (C) 1985--2022 Free Software Foundation, Inc.
@c See file emacs.texi for copying conditions.
@iftex
@chapter Miscellaneous Commands
@@ -2870,99 +2869,6 @@ new major mode which provides a command to switch back. These
approaches give you more flexibility to go back to unfinished tasks in
the order you choose.
-@ignore
-@c Apart from edt and viper, this is all obsolete.
-@c (Can't believe we were saying "most other editors" into 2014!)
-@c There seems no point having a node just for those, which both have
-@c their own manuals.
-@node Emulation
-@section Emulation
-@cindex emulating other editors
-@cindex other editors
-@cindex EDT
-@cindex vi
-@cindex WordStar
-
- GNU Emacs can be programmed to emulate (more or less) most other
-editors. Standard facilities can emulate these:
-
-@table @asis
-@item CRiSP/Brief (PC editor)
-@findex crisp-mode
-@vindex crisp-override-meta-x
-@findex scroll-all-mode
-@cindex CRiSP mode
-@cindex Brief emulation
-@cindex emulation of Brief
-@cindex mode, CRiSP
-@kbd{M-x crisp-mode} enables key bindings to emulate the CRiSP/Brief
-editor. Note that this rebinds @kbd{M-x} to exit Emacs unless you set
-the variable @code{crisp-override-meta-x}. You can also use the
-command @kbd{M-x scroll-all-mode} or set the variable
-@code{crisp-load-scroll-all} to emulate CRiSP's scroll-all feature
-(scrolling all windows together).
-
-@item EDT (DEC VMS editor)
-@findex edt-emulation-on
-@findex edt-emulation-off
-Turn on EDT emulation with @kbd{M-x edt-emulation-on}; restore normal
-command bindings with @kbd{M-x edt-emulation-off}.
-
-Most of the EDT emulation commands are keypad keys, and most standard
-Emacs key bindings are still available. The EDT emulation rebindings
-are done in the global keymap, so there is no problem switching
-buffers or major modes while in EDT emulation.
-
-@item TPU (DEC VMS editor)
-@findex tpu-edt-on
-@cindex TPU
-@kbd{M-x tpu-edt-on} turns on emulation of the TPU editor emulating EDT.
-
-@item vi (Berkeley editor)
-@findex viper-mode
-Viper is an emulator for vi. It implements several levels of
-emulation; level 1 is closest to vi itself, while level 5 departs
-somewhat from strict emulation to take advantage of the capabilities of
-Emacs. To invoke Viper, type @kbd{M-x viper-mode}; it will guide you
-the rest of the way and ask for the emulation level. @inforef{Top,
-Viper, viper}.
-
-@item vi (another emulator)
-@findex vi-mode
-@kbd{M-x vi-mode} enters a major mode that replaces the previously
-established major mode. All of the vi commands that, in real vi, enter
-input mode are programmed instead to return to the previous major
-mode. Thus, ordinary Emacs serves as vi's input mode.
-
-Because vi emulation works through major modes, it does not work
-to switch buffers during emulation. Return to normal Emacs first.
-
-If you plan to use vi emulation much, you probably want to bind a key
-to the @code{vi-mode} command.
-
-@item vi (alternate emulator)
-@findex vip-mode
-@kbd{M-x vip-mode} invokes another vi emulator, said to resemble real vi
-more thoroughly than @kbd{M-x vi-mode}. Input mode in this emulator
-is changed from ordinary Emacs so you can use @key{ESC} to go back to
-emulated vi command mode. To get from emulated vi command mode back to
-ordinary Emacs, type @kbd{C-z}.
-
-This emulation does not work through major modes, and it is possible
-to switch buffers in various ways within the emulator. It is not
-so necessary to assign a key to the command @code{vip-mode} as
-it is with @code{vi-mode} because terminating insert mode does
-not use it.
-
-@inforef{Top, VIP, vip}, for full information.
-
-@item WordStar (old wordprocessor)
-@findex wordstar-mode
-@kbd{M-x wordstar-mode} provides a major mode with WordStar-like
-key bindings.
-@end table
-@end ignore
-
@node Hyperlinking
@section Hyperlinking and Web Navigation Features
diff --git a/doc/emacs/msdos.texi b/doc/emacs/msdos.texi
index e30d623a77c..dd0787cd38d 100644
--- a/doc/emacs/msdos.texi
+++ b/doc/emacs/msdos.texi
@@ -986,9 +986,9 @@ printer, put this in your @file{.emacs} file:
@section Specifying Fonts on MS-Windows
@cindex font specification (MS Windows)
- Starting with Emacs 23, fonts are specified by their name, size
-and optional properties. The format for specifying fonts comes from the
-fontconfig library used in modern Free desktops:
+ Fonts are specified by their name, size and optional properties.
+The format for specifying fonts comes from the fontconfig library used
+in modern Free desktops:
@example
[Family[-PointSize]][:Option1=Value1[:Option2=Value2[...]]]
diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
index f4e12d29e99..582e764c55f 100644
--- a/doc/emacs/search.texi
+++ b/doc/emacs/search.texi
@@ -228,8 +228,9 @@ customizing the @code{isearch-wrap-pause} user option. If it is
@code{t} (the default), signal an error. (Repeating the search will
wrap around.) If @code{no}, issue a @code{ding} and wrap immediately
after reaching the last match. If @code{no-ding}, wrap immediately,
-but don't @code{ding}. Finally, if @code{nil}, never wrap, but just
-stop at the last match.
+but don't @code{ding}. With the values @code{no} and @code{no-ding}
+the search will try to wrap around also on typing a character.
+Finally, if @code{nil}, never wrap, but just stop at the last match.
@cindex search ring
@findex isearch-ring-advance
@@ -1428,16 +1429,18 @@ of its accented cousins like @code{@"a} and @code{@'a}, i.e., the
match disregards the diacritics that distinguish these
variants. In addition, @code{a} matches other characters that
resemble it, or have it as part of their graphical representation,
-such as U+249C @sc{parenthesized latin small letter a} and U+2100
-@sc{account of} (which looks like a small @code{a} over @code{c}).
+such as U+00AA @sc{feminine ordinal indicator} and U+24D0
+@sc{circled latin small letter a} (which looks like a small @code{a}
+inside a circle).
Similarly, the @acronym{ASCII} double-quote character @code{"} matches
all the other variants of double quotes defined by the Unicode
standard. Finally, character folding can make a sequence of one or
more characters match another sequence of a different length: for
example, the sequence of two characters @code{ff} matches U+FB00
-@sc{latin small ligature ff}. Character sequences that are not identical,
-but match under character folding are known as @dfn{equivalent
-character sequences}.
+@sc{latin small ligature ff} and the sequence @code{(a)} matches
+U+249C @sc{parenthesized latin small letter a}. Character sequences
+that are not identical, but match under character folding are known as
+@dfn{equivalent character sequences}.
@kindex M-s ' @r{(Incremental Search)}
@findex isearch-toggle-char-fold
diff --git a/doc/emacs/trouble.texi b/doc/emacs/trouble.texi
index f06b93759d8..887e5c6170f 100644
--- a/doc/emacs/trouble.texi
+++ b/doc/emacs/trouble.texi
@@ -158,7 +158,6 @@ Emacs.
* Crashing:: What Emacs does when it crashes.
* After a Crash:: Recovering editing in an Emacs session that crashed.
* Emergency Escape:: What to do if Emacs stops responding.
-* Long Lines:: Mitigating slowness due to extremely long lines.
* DEL Does Not Delete:: What to do if @key{DEL} doesn't delete.
@end menu
@@ -433,64 +432,6 @@ program.
emergency escape---but there are cases where it won't work, when a
system call hangs or when Emacs is stuck in a tight loop in C code.
-@node Long Lines
-@subsection Long Lines
-@cindex long lines
-
- For a variety of reasons (some of which are fundamental to the Emacs
-redisplay code and the complex range of possibilities it handles;
-others of which are due to modes and features which do not scale well
-in unusual circumstances), Emacs can perform poorly when extremely
-long lines are present (where ``extremely long'' usually means at
-least many thousands of characters).
-
-@cindex @code{so-long} mode
-@findex global-so-long-mode
-@vindex so-long-action
- A particular problem is that Emacs may ``hang'' for a long time at
-the point of visiting a file with extremely long lines. This can be
-mitigated by enabling the @file{so-long} library, which detects when a
-visited file contains abnormally long lines, and takes steps to
-disable features which are liable to cause slowness in that situation.
-To enable this library, type @kbd{M-x global-so-long-mode @key{RET}},
-or turn on the @code{global-so-long-mode} in your init file
-(@pxref{Init File}), or customize the @code{global-so-long-mode}
-option. You can tailor this mode's operation by customizing the
-variable @code{so-long-action}.
-
- The @file{so-long} library can also significantly improve
-performance when moving and editing in a buffer with long lines.
-Performance is still likely to degrade as you get deeper into the long
-lines, but the improvements from using this library can nevertheless
-be substantial.
-
-@findex so-long-commentary
- Use @kbd{M-x so-long-commentary} to view the documentation for this
-library and learn more about how to enable and configure it.
-
-@vindex max-redisplay-ticks
- If even @code{so-long-mode} doesn't help making Emacs responsive
-enough, or if you'd rather not disable the display-related features
-that @code{so-long-mode} turns off, you can instead customize the
-variable @code{max-redisplay-ticks} to a non-zero value. Then Emacs
-will abort redisplay of a window and commands, like @kbd{C-n} and
-@kbd{M-v}, which use the display code to do their job, if processing a
-window needs more low-level display operations than the value of this
-variable. The display of the offending window will then remain
-outdated, and possibly incomplete, on the screen, but Emacs should
-otherwise be responsive, and you could then switch to another buffer,
-or kill the problematic buffer, or turn on @code{so-long-mode} or
-@code{so-long-minor-mode} in that buffer. When the display of a
-window is aborted due to this reason, the buffer shown in that window
-will not have any of its windows redisplayed until the buffer is
-modified or until you type @kbd{C-l} (@pxref{Recentering}) in one of
-that buffer's windows.
-
- If you decide to customize this variable to a non-zero value, we
-recommend to use a value between 100,000 and 1,000,000, depending on
-your patience and the speed of your system. The default value is
-zero, which disables this feature.
-
@node DEL Does Not Delete
@subsection If @key{DEL} Fails to Delete
@cindex @key{DEL} vs @key{BACKSPACE}
diff --git a/doc/emacs/xresources.texi b/doc/emacs/xresources.texi
index 2c2700bc15b..ab0df3563f5 100644
--- a/doc/emacs/xresources.texi
+++ b/doc/emacs/xresources.texi
@@ -382,7 +382,9 @@ which prevents blank areas of a frame that have not yet been painted
from being displayed. If set to @samp{extended}, it will enable use
of an alternative frame synchronization protocol, which might be
supported by some compositing window managers that don't support the
-protocol Emacs uses by default.
+protocol Emacs uses by default, and causes Emacs to synchronize
+display with the monitor refresh rate when a compatible compositing
+window manager is in use.
@item @code{verticalScrollBars} (class @code{ScrollBars})
Give frames scroll bars on the left if @samp{left}, on the right if
@@ -449,6 +451,12 @@ Foreground color for a selected item.
Foreground color.
@item disabledForeground
Foreground color for a disabled menu item.
+@item highlightForeground
+Foreground color for a menu item highlighted by the mouse or key
+navigation.
+@item highlightBackground
+Background color for a menu item highlighted by the mouse or key
+navigation.
@ifnottex
@item horizontalSpacing
Horizontal spacing in pixels between items. Default is 3.
diff --git a/doc/lispintro/emacs-lisp-intro.texi b/doc/lispintro/emacs-lisp-intro.texi
index 049c8a65a8f..e00edeb392b 100644
--- a/doc/lispintro/emacs-lisp-intro.texi
+++ b/doc/lispintro/emacs-lisp-intro.texi
@@ -2020,7 +2020,6 @@ the arguments to the function @code{concat} are the strings
@w{@code{"The "}} and @w{@code{" red foxes."}} and the list
@code{(number-to-string (+ 2 fill-column))}.
-@c For GNU Emacs 22, need number-to-string
@smallexample
(concat "The " (number-to-string (+ 2 fill-column)) " red foxes.")
@end smallexample
@@ -10297,9 +10296,8 @@ loop with a list.
@cindex @file{*scratch*} buffer
The function requires several lines for its output. If you are
-reading this in a recent instance of GNU Emacs,
-@c GNU Emacs 21, GNU Emacs 22, or a later version,
-you can evaluate the following expression inside of Info, as usual.
+reading this in a recent instance of GNU Emacs, you can evaluate the
+following expression inside of Info, as usual.
If you are using an earlier version of Emacs, you need to copy the
necessary expressions to your @file{*scratch*} buffer and evaluate
@@ -14810,7 +14808,7 @@ symbols in one function definition."
(setq lengths-list
(cons (count-words-in-defun) lengths-list)))
(kill-buffer buffer)
- lengths-list)))
+ lengths-list))))
@end group
@end smallexample
@@ -15134,16 +15132,16 @@ Emacs may produce different results.)
@end group
@group
-(lengths-list-file "./lisp/makesum.el")
- @result{} (85 181)
+(lengths-list-file "./lisp/hex-util.el")
+ @result{} (82 71)
@end group
@group
(recursive-lengths-list-many-files
'("./lisp/macros.el"
"./lisp/mail/mailalias.el"
- "./lisp/makesum.el"))
- @result{} (283 263 480 90 38 32 29 95 178 180 321 218 324 85 181)
+ "./lisp/hex-util.el"))
+ @result{} (283 263 480 90 38 32 29 95 178 180 321 218 324 82 71)
@end group
@end smallexample
@@ -15235,27 +15233,13 @@ Sorting the list returned by the
@code{recursive-lengths-list-many-files} function is straightforward;
it uses the @code{<} function:
-@ignore
-2006 Oct 29
-In GNU Emacs 22, eval
-(progn
- (cd "/usr/local/share/emacs/22.0.50/")
- (sort
- (recursive-lengths-list-many-files
- '("./lisp/macros.el"
- "./lisp/mail/mailalias.el"
- "./lisp/makesum.el"))
- '<))
-
-@end ignore
-
@smallexample
@group
(sort
(recursive-lengths-list-many-files
'("./lisp/macros.el"
"./lisp/mailalias.el"
- "./lisp/makesum.el"))
+ "./lisp/hex-util.el"))
'<)
@end group
@end smallexample
@@ -15265,7 +15249,7 @@ In GNU Emacs 22, eval
which produces:
@smallexample
-(29 32 38 85 90 95 178 180 181 218 263 283 321 324 480)
+(29 32 38 71 82 90 95 178 180 218 263 283 321 324 480)
@end smallexample
@noindent
@@ -15313,7 +15297,7 @@ as a list that looks like this (but with more elements):
@group
("./lisp/macros.el"
"./lisp/mail/rmail.el"
- "./lisp/makesum.el")
+ "./lisp/hex-util.el")
@end group
@end smallexample
@@ -17711,17 +17695,6 @@ or start GNU Emacs with the command @code{emacs -nbc}.
(setq grep-command "grep -i -nH -e ")
@end smallexample
-@ignore
-@c Evidently, no longer needed in GNU Emacs 22
-
-item Automatically uncompress compressed files when visiting them
-
-smallexample
-(load "uncompress")
-end smallexample
-
-@end ignore
-
@item Find an existing buffer, even if it has a different name@*
This avoids problems with symbolic links.
diff --git a/doc/lispref/buffers.texi b/doc/lispref/buffers.texi
index aee440fe782..6a1d125701c 100644
--- a/doc/lispref/buffers.texi
+++ b/doc/lispref/buffers.texi
@@ -994,6 +994,9 @@ Satisfied if the buffer's major mode derives from @var{expr}.
Satisfied if the buffer's major mode is equal to @var{expr}. Prefer
using @code{derived-mode} instead when both can work.
@end table
+@item t
+Satisfied by any buffer. A convenient alternative to @code{""} (empty
+string), @code{(and)} (empty conjunction) or @code{always}.
@end itemize
@end defun
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index e37f6002430..26739bf5b8d 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -2701,7 +2701,10 @@ the character at that position.
@cindex timestamp of a mouse event
@defun posn-timestamp position
Return the timestamp in @var{position}. This is the time at which the
-event occurred, in milliseconds.
+event occurred, in milliseconds. Such a timestamp is reported
+relative to an arbitrary starting time that varies according to the
+window system in use. On the X Window System, for example, it is the
+number of milliseconds since the X server was started.
@end defun
These functions compute a position list given particular buffer
diff --git a/doc/lispref/compile.texi b/doc/lispref/compile.texi
index 9bb7b590a2c..60fc11a22ed 100644
--- a/doc/lispref/compile.texi
+++ b/doc/lispref/compile.texi
@@ -981,7 +981,9 @@ corresponding compiler @option{-O0}, @option{-O1}, etc.@: command-line
options of the compiler. The value @minus{}1 means disable
native-compilation: functions and files will be only byte-compiled;
however, the @file{*.eln} files will still be produced, they will just
-contain the compiled code in bytecode form.
+contain the compiled code in bytecode form. (This can be achieved at
+function granularity by using the @w{@code{(declare (speed -1))}}
+form, @pxref{Declare Form}.)
The default value is 2.
@end defopt
diff --git a/doc/lispref/customize.texi b/doc/lispref/customize.texi
index 528421bf3b4..6ba35cffffe 100644
--- a/doc/lispref/customize.texi
+++ b/doc/lispref/customize.texi
@@ -672,6 +672,10 @@ The value must be a valid color name. The widget provides completion
for color names, as well as a sample and a button for selecting a
color name from a list of color names shown in a @file{*Colors*}
buffer.
+
+@item fringe-bitmap
+The value must be a valid fringe bitmap name. The widget provides
+completion.
@end table
@node Composite Types
diff --git a/doc/lispref/debugging.texi b/doc/lispref/debugging.texi
index 058c9319544..9ae40949d1e 100644
--- a/doc/lispref/debugging.texi
+++ b/doc/lispref/debugging.texi
@@ -77,6 +77,7 @@ debugger recursively. @xref{Recursive Editing}.
@menu
* Error Debugging:: Entering the debugger when an error happens.
+* Debugging Redisplay:: Getting backtraces from redisplay errors.
* Infinite Loops:: Stopping and debugging a program that doesn't exit.
* Function Debugging:: Entering it when a certain function is called.
* Variable Debugging:: Entering it when a variable is modified.
@@ -105,6 +106,10 @@ debugger, set the variable @code{debug-on-error} to non-@code{nil}.
(The command @code{toggle-debug-on-error} provides an easy way to do
this.)
+Note that, for technical reasons, you cannot use the facilities
+defined in this subsection to debug errors in Lisp that the redisplay
+code has invoked. @xref{Debugging Redisplay}, for help with these.
+
@defopt debug-on-error
This variable determines whether the debugger is called when an error
is signaled and not handled. If @code{debug-on-error} is @code{t},
@@ -213,6 +218,45 @@ file, use the option @samp{--debug-init}. This binds
bypasses the @code{condition-case} which normally catches errors in the
init file.
+@node Debugging Redisplay
+@subsection Debugging Redisplay Errors
+@cindex redisplay errors
+@cindex debugging redisplay errors
+
+When an error occurs in Lisp code which redisplay has invoked, Emacs's
+usual debugging mechanisms are unusable, for technical reasons. This
+subsection describes how to get a backtrace from such an error, which
+should be helpful in debugging it.
+
+These directions apply to Lisp forms used, for example, in
+@code{:eval} mode line constructs (@pxref{Mode Line Data}), and in all
+hooks invoked from redisplay, such as:
+
+@itemize
+@item
+@code{fontification-functions} (@pxref{Auto Faces}).
+@item
+@code{window-scroll-functions} (@pxref{Window Hooks}).
+@end itemize
+
+Note that if you have had an error in a hook function called from
+redisplay, the error handling might have removed this function from
+the hook. You will thus need to reinitialize that hook somehow,
+perhaps with @code{add-hook}, to be able to replay the bug.
+
+To generate a backtrace in these circumstances, set the variable
+@code{backtrace-on-redisplay-error} to non-@code{nil}. When the error
+occurs, Emacs will dump the backtrace to the buffer
+@file{*Redisplay-trace*}, but won't automatically display it in a
+window. This is to avoid needlessly corrupting the redisplay you are
+debugging. You will thus need to display the buffer yourself, with a
+command such as @code{switch-to-buffer-other-frame} @key{C-x 5 b}.
+
+@defvar backtrace-on-redisplay-error
+Set this variable to non-@code{nil} to enable the generation of a
+backtrace when an error occurs in any Lisp called from redisplay.
+@end defvar
+
@node Infinite Loops
@subsection Debugging Infinite Loops
@cindex infinite loops
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 08bf7441df0..d336cda6743 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -27,6 +27,7 @@ that Emacs presents to the user.
* Window Dividers:: Separating windows visually.
* Display Property:: Images, margins, text size, etc.
* Images:: Displaying images in Emacs buffers.
+* Icons:: Displaying icons in Emacs buffers.
* Xwidgets:: Displaying native widgets in Emacs buffers.
* Buttons:: Adding clickable buttons to Emacs buffers.
* Abstract Display:: Emacs's Widget for Object Collections.
@@ -3479,6 +3480,12 @@ function finishes are the ones that really matter.
For efficiency, we recommend writing these functions so that they
usually assign faces to around 400 to 600 characters at each call.
+
+When the buffer text includes very long lines, these functions are
+called with the buffer narrowed to a relatively small region around
+@var{pos}, and with narrowing locked, so the functions cannot use
+@code{widen} to gain access to the rest of the buffer.
+@xref{Narrowing}.
@end defvar
@node Basic Faces
@@ -4619,6 +4626,7 @@ Used to indicate buffer boundaries.
Used for different types of fringe cursors.
@item @code{exclamation-mark}, @code{question-mark}
+@itemx @code{large-circle}
Not used by core Emacs features.
@end table
@@ -6979,6 +6987,165 @@ bytes. An image of size 200x100 with 24 bits per color will have a
cache size of 60000 bytes, for instance.
@end defun
+@node Icons
+@section Icons
+
+Emacs sometimes uses buttons (for clicking on) or small graphics (to
+illustrate something). Since Emacs is available on a wide variety of
+systems with different capabilities, and users have different
+preferences, Emacs provides a facility to handle this in a convenient
+way, allowing customization, graceful degradation, accessibility, as
+well as themability: @dfn{Icons}.
+
+The central macro here is @code{define-icon}, and here's a simple
+example:
+
+@lisp
+(define-icon outline-open button
+ '((image "right.svg" "open.xpm" "open.pbm" :height line)
+ (emoji "▶️")
+ (symbol "▶" "➤")
+ (text "open" :face icon-button))
+ "Icon used for buttons for opening a section in outline buffers."
+ :version "29.1"
+ :help-echo "Open this section")
+@end lisp
+
+Which alternative will actually be displayed depends on the value of
+the user option @code{icon-preference} (@pxref{Icons,,, emacs, The GNU
+Emacs Manual}) and on the results of run-time checks for what the
+current frame's terminal can actually display.
+
+The macro in the example above defines @code{outline-open} as an icon,
+and inherits properties from the icon called @code{button} (so this is
+meant as a clickable button to be inserted in a buffer). It is
+followed by a list of @dfn{icon types} along with the actual icon
+shapes themselves. In addition, there's a doc string and various
+keywords that contain additional information and properties.
+
+To instantiate an icon, you use @code{icon-string}, which will
+consult the current Customize theming, and the @code{icon-preference}
+user option, and finally what the Emacs is able to actually display.
+If @code{icon-preference} is @code{(image emoji symbol text)} (i.e.,
+allowing all of these forms of icons), in this case,
+@code{icon-string} will first check that Emacs is able to display
+images at all, and then whether it has support for each of those
+different image formats. If that fails, Emacs will check whether
+Emacs can display emojis (in the current frame). If that fails, it'll
+check whether it can display the symbol in question. If that fails,
+it'll use the plain text version.
+
+For instance, if @code{icon-preference} doesn't contain @code{image}
+or @code{emoji}, it'll skip those entries.
+
+Code can confidently call @code{icon-string} in all circumstances and
+be sure that something readable will appear on the screen, no
+matter whether the user is on a graphical terminal or a text terminal,
+and no matter which features Emacs was built with.
+
+@defmac define-icon name parent specs doc &rest keywords
+Define an icon @var{name}, a symbol, with the display alternatives in
+@var{spec}, that can be later instantiated using @code{icon-string}.
+The @var{name} is the name of the resulting keyword.
+
+The resulting icon will inherit specs from @var{parent}, and from
+their parent's parents, and so on, and the lowest descendent element
+wins.
+
+@var{specs} is a list of icon specifications. The first element of each
+specification is the type, and the rest is something that can be used
+as an icon of that type, and then optionally followed by a keyword
+list. The following icon types are available:
+
+@cindex icon types
+@table @code
+@item image
+In this case, there may be many images listed as candidates. Emacs
+will choose the first one that the current Emacs instance can show.
+If an image is listed is an absolute file name, it's used as is, but it's
+otherwise looked up in the list @code{image-load-path}
+(@pxref{Defining Images}).
+
+@item emoji
+This should be a (possibly colorful) emoji.
+
+@item symbol
+This should be a (monochrome) symbol character.
+
+@item text
+Icons should also have a textual fallback. This can also be used for
+the visually impaired: if @code{icon-preference} is just
+@code{(text)}, all icons will be replaced by text.
+@end table
+
+Various keywords may follow the list of icon specifications. For
+instance:
+
+@example
+(symbol "▶" "➤" :face icon-button)
+@end example
+
+Unknown keywords are ignored. The following keywords are allowed:
+
+@cindex icon keywords
+@table @code
+@item :face
+The face to be used for the icon.
+
+@item :height
+This is only valid for @code{image} icons, and can be either a number
+(which specifies the height in pixels), or the symbol @code{line},
+which will use the default line height in the currently selected
+window.
+@end table
+
+@var{doc} should be a doc string.
+
+@var{keywords} is a list of keyword/value pairs. The following
+keywords are allowed:
+
+@table @code
+@item :version
+The (approximate) Emacs version this button first appeared. (This
+keyword is mandatory.)
+
+@item :group
+The customization group this icon belongs in. If not present, it is
+inferred.
+
+@item :help-echo
+The help string shown when hovering over the icon with the mouse
+pointer.
+@end table
+@end defmac
+
+@defun icon-string icon
+This function returns a string suitable for display in the current
+buffer for @var{icon}.
+@end defun
+
+@defun icon-elements icon
+Alternatively, you can get a ``deconstructed'' version of @var{icon}
+with this function. It returns a plist (@pxref{Property Lists}) where
+the keys are @code{string}, @code{face} and @var{image}. (The latter
+is only present if the icon is represented by an image.) This can be
+useful if the icon isn't to be inserted directly in the buffer, but
+needs some sort of pre-processing first.
+@end defun
+
+Icons can be customized with @kbd{M-x customize-icon}. Themes can
+specify changes to icons with, for instance:
+
+@lisp
+(custom-theme-set-icons
+ 'my-theme
+ '(outline-open ((image :height 100)
+ (text " OPEN ")))
+ '(outline-close ((image :height 100)
+ (text " CLOSE " :face warning))))
+@end lisp
+
+
@node Xwidgets
@section Embedded Native Widgets
@cindex xwidget
@@ -7311,6 +7478,7 @@ the usual Emacs @code{highlight} face.
@item keymap
@kindex keymap @r{(button property)}
+@vindex button-map
The button's keymap, defining bindings active within the button
region. By default this is the usual button region keymap, stored
in the variable @code{button-map}, which defines @key{RET} and
@@ -7525,6 +7693,7 @@ Return @code{t} if button-type @var{type} is a subtype of @var{supertype}.
These are commands and functions for locating and operating on
buttons in an Emacs buffer.
+@cindex buffer-button-map
@code{push-button} is the command that a user uses to actually push
a button, and is bound by default in the button itself to @key{RET}
and to @key{mouse-2} using a local keymap in the button's overlay or
@@ -8428,9 +8597,9 @@ Characters of Unicode General Category [Cf], such as U+200E
images, such as U+00AD @sc{soft hyphen}.
@item variation-selectors
-Unicode VS-1 through VS-16 (U+FE00 through U+FE0F), which are used to
-select between different glyphs for the same codepoints (typically
-emojis).
+Unicode VS-1 through VS-256 (U+FE00 through U+FE0F and U+E0100 through
+U+E01EF), which are used to select between different glyphs for the same
+codepoints (typically emojis).
@item no-font
Characters for which there is no suitable font, or which cannot be
diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index ed56fa777d2..262b86672da 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -2180,10 +2180,20 @@ If non-@code{nil}, the frame is visible on all virtual desktops on systems
with virtual desktops.
@vindex shaded@r{, a frame parameter}
-@item sticky
+@item shaded
If non-@code{nil}, tell the window manager to display the frame in a
way that its contents are hidden, leaving only the title bar.
+@vindex use-frame-synchronization@r{, a frame parameter}
+@item use-frame-synchronization
+If non-@code{nil}, synchronize the frame redisplay with the refresh
+rate of the monitor to avoid graphics tearing. At present, this is
+only implemented on Haiku and the X window system inside no-toolkit
+and X toolkit builds, does not work correctly with toolkit scroll
+bars, and requires a compositing manager supporting the relevant
+display synchronization protocols. The @code{synchronizeResize} X
+resource must also be set to the string @code{"extended"}.
+
@vindex inhibit-double-buffering@r{, a frame parameter}
@item inhibit-double-buffering
If non-@code{nil}, the frame is drawn to the screen without double
diff --git a/doc/lispref/functions.texi b/doc/lispref/functions.texi
index e3de6009e90..983dfe2ec59 100644
--- a/doc/lispref/functions.texi
+++ b/doc/lispref/functions.texi
@@ -217,6 +217,16 @@ function. For example:
@end example
@end defun
+@defun compiled-function-p object
+This function returns @code{t} if @var{object} is a function object
+that is not in the form of ELisp source code but something like
+machine code or byte code instead. More specifically it returns
+@code{t} if the function is built-in (a.k.a.@: ``primitive'',
+@pxref{What Is a Function}), or byte-compiled (@pxref{Byte
+Compilation}), or natively-compiled (@pxref{Native Compilation}), or
+a function loaded from a dynamic module (@pxref{Dynamic Modules}).
+@end defun
+
@defun subr-arity subr
This works like @code{func-arity}, but only for built-in functions and
without symbol indirection. It signals an error for non-built-in
@@ -2497,6 +2507,34 @@ the current buffer.
@item (modes @var{modes})
Specify that this command is meant to be applicable for @var{modes}
only.
+
+@item (interactive-args @var{arg} ...)
+Specify the arguments that should be stored for @code{repeat-command}.
+Each @var{arg} is on the form @code{@var{argument-name} @var{form}}.
+
+@item (pure @var{val})
+If @var{val} is non-@code{nil}, this function is @dfn{pure}
+(@pxref{What Is a Function}). This is the same as the @code{pure}
+property of the function's symbol (@pxref{Standard Properties}).
+
+@item (side-effect-free @var{val})
+If @var{val} is non-@code{nil}, this function is free of side effects,
+so the byte compiler can ignore calls whose value is ignored. This is
+the same as the @code{side-effect-free} property of the function's
+symbol, @pxref{Standard Properties}.
+
+@item (speed @var{n})
+Specify the value of @code{native-comp-speed} in effect for native
+compilation of this function (@pxref{Native-Compilation Variables}).
+This allows function-level control of the optimization level used for
+native code emitted for the function. In particular, if @var{n} is
+@minus{}1, native compilation of the function will emit bytecode
+instead of native code for the function.
+
+@item no-font-lock-keyword
+This is valid for macros only. Macros with this declaration are
+highlighted by font-lock (@pxref{Font Lock Mode}) as normal functions,
+not specially as macros.
@end table
@end defmac
diff --git a/doc/lispref/hash.texi b/doc/lispref/hash.texi
index d3ae673d44d..25a56bd7151 100644
--- a/doc/lispref/hash.texi
+++ b/doc/lispref/hash.texi
@@ -324,15 +324,13 @@ the same integer.
compared case-insensitively.
@example
-(defun case-fold-string= (a b)
- (eq t (compare-strings a nil nil b nil nil t)))
-(defun case-fold-string-hash (a)
+(defun string-hash-ignore-case (a)
(sxhash-equal (upcase a)))
-(define-hash-table-test 'case-fold
- 'case-fold-string= 'case-fold-string-hash)
+(define-hash-table-test 'ignore-case
+ 'string-equal-ignore-case 'string-hash-ignore-case)
-(make-hash-table :test 'case-fold)
+(make-hash-table :test 'ignore-case)
@end example
Here is how you could define a hash table test equivalent to the
diff --git a/doc/lispref/hooks.texi b/doc/lispref/hooks.texi
index 59b7930732f..339e1387d2e 100644
--- a/doc/lispref/hooks.texi
+++ b/doc/lispref/hooks.texi
@@ -280,7 +280,6 @@ kbd-macro-termination-hook
signal-hook-function
C functions:
-redisplay-end-trigger-functions
x-lost-selection-functions
x-sent-selection-functions
diff --git a/doc/lispref/keymaps.texi b/doc/lispref/keymaps.texi
index f5341f40f0a..2be31d63a62 100644
--- a/doc/lispref/keymaps.texi
+++ b/doc/lispref/keymaps.texi
@@ -374,7 +374,8 @@ number of keys. Here's a very basic example:
@end lisp
This function creates a new sparse keymap, defines the keystrokes in
-@var{pairs}, and returns the new keymap.
+@var{pairs}, and returns the new keymap. It signals an error if there
+are duplicate key bindings in @var{pairs}.
@var{pairs} is a list of alternating key bindings and key definitions,
as accepted by @code{keymap-set}. In addition, the key can be the
@@ -438,7 +439,8 @@ variable. This is what virtually all modes do---a mode called
This macro defines @var{name} as a variable, passes @var{options}
and @var{pairs} to @code{define-keymap}, and uses the result as the
-default value for the variable.
+default value for the variable. It signals an error if there are
+duplicate key bindings in @var{pairs}.
@var{options} is like the keywords in @code{define-keymap}, but
there's an additional @code{:doc} keyword that provides the doc
@@ -1882,6 +1884,7 @@ to make entries in @code{input-decode-map} beyond those that can be
deduced from Termcap and Terminfo. @xref{Terminal-Specific}.
@end defvar
+@cindex function-key-map
@defvar local-function-key-map
This variable holds a keymap similar to @code{input-decode-map} except
that it describes key sequences which should be translated to
diff --git a/doc/lispref/lists.texi b/doc/lispref/lists.texi
index a4f0ba815b1..5c5c615f85d 100644
--- a/doc/lispref/lists.texi
+++ b/doc/lispref/lists.texi
@@ -340,6 +340,44 @@ If @var{n} is zero, @code{nthcdr} returns all of
@end example
@end defun
+@defun take n list
+This function returns the @var{n} first elements of @var{list}. Essentially,
+it returns the part of @var{list} that @code{nthcdr} skips.
+
+@code{take} returns @var{list} if shorter than @var{n} elements;
+it returns @code{nil} if @var{n} is zero or negative.
+
+@example
+@group
+(take 3 '(a b c d))
+ @result{} (a b c)
+@end group
+@group
+(take 10 '(a b c d))
+ @result{} (a b c d)
+@end group
+@group
+(take 0 '(a b c d))
+ @result{} nil
+@end group
+@end example
+@end defun
+
+@defun ntake n list
+This is a version of @code{take} that works by destructively modifying
+the list structure of the argument. That makes it faster, but the
+original value of @var{list} may be lost.
+
+@code{ntake} returns @var{list} unmodified if shorter than @var{n}
+elements; it returns @code{nil} if @var{n} is zero or negative.
+Otherwise, it returns @var{list} truncated to its first @var{n}
+elements.
+
+This means that it is usually a good idea to use the return value and
+not just rely on the truncation effect unless @var{n} is known to be
+positive.
+@end defun
+
@defun last list &optional n
This function returns the last link of @var{list}. The @code{car} of
this link is the list's last element. If @var{list} is null,
diff --git a/doc/lispref/loading.texi b/doc/lispref/loading.texi
index 54fc16ec9f0..4e4f12dc324 100644
--- a/doc/lispref/loading.texi
+++ b/doc/lispref/loading.texi
@@ -440,7 +440,7 @@ similarly-named file in a directory earlier on @code{load-path}.
For instance, suppose @code{load-path} is set to
@example
- ("/opt/emacs/site-lisp" "/usr/share/emacs/23.3/lisp")
+ ("/opt/emacs/site-lisp" "/usr/share/emacs/29.1/lisp")
@end example
@noindent
@@ -698,14 +698,13 @@ Switch to *doctor* buffer and start giving psychotherapy.
@noindent
@cindex @code{fn} in function's documentation string
-The backslash and newline immediately following the double-quote are a
-convention used only in the preloaded uncompiled Lisp files such as
-@file{loaddefs.el}; they tell @code{make-docfile} to put the
-documentation string in the @file{etc/DOC} file. @xref{Building Emacs}.
-See also the commentary in @file{lib-src/make-docfile.c}. @samp{(fn)}
-in the usage part of the documentation string is replaced with the
-function's name when the various help functions (@pxref{Help
-Functions}) display it.
+While the @file{loaddefs.el} isn't for editing, we try to keep it
+somewhat readable for people. For instance, control characters in
+@code{defvar} values are escaped, and we insert a backslash and
+newline immediately following the double-quote of the doc string to
+keep the line length down. @samp{(fn)} in the usage part of the
+documentation string is replaced with the function's name when the
+various help functions (@pxref{Help Functions}) display it.
If you write a function definition with an unusual macro that is not
one of the known and recognized function definition methods, use of an
@@ -767,7 +766,7 @@ the corresponding list of files to load for it. Entries to this
mapping are added by calls to @code{register-definition-prefixes}
which are generated by @code{loaddefs-generate}
(@pxref{Autoload}). Files which don't contain any definitions worth
-loading (test files, for examples), should set
+loading (test files, for example), should set
@code{autoload-compute-prefixes} to @code{nil} as a file-local
variable.
@@ -1032,7 +1031,7 @@ with a call to @code{provide}. The order of the elements in the
@cindex symbol, where defined
@cindex where was a symbol defined
-@defun symbol-file symbol &optional type
+@defun symbol-file symbol &optional type native-p
This function returns the name of the file that defined @var{symbol}.
If @var{type} is @code{nil}, then any kind of definition is acceptable.
If @var{type} is @code{defun}, @code{defvar}, or @code{defface}, that
@@ -1043,6 +1042,14 @@ The value is normally an absolute file name. It can also be @code{nil},
if the definition is not associated with any file. If @var{symbol}
specifies an autoloaded function, the value can be a relative file name
without extension.
+
+If the optional third argument @var{native-p} is non-@code{nil}, and
+Emacs was built with native compilation support (@pxref{Native
+Compilation}), this function will try to find the @file{.eln} file
+that defined @var{symbol}, instead of the @file{.elc} or @file{.el}
+file. If such a @file{.eln} file is found and is not outdated, the
+function will return its absolute file name; otherwise it will report
+the name of either the source or the byte-compiled file.
@end defun
The basis for @code{symbol-file} is the data in the variable
diff --git a/doc/lispref/maps.texi b/doc/lispref/maps.texi
index 90497728a1c..d18b553dc19 100644
--- a/doc/lispref/maps.texi
+++ b/doc/lispref/maps.texi
@@ -125,6 +125,7 @@ setup-language-environment-map, describe-language-environment-map,
menu-bar-epatch-menu, menu-bar-ediff-merge-menu, menu-bar-ediff-menu, etc.
@end ignore
+@cindex minibuffer-inactive-mode-map
@item minibuffer-inactive-mode-map
A full keymap used in the minibuffer when it is not active.@*
@xref{Minibuffer Edit,, Editing in the Minibuffer, emacs, The GNU Emacs Manual}.
@@ -156,6 +157,7 @@ The global keymap used for the @kbd{C-x @key{RET}} prefix key.
@vindex narrow-map
A sparse keymap for subcommands of the prefix @kbd{C-x n}.
+@cindex prog-mode-map
@item prog-mode-map
The keymap used by Prog mode.@*
@xref{Basic Major Modes}.
@@ -171,6 +173,7 @@ for multi-buffer replacements. @xref{Search and Replace, query-replace-map}.
@item search-map
A sparse keymap that provides global bindings for search-related commands.
+@cindex special-mode-map
@item special-mode-map
The keymap used by Special mode.@*
@xref{Basic Major Modes}.
@@ -179,6 +182,7 @@ The keymap used by Special mode.@*
The global keymap used for the @kbd{C-x t} prefix key for tab-bar related commands.@*
@xref{Tab Bars,,, emacs, The GNU Emacs Manual}.
+@cindex tab-bar-map
@item tab-bar-map
The keymap defining the contents of the tab bar.@*
@xref{Tab Bars,,, emacs, The GNU Emacs Manual}.
diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index e94093318fc..75eb21522f1 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -1356,11 +1356,10 @@ the conventions listed above:
;; @r{Create the keymap for this mode.}
@group
(defvar-keymap text-mode-map
- "C-M-i" #'ispell-complete-word
- @dots{})
- "Keymap for `text-mode'.
-Many other modes, such as `mail-mode', `outline-mode' and
-`indented-text-mode', inherit all the commands defined in this map.")
+ :doc "Keymap for `text-mode'.
+Many other modes, such as `mail-mode' and `outline-mode', inherit all
+the commands defined in this map."
+ "C-M-i" #'ispell-complete-word)
@end group
@end smallexample
diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi
index 1bae1924557..7b5e9adee29 100644
--- a/doc/lispref/objects.texi
+++ b/doc/lispref/objects.texi
@@ -2022,6 +2022,9 @@ with references to further information.
@item byte-code-function-p
@xref{Byte-Code Type, byte-code-function-p}.
+@item compiled-function-p
+@xref{Byte-Code Type, compiled-function-p}.
+
@item case-table-p
@xref{Case Tables, case-table-p}.
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 2b49818ed33..35828018417 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -1541,20 +1541,20 @@ Year numbers count since the year 1 BCE, and do not skip zero
as traditional Gregorian years do; for example, the year number
@minus{}37 represents the Gregorian year 38 BCE@.
-@defun time-convert time &optional form
+@defun time-convert time form
This function converts a time value into a Lisp timestamp.
-The optional @var{form} argument specifies the timestamp form to be
-returned. If @var{form} is the symbol @code{integer}, this function
-returns an integer count of seconds. If @var{form} is a positive
-integer, it specifies a clock frequency and this function returns an
-integer-pair timestamp @code{(@var{ticks} . @var{form})}. If @var{form} is
+The @var{form} argument specifies the timestamp form to be returned.
+If @var{form} is the symbol @code{integer}, this function returns an
+integer count of seconds. If @var{form} is a positive integer, it
+specifies a clock frequency and this function returns an integer-pair
+timestamp @code{(@var{ticks} . @var{form})}. If @var{form} is
@code{t}, this function treats it as a positive integer suitable for
representing the timestamp; for example, it is treated as 1000000000
if @var{time} is @code{nil} and the platform timestamp has nanosecond
resolution. If @var{form} is @code{list}, this function returns an
integer list @code{(@var{high} @var{low} @var{micro} @var{pico})}.
-Although an omitted or @code{nil} @var{form} currently acts like
+Although a @code{nil} @var{form} currently acts like
@code{list}, this is planned to change in a future Emacs version, so
callers requiring list timestamps should pass @code{list} explicitly.
@@ -2067,7 +2067,12 @@ This returns @code{t} if the time value @var{t1} is less than the time value
@defun time-equal-p t1 t2
This returns @code{t} if the two time values @var{t1} and @var{t2} are
-equal.
+equal. The result is @code{nil} if either argument is a NaN.
+For the purpose of comparison, a @code{nil} argument represents the
+current time with infinite resolution, so this function returns
+@code{nil} if one argument is @code{nil} and the other is not, and
+callers can therefore use @code{nil} to represent an unknown time
+value that does not equal any timestamp.
@end defun
@defun time-subtract t1 t2
diff --git a/doc/lispref/positions.texi b/doc/lispref/positions.texi
index ca1166caac4..333c8e19a0e 100644
--- a/doc/lispref/positions.texi
+++ b/doc/lispref/positions.texi
@@ -1002,6 +1002,12 @@ positions.
In an interactive call, @var{start} and @var{end} are set to the bounds
of the current region (point and the mark, with the smallest first).
+
+Note that, in rare circumstances, Emacs may decide to leave, for
+performance reasons, the accessible portion of the buffer unchanged
+after a call to @code{narrow-to-region}. This can happen when a Lisp
+program is called via low-level hooks, such as
+@code{jit-lock-functions}, @code{post-command-hook}, etc.
@end deffn
@deffn Command narrow-to-page &optional move-count
@@ -1027,6 +1033,12 @@ It is equivalent to the following expression:
@end example
@end deffn
+Note that, in rare circumstances, Emacs may decide to leave, for
+performance reasons, the accessible portion of the buffer unchanged
+after a call to @code{widen}. This can happen when a Lisp program is
+called via low-level hooks, such as @code{jit-lock-functions},
+@code{post-command-hook}, etc.
+
@defun buffer-narrowed-p
This function returns non-@code{nil} if the buffer is narrowed, and
@code{nil} otherwise.
diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi
index 80c371e1c6a..db6b4c35ef7 100644
--- a/doc/lispref/processes.texi
+++ b/doc/lispref/processes.texi
@@ -705,12 +705,13 @@ coding system will apply. @xref{Default Coding Systems}.
Initialize the type of device used to communicate with the subprocess.
Possible values are @code{pty} to use a pty, @code{pipe} to use a
pipe, or @code{nil} to use the default derived from the value of the
-@code{process-connection-type} variable. This parameter and the value
-of @code{process-connection-type} are ignored if a non-@code{nil}
-value is specified for the @code{:stderr} parameter; in that case, the
-type will always be @code{pipe}. On systems where ptys are not
-available (MS-Windows), this parameter is likewise ignored, and pipes
-are used unconditionally.
+@code{process-connection-type} variable. If @var{type} is a cons cell
+@w{@code{(@var{input} . @var{output})}}, then @var{input} will be used
+for standard input and @var{output} for standard output (and standard
+error if @code{:stderr} is @code{nil}).
+
+On systems where ptys are not available (MS-Windows), this parameter
+is ignored, and pipes are used unconditionally.
@item :noquery @var{query-flag}
Initialize the process query flag to @var{query-flag}.
@@ -1242,15 +1243,24 @@ that are already closed, the value is either 0 or 256, depending on
whether the connection was closed normally or abnormally.
@end defun
-@defun process-tty-name process
+@defun process-tty-name process &optional stream
This function returns the terminal name that @var{process} is using for
its communication with Emacs---or @code{nil} if it is using pipes
instead of a pty (see @code{process-connection-type} in
-@ref{Asynchronous Processes}). If @var{process} represents a program
-running on a remote host, the terminal name used by that program on
-the remote host is provided as process property @code{remote-tty}. If
-@var{process} represents a network, serial, or pipe connection, the
-value is @code{nil}.
+@ref{Asynchronous Processes}). By default, this function returns the
+terminal name if any of @var{process}'s standard streams use a
+terminal. If @var{stream} is one of @code{stdin}, @code{stdout}, or
+@code{stderr}, this function returns the terminal name (or @code{nil},
+as above) that @var{process} uses for that stream specifically. You
+can use this to determine whether a particular stream uses a pipe or a
+pty.
+
+If @var{process} represents a program running on a remote host, this
+function returns the @emph{local} terminal name that communicates with
+@var{process}; you can get the terminal name used by that program on
+the remote host with the process property @code{remote-tty}. If
+@var{process} represents a network, serial, or pipe connection, this
+function always returns @code{nil}.
@end defun
@defun process-coding-system process
@@ -1530,20 +1540,11 @@ a buffer, which is called the associated buffer of the process
default filter discards the output.
If the subprocess writes to its standard error stream, by default
-the error output is also passed to the process filter function. If
-Emacs uses a pseudo-TTY (pty) for communication with the subprocess,
-then it is impossible to separate the standard output and standard
-error streams of the subprocess, because a pseudo-TTY has only one
-output channel. In that case, if you want to keep the output to those
-streams separate, you should redirect one of them to a file---for
-example, by using an appropriate shell command via
-@code{start-process-shell-command} or a similar function.
-
- Alternatively, you could use the @code{:stderr} parameter with a
+the error output is also passed to the process filter function.
+Alternatively, you could use the @code{:stderr} parameter with a
non-@code{nil} value in a call to @code{make-process}
(@pxref{Asynchronous Processes, make-process}) to make the destination
-of the error output separate from the standard output; in that case,
-Emacs will use pipes for communicating with the subprocess.
+of the error output separate from the standard output.
When a subprocess terminates, Emacs reads any pending output,
then stops reading output from that subprocess. Therefore, if the
@@ -1959,7 +1960,6 @@ because @var{seconds} can be floating point to specify
waiting a fractional number of seconds. If @var{seconds} is 0, the
function accepts whatever output is pending but does not wait.
-@c Emacs 22.1 feature
If @var{process} is a process, and the argument @var{just-this-one} is
non-@code{nil}, only output from that process is handled, suspending output
from other processes until some output has been received from that
@@ -3204,20 +3204,39 @@ If the vector does not include the port number, @var{p}, or if
@code{:@var{p}} suffix.
@end defun
-@defun network-lookup-address-info name &optional family
-This function is used to perform hostname lookups on @var{name}, which
-is expected to be an ASCII-only string, otherwise an error is
-signaled. Call @code{puny-encode-domain} on @var{name}
-first if you wish to lookup internationalized hostnames.
+@defun network-lookup-address-info name &optional family hints
+This function perform hostname lookups on @var{name}, which is
+expected to be an ASCII-only string, otherwise it signals an error. Call
+@code{puny-encode-domain} on @var{name} first if you wish to lookup
+internationalized hostnames.
-If successful it returns a list of Lisp representations of network
-addresses, otherwise it returns @code{nil}. In the latter case, it
-also displays the error message hopefully explaining what went wrong.
+If successful, this function returns a list of Lisp representations of network
+addresses (@pxref{Network Processes}, for a description of the
+format), otherwise return @code{nil}. In the latter case, it also logs
+an error message hopefully explaining what went wrong.
-By default both IPv4 and IPv6 lookups are attempted. The optional
-argument @var{family} controls this behavior, specifying the symbol
-@code{ipv4} or @code{ipv6} restricts lookups to IPv4 and IPv6
+By default, this function attempts both IPv4 and IPv6 lookups. The
+optional argument @var{family} controls this behavior, specifying the
+symbol @code{ipv4} or @code{ipv6} restricts lookups to IPv4 and IPv6
respectively.
+
+If optional argument @var{hints} is @code{numeric}, the function
+treats the @var{name} as a numerical IP address (and does not perform DNS
+lookups). This can be used to check whether a string is a valid
+numerical representation of an IP address, or to convert a numerical
+string to its canonical representation. e.g.@:
+
+@example
+(network-lookup-address-info "127.1" 'ipv4 'numeric)
+ @result{} ([127 0 0 1 0])
+
+(network-lookup-address-info "::1" nil 'numeric)
+ @result{} ([0 0 0 0 0 0 0 1 0])
+@end example
+
+Be warned that there are some surprising valid forms,
+especially for IPv4, e.g @samp{0xe3010203} and @samp{0343.1.2.3} are both
+valid, as are @samp{0} and @samp{1} (but they are invalid for IPv6).
@end defun
@node Serial Ports
diff --git a/doc/lispref/strings.texi b/doc/lispref/strings.texi
index addf195fad2..374381e5955 100644
--- a/doc/lispref/strings.texi
+++ b/doc/lispref/strings.texi
@@ -560,6 +560,12 @@ Representations}.
@code{string-equal} is another name for @code{string=}.
@end defun
+@defun string-equal-ignore-case string1 string2
+@code{string-equal-ignore-case} compares strings ignoring case
+differences, like @code{char-equal} when @code{case-fold-search} is
+@code{t}.
+@end defun
+
@cindex locale-dependent string equivalence
@defun string-collate-equalp string1 string2 &optional locale ignore-case
This function returns @code{t} if @var{string1} and @var{string2} are
@@ -567,11 +573,19 @@ equal with respect to collation rules. A collation rule is not only
determined by the lexicographic order of the characters contained in
@var{string1} and @var{string2}, but also further rules about
relations between these characters. Usually, it is defined by the
-@var{locale} environment Emacs is running with.
-
-For example, characters with different coding points but
-the same meaning might be considered as equal, like different grave
-accent Unicode characters:
+@var{locale} environment Emacs is running with and by the Standard C
+library against which Emacs was linked@footnote{
+For more information about collation rules and their locale
+dependencies, see @uref{https://unicode.org/reports/tr10/, The Unicode
+Collation Algorithm}. Some Standard C libraries, such as the
+@acronym{GNU} C Library (a.k.a.@: @dfn{glibc}) implement large
+portions of the Unicode Collation Algorithm and use the associated
+locale data, Common Locale Data Repository, or @acronym{CLDR}.
+}.
+
+For example, characters with different code points but the same
+meaning, like different grave accent Unicode characters, might, in
+some locales, be considered as equal:
@example
@group
@@ -759,7 +773,8 @@ The strings are compared by the numeric values of their characters.
For instance, @var{str1} is considered less than @var{str2} if
its first differing character has a smaller numeric value. If
@var{ignore-case} is non-@code{nil}, characters are converted to
-upper-case before comparing them. Unibyte strings are converted to
+upper-case, using the current buffer's case-table (@pxref{Case
+Tables}), before comparing them. Unibyte strings are converted to
multibyte for comparison (@pxref{Text Representations}), so that a
unibyte string and its conversion to multibyte are always regarded as
equal.
diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi
index 8b0e1981955..c2161b9341d 100644
--- a/doc/lispref/text.texi
+++ b/doc/lispref/text.texi
@@ -2366,6 +2366,9 @@ begins. @xref{Usual Display}.
amount of horizontal scrolling. Consequently, a column value can be
arbitrarily high. The first (or leftmost) column is numbered 0. They
also ignore overlays and text properties, aside from invisibility.
+Invisible text is considered as having zero width, unless
+@code{buffer-invisibility-spec} specifies that invisible text should
+be displayed as ellipsis (@pxref{Invisible Text}).
@defun current-column
This function returns the horizontal position of point, measured in
@@ -2439,6 +2442,10 @@ This function returns the indentation of the current line, which is
the horizontal position of the first nonblank character. If the
contents are entirely blank, then this is the horizontal position of the
end of the line.
+
+This function considers invisible text as having zero width, unless
+@code{buffer-invisibility-spec} specifies that invisible text should
+be displayed as ellipsis. @xref{Invisible Text}.
@end defun
@deffn Command indent-to column &optional minimum
diff --git a/doc/lispref/tips.texi b/doc/lispref/tips.texi
index 30146a89ebf..3a1f6de12b2 100644
--- a/doc/lispref/tips.texi
+++ b/doc/lispref/tips.texi
@@ -689,6 +689,18 @@ line. This looks nice in the source code, but looks bizarre when users
view the documentation. Remember that the indentation before the
starting double-quote is not part of the string!
+@item
+When documentation should display an ASCII apostrophe or grave accent,
+use @samp{\\='} or @samp{\\=`} in the documentation string literal so
+that the character is displayed as-is.
+
+@item
+In documentation strings, do not quote expressions that are not Lisp symbols,
+as these expressions can stand for themselves. For example, write
+@samp{Return the list (NAME TYPE RANGE) ...}@: instead of
+@samp{Return the list `(NAME TYPE RANGE)' ...}@: or
+@samp{Return the list \\='(NAME TYPE RANGE) ...}.
+
@anchor{Docstring hyperlinks}
@item
@cindex curly quotes
@@ -700,7 +712,7 @@ two exceptions: write @code{t} and @code{nil} without surrounding
punctuation. For example:
@example
- CODE can be `lambda', nil, or t.
+CODE can be `lambda', nil, or t.
@end example
Note that when Emacs displays these doc strings, Emacs will usually
@@ -856,7 +868,7 @@ find an alternate phrasing that conveys the meaning.
@item
Try to avoid using abbreviations such as ``e.g.'' (for ``for
example''), ``i.e.'' (for ``that is''), ``no.'' (for ``number''),
-``c.f.'' (for ``in contrast to'') and ``w.r.t.'' (for ``with respect
+``cf.'' (for ``compare''/``see also'') and ``w.r.t.'' (for ``with respect
to'') as much as possible. It is almost always clearer and easier to
read the expanded version.@footnote{We do use these occasionally, but
try not to overdo it.}
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 535571b3161..c7f014e2f3b 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -737,7 +737,7 @@ with any other @var{round} it returns the internal value of
@cindex window width
@cindex width of a window
@cindex total width of a window
-The @dfn{total width} of a window is the number of lines comprising its
+The @dfn{total width} of a window is the number of columns comprising its
body and its left and right decorations (@pxref{Basic Windows}).
@defun window-total-width &optional window round
@@ -747,7 +747,7 @@ the selected window. If @var{window} is internal, the return value is
the total width occupied by its descendant windows.
If a window's pixel width is not an integral multiple of its frame's
-character width, the number of lines occupied by the window is rounded
+character width, the number of columns occupied by the window is rounded
internally. This is done in a way such that, if the window is a parent
window, the sum of the total widths of all its children internally
equals the total width of their parent. This means that although two
diff --git a/doc/misc/auth.texi b/doc/misc/auth.texi
index 829d7f4fa03..91a9afd9c9f 100644
--- a/doc/misc/auth.texi
+++ b/doc/misc/auth.texi
@@ -652,14 +652,8 @@ before @file{~/.authinfo}, the auth-source library will try to
read the GnuPG encrypted @file{.gpg} file first, before
the unencrypted file.
-In Emacs 23 or later there is an option @code{auto-encryption-mode} to
-automatically decrypt @file{*.gpg} files. It is enabled by default.
-If you are using earlier versions of Emacs, you will need:
-
-@lisp
-(require 'epa-file)
-(epa-file-enable)
-@end lisp
+There is an option @code{auto-encryption-mode} to automatically
+decrypt @file{*.gpg} files. It is enabled by default.
If you want your GnuPG passwords to be cached, set up @code{gpg-agent}
or EasyPG Assistant
diff --git a/doc/misc/autotype.texi b/doc/misc/autotype.texi
index b005c9c34f7..93c65692d01 100644
--- a/doc/misc/autotype.texi
+++ b/doc/misc/autotype.texi
@@ -92,7 +92,6 @@ completions and expansions of text at point.
* Copyrights:: Inserting and updating copyrights.
* Executables:: Turning interpreter scripts into executables.
* Timestamps:: Updating dates and times in modified files.
-* QuickURL:: Inserting URLs based on text at point.
* Tempo:: Flexible template insertion.
* Hippie Expand:: Expansion of text trying various methods.
* Skeleton Language:: Making skeleton commands insert what you want.
@@ -478,31 +477,6 @@ The time stamp is written between the brackets or quotes:
Time-stamp: <1998-02-18 10:20:51 gildea>
@end example
-@node QuickURL
-@chapter QuickURL: Inserting URLs Based on Text at Point
-
-@vindex quickurl-url-file
-@findex quickurl
-@cindex URLs
-@kbd{M-x quickurl} can be used to insert a URL into a buffer based on
-the text at point. The URLs are stored in an external file defined by
-the variable @code{quickurl-url-file} as a list of either cons cells of
-the form @code{(@var{key} . @var{URL})} or
-lists of the form @code{(@var{key} @var{URL} @var{comment})}. These
-specify that @kbd{M-x quickurl} should insert @var{URL} if the word
-@var{key} is at point, for example:
-
-@example
-(("FSF" "https://www.fsf.org/" "The Free Software Foundation")
- ("emacs" . "https://www.gnu.org/software/emacs/"))
-@end example
-
-@findex quickurl-add-url
-@findex quickurl-list
-@kbd{M-x quickurl-add-url} can be used to add a new @var{key}/@var{URL}
-pair. @kbd{M-x quickurl-list} provides interactive editing of the URL
-list.
-
@node Tempo
@chapter Tempo: Flexible Template Insertion
diff --git a/doc/misc/calc.texi b/doc/misc/calc.texi
index 9bda6af1c5b..98f59b89c01 100644
--- a/doc/misc/calc.texi
+++ b/doc/misc/calc.texi
@@ -1,7 +1,7 @@
\input texinfo @c -*- mode: texinfo; coding: utf-8 -*-
+@setfilename ../../info/calc.info
@comment %**start of header (This is for running Texinfo on a region.)
@c smallbook
-@setfilename ../../info/calc.info
@c [title]
@settitle GNU Emacs Calc Manual
@include docstyle.texi
diff --git a/doc/misc/ede.texi b/doc/misc/ede.texi
index af8e2153dd8..9867883b24a 100644
--- a/doc/misc/ede.texi
+++ b/doc/misc/ede.texi
@@ -1551,14 +1551,14 @@ This is a URL to be sent to a web site for documentation.
@item :web-site-directory @*
A directory where web pages can be found by Emacs.
-For remote locations use a path compatible with ange-ftp or EFS@.
+For remote locations use a path compatible with ange-ftp.
You can also use TRAMP for use with rcp & scp.
@item :web-site-file @*
A file which contains the website for this project.
This file can be relative to slot @code{web-site-directory}.
-This can be a local file, use ange-ftp, EFS, or TRAMP.
+This can be a local file, use ange-ftp or TRAMP.
@item :ftp-site
Type: @code{string} @*
diff --git a/doc/misc/ediff.texi b/doc/misc/ediff.texi
index 39b09b29b3f..cbc7556aa82 100644
--- a/doc/misc/ediff.texi
+++ b/doc/misc/ediff.texi
@@ -947,12 +947,14 @@ This function can also be invoked from the Menubar. However, in some
cases, the change will take place only after you execute one of the Ediff
commands, such as going to the next difference or redisplaying.
+@c --> The below can be revisited once the toolbar has been ported to Emacs:
+@ignore
@item ediff-toggle-use-toolbar
@findex ediff-toggle-use-toolbar
-Available in XEmacs only. The Ediff toolbar provides quick access to some
-of the common Ediff functions. This function toggles the display of the
-toolbar. If invoked from the menubar, the function may take sometimes
-effect only after you execute an Ediff command, such as going to the next
+The Ediff toolbar provides quick access to some of the common Ediff
+functions. This function toggles the display of the toolbar. If
+invoked from the menubar, the function may take sometimes effect only
+after you execute an Ediff command, such as going to the next
difference.
@item ediff-use-toolbar-p
@@ -961,6 +963,7 @@ The use of the toolbar can also be specified via the variable
@code{ediff-use-toolbar-p} (default is @code{t}). This variable can be set
only in @file{.emacs}: do @strong{not} change it interactively. Use the
function @code{ediff-toggle-use-toolbar} instead.
+@end ignore
@item ediff-revert-buffers-then-recompute-diffs
@findex ediff-revert-buffers-then-recompute-diffs
diff --git a/doc/misc/efaq-w32.texi b/doc/misc/efaq-w32.texi
index 084b5a3254e..46c257e42e5 100644
--- a/doc/misc/efaq-w32.texi
+++ b/doc/misc/efaq-w32.texi
@@ -930,9 +930,9 @@ an indication of whether the font is outline (.TTF, .ATM) or raster (.FON)
based when fonts are listed, which may let you differentiate between two
fonts with the same name and different technologies.
-Starting with Emacs 23, the preferred font name format will be moving
-to the simpler and more flexible fontconfig format. XLFD names will
-continue to be supported for backward compatibility.
+Starting with Emacs 23, the preferred font name format is the simpler
+and more flexible fontconfig format. XLFD names will continue to be
+supported for backward compatibility.
@example
XLFD: -*-Courier New-normal-r-*-*-13-*-*-*-c-*-iso8859-1
diff --git a/doc/misc/efaq.texi b/doc/misc/efaq.texi
index a98c4b6a614..c29e4fe4875 100644
--- a/doc/misc/efaq.texi
+++ b/doc/misc/efaq.texi
@@ -2891,20 +2891,20 @@ and cause an annoying delay in display, so several features exist to
work around this.
@cindex Just-In-Time syntax highlighting
-In Emacs 21 and later, turning on @code{font-lock-mode} automatically
-activates the new @dfn{Just-In-Time fontification} provided by
-@code{jit-lock-mode}. @code{jit-lock-mode} defers the fontification of
-portions of buffer until you actually need to see them, and can also
-fontify while Emacs is idle. This makes display of the visible portion
-of a buffer almost instantaneous. For details about customizing
-@code{jit-lock-mode}, type @kbd{C-h f jit-lock-mode @key{RET}}.
+Turning on @code{font-lock-mode} automatically activates
+@dfn{Just-In-Time fontification} provided by @code{jit-lock-mode}.
+@code{jit-lock-mode} defers the fontification of portions of buffer
+until you actually need to see them, and can also fontify while Emacs
+is idle. This makes display of the visible portion of a buffer almost
+instantaneous. For details about customizing @code{jit-lock-mode},
+type @kbd{C-h f jit-lock-mode @key{RET}}.
@cindex Levels of syntax highlighting
@cindex Decoration level, in @code{font-lock-mode}
-In versions of Emacs before 21, different levels of decoration are
-available, from slight to gaudy. More decoration means you need to wait
-more time for a buffer to be fontified (or a faster machine). To
-control how decorated your buffers should become, set the value of
+Different levels of decoration are available, from slight to gaudy.
+More decoration means you need to wait more time for a buffer to be
+fontified (or a faster machine). To control how decorated your
+buffers should become, set the value of
@code{font-lock-maximum-decoration} in your @file{.emacs} file, with a
@code{nil} value indicating default (usually minimum) decoration, and a
@code{t} value indicating the maximum decoration. For the gaudiest
@@ -2985,11 +2985,7 @@ Add the following line to your @file{.emacs} file:
In many systems, @code{ls} is aliased to @samp{ls --color}, which
prints using ANSI color escape sequences. Emacs includes the
@code{ansi-color} package, which lets Shell mode recognize these
-escape sequences. In Emacs 23.2 and later, the package is enabled by
-default; in earlier versions you can enable it by typing @kbd{M-x
-ansi-color-for-comint-mode} in the Shell buffer, or by adding
-@code{(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)} to
-your init file.
+escape sequences. It is enabled by default.
@node Fullscreen mode on MS-Windows
@section How can I start Emacs in fullscreen mode on MS-Windows?
diff --git a/doc/misc/emacs-mime.texi b/doc/misc/emacs-mime.texi
index 640712edf33..5f4e1a639be 100644
--- a/doc/misc/emacs-mime.texi
+++ b/doc/misc/emacs-mime.texi
@@ -403,9 +403,9 @@ This selects the function used to render @acronym{HTML}. The
predefined renderers are selected by the symbols @code{shr},
@code{gnus-w3m}, @code{w3m}@footnote{See
@uref{http://emacs-w3m.namazu.org/} for more information about
-emacs-w3m}, @code{links}, @code{lynx}, @code{w3m-standalone} or
-@code{html2text}. You can also specify a function, which will be
-called with a @acronym{MIME} handle as the argument.
+emacs-w3m}, @code{links}, @code{lynx}, or @code{w3m-standalone}. You
+can also specify a function, which will be called with a
+@acronym{MIME} handle as the argument.
@item mm-html-inhibit-images
@vindex mm-html-inhibit-images
diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi
index 9f9c88582f3..13f13163dd7 100644
--- a/doc/misc/eshell.texi
+++ b/doc/misc/eshell.texi
@@ -201,7 +201,7 @@ history and invoking commands in a script file.
* Aliases::
* History::
* Completion::
-* for loop::
+* Control Flow::
* Scripts::
@end menu
@@ -219,12 +219,18 @@ same name; if there is no match, it then tries to execute it as an
external command.
The semicolon (@code{;}) can be used to separate multiple command
-invocations on a single line. A command invocation followed by an
-ampersand (@code{&}) will be run in the background. Eshell has no job
-control, so you can not suspend or background the current process, or
-bring a background process into the foreground. That said, background
-processes invoked from Eshell can be controlled the same way as any
-other background process in Emacs.
+invocations on a single line. You can also separate commands with
+@code{&&} or @code{||}. When using @code{&&}, Eshell will execute the
+second command only if the first succeeds (i.e.@: has an exit
+status of 0); with @code{||}, Eshell will execute the second command
+only if the first fails.
+
+A command invocation followed by an ampersand (@code{&}) will be run
+in the background. Eshell has no job control, so you can not suspend
+or background the current process, or bring a background process into
+the foreground. That said, background processes invoked from Eshell
+can be controlled the same way as any other background process in
+Emacs.
@node Arguments
@section Arguments
@@ -884,14 +890,18 @@ command (excluding the command name itself).
@vindex $$
@item $$
-This is the result of the last command. In case of an external
-command, it is @code{t} or @code{nil}.
+This is the result of the last command. For external commands, it is
+@code{t} if the exit code was 0 or @code{nil} otherwise.
+@vindex eshell-lisp-form-nil-is-failure
@vindex $?
@item $?
This variable contains the exit code of the last command. If the last
command was a Lisp function, it is 0 for successful completion or 1
-otherwise.
+otherwise. If @code{eshell-lisp-form-nil-is-failure} is
+non-@code{nil}, then a command with a Lisp form, like
+@samp{(@var{command} @var{args}@dots{})}, that returns @code{nil} will
+set this variable to 2.
@vindex $COLUMNS
@vindex $LINES
@@ -1008,19 +1018,46 @@ command for which this function provides completions; you can also name
the function @code{pcomplete/MAJOR-MODE/COMMAND} to define completions
for a specific major mode.
-@node for loop
-@section @code{for} loop
+@node Control Flow
+@section Control Flow
Because Eshell commands can not (easily) be combined with lisp forms,
-Eshell provides a command-oriented @command{for}-loop for convenience.
-The syntax is as follows:
+Eshell provides command-oriented control flow statements for
+convenience.
-@example
-@code{for VAR in TOKENS @{ command invocation(s) @}}
-@end example
+Most of Eshell's control flow statements accept a @var{conditional}.
+This can take a few different forms. If @var{conditional} is a dollar
+expansion, the condition is satisfied if the result is a
+non-@code{nil} value. If @var{conditional} is a @samp{@{
+@var{subcommand} @}} or @samp{(@var{lisp form})}, the condition is
+satisfied if the command's exit status is 0.
+
+@table @code
+
+@item if @var{conditional} @{ @var{true-commands} @}
+@itemx if @var{conditional} @{ @var{true-commands} @} @{ @var{false-commands} @}
+Evaluate @var{true-commands} if @var{conditional} is satisfied;
+otherwise, evaluate @var{false-commands}.
+
+@item unless @var{conditional} @{ @var{false-commands} @}
+@itemx unless @var{conditional} @{ @var{false-commands} @} @{ @var{true-commands} @}
+Evaluate @var{false-commands} if @var{conditional} is not satisfied;
+otherwise, evaluate @var{true-commands}.
-where @samp{TOKENS} is a space-separated sequence of values of
-@var{VAR} for each iteration. This can even be the output of a
-command if @samp{TOKENS} is replaced with @samp{@{ command invocation @}}.
+@item while @var{conditional} @{ @var{commands} @}
+Repeatedly evaluate @var{commands} so long as @var{conditional} is
+satisfied.
+
+@item until @var{conditional} @{ @var{commands} @}
+Repeatedly evaluate @var{commands} until @var{conditional} is
+satisfied.
+
+@item for @var{var} in @var{list}@dots{} @{ @var{commands} @}
+Iterate over each element of of @var{list}, storing the element in
+@var{var} and evaluating @var{commands}. If @var{list} is not a list,
+treat it as a list of one element. If you specify multiple
+@var{lists}, this will iterate over each of them in turn.
+
+@end table
@node Scripts
@section Scripts
@@ -1811,11 +1848,6 @@ scrolls back.
@item Menu support was removed, but never put back
-@item Using C-p and C-n with rebind gets into a locked state
-
-This happened a few times in Emacs 21, but has been irreproducible
-since.
-
@item If an interactive process is currently running, @kbd{M-!} doesn't work
@item Use a timer instead of @code{sleep-for} when killing child processes
diff --git a/doc/misc/eudc.texi b/doc/misc/eudc.texi
index 7fd5add67ea..0037ba78d3b 100644
--- a/doc/misc/eudc.texi
+++ b/doc/misc/eudc.texi
@@ -292,7 +292,7 @@ LDAP:
(setopt eudc-server-hotlist
'(("" . bbdb)
("ldaps://ldap.gnu.org" . ldap)))
-(setopt 'ldap-host-parameters-alist
+(setopt ldap-host-parameters-alist
'(("ldaps://ldap.gnu.org"
base "ou=people,dc=gnu,dc=org"
binddn "gnu\\emacsuser"
@@ -346,10 +346,10 @@ configure EUDC for LDAP:
@lisp
(with-eval-after-load "message"
(define-key message-mode-map (kbd "TAB") 'eudc-expand-try-all))
-(setopt 'eudc-server-hotlist
+(setopt eudc-server-hotlist
'(("" . bbdb)
("ldaps://ldap.gnu.org" . ldap)))
-(setopt 'ldap-host-parameters-alist
+(setopt ldap-host-parameters-alist
'(("ldaps://ldap.gnu.org"
auth-source t)))
@end lisp
@@ -376,9 +376,9 @@ and the @file{.emacs} expressions become:
@lisp
(with-eval-after-load "message"
(define-key message-mode-map (kbd "TAB") 'eudc-expand-try-all))
-(setopt 'eudc-server-hotlist
+(setopt eudc-server-hotlist
'(("" . bbdb) ("" . ldap)))
-(setopt 'ldap-host-parameters-alist
+(setopt ldap-host-parameters-alist
'(("" auth-source t)))
@end lisp
@@ -423,11 +423,12 @@ all macOS versions since 10.0 (which was released 2001).
configurations.
@file{eudcb-mab.el} reverse engineers the format of the database file
-used by the macOS Contacts app, and accesses its contents directly.
-While this may promise some performance advantages, it comes at the
-cost of using an undocumented interface. Hence, users of
-@file{eudcb-mab.el} are recommended to double check the compatibility
-of @file{eudcb-mab.el} before upgrading to a new version of macOS.
+using the external command-line utility named contacts, which needs to
+be installed separately. While this may promise some performance
+advantages, it comes at the cost of using an undocumented interface.
+Hence, users of @file{eudcb-mab.el} are recommended to double check
+the compatibility of @file{eudcb-mab.el} and the required, external
+command-line utility before upgrading to a new version of macOS.
@file{eudcb-mab.el} is retained for backwards compatibility with
existing configurations, and may be removed in a future release.
diff --git a/doc/misc/gnus-faq.texi b/doc/misc/gnus-faq.texi
index 4923efb3dbe..6d09fd4ec96 100644
--- a/doc/misc/gnus-faq.texi
+++ b/doc/misc/gnus-faq.texi
@@ -1,7 +1,7 @@
@c \input texinfo @c -*-texinfo-*-
@c Uncomment 1st line before texing this file alone.
@c %**start of header
-@c Copyright (C) 1995, 2001--2022 Free Software Foundation, Inc.
+@c Copyright (C) 1995--2022 Free Software Foundation, Inc.
@c
@c @setfilename gnus-faq.info
@c @settitle Frequently Asked Questions
@@ -13,7 +13,6 @@
@section Frequently Asked Questions
@menu
-* FAQ - Changes::
* FAQ - Introduction:: About Gnus and this FAQ.
* FAQ 1 - Installation FAQ:: Installation of Gnus.
* FAQ 2 - Startup / Group buffer:: Start up questions and the
@@ -41,21 +40,6 @@ This is the new Gnus Frequently Asked Questions list.
Please submit features and suggestions to the
@email{ding@@gnus.org, ding list}.
-@node FAQ - Changes
-@subsection Changes
-
-
-
-@itemize @bullet
-
-@item
-2008-06-15: Adjust for message-fill-column. Add x-face-file.
-Clarify difference between ding and gnu.emacs.gnus. Remove
-reference to discontinued service.
-
-@item
-2006-04-15: Added tip on how to delete sent buffer on exit.
-@end itemize
@node FAQ - Introduction
@subsection Introduction
@@ -63,11 +47,11 @@ reference to discontinued service.
This is the Gnus Frequently Asked Questions list.
Gnus is a Usenet Newsreader and Electronic Mail User Agent implemented
-as a part of Emacs. It's been around in some form for almost a decade
-now, and has been distributed as a standard part of Emacs for much of
-that time. Gnus 5 is the latest (and greatest) incarnation. The
+as a part of Emacs. It's been around in some form since the early
+1990s, and has been distributed as a standard part of Emacs for much
+of that time. Gnus 5 is the latest (and greatest) incarnation. The
original version was called GNUS, and was written by Masanobu UMEDA@.
-When autumn crept up in '94, Lars Magne Ingebrigtsen grew bored and
+When autumn crept up in 1994, Lars Magne Ingebrigtsen grew bored and
decided to rewrite Gnus.
Its biggest strength is the fact that it is extremely
@@ -84,11 +68,6 @@ would like to thank Steve Baur and Per Abrahamsen for doing a wonderful
job with this FAQ before him. We would like to do the same: thanks,
Justin!
-This version is much nicer than the unofficial hypertext
-versions that are archived at Utrecht, Oxford, Smart Pages, Ohio
-State, and other FAQ archives. See the resources question below
-if you want information on obtaining it in another format.
-
The information contained here was compiled with the assistance
of the Gnus development mailing list, and any errors or
misprints are the Gnus team's fault, sorry.
@@ -98,11 +77,9 @@ misprints are the Gnus team's fault, sorry.
@menu
* FAQ 1-1:: What is the latest version of Gnus?
-* FAQ 1-2:: What's new in 5.10?
-* FAQ 1-3:: Where and how to get Gnus?
-* FAQ 1-4:: I sometimes read references to No Gnus and Oort Gnus,
+* FAQ 1-2:: Where and how to get Gnus?
+* FAQ 1-3:: I sometimes read references to No Gnus and Oort Gnus,
what are those?
-* FAQ 1-5:: Which version of Emacs do I need?
@end menu
@node FAQ 1-1
@@ -112,80 +89,28 @@ What is the latest version of Gnus?
@subsubheading Answer
-Jingle please: Gnus 5.10 is released, get it while it's
-hot! As well as the step in version number is rather
-small, Gnus 5.10 has tons of new features which you
-shouldn't miss. The current release (5.13) should be at
-least as stable as the latest release of the 5.8 series.
+The latest version of Gnus is bundled with Emacs.
@node FAQ 1-2
@subsubheading Question 1.2
-What's new in 5.10?
-
-@subsubheading Answer
-
-First of all, you should have a look into the file
-GNUS-NEWS in the toplevel directory of the Gnus tarball,
-there the most important changes are listed. Here's a
-short list of the changes I find especially
-important/interesting:
-
-@itemize @bullet
-
-@item
-Major rewrite of the Gnus agent, Gnus agent is now
-active by default.
-
-@item
-Many new article washing functions for dealing with
-ugly formatted articles.
-
-@item
-Anti Spam features.
-
-@item
-Message-utils now included in Gnus.
-
-@item
-New format specifiers for summary lines, e.g., %B for
-a complex trn-style thread tree.
-@end itemize
-
-@node FAQ 1-3
-@subsubheading Question 1.3
-
Where and how to get Gnus?
@subsubheading Answer
Gnus is bundled with Emacs.
-@node FAQ 1-4
-@subsubheading Question 1.4
+@node FAQ 1-3
+@subsubheading Question 1.3
I sometimes read references to No Gnus and Oort Gnus,
what are those?
@subsubheading Answer
-Oort Gnus was the name of the development version of
-Gnus, which became Gnus 5.10 in autumn 2003. No Gnus is
-the name of the current development version which will
-once become Gnus 5.12 or Gnus 6. (If you're wondering why
-not 5.11, the odd version numbers are normally used for
-the Gnus versions bundled with Emacs)
-
-@node FAQ 1-5
-@subsubheading Question 1.5
-
-Which version of Emacs do I need?
-
-@subsubheading Answer
-
-Gnus 5.13 requires an Emacs version that is greater than or equal
-to Emacs 23.1, although there are some features that
-only work on Emacs 24.
+Oort Gnus was the name of the development version of Gnus, which
+became Gnus 5.10 in autumn 2003. No Gnus was the name of the
+development version that became Gnus 5.12.
@node FAQ 2 - Startup / Group buffer
@subsection Startup / Group buffer
@@ -718,9 +643,8 @@ in @file{~/.gnus.el} to load enough old articles to prevent teared threads, repl
all articles (Warning: Both settings enlarge the amount of data which is
fetched when you enter a group and slow down the process of entering a group).
-If you already use Gnus 5.10, you can say
-@samp{/o N}
-In summary buffer to load the last N messages, this feature is not available in 5.8.8
+You can say @samp{/o N} in the summary buffer to load the last N
+messages.
If you don't want all old messages, but the parent of the message you're just reading,
you can say @samp{^}, if you want to retrieve the whole thread
@@ -820,11 +744,10 @@ Can I use some other browser than w3m to render my HTML-mails?
@subsubheading Answer
-Only if you use Gnus 5.10 or younger. In this case you've got the
-choice between shr, w3m, links, lynx and html2text, which
-one is used can be specified in the variable
-mm-text-html-renderer, so if you want links to render your
-mail say
+You've got the choice between @samp{shr}, @samp{w3m}, @samp{links},
+and @samp{lynx}. Which one is used is specified in the variable
+@code{mm-text-html-renderer}, so if you want links to render your
+mail, say:
@example
(setq mm-text-html-renderer 'links)
@@ -847,8 +770,7 @@ long lines'' (@samp{W w}), ``Decode ROT13''
the dumb quoting used by many users of Microsoft products
(@samp{W Y f} gives you full deuglify.
See @samp{W Y C-h} or have a look at the menus for
-other deuglifications). Outlook deuglify is only available since
-Gnus 5.10.
+other deuglifications).
@node FAQ 4-9
@subsubheading Question 4.9
@@ -1038,7 +960,7 @@ you'll find useful things like positioning the cursor and
tabulators which allow you a summary in table form, but
sadly hard tabulators are broken in 5.8.8.
-Since 5.10, Gnus offers you some very nice new specifiers,
+Gnus offers you some very nice new specifiers,
e.g., %B which draws a thread-tree and %&user-date which
gives you a date where the details are dependent of the
articles age. Here's an example which uses both:
@@ -1245,7 +1167,7 @@ How to set stuff like From, Organization, Reply-To, signature...?
@subsubheading Answer
There are other ways, but you should use posting styles
-for this. (See below why).
+for this. (See below why.)
This example should make the syntax clear:
@example
@@ -1329,19 +1251,14 @@ Is there a spell-checker? Perhaps even on-the-fly spell-checking?
@subsubheading Answer
-You can use ispell.el to spell-check stuff in Emacs. So the
-first thing to do is to make sure that you've got either
-@uref{https://www.cs.hmc.edu/~geoff/ispell.html, ispell}
-or @uref{http://aspell.net, aspell}
-installed and in your Path. Then you need
-ispell.el
-and for on-the-fly spell-checking
-@uref{https://www-sop.inria.fr/members/Manuel.Serrano/flyspell/flyspell.html, flyspell.el}.
-Ispell.el is shipped with Emacs,
-flyspell.el is shipped with Emacs, so there should be no need to install them
-manually.
+You can use ispell.el to spell-check stuff in Emacs, and flyspell.el
+for on-the-fly spell-checking. So the first thing to do is to make
+sure that you've got either
+@uref{https://hunspell.github.io/, hunspell},
+@uref{https://www.cs.hmc.edu/~geoff/ispell.html, ispell} or
+@uref{http://aspell.net, aspell} installed and in your Path.
-Ispell.el assumes you use ispell, if you choose aspell say
+Ispell.el assumes you use ispell. If you use aspell say
@example
(setq ispell-program-name "aspell")
@@ -1494,14 +1411,14 @@ Now you only have to tell Gnus to include the X-face in your postings by saying
@end example
@noindent
-in @file{~/.gnus.el}. If you use Gnus 5.10, you can simply add an entry
+in @file{~/.gnus.el}. You can add an entry
@example
(x-face-file "~/.xface")
@end example
@noindent
-to gnus-posting-styles.
+to @code{gnus-posting-styles}.
@node FAQ 5-9
@subsubheading Question 5.9
@@ -1519,21 +1436,6 @@ Put this in @file{~/.gnus.el}:
@end example
@noindent
-if you already use Gnus 5.10, if you still use 5.8.8 or
-5.9 try this instead:
-
-@example
-(with-eval-after-load "gnus-msg"
- (unless (boundp 'gnus-confirm-mail-reply-to-news)
- (defadvice gnus-summary-reply (around reply-in-news activate)
- "Request confirmation when replying to news."
- (interactive)
- (when (or (not (gnus-news-group-p gnus-newsgroup-name))
- (y-or-n-p "Really reply by mail to article author?"))
- ad-do-it))))
-@end example
-@noindent
-
@node FAQ 5-10
@subsubheading Question 5.10
@@ -1541,14 +1443,7 @@ How to tell Gnus not to generate a sender header?
@subsubheading Answer
-Since 5.10 Gnus doesn't generate a sender header by
-default. For older Gnus' try this in @file{~/.gnus.el}:
-
-@example
-(with-eval-after-load "message"
- (add-to-list 'message-syntax-checks '(sender . disabled)))
-@end example
-@noindent
+Gnus doesn't generate a sender header by default.
@node FAQ 5-11
@subsubheading Question 5.11
@@ -1729,7 +1624,7 @@ more then one article."
You can now say @samp{M-x
my-archive-article} in summary buffer to
archive the article under the cursor in a nnml
-group. (Change nnml to your preferred back end)
+group. (Change nnml to your preferred back end.)
Of course you can also make sure the cache is enabled by saying
@@ -1756,7 +1651,7 @@ if you found the posting there, tell Google to display
the raw message, look for the message-id, and say
@samp{M-^ the@@message.id @key{RET}} in a
summary buffer.
-Since Gnus 5.10 there's also a Gnus interface for
+There's a Gnus interface for
groups.google.com which you can call with
@samp{G W}) in group buffer.
@@ -1770,25 +1665,6 @@ instead. Further on there are the
gnus-summary-limit-to-foo functions, which can help you,
too.
-Of course you can also use grep to search through your
-local mail, but this is both slow for big archives and
-inconvenient since you are not displaying the found mail
-in Gnus. Here nnir comes into action. Nnir is a front end
-to search engines like swish-e or swish++ and
-others. You index your mail with one of those search
-engines and with the help of nnir you can search through
-the indexed mail and generate a temporary group with all
-messages which met your search criteria. If this sounds
-cool to you, get nnir.el from
-@c FIXME Isn't this file in Gnus?
-@ignore
-@c Dead link 2013/7.
-@uref{ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/}
-or
-@end ignore
-@uref{ftp://ftp.is.informatik.uni-duisburg.de/pub/src/emacs/}.
-Instructions on how to use it are at the top of the file.
-
@node FAQ 6-4
@subsubheading Question 6.4
@@ -1937,16 +1813,9 @@ So what was this thing about the Agent?
The Gnus agent is part of Gnus, it allows you to fetch
mail and news and store them on disk for reading them
later when you're offline. It kind of mimics offline
-newsreaders like Forte Agent. If you want to use
-the Agent place the following in @file{~/.gnus.el} if you are
-still using 5.8.8 or 5.9 (it's the default since 5.10):
+newsreaders like Forte Agent. It is enabled by default.
-@example
-(setq gnus-agent t)
-@end example
-@noindent
-
-Now you've got to select the servers whose groups can be
+You've got to select the servers whose groups can be
stored locally. To do this, open the server buffer
(that is press @samp{^} while in the
group buffer). Now select a server by moving point to
@@ -2051,10 +1920,9 @@ I can't find anything in the Gnus manual about X
@subsubheading Answer
There's not only the Gnus manual but also the manuals for message,
-emacs-mime, sieve, EasyPG Assistant, and pgg. Those packages are
-distributed with Gnus and used by Gnus but aren't really part of core
-Gnus, so they are documented in different info files, you should have
-a look in those manuals, too.
+emacs-mime, sieve, and EasyPG Assistant. Those packages are
+distributed with Emacs and used by Gnus. They are documented in
+separate info files, so you should have a look in those manuals, too.
@node FAQ 8-3
@subsubheading Question 8.3
@@ -2161,12 +2029,12 @@ How to speed up the process of entering a group?
@subsubheading Answer
-A speed killer is setting the variable
-gnus-fetch-old-headers to anything different from @code{nil},
-so don't do this if speed is an issue.
+A speed killer is setting the variable @code{gnus-fetch-old-headers}
+to anything different from @code{nil}, so don't do this if speed is an
+issue.
-You could increase the value of gc-cons-threshold
-by saying something like
+You could increase the value of @code{gc-cons-threshold} by saying
+something like:
@example
(setq gc-cons-threshold 3500000)
@@ -2204,10 +2072,6 @@ between core Gnus and the real NNTP-, POP3-, IMAP- or
whatever-server which offers Gnus a standardized interface
to functions like "get message", "get Headers" etc.
-@item Emacs
-When the term Emacs is used in this FAQ, it means GNU
-Emacs.
-
@item Message
In this FAQ message means either a mail or a posting to a
Usenet Newsgroup or to some other fancy back end, no matter
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 6b5173d3c2f..acc70a260f3 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -883,10 +883,7 @@ History
* Gnus Versions:: What Gnus versions have been released.
* Why?:: What's the point of Gnus?
-* Compatibility:: Just how compatible is Gnus with @sc{gnus}?
* Conformity:: Gnus tries to conform to all standards.
-* Emacsen:: Gnus can be run on a few modern Emacsen.
-* Gnus Development:: How Gnus is developed.
* Contributors:: Oodles of people.
* New Features:: Pointers to some of the new stuff in Gnus.
@@ -1806,8 +1803,7 @@ long as Gnus is active.
@end menu
You can customize the Group Mode tool bar, see @kbd{M-x
-customize-apropos @key{RET} gnus-group-tool-bar}. This feature is only
-available in Emacs.
+customize-apropos @key{RET} gnus-group-tool-bar}.
The tool bar icons are now (de)activated correctly depending on the
cursor position. Therefore, moving around in the Group Buffer is
@@ -4839,8 +4835,7 @@ group buffer (@pxref{Selecting a Group}).
You can have as many summary buffers open as you wish.
You can customize the Summary Mode tool bar, see @kbd{M-x
-customize-apropos @key{RET} gnus-summary-tool-bar}. This feature is only
-available in Emacs.
+customize-apropos @key{RET} gnus-summary-tool-bar}.
@kindex v @r{(Summary)}
@cindex keys, reserved for users (Summary)
@@ -8621,14 +8616,6 @@ uuencoded files that have had trailing spaces deleted.
@vindex gnus-uu-pre-uudecode-hook
Hook run before sending a message to @code{uudecode}.
-@item gnus-uu-view-with-metamail
-@vindex gnus-uu-view-with-metamail
-@cindex metamail
-Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
-commands defined by the rule variables and just fudge a @acronym{MIME}
-content type based on the file name. The result will be fed to
-@code{metamail} for viewing.
-
@item gnus-uu-save-in-digest
@vindex gnus-uu-save-in-digest
Non-@code{nil} means that @code{gnus-uu}, when asked to save without
@@ -9364,9 +9351,6 @@ Use @uref{https://almende.github.io/chap-links-library/, CHAP Links}.
@item lynx
Use @uref{https://lynx.browser.org/, Lynx}.
-@item html2text
-Use html2text---a simple @acronym{HTML} converter included with Gnus.
-
@end table
@item W D F
@@ -11576,8 +11560,8 @@ things to work:
To handle @acronym{PGP} and @acronym{PGP/MIME} messages, you have to
install an OpenPGP implementation such as GnuPG@. The Lisp interface
to GnuPG included with Emacs is called EasyPG (@pxref{Top, ,EasyPG,
-epa, EasyPG Assistant user's manual}), but PGG (@pxref{Top, ,PGG, pgg,
-PGG Manual}), and Mailcrypt are also supported.
+epa, EasyPG Assistant user's manual}), but Mailcrypt is also
+supported.
@item
To handle @acronym{S/MIME} message, you need to install OpenSSL@. OpenSSL 0.9.6
@@ -11615,18 +11599,16 @@ public-key matching the @samp{From:} header as the recipient;
@item mml1991-use
@vindex mml1991-use
Symbol indicating elisp interface to OpenPGP implementation for
-@acronym{PGP} messages. The default is @code{epg}, but @code{pgg},
-and @code{mailcrypt} are also supported although
-deprecated. By default, Gnus uses the first available interface in
-this order.
+@acronym{PGP} messages. The default is @code{epg}, but
+@code{mailcrypt} is also supported although deprecated. By default,
+Gnus uses the first available interface in this order.
@item mml2015-use
@vindex mml2015-use
Symbol indicating elisp interface to OpenPGP implementation for
@acronym{PGP/MIME} messages. The default is @code{epg}, but
-@code{pgg}, and @code{mailcrypt} are also supported
-although deprecated. By default, Gnus uses the first available
-interface in this order.
+@code{mailcrypt} is also supported although deprecated. By default,
+Gnus uses the first available interface in this order.
@end table
@@ -15440,8 +15422,6 @@ files. If a positive number, delete files older than number of days
(the deletion will only happen when receiving new mail). You may also
set @code{mail-source-delete-incoming} to @code{nil} and call
@code{mail-source-delete-old-incoming} from a hook or interactively.
-@code{mail-source-delete-incoming} defaults to @code{10} in alpha Gnusae
-and @code{2} in released Gnusae. @xref{Gnus Development}.
@item mail-source-delete-old-incoming-confirm
@vindex mail-source-delete-old-incoming-confirm
@@ -17357,11 +17337,6 @@ changes to a wiki (e.g., @url{https://cliki.net/site/recent-changes}).
@acronym{RSS} has a quite regular and nice interface, and it's
possible to get the information Gnus needs to keep groups updated.
-Note: you had better use Emacs which supports the @code{utf-8} coding
-system because @acronym{RSS} uses UTF-8 for encoding non-@acronym{ASCII}
-text by default. It is also used by default for non-@acronym{ASCII}
-group names.
-
@kindex G R @r{(Group)}
Use @kbd{G R} from the group buffer to subscribe to a feed---you will be
prompted for the location, the title and the description of the feed.
@@ -17410,7 +17385,7 @@ The directory where @code{nnrss} stores its files. The default is
@vindex nnrss-file-coding-system
The coding system used when reading and writing the @code{nnrss} groups
data files. The default is the value of
-@code{mm-universal-coding-system} (which defaults to @code{emacs-mule}).
+@code{mm-universal-coding-system} (which defaults to @code{utf-8-emacs}).
@item nnrss-ignore-article-fields
@vindex nnrss-ignore-article-fields
@@ -17518,16 +17493,16 @@ If you have a directory that has lots of articles in separate files in
it, you might treat it as a newsgroup. The files have to have numerical
names, of course.
-This might be an opportune moment to mention @code{ange-ftp} (and its
-successor @code{efs}), that most wonderful of all wonderful Emacs
-packages. When I wrote @code{nndir}, I didn't think much about it---a
-back end to read directories. Big deal.
+This might be an opportune moment to mention @code{ange-ftp}, that
+most wonderful of all wonderful Emacs packages. When I wrote
+@code{nndir}, I didn't think much about it---a back end to read
+directories. Big deal.
@code{ange-ftp} changes that picture dramatically. For instance, if you
enter the @code{ange-ftp} file name
@file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
-@code{ange-ftp} or @code{efs} will actually allow you to read this
-directory over at @samp{sina} as a newsgroup. Distributed news ahoy!
+@code{ange-ftp} will actually allow you to read this directory over at
+@samp{sina} as a newsgroup. Distributed news ahoy!
@code{nndir} will use @acronym{NOV} files if they are present.
@@ -21962,7 +21937,7 @@ you can set up a local @acronym{IMAP} server, which you then access via
@code{nnimap}. This is a rather massive setup for accessing some mbox
files, so just change to MH or Maildir already... However, if you're
really, really passionate about using mbox, you might want to look into
-the package @file{mairix.el}, which comes with Emacs 23.
+the package @file{mairix.el}, which comes with Emacs.
@node What nnmairix does
@subsection What nnmairix does
@@ -24216,8 +24191,7 @@ people have started putting nonsense addresses into their @code{From}
lines. I think this is counterproductive---it makes it difficult for
people to send you legitimate mail in response to things you write, as
well as making it difficult to see who wrote what. This rewriting may
-perhaps be a bigger menace than the unsolicited commercial email itself
-in the end.
+perhaps be a bigger menace than the spam itself in the end.
The biggest problem I have with email spam is that it comes in under
false pretenses. I press @kbd{g} and Gnus merrily informs me that I
@@ -24243,33 +24217,13 @@ This is annoying. Here's what you can do about it.
@cindex UCE
@cindex unsolicited commercial email
-First, some background on spam.
-
-If you have access to e-mail, you are familiar with spam (technically
-termed @acronym{UCE}, Unsolicited Commercial E-mail). Simply put, it
-exists because e-mail delivery is very cheap compared to paper mail,
-so only a very small percentage of people need to respond to an UCE to
-make it worthwhile to the advertiser. Ironically, one of the most
-common spams is the one offering a database of e-mail addresses for
-further spamming. Senders of spam are usually called @emph{spammers},
-but terms like @emph{vermin}, @emph{scum}, @emph{sociopaths}, and
-@emph{morons} are in common use as well.
-
Spam comes from a wide variety of sources. It is simply impossible to
-dispose of all spam without discarding useful messages. A good
-example is the TMDA system, which requires senders
-unknown to you to confirm themselves as legitimate senders before
-their e-mail can reach you. Without getting into the technical side
-of TMDA, a downside is clearly that e-mail from legitimate sources may
-be discarded if those sources can't or won't confirm themselves
-through the TMDA system. Another problem with TMDA is that it
-requires its users to have a basic understanding of e-mail delivery
-and processing.
+dispose of all spam without discarding useful messages.
The simplest approach to filtering spam is filtering, at the mail
server or when you sort through incoming mail. If you get 200 spam
-messages per day from @samp{random-address@@vmadmin.com}, you block
-@samp{vmadmin.com}. If you get 200 messages about @samp{VIAGRA}, you
+messages per day from @samp{random-address@@example.org}, you block
+@samp{example.org}. If you get 200 messages about @samp{VIAGRA}, you
discard all messages with @samp{VIAGRA} in the message. If you get
lots of spam from Bulgaria, for example, you try to filter all mail
from Bulgarian IPs.
@@ -24380,7 +24334,7 @@ In my experience, this will sort virtually everything into the right
group. You still have to check the @samp{spam} group from time to time to
check for legitimate mail, though. If you feel like being a good net
citizen, you can even send off complaints to the proper authorities on
-each unsolicited commercial email---at your leisure.
+each spam---at your leisure.
This works for me. It allows people an easy way to contact me (they can
just press @kbd{r} in the usual way), and I'm not bothered at all with
@@ -24396,8 +24350,8 @@ Be careful with this approach. Spammers are wise to it.
@cindex Vipul's Razor
@cindex DCC
-The days where the hints in the previous section were sufficient in
-avoiding spam are coming to an end. There are many tools out there
+The days where the hints in the previous section were sufficient to
+avoid spam are over. There are many tools out there
that claim to reduce the amount of spam you get. This section could
easily become outdated fast, as new products replace old, but
fortunately most of these tools seem to have similar interfaces. Even
@@ -24478,7 +24432,7 @@ spam. And here is the nifty function:
@subsection Hashcash
@cindex hashcash
-A novel technique to fight spam is to require senders to do something
+One technique to fight spam is to require senders to do something
costly and demonstrably unique for each message they send. This has
the obvious drawback that you cannot rely on everyone in the world
using this technique, since it is not part of the Internet standards,
@@ -25135,8 +25089,8 @@ The @code{gnus-article-sort-by-chars} entry simplifies detection of
false positives for me. I receive lots of worms (sweN, @dots{}), that all
have a similar size. Grouping them by size (i.e., chars) makes finding
other false positives easier. (Of course worms aren't @i{spam}
-(@acronym{UCE}, @acronym{UBE}) strictly speaking. Anyhow, bogofilter is
-an excellent tool for filtering those unwanted mails for me.)
+strictly speaking. Anyhow, bogofilter is an excellent tool for
+filtering those unwanted mails for me.)
@item @b{Ham folders:}
@@ -26778,7 +26732,7 @@ on finding a separator line between the head and the body. If this
variable is @code{nil}, there is no upper read bound. If it is
@code{t}, the back ends won't try to read the articles piece by piece,
but read the entire articles. This makes sense with some versions of
-@code{ange-ftp} or @code{efs}.
+@code{ange-ftp}.
@item nnheader-head-chop-length
@vindex nnheader-head-chop-length
@@ -26917,10 +26871,7 @@ renamed it back again to ``Gnus''. But in mixed case. ``Gnus'' vs.
@menu
* Gnus Versions:: What Gnus versions have been released.
* Why?:: What's the point of Gnus?
-* Compatibility:: Just how compatible is Gnus with @sc{gnus}?
* Conformity:: Gnus tries to conform to all standards.
-* Emacsen:: Gnus can be run on a few modern Emacsen.
-* Gnus Development:: How Gnus is developed.
* Contributors:: Oodles of people.
* New Features:: Pointers to some of the new stuff in Gnus.
@end menu
@@ -27000,71 +26951,6 @@ every one of you to explore and invent.
May Gnus never be complete. @kbd{C-u 100 M-x all-hail-emacs}.
-@node Compatibility
-@subsection Compatibility
-
-@cindex compatibility
-Gnus was designed to be fully compatible with @sc{gnus}. Almost all key
-bindings have been kept. More key bindings have been added, of course,
-but only in one or two obscure cases have old bindings been changed.
-
-Our motto is:
-@quotation
-@cartouche
-@center In a cloud bones of steel.
-@end cartouche
-@end quotation
-
-All commands have kept their names. Some internal functions have changed
-their names.
-
-The @code{gnus-uu} package has changed drastically. @xref{Decoding
-Articles}.
-
-One major compatibility question is the presence of several summary
-buffers. All variables relevant while reading a group are
-buffer-local to the summary buffer they belong in. Although many
-important variables have their values copied into their global
-counterparts whenever a command is executed in the summary buffer, this
-change might lead to incorrect values being used unless you are careful.
-
-All code that relies on knowledge of @sc{gnus} internals will probably
-fail. To take two examples: Sorting @code{gnus-newsrc-alist} (or
-changing it in any way, as a matter of fact) is strictly verboten. Gnus
-maintains a hash table that points to the entries in this alist (which
-speeds up many functions), and changing the alist directly will lead to
-peculiar results.
-
-@cindex hilit19
-@cindex highlighting
-Old hilit19 code does not work at all. In fact, you should probably
-remove all hilit code from all Gnus hooks
-(@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}).
-Gnus provides various integrated functions for highlighting. These are
-faster and more accurate. To make life easier for everybody, Gnus will
-by default remove all hilit calls from all hilit hooks. Uncleanliness!
-Away!
-
-Packages like @code{expire-kill} will no longer work. As a matter of
-fact, you should probably remove all old @sc{gnus} packages (and other
-code) when you start using Gnus. More likely than not, Gnus already
-does what you have written code to make @sc{gnus} do. (Snicker.)
-
-Even though old methods of doing things are still supported, only the
-new methods are documented in this manual. If you detect a new method of
-doing something while reading this manual, that does not mean you have
-to stop doing it the old way.
-
-Gnus understands all @sc{gnus} startup files.
-
-@findex gnus-bug
-@cindex reporting bugs
-@cindex bugs
-Overall, a casual user who hasn't written much code that depends on
-@sc{gnus} internals should suffer no problems. If problems occur,
-please let me know by issuing that magic command @kbd{M-x gnus-bug}.
-
-
@node Conformity
@subsection Conformity
@@ -27147,79 +27033,6 @@ mentioned above, don't hesitate to drop a note to Gnus Towers and let us
know.
-@node Emacsen
-@subsection Emacsen
-@cindex Emacsen
-@cindex Mule
-@cindex Emacs
-
-This version of Gnus should work on:
-
-@itemize @bullet
-
-@item
-Emacs 23.1 and up.
-
-@end itemize
-
-This Gnus version will absolutely not work on any Emacsen older than
-that. Not reliably, at least. Older versions of Gnus may work on older
-Emacs versions. Particularly, Gnus 5.10.8 should also work on Emacs
-20.7.
-
-@c No-merge comment: The paragraph added in v5-10 here must not be
-@c synced here!
-
-@node Gnus Development
-@subsection Gnus Development
-
-Gnus is developed in a two-phased cycle. The first phase involves much
-discussion on the development mailing list @samp{ding@@gnus.org}, where people
-propose changes and new features, post patches and new back ends. This
-phase is called the @dfn{alpha} phase, since the Gnusae released in this
-phase are @dfn{alpha releases}, or (perhaps more commonly in other
-circles) @dfn{snapshots}. During this phase, Gnus is assumed to be
-unstable and should not be used by casual users. Gnus alpha releases
-have names like ``Oort Gnus'' and ``No Gnus''. @xref{Gnus Versions}.
-
-After futzing around for 10--100 alpha releases, Gnus is declared
-@dfn{frozen}, and only bug fixes are applied. Gnus loses the prefix,
-and is called things like ``Gnus 5.10.1'' instead. Normal people are
-supposed to be able to use these, and these are mostly discussed on the
-@samp{gnu.emacs.gnus} newsgroup. This newgroup is mirrored to the
-mailing list @samp{info-gnus-english@@gnu.org} which is carried on Gmane
-as @samp{gmane.emacs.gnus.user}. These releases are finally integrated
-in Emacs.
-
-@cindex Incoming*
-@vindex mail-source-delete-incoming
-Some variable defaults differ between alpha Gnusae and released Gnusae,
-in particular, @code{mail-source-delete-incoming}. This is to prevent
-lossage of mail if an alpha release hiccups while handling the mail.
-@xref{Mail Source Customization}.
-
-The division of discussion between the ding mailing list and the Gnus
-newsgroup is not purely based on publicity concerns. It's true that
-having people write about the horrible things that an alpha Gnus release
-can do (sometimes) in a public forum may scare people off, but more
-importantly, talking about new experimental features that have been
-introduced may confuse casual users. New features are frequently
-introduced, fiddled with, and judged to be found wanting, and then
-either discarded or totally rewritten. People reading the mailing list
-usually keep up with these rapid changes, while people on the newsgroup
-can't be assumed to do so.
-
-So if you have problems with or questions about the alpha versions,
-direct those to the ding mailing list @samp{ding@@gnus.org}. This list
-is also available on Gmane as @samp{gmane.emacs.gnus.general}.
-
-@cindex Incoming*
-@vindex mail-source-delete-incoming
-Some variable defaults differ between alpha Gnusae and released Gnusae,
-in particular, @code{mail-source-delete-incoming}. This is to prevent
-lossage of mail if an alpha release hiccups while handling the mail.
-@xref{Mail Source Customization}.
-
@node Contributors
@subsection Contributors
@cindex contributors
@@ -29797,19 +29610,6 @@ Ahem.
Make sure your computer is switched on.
@item
-Make sure that you really load the current Gnus version. If you have
-been running @sc{gnus}, you need to exit Emacs and start it up again before
-Gnus will work.
-
-@item
-Try doing an @kbd{M-x gnus-version}. If you get something that looks
-like @c
-@samp{Gnus v5.13} @c Adjust ../Makefile.in if you change this line!
-@c
-you have the right files loaded. Otherwise you have some old @file{.el}
-files lying around. Delete these.
-
-@item
Read the help group (@kbd{G h} in the group buffer) for a
@acronym{FAQ} and a how-to.
@@ -29817,7 +29617,7 @@ Read the help group (@kbd{G h} in the group buffer) for a
@vindex max-lisp-eval-depth
Gnus works on many recursive structures, and in some extreme (and very
rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at
-you. If this happens to you, set @code{max-lisp-eval-depth} to 500 or
+you. If this happens to you, set @code{max-lisp-eval-depth} to 2000 or
something like that.
@end enumerate
@@ -29828,10 +29628,9 @@ If all else fails, report the problem as a bug.
@findex gnus-bug
If you find a bug in Gnus, you can report it with the @kbd{M-x
-gnus-bug} command. @kbd{M-x set-variable @key{RET} debug-on-error
-@key{RET} t @key{RET}}, and send me the backtrace. I will fix bugs,
-but I can only fix them if you send me a precise description as to how
-to reproduce the bug.
+gnus-bug} command. @kbd{M-x toggle-debug-on-error}, and send me the
+backtrace. I will fix bugs, but I can only fix them if you send me a
+precise description as to how to reproduce the bug.
You really can never be too detailed in a bug report. Always use the
@kbd{M-x gnus-bug} command when you make bug reports, even if it creates
@@ -29862,7 +29661,7 @@ edebug. Debugging Lisp code is documented in the Elisp manual
(@pxref{Debugging, , Debugging Lisp Programs, elisp, The GNU Emacs
Lisp Reference Manual}). To get you started with edebug, consider if
you discover some weird behavior when pressing @kbd{c}, the first
-step is to do @kbd{C-h k c} and click on the hyperlink (Emacs only) in
+step is to do @kbd{C-h k c} and click on the hyperlink in
the documentation buffer that leads you to the function definition,
then press @kbd{M-x edebug-defun @key{RET}} with point inside that function,
return to Gnus and press @kbd{c} to invoke the code. You will be
@@ -29874,7 +29673,7 @@ evaluate expressions using @kbd{M-:} or inspect variables using
@cindex elp
@cindex profile
@cindex slow
-Sometimes, a problem do not directly generate an elisp error but
+Sometimes, a problem do not directly generate an Emacs Lisp error but
manifests itself by causing Gnus to be very slow. In these cases, you
can use @kbd{M-x toggle-debug-on-quit} and press @kbd{C-g} when things are
slow, and then try to analyze the backtrace (repeating the procedure
diff --git a/doc/misc/htmlfontify.texi b/doc/misc/htmlfontify.texi
index 0ab000b70f1..fadc6a5cbe3 100644
--- a/doc/misc/htmlfontify.texi
+++ b/doc/misc/htmlfontify.texi
@@ -10,8 +10,7 @@
This manual documents Htmlfontify, a source code -> crosslinked +
formatted + syntax colorized html transformer.
-Copyright @copyright{} 2002--2003, 2013--2022 Free Software Foundation,
-Inc.
+Copyright @copyright{} 2002--2022 Free Software Foundation, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
@@ -1540,13 +1539,6 @@ Htmlfontify has a couple of external requirements:
@itemize @bullet
@item
-GNU Emacs 20.7+ or 21.1+
-
-Other versions may work---these have been used successfully by the
-author. If you intend to use Htmlfontify in batch mode, 21.1+ is
-pretty much required.
-
-@item
A copy of etags (exuberant-ctags or GNU etags). Htmlfontify attempts
to autodetect the version you have and customize itself accordingly,
but you should be able to override this.
diff --git a/doc/misc/idlwave.texi b/doc/misc/idlwave.texi
index 26a6e6c7a33..0ba87b2e58b 100644
--- a/doc/misc/idlwave.texi
+++ b/doc/misc/idlwave.texi
@@ -217,7 +217,7 @@ Integrity checks and auto-termination of logical blocks.
@item
Routine name space conflict search with likelihood-of-use ranking.
@item
-Support for @file{imenu} (Emacs) and @file{func-menu} (XEmacs).
+Support for @file{imenu}.
@item
Documentation support.
@item
@@ -392,7 +392,7 @@ that IDLWAVE has many more capabilities than covered here, which can
be discovered by reading the entire manual, or hovering over the
shoulder of your nearest IDLWAVE guru for a few days.
-It is assumed that you have access to Emacs or XEmacs with the full
+It is assumed that you have access to Emacs with the full
IDLWAVE package including online help. We also assume that you are
familiar with Emacs and can read the nomenclature of key presses in
Emacs (in particular, @kbd{C} stands for @key{CONTROL} and @kbd{M} for
@@ -1011,9 +1011,9 @@ Non-@code{nil} means use last match on line for
@cindex Font lock
Highlighting of keywords, comments, strings etc.@: can be accomplished
-with @code{font-lock}. If you are using @code{global-font-lock-mode}
-(in Emacs), or have @code{font-lock} turned on in any other buffer in
-XEmacs, it should also automatically work in IDLWAVE buffers. If you'd
+with @code{font-lock}. If you are using @code{global-font-lock-mode},
+or have @code{font-lock-mode} turned on in any other buffer,
+it should also automatically work in IDLWAVE buffers. If you'd
prefer invoking font-lock individually by mode, you can enforce it in
@code{idlwave-mode} with the following line in your @file{.emacs}:
@@ -2298,12 +2298,11 @@ Regexp matching the start of a document library header.
@cindex Motion commands
@cindex Program structure, moving through
@cindex Code structure, moving through
-@cindex @file{Func-menu}, XEmacs package
-@cindex @file{Imenu}, Emacs package
+@cindex @file{Imenu}
@cindex Function definitions, jumping to
@cindex Procedure definitions, jumping to
-IDLWAVE supports both @file{Imenu} and @file{Func-menu}, two packages
+IDLWAVE supports @file{Imenu}, a package
which make it easy to jump to the definitions of functions and
procedures in the current file with a pop-up selection. To bind
@file{Imenu} to a mouse-press, use in your @file{.emacs}:
@@ -4022,7 +4021,7 @@ user is King!
IDLWAVE was developed on a UNIX system. However, thanks to the
portability of Emacs, much of IDLWAVE does also work under different
-operating systems like Windows (with NTEmacs or NTXEmacs).
+operating systems like Windows (with NTEmacs).
The only real problem is that there is no command-line version of IDL
for Windows with which IDLWAVE can interact. As a
@@ -4117,24 +4116,6 @@ configuration files (e.g., @file{.cshrc}), but from the file
@file{~/.MacOSX/environment.plist}. Either include your path settings
there, or start Emacs and IDLWAVE from the shell.
-@item @strong{I get errors like @samp{Symbol's function is void:
-overlayp}}
-
-You don't have the @samp{fsf-compat} package installed, which IDLWAVE
-needs to run under XEmacs. Install it, or find an XEmacs distribution
-which includes it by default.
-
-@item @strong{I'm getting errors like @samp{Symbol's value as variable is void:
-cl-builtin-gethash} on completion or routine info.}
-
-This error arises if you upgraded Emacs from 20.x to 21.x without
-re-installing IDLWAVE@. Old Emacs and new Emacs are not byte-compatible
-in compiled lisp files. Presumably, you kept the original .elc files in
-place, and this is the source of the error. If you recompile (or just
-"make; make install") from source, it should resolve this problem.
-Another option is to recompile the @file{idlw*.el} files by hand using
-@kbd{M-x byte-compile-file}.
-
@item @strong{@kbd{M-@key{TAB}} doesn't complete words, it switches
windows on my desktop.}
@@ -4262,20 +4243,6 @@ is updated).
Starting with IDL 6.2, the HTML help and its catalog are
distributed with IDL, and so should never be inconsistent.
-@item @strong{I get errors such as @samp{void-variable
-browse-url-browser-function} or similar when attempting to load IDLWAVE
-under XEmacs.}
-
-You don't have the @samp{browse-url} (or other required) XEmacs package.
-Unlike Emacs, XEmacs distributes many packages separately from the
-main program. IDLWAVE is actually among these, but is not always the
-most up to date. When installing IDLWAVE as an XEmacs package, it
-should prompt you for required additional packages. When installing it
-from source, it won't and you'll get this error. The easiest solution
-is to install all the packages when you install XEmacs (the so-called
-@samp{sumo} bundle). The minimum set of XEmacs packages required by
-IDLWAVE is @samp{fsf-compat, xemacs-base, mail-lib}.
-
@end enumerate
@node GNU Free Documentation License
diff --git a/doc/misc/message.texi b/doc/misc/message.texi
index 29fbdfe1786..6a6beb7a1ff 100644
--- a/doc/misc/message.texi
+++ b/doc/misc/message.texi
@@ -1152,12 +1152,11 @@ programs are required to make things work, and some small general hints.
@uref{https://www.gnupg.org/, GNU Privacy Guard} or
@uref{https://www.openssl.org/, OpenSSL}. The default Emacs interface
to the S/MIME implementation is EasyPG (@pxref{Top,,EasyPG Assistant
-User's Manual, epa, EasyPG Assistant User's Manual}), which has been
-included in Emacs since version 23 and which relies on the command
-line tool @command{gpgsm} provided by @acronym{GnuPG}. That tool
-implements certificate management, including certificate revocation
-and expiry, while such tasks need to be performed manually, if OpenSSL
-is used.
+User's Manual, epa, EasyPG Assistant User's Manual}), which is
+included in Emacs and relies on the command line tool @command{gpgsm}
+provided by @acronym{GnuPG}. That tool implements certificate
+management, including certificate revocation and expiry, while such
+tasks need to be performed manually, if OpenSSL is used.
The choice between EasyPG and OpenSSL is controlled by the variable
@code{mml-smime-use}, which needs to be set to the value @code{epg}
@@ -1250,8 +1249,8 @@ as @uref{https://www.gnupg.org/, GNU Privacy Guard}. Pre-OpenPGP
implementations such as PGP 2.x and PGP 5.x are also supported. The
default Emacs interface to the PGP implementation is EasyPG
(@pxref{Top,,EasyPG Assistant User's Manual, epa, EasyPG Assistant
-User's Manual}), but PGG (@pxref{Top, ,PGG, pgg, PGG Manual}) and
-Mailcrypt are also supported. @xref{PGP Compatibility}.
+User's Manual}), but Mailcrypt is also supported. @xref{PGP
+Compatibility}.
As stated earlier, messages encrypted with OpenPGP can be formatted
according to two different standards, namely @acronym{PGP} or
@@ -1340,8 +1339,7 @@ your PGP implementation, so we refer to it.
If you have imported your old PGP 2.x key into GnuPG, and want to send
signed and encrypted messages to your fellow PGP 2.x users, you'll
discover that the receiver cannot understand what you send. One
-solution is to use PGP 2.x instead (e.g., if you use @code{pgg}, set
-@code{pgg-default-scheme} to @code{pgp}). You could also convince your
+solution is to use PGP 2.x instead. You could also convince your
fellow PGP 2.x users to convert to GnuPG@.
@vindex mml-signencrypt-style-alist
As a final workaround, you can make the sign and encryption work in
diff --git a/doc/misc/mh-e.texi b/doc/misc/mh-e.texi
index c1cf44a0272..2106c674f37 100644
--- a/doc/misc/mh-e.texi
+++ b/doc/misc/mh-e.texi
@@ -213,10 +213,8 @@ more niceties about GNU Emacs and MH@. Now I'm fully hooked on both of
them.
The MH-E package is distributed with Emacs@footnote{Version
-@value{VERSION} of MH-E appeared in Emacs 24.4. It is supported in GNU
-Emacs 23 and higher, as well as XEmacs 21.4.22 and 21.5.31. MH-E is
-known not to work with GNU Emacs versions 20 and below, and XEmacs
-version 21.5.9--21.5.16. It is compatible with MH versions 6.8.4 and
+@value{VERSION} of MH-E appeared in Emacs 24.4.
+It is compatible with MH versions 6.8.4 and
higher, all versions of nmh, and GNU mailutils 1.0 and higher}, so you
shouldn't have to do anything special to use it. Gnus is also
required; version 5.10 or higher is recommended. This manual covers
@@ -1490,7 +1488,7 @@ Binding} of @samp{m}.
@cindex Unix commands, @command{xbuffy}
You can use @command{xbuffy} to automate the incorporation of this
-mail using the Emacs 23 command @command{emacsclient} as follows:
+mail using the Emacs command @command{emacsclient} as follows:
@smallexample
box ~/mail/mh-e
@@ -1501,9 +1499,6 @@ box ~/mail/mh-e
command emacsclient --eval '(mh-inc-spool-mh-e)'
@end smallexample
-In XEmacs, the command @command{gnuclient} is used in a similar
-fashion.
-
@findex mh-inc-folder
@kindex i
@vindex mh-inc-folder-hook
@@ -2090,8 +2085,7 @@ and @samp{X-Image-URL:} will be used. The option
This feature will be turned on by default if your system supports it.
The first header field used, if present, is the Gnus-specific
-@samp{Face:} field@footnote{The @samp{Face:} field appeared in GNU
-Emacs 21 and XEmacs. For more information, see
+@samp{Face:} field@footnote{For more information, see
@uref{https://quimby.gnus.org/circus/face/}.}.
@cindex @command{uncompface}
@@ -2104,12 +2098,9 @@ Emacs 21 and XEmacs. For more information, see
Next is the traditional @samp{X-Face:} header field@footnote{The
display of this field requires the
@uref{ftp://ftp.cs.indiana.edu/pub/faces/compface/compface.tar.Z,
-@command{uncompface} program}. Recent versions of XEmacs have internal
-support for @samp{X-Face:} images. If your version of XEmacs does not,
-then you'll need both @command{uncompface} and the
-@uref{http://www.jpl.org/ftp/pub/elisp/, @samp{x-face} package}.}. MH-E
-renders the foreground and background of the image using the
-associated attributes of the face @code{mh-show-xface}.
+@command{uncompface} program}.} MH-E renders the foreground and
+background of the image using the associated attributes of the face
+@code{mh-show-xface}.
@cindex @command{convert}
@cindex @command{wget}
@@ -2562,13 +2553,6 @@ produces pretty nice output, and it highlights links. It renders
@samp{&ndash;} and @samp{&reg;} okay. It sometimes fails to wrap lines
properly. It always downloads remote images.
@c -------------------------
-@cindex browser, @samp{html2text}
-@cindex @samp{html2text}
-@item @samp{html2text}
-The @samp{html2text} browser requires an external program. Some users
-have reported problems with it, such as filling the entire message as
-if it were one paragraph, or displaying chunks of raw HTML.
-@c -------------------------
@cindex browser, @samp{links}
@cindex @samp{links}
@item @samp{links}
@@ -2830,24 +2814,6 @@ The appearance of the buttons is controlled by the faces
@code{mh-show-pgg-unknown} depending on the validity of the signature.
The latter is used whether the signature is unknown or untrusted.
-@cindex @samp{pgg} customization group
-@cindex PGG
-@cindex customization group, @samp{pgg}
-
-The @samp{pgg} customization group may have some settings which may
-interest you.
-@iftex
-See @cite{The PGG Manual}.
-@end iftex
-@ifinfo
-@xref{Top, , The PGG Manual, pgg, The PGG Manual}.
-@end ifinfo
-@ifhtml
-See
-@uref{https://www.gnu.org/software/emacs/manual/pgg.html,
-@cite{The PGG Manual}}.
-@end ifhtml
-
@node Printing
@section Printing Your Mail
@@ -5594,33 +5560,6 @@ variety of mail security mechanisms. The default is @samp{PGP (MIME)}
if it is supported; otherwise, the default is @samp{None}. Other
mechanisms include vanilla @samp{PGP} and @samp{S/MIME}.
-@cindex @samp{pgg} customization group
-@cindex PGG
-@cindex customization group, @samp{pgg}
-
-The @samp{pgg} customization group may have some settings which may
-interest you.
-@iftex
-See @cite{The PGG Manual}.
-@end iftex
-@ifinfo
-@xref{Top, , The PGG Manual, pgg, The PGG Manual}.
-@end ifinfo
-@ifhtml
-See
-@uref{https://www.gnu.org/software/emacs/manual/pgg.html,
-@cite{The PGG Manual}}.
-@end ifhtml
-
-@cindex header field, @samp{Fcc}
-@cindex @samp{Fcc} header field
-@vindex pgg-encrypt-for-me
-
-In particular, I turn on the option @code{pgg-encrypt-for-me} so that
-all messages I encrypt are encrypted with my public key as well. If
-you keep a copy of all of your outgoing mail with a @samp{Fcc:} header
-field, this setting is vital so that you can read the mail you write!
-
@node Checking Recipients
@section Checking Recipients
@@ -6448,17 +6387,9 @@ too long to list here).
@item mh-tool-bar-search-function
Function called by the tool bar search button (default:
@code{mh-search}).
-@c -------------------------
-@item mh-xemacs-tool-bar-position
-Tool bar location (default: @samp{Same As Default Tool Bar}).
-@c -------------------------
-@item mh-xemacs-use-tool-bar-flag
-If @samp{on}, use tool bar (default: @samp{on}, if supported).
@end vtable
-In GNU Emacs, icons for some of MH-E's functions are added to the tool
-bar. In XEmacs, you have the opportunity to create a separate tool bar for
-the MH-E icons.
+Icons for some of MH-E's functions are added to the tool bar.
@vindex mh-tool-bar-folder-buttons
@vindex mh-tool-bar-letter-buttons
@@ -6480,24 +6411,6 @@ option @code{mh-tool-bar-search-function}. By default, this is set to
Function} from the @samp{Value Menu} and enter a function of your own
choosing.
-@vindex mh-xemacs-use-tool-bar-flag
-
-XEmacs provides a couple of extra options. The first,
-@code{mh-xemacs-use-tool-bar-flag}, controls whether to show the MH-E
-icons at all. By default, this option is turned on if the window
-system supports tool bars. If your system doesn't support tool bars,
-then you won't be able to turn on this option.
-
-@vindex mh-xemacs-tool-bar-position
-
-The second extra option is @code{mh-xemacs-tool-bar-position} which
-controls the placement of the tool bar along the four edges of the
-frame. You can choose from one of @samp{Same As Default Tool Bar},
-@samp{Top}, @samp{Bottom}, @samp{Left}, or @samp{Right}. If this
-variable is set to anything other than @samp{Same As Default Tool Bar}
-and the default tool bar is in a different location, then two tool
-bars will be displayed: the MH-E tool bar and the default tool bar.
-
@node Searching
@chapter Searching Through Messages
diff --git a/doc/misc/modus-themes.org b/doc/misc/modus-themes.org
index 943294b626c..ddd9595fc89 100644
--- a/doc/misc/modus-themes.org
+++ b/doc/misc/modus-themes.org
@@ -1,25 +1,23 @@
-#+title: Modus themes for GNU Emacs
-#+author: Protesilaos Stavrou
-#+email: info@protesilaos.com
-#+language: en
-#+options: ':t toc:nil author:t email:t num:t
-#+startup: content
-
-#+macro: stable-version 2.4.0
-#+macro: release-date 2022-06-01
-#+macro: development-version 2.5.0-dev
-#+macro: file @@texinfo:@file{@@$1@@texinfo:}@@
-#+macro: space @@texinfo:@: @@
-#+macro: kbd @@texinfo:@kbd{@@$1@@texinfo:}@@
-
-#+texinfo_filename: modus-themes.info
-#+texinfo_dir_category: Emacs misc features
-#+texinfo_dir_title: Modus Themes: (modus-themes)
-#+texinfo_dir_desc: Elegant, highly legible and customizable themes
-#+texinfo_header: @set MAINTAINERSITE @uref{https://protesilaos.com,maintainer webpage}
-#+texinfo_header: @set MAINTAINER Protesilaos Stavrou
-#+texinfo_header: @set MAINTAINEREMAIL @email{info@protesilaos.com}
-#+texinfo_header: @set MAINTAINERCONTACT @uref{mailto:info@protesilaos.com,contact the maintainer}
+#+title: Modus themes for GNU Emacs
+#+author: Protesilaos Stavrou
+#+email: info@protesilaos.com
+#+language: en
+#+options: ':t toc:nil author:t email:t num:t
+#+startup: content
+#+macro: stable-version 2.5.0
+#+macro: release-date 2022-08-03
+#+macro: development-version 2.6.0-dev
+#+macro: file @@texinfo:@file{@@$1@@texinfo:}@@
+#+macro: space @@texinfo:@: @@
+#+macro: kbd @@texinfo:@kbd{@@$1@@texinfo:}@@
+#+texinfo_filename: modus-themes.info
+#+texinfo_dir_category: Emacs misc features
+#+texinfo_dir_title: Modus Themes: (modus-themes)
+#+texinfo_dir_desc: Elegant, highly legible and customizable themes
+#+texinfo_header: @set MAINTAINERSITE @uref{https://protesilaos.com,maintainer webpage}
+#+texinfo_header: @set MAINTAINER Protesilaos Stavrou
+#+texinfo_header: @set MAINTAINEREMAIL @email{info@protesilaos.com}
+#+texinfo_header: @set MAINTAINERCONTACT @uref{mailto:info@protesilaos.com,contact the maintainer}
#+texinfo: @insertcopying
@@ -198,6 +196,9 @@ sudo apt install elpa-modus-themes
They are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]].
+NOTE that Debian's package is severely out-of-date as of this writing
+2022-07-24 09:57 +0300.
+
*** GNU Guix
:properties:
:custom_id: h:a4ca52cd-869f-46a5-9e16-4d9665f5b88e
@@ -618,7 +619,7 @@ By default, customizing a theme-related user option through the Custom
interfaces or with {{{kbd(M-x customize-set-variable)}}} will not reload the
currently active Modus theme.
-Enable this behavior by setting this variable to ~nil~.
+Enable this behaviour by setting this variable to ~nil~.
Regardless of this option, the active theme must be reloaded for changes
to user options to take effect ([[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]).
@@ -1199,7 +1200,7 @@ Brief: Set the overall style of completion framework interfaces.
Symbol: ~modus-themes-completions~ (=alist= type properties)
-This affects Company, Corfu, Flx, Helm, Icomplete/Fido, Ido, Ivy, Mct,
+This affects Company, Corfu, Flx, Helm, Icomplete/Fido, Ido, Ivy,
Orderless, Selectrum, Vertico. The value is an alist that takes the
form of a =(key . properties)= combination. Here is a sample, followed
by a description of the particularities:
@@ -1476,6 +1477,9 @@ with underlines.
This style affects several packages that enable ~hl-line-mode~, such as
=elfeed=, =notmuch=, and =mu4e=.
+[ Also check the =lin= package on GNU ELPA (by the author of the
+ modus-themes) for a stylistic enhancement to ~hl-line-mode~. ]
+
** Option for line numbers
:properties:
:alt_title: Line numbers
@@ -2000,16 +2004,21 @@ Putting it all together, the alist can look like this:
:end:
#+vindex: modus-themes-headings
-Brief: Control the style of headings. This can be particularised for
-each level of heading (e.g. Org has eight levels).
+Brief: Heading styles with optional list of values for levels 0-8.
Symbol: ~modus-themes-headings~ (=alist= type, multiple properties)
-This is an alist that accepts a =(key . list-of-values)= combination. The
-key is either a number, representing the heading's level or ~t~, which
-pertains to the fallback style. The list of values covers symbols that
-refer to properties, as described below. Here is a sample, followed by
-a presentation of all available properties:
+This is an alist that accepts a =(key . list-of-values)= combination.
+The key is either a number, representing the heading's level (0-8) or t,
+which pertains to the fallback style.
+
+Level 0 is a special heading: it is used for what counts as a document
+title or equivalent, such as the =#+title= construct we find in Org
+files. Levels 1-8 are regular headings.
+
+The list of values covers symbols that refer to properties, as described
+below. Here is a complete sample, followed by a presentation of all
+available properties:
#+begin_src emacs-lisp
(setq modus-themes-headings
@@ -2162,7 +2171,7 @@ things with precision ([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization
This section is of interest only to users who are prepared to maintain
their own local tweaks and who are willing to deal with any possible
incompatibilities between versioned releases of the themes. As such,
-they are labeled as "do-it-yourself" or "DIY".
+they are labelled as "do-it-yourself" or "DIY".
** More accurate colors in terminal emulators
:PROPERTIES:
@@ -2605,7 +2614,7 @@ this example:
Whenever we enter a ~diff-mode~ buffer, we now get a magenta-colored
region.
-Perhaps you may wish to generalize those findings in to a set of
+Perhaps you may wish to generalise those findings in to a set of
functions that also accept an arbitrary face. We shall leave the
experimentation up to you.
@@ -2624,7 +2633,7 @@ contrast on an on-demand basis.
One way to achieve this is to design a command that cycles through three
distinct levels of intensity, though the following can be adapted to any
-kind of cyclic behavior, such as to switch between red, green, and
+kind of cyclic behaviour, such as to switch between red, green, and
blue.
In the following example, we employ the ~modus-themes-color~ function
@@ -2848,7 +2857,6 @@ both themes and expands to some more assosiations in the palette:
(bg-inactive . "#f6ece5")
(bg-region . "#c6bab1")
(bg-header . "#ede3e0")
- (bg-tab-bar . "#dcd3d3")
(bg-tab-active . "#fdf6eb")
(bg-tab-inactive . "#c8bab8"))
modus-themes-vivendi-color-overrides
@@ -2860,7 +2868,6 @@ both themes and expands to some more assosiations in the palette:
(bg-inactive . "#1a1e39")
(bg-region . "#393a53")
(bg-header . "#202037")
- (bg-tab-bar . "#262b41")
(bg-tab-active . "#120f18")
(bg-tab-inactive . "#3a3a5a")))
(setq modus-themes-operandi-color-overrides nil
@@ -2879,7 +2886,6 @@ look like this:
(bg-inactive . "#e6e6e6")
(bg-region . "#b5b5b5")
(bg-header . "#e4e4e4")
- (bg-tab-bar . "#d1d1d4")
(bg-tab-active . "#f5f5f5")
(bg-tab-inactive . "#c0c0c0"))
#+end_src
@@ -2897,6 +2903,9 @@ fall below the minimum 7:1 contrast ratio that governs the design of the
themes (the WCAG AAA legibility standard). Alternatively, this can also
be done programmatically ([[#h:4589acdc-2505-41fc-9f5e-699cfc45ab00][Override color saturation]]).
+The above are expanded into a fully fledged derivative elsewhere in this
+document ([[#h:736c0ff5-8c9c-4565-82cf-989e57d07d4a][Override colors completely]]).
+
For manual interventions it is advised to inspect the source code of
~modus-themes-operandi-colors~ and ~modus-themes-vivendi-colors~ for the
inline commentary: it explains what the intended use of each palette
@@ -3092,6 +3101,286 @@ Blend background colors with BG-BLEND and foreground colors with FG-BLEND."
(modus-themes-tinted-mode 1)
#+end_src
+** Override colors completely
+:PROPERTIES:
+:CUSTOM_ID: h:736c0ff5-8c9c-4565-82cf-989e57d07d4a
+:END:
+
+Based on the ideas we have already covered in these sections, the
+following code block provides a complete, bespoke pair of color palettes
+which override the defaults. They are implemented as a minor mode, as
+explained before ([[#h:307d95dd-8dbd-4ece-a543-10ae86f155a6][Override colors]]). We call them "Summertime" for
+convenience.
+
+#+begin_src emacs-lisp
+;; Read the relevant blog post:
+;; <https://protesilaos.com/codelog/2022-07-26-modus-themes-color-override-demo/>
+(define-minor-mode modus-themes-summertime
+ "Refashion the Modus themes by overriding their colors.
+
+This is a complete technology demonstration to show how to
+manually override the colors of the Modus themes. I have taken
+good care of those overrides to make them work as a fully fledged
+color scheme that is compatible with all user options of the
+Modus themes.
+
+These overrides are usable by those who (i) like something more
+fancy than the comparatively austere looks of the Modus themes,
+and (ii) can cope with a lower contrast ratio.
+
+The overrides are set up as a minor mode, so that the user can
+activate the effect on demand. Those who want to load the
+overrides at all times can either add them directly to their
+configuration or enable `modus-themes-summertime' BEFORE loading
+either of the Modus themes (if the overrides are evaluated after
+the theme, the theme must be reloaded).
+
+Remember that all changes to theme-related variables require a
+reload of the theme to take effect (the Modus themes have lots of
+user options, apart from those overrides).
+
+The `modus-themes-summertime' IS NOT an official extension to the
+Modus themes and DOES NOT comply with its lofty accessibility
+standards. It is included in the official manual as guidance for
+those who want to make use of the color overriding facility we
+provide."
+ :init-value nil
+ :global t
+ (if modus-themes-summertime
+ (setq modus-themes-operandi-color-overrides
+ '((bg-main . "#fff0f2")
+ (bg-dim . "#fbe6ef")
+ (bg-alt . "#f5dae6")
+ (bg-hl-line . "#fad8e3")
+ (bg-active . "#efcadf")
+ (bg-inactive . "#f3ddef")
+ (bg-active-accent . "#ffbbef")
+ (bg-region . "#dfc5d1")
+ (bg-region-accent . "#efbfef")
+ (bg-region-accent-subtle . "#ffd6ef")
+ (bg-header . "#edd3e0")
+ (bg-tab-active . "#ffeff2")
+ (bg-tab-inactive . "#f8d3ef")
+ (bg-tab-inactive-accent . "#ffd9f5")
+ (bg-tab-inactive-alt . "#e5c0d5")
+ (bg-tab-inactive-alt-accent . "#f3cce0")
+ (fg-main . "#543f78")
+ (fg-dim . "#5f476f")
+ (fg-alt . "#7f6f99")
+ (fg-unfocused . "#8f6f9f")
+ (fg-active . "#563068")
+ (fg-inactive . "#8a5698")
+ (fg-docstring . "#5f5fa7")
+ (fg-comment-yellow . "#a9534f")
+ (fg-escape-char-construct . "#8b207f")
+ (fg-escape-char-backslash . "#a06d00")
+ (bg-special-cold . "#d3e0f4")
+ (bg-special-faint-cold . "#e0efff")
+ (bg-special-mild . "#c4ede0")
+ (bg-special-faint-mild . "#e0f0ea")
+ (bg-special-warm . "#efd0c4")
+ (bg-special-faint-warm . "#ffe4da")
+ (bg-special-calm . "#f0d3ea")
+ (bg-special-faint-calm . "#fadff9")
+ (fg-special-cold . "#405fb8")
+ (fg-special-mild . "#407f74")
+ (fg-special-warm . "#9d6f4f")
+ (fg-special-calm . "#af509f")
+ (bg-completion . "#ffc5e5")
+ (bg-completion-subtle . "#f7cfef")
+ (red . "#ed2f44")
+ (red-alt . "#e0403d")
+ (red-alt-other . "#e04059")
+ (red-faint . "#ed4f44")
+ (red-alt-faint . "#e0603d")
+ (red-alt-other-faint . "#e06059")
+ (green . "#217a3c")
+ (green-alt . "#417a1c")
+ (green-alt-other . "#006f3c")
+ (green-faint . "#318a4c")
+ (green-alt-faint . "#518a2c")
+ (green-alt-other-faint . "#20885c")
+ (yellow . "#b06202")
+ (yellow-alt . "#a95642")
+ (yellow-alt-other . "#a06f42")
+ (yellow-faint . "#b07232")
+ (yellow-alt-faint . "#a96642")
+ (yellow-alt-other-faint . "#a08042")
+ (blue . "#275ccf")
+ (blue-alt . "#475cc0")
+ (blue-alt-other . "#3340ef")
+ (blue-faint . "#476ce0")
+ (blue-alt-faint . "#575ccf")
+ (blue-alt-other-faint . "#3f60d7")
+ (magenta . "#bf317f")
+ (magenta-alt . "#d033c0")
+ (magenta-alt-other . "#844fe4")
+ (magenta-faint . "#bf517f")
+ (magenta-alt-faint . "#d053c0")
+ (magenta-alt-other-faint . "#846fe4")
+ (cyan . "#007a9f")
+ (cyan-alt . "#3f709f")
+ (cyan-alt-other . "#107f7f")
+ (cyan-faint . "#108aaf")
+ (cyan-alt-faint . "#3f80af")
+ (cyan-alt-other-faint . "#3088af")
+ (red-active . "#cd2f44")
+ (green-active . "#116a6c")
+ (yellow-active . "#993602")
+ (blue-active . "#475ccf")
+ (magenta-active . "#7f2ccf")
+ (cyan-active . "#007a8f")
+ (red-nuanced-bg . "#ffdbd0")
+ (red-nuanced-fg . "#ed6f74")
+ (green-nuanced-bg . "#dcf0dd")
+ (green-nuanced-fg . "#3f9a4c")
+ (yellow-nuanced-bg . "#fff3aa")
+ (yellow-nuanced-fg . "#b47232")
+ (blue-nuanced-bg . "#e3e3ff")
+ (blue-nuanced-fg . "#201f6f")
+ (magenta-nuanced-bg . "#fdd0ff")
+ (magenta-nuanced-fg . "#c0527f")
+ (cyan-nuanced-bg . "#dbefff")
+ (cyan-nuanced-fg . "#0f3f60")
+ (bg-diff-heading . "#b7cfe0")
+ (fg-diff-heading . "#041645")
+ (bg-diff-added . "#d6f0d6")
+ (fg-diff-added . "#004520")
+ (bg-diff-changed . "#fcefcf")
+ (fg-diff-changed . "#524200")
+ (bg-diff-removed . "#ffe0ef")
+ (fg-diff-removed . "#891626")
+ (bg-diff-refine-added . "#84cfa4")
+ (fg-diff-refine-added . "#002a00")
+ (bg-diff-refine-changed . "#cccf8f")
+ (fg-diff-refine-changed . "#302010")
+ (bg-diff-refine-removed . "#da92b0")
+ (fg-diff-refine-removed . "#500010")
+ (bg-diff-focus-added . "#a6e5c6")
+ (fg-diff-focus-added . "#002c00")
+ (bg-diff-focus-changed . "#ecdfbf")
+ (fg-diff-focus-changed . "#392900")
+ (bg-diff-focus-removed . "#efbbcf")
+ (fg-diff-focus-removed . "#5a0010"))
+ modus-themes-vivendi-color-overrides
+ '((bg-main . "#25152a")
+ (bg-dim . "#2a1930")
+ (bg-alt . "#382443")
+ (bg-hl-line . "#332650")
+ (bg-active . "#463358")
+ (bg-inactive . "#2d1f3a")
+ (bg-active-accent . "#50308f")
+ (bg-region . "#5d4a67")
+ (bg-region-accent . "#60509f")
+ (bg-region-accent-subtle . "#3f285f")
+ (bg-header . "#3a2543")
+ (bg-tab-active . "#26162f")
+ (bg-tab-inactive . "#362647")
+ (bg-tab-inactive-accent . "#36265a")
+ (bg-tab-inactive-alt . "#3e2f5a")
+ (bg-tab-inactive-alt-accent . "#3e2f6f")
+ (fg-main . "#debfe0")
+ (fg-dim . "#d0b0da")
+ (fg-alt . "#ae85af")
+ (fg-unfocused . "#8e7f9f")
+ (fg-active . "#cfbfef")
+ (fg-inactive . "#b0a0c0")
+ (fg-docstring . "#c8d9f7")
+ (fg-comment-yellow . "#cf9a70")
+ (fg-escape-char-construct . "#ff75aa")
+ (fg-escape-char-backslash . "#dbab40")
+ (bg-special-cold . "#2a3f58")
+ (bg-special-faint-cold . "#1e283f")
+ (bg-special-mild . "#0f3f31")
+ (bg-special-faint-mild . "#0f281f")
+ (bg-special-warm . "#44331f")
+ (bg-special-faint-warm . "#372213")
+ (bg-special-calm . "#4a314f")
+ (bg-special-faint-calm . "#3a223f")
+ (fg-special-cold . "#c0b0ff")
+ (fg-special-mild . "#bfe0cf")
+ (fg-special-warm . "#edc0a6")
+ (fg-special-calm . "#ff9fdf")
+ (bg-completion . "#502d70")
+ (bg-completion-subtle . "#451d65")
+ (red . "#ff5f6f")
+ (red-alt . "#ff8f6d")
+ (red-alt-other . "#ff6f9d")
+ (red-faint . "#ffa0a0")
+ (red-alt-faint . "#f5aa80")
+ (red-alt-other-faint . "#ff9fbf")
+ (green . "#51ca5c")
+ (green-alt . "#71ca3c")
+ (green-alt-other . "#51ca9c")
+ (green-faint . "#78bf78")
+ (green-alt-faint . "#99b56f")
+ (green-alt-other-faint . "#88bf99")
+ (yellow . "#f0b262")
+ (yellow-alt . "#f0e242")
+ (yellow-alt-other . "#d0a272")
+ (yellow-faint . "#d2b580")
+ (yellow-alt-faint . "#cabf77")
+ (yellow-alt-other-faint . "#d0ba95")
+ (blue . "#778cff")
+ (blue-alt . "#8f90ff")
+ (blue-alt-other . "#8380ff")
+ (blue-faint . "#82b0ec")
+ (blue-alt-faint . "#a0acef")
+ (blue-alt-other-faint . "#80b2f0")
+ (magenta . "#ff70cf")
+ (magenta-alt . "#ff77f0")
+ (magenta-alt-other . "#ca7fff")
+ (magenta-faint . "#e0b2d6")
+ (magenta-alt-faint . "#ef9fe4")
+ (magenta-alt-other-faint . "#cfa6ff")
+ (cyan . "#30cacf")
+ (cyan-alt . "#60caff")
+ (cyan-alt-other . "#40b79f")
+ (cyan-faint . "#90c4ed")
+ (cyan-alt-faint . "#a0bfdf")
+ (cyan-alt-other-faint . "#a4d0bb")
+ (red-active . "#ff6059")
+ (green-active . "#64dc64")
+ (yellow-active . "#ffac80")
+ (blue-active . "#4fafff")
+ (magenta-active . "#cf88ff")
+ (cyan-active . "#50d3d0")
+ (red-nuanced-bg . "#440a1f")
+ (red-nuanced-fg . "#ffcccc")
+ (green-nuanced-bg . "#002904")
+ (green-nuanced-fg . "#b8e2b8")
+ (yellow-nuanced-bg . "#422000")
+ (yellow-nuanced-fg . "#dfdfb0")
+ (blue-nuanced-bg . "#1f1f5f")
+ (blue-nuanced-fg . "#bfd9ff")
+ (magenta-nuanced-bg . "#431641")
+ (magenta-nuanced-fg . "#e5cfef")
+ (cyan-nuanced-bg . "#042f49")
+ (cyan-nuanced-fg . "#a8e5e5")
+ (bg-diff-heading . "#304466")
+ (fg-diff-heading . "#dae7ff")
+ (bg-diff-added . "#0a383a")
+ (fg-diff-added . "#94ba94")
+ (bg-diff-changed . "#2a2000")
+ (fg-diff-changed . "#b0ba9f")
+ (bg-diff-removed . "#50163f")
+ (fg-diff-removed . "#c6adaa")
+ (bg-diff-refine-added . "#006a46")
+ (fg-diff-refine-added . "#e0f6e0")
+ (bg-diff-refine-changed . "#585800")
+ (fg-diff-refine-changed . "#ffffcc")
+ (bg-diff-refine-removed . "#952838")
+ (fg-diff-refine-removed . "#ffd9eb")
+ (bg-diff-focus-added . "#1d4c3f")
+ (fg-diff-focus-added . "#b4dfb4")
+ (bg-diff-focus-changed . "#424200")
+ (fg-diff-focus-changed . "#d0daaf")
+ (bg-diff-focus-removed . "#6f0f39")
+ (fg-diff-focus-removed . "#eebdba")))
+ (setq modus-themes-operandi-color-overrides nil
+ modus-themes-vivendi-color-overrides nil)))
+#+end_src
+
** Font configurations for Org and others
:properties:
:custom_id: h:defcf4fc-8fa8-4c29-b12e-7119582cc929
@@ -3117,6 +3406,9 @@ the ~variable-pitch~ (proportional spacing) and ~fixed-pitch~ (monospaced)
faces respectively. It may also be convenient to set your main typeface
by configuring the ~default~ face the same way.
+[ The =fontaine= package on GNU ELPA (by the author of the modus-themes)
+ is designed to handle this case. ]
+
Put something like this in your initialization file (also consider
reading the doc string of ~set-face-attribute~):
@@ -4165,9 +4457,9 @@ have lots of extensions, so the "full support" may not be 100% true…
+ calendar and diary
+ calfw
+ calibredb
-+ centaur-tabs
+ cfrs
+ change-log and log-view (such as ~vc-print-log~, ~vc-print-root-log~)
++ chart
+ cider
+ circe
+ citar
@@ -4187,13 +4479,12 @@ have lots of extensions, so the "full support" may not be 100% true…
+ css-mode
+ csv-mode
+ ctrlf
-+ cursor-flash
+ custom (what you get with {{{kbd(M-x customize)}}})
+ dap-mode
-+ dashboard (emacs-dashboard)
+ deadgrep
+ debbugs
+ deft
++ denote
+ devdocs
+ dictionary
+ diff-hl
@@ -4210,7 +4501,6 @@ have lots of extensions, so the "full support" may not be 100% true…
+ diredp (dired+)
+ display-fill-column-indicator-mode
+ doom-modeline
-+ dynamic-ruler
+ easy-jekyll
+ ebdb
+ ediff
@@ -4251,7 +4541,6 @@ have lots of extensions, so the "full support" may not be 100% true…
+ flyspell
+ flx
+ freeze-it
-+ frog-menu
+ focus
+ fold-this
+ font-lock (generic syntax highlighting)
@@ -4289,6 +4578,7 @@ have lots of extensions, so the "full support" may not be 100% true…
+ imenu-list
+ indium
+ info
++ info+ (info-plus)
+ info-colors
+ interaction-log
+ ioccur
@@ -4303,6 +4593,7 @@ have lots of extensions, so the "full support" may not be 100% true…
+ kaocha-runner
+ keycast
+ ledger-mode
++ leerzeichen
+ line numbers (~display-line-numbers-mode~ and global variant)
+ lsp-mode
+ lsp-ui
@@ -4314,7 +4605,6 @@ have lots of extensions, so the "full support" may not be 100% true…
+ marginalia
+ markdown-mode
+ markup-faces (~adoc-mode~)
-+ mct
+ mentor
+ messages
+ mini-modeline
@@ -4341,14 +4631,12 @@ have lots of extensions, so the "full support" may not be 100% true…
+ org-superstar
+ org-table-sticky-header
+ org-tree-slide
-+ org-treescope
+ origami
+ outline-mode
+ outline-minor-faces
+ package (what you get with {{{kbd(M-x list-packages)}}})
+ page-break-lines
+ pandoc-mode
-+ paradox
+ paren-face
+ pass
+ pdf-tools
@@ -4420,7 +4708,6 @@ have lots of extensions, so the "full support" may not be 100% true…
+ typescript
+ undo-tree
+ vc (vc-dir.el, vc-hooks.el)
-+ vc-annotate (the output of {{{kbd(C-x v g)}}})
+ vertico
+ vertico-quick
+ vimish-fold
@@ -4464,9 +4751,11 @@ supported by the themes.
+ bufler
+ counsel-notmuch
+ counsel-org-capture-string
++ dashboard (emacs-dashboard)
+ define-word
+ disk-usage
+ dtache
++ dynamic-ruler
+ easy-kill
+ edit-indirect
+ egerrit
@@ -4542,7 +4831,7 @@ The =git-gutter= and =git-gutter-fr= packages default to drawing bitmaps
for the indicators they display (e.g. bitmap of a plus sign for added
lines). In Doom Emacs, these bitmaps are replaced with contiguous lines
which may look nicer, but require a change to the foreground of the
-relevant faces to yield the desired color combinations.
+relevant faces to yield the desired colour combinations.
Since this is Doom-specific, we urge users to apply changes in their
local setup. Below is some sample code, based on what we cover at
@@ -5181,24 +5470,6 @@ candidates. That style still meets the contrast ratio target of >= 7:1
ANSI color number 1 (red) from the already-supported array of
~ansi-color-names-vector~.
-** Note on vc-annotate-background-mode
-:properties:
-:custom_id: h:5095cbd1-e17a-419c-93e8-951c186362a3
-:end:
-
-Due to the unique way ~vc-annotate~ ({{{kbd(C-x v g)}}}) applies colors, support
-for its background mode (~vc-annotate-background-mode~) is disabled at the
-theme level.
-
-Normally, such a drastic measure should not belong in a theme: assuming
-the user's preferences is bad practice. However, it has been deemed
-necessary in the interest of preserving color contrast accessibility
-while still supporting a useful built-in tool.
-
-If there actually is a way to avoid such a course of action, without
-prejudice to the accessibility standard of this project, then please
-report as much or send patches ([[#h:9c3cd842-14b7-44d7-84b2-a5c8bc3fc3b1][Contributing]]).
-
** Note on pdf-tools link hints
:properties:
:custom_id: h:2659d13e-b1a5-416c-9a89-7c3ce3a76574
@@ -5519,7 +5790,7 @@ interface virtually unusable.
[[#h:5808be52-361a-4d18-88fd-90129d206f9b][Option for links]].
-Again, one must exercise judgment in order to avoid discrimination,
+Again, one must exercise judgement in order to avoid discrimination,
where "discrimination" refers to:
+ The treatment of substantially different magnitudes as if they were of
@@ -5535,11 +5806,11 @@ usability beyond matters of color---they would be making a
not-so-obvious error of treating different cases as if they were the
same.
-The Modus themes prioritize "thematic consistency" over abstract harmony
+The Modus themes prioritise "thematic consistency" over abstract harmony
or regularity among their applicable colors. In concrete terms, we do
not claim that, say, our yellows are the best complements for our blues
because we generally avoid using complementary colors side-by-side, so
-it is wrong to optimize for a decontextualised blue+yellow combination.
+it is wrong to optimise for a decontextualised blue+yellow combination.
Not to imply that our colors do not work well together because they do,
just to clarify that consistency of context is what themes must strive
for, and that requires widening the scope of the design beyond the
@@ -5758,22 +6029,22 @@ The Modus themes are a collective effort. Every bit of work matters.
Gautier Ponsinet, Gerry Agbobada, Gianluca Recchia, Gonçalo Marrafa,
Guilherme Semente, Gustavo Barros, Hörmetjan Yiltiz, Ilja Kocken, Iris
Garcia, Ivan Popovych, Jeremy Friesen, Jerry Zhang, Johannes Grødem,
- John Haman, Jorge Morais, Joshua O'Connor, Julio C. Villasante, Kenta
- Usami, Kevin Fleming, Kévin Le Gouguec, Kostadin Ninev, Len Trigg,
- Lennart C. Karssen, Magne Hov, Manuel Uberti, Mark Bestley, Mark
- Burton, Markus Beppler, Mauro Aranda, Maxime Tréca, Michael
- Goldenberg, Morgan Smith, Morgan Willcock, Murilo Pereira, Nicky van
- Foreest, Nicolas De Jaeghere, Paul Poloskov, Pengji Zhang, Pete
- Kazmier, Peter Wu, Philip Kaludercic, Pierre Téchoueyres, Przemysław
- Kryger, Robert Hepple, Roman Rudakov, Ryan Phillips, Rytis Paškauskas,
- Rudolf Adamkovič, Sam Kleinman, Samuel Culpepper, Saša Janiška,
- Shreyas Ragavan, Simon Pugnet, Tassilo Horn, Thibaut Verron, Thomas
- Heartman, Togan Muftuoglu, Tony Zorman, Trey Merkley, Tomasz
- Hołubowicz, Toon Claes, Uri Sharf, Utkarsh Singh, Vincent Foley. As
- well as users: Ben, CsBigDataHub1, Emacs Contrib, Eugene, Fourchaux,
- Fredrik, Moesasji, Nick, TheBlob42, Trey, bepolymathe, bit9tream,
- derek-upham, doolio, fleimgruber, gitrj95, iSeeU, jixiuf, okamsn,
- pRot0ta1p.
+ John Haman, Jonas Collberg, Jorge Morais, Joshua O'Connor, Julio
+ C. Villasante, Kenta Usami, Kevin Fleming, Kévin Le Gouguec, Kostadin
+ Ninev, Len Trigg, Lennart C. Karssen, Magne Hov, Manuel Uberti, Mark
+ Bestley, Mark Burton, Markus Beppler, Matt Armstrong, Mauro Aranda,
+ Maxime Tréca, Michael Goldenberg, Morgan Smith, Morgan Willcock,
+ Murilo Pereira, Nicky van Foreest, Nicolas De Jaeghere, Paul Poloskov,
+ Pengji Zhang, Pete Kazmier, Peter Wu, Philip Kaludercic, Pierre
+ Téchoueyres, Przemysław Kryger, Robert Hepple, Roman Rudakov, Ryan
+ Phillips, Rytis Paškauskas, Rudolf Adamkovič, Sam Kleinman, Samuel
+ Culpepper, Saša Janiška, Shreyas Ragavan, Simon Pugnet, Tassilo Horn,
+ Thibaut Verron, Thomas Heartman, Togan Muftuoglu, Tony Zorman, Trey
+ Merkley, Tomasz Hołubowicz, Toon Claes, Uri Sharf, Utkarsh Singh,
+ Vincent Foley. As well as users: Ben, CsBigDataHub1, Emacs Contrib,
+ Eugene, Fourchaux, Fredrik, Moesasji, Nick, Summer Emacs, TheBlob42,
+ Trey, bepolymathe, bit9tream, derek-upham, doolio, fleimgruber,
+ gitrj95, iSeeU, jixiuf, okamsn, pRot0ta1p.
+ Packaging :: Basil L.{{{space()}}} Contovounesios, Eli Zaretskii,
Glenn Morris, Mauro Aranda, Richard Stallman, Stefan Kangas (core
@@ -5784,10 +6055,12 @@ The Modus themes are a collective effort. Every bit of work matters.
+ Inspiration for certain features :: Bozhidar Batsov (zenburn-theme),
Fabrice Niessen (leuven-theme).
-Special thanks (from A-Z) to Gustavo Barros, Manuel Uberti, Nicolas De
-Jaeghere, and Omar Antolín Camarena for their long time contributions
-and insightful commentary on key aspects of the themes' design and/or
-aspects of their functionality.
+Special thanks (from A-Z) to Daniel Mendler, Gustavo Barros, Manuel
+Uberti, Nicolas De Jaeghere, and Omar Antolín Camarena for their long
+time contributions and insightful commentary on key aspects of the
+themes' design and/or aspects of their functionality.
+
+All errors are my own.
* Other notes about the project
:properties:
diff --git a/doc/misc/reftex.texi b/doc/misc/reftex.texi
index c3b7b0b0f6b..0c95b388cb2 100644
--- a/doc/misc/reftex.texi
+++ b/doc/misc/reftex.texi
@@ -38,7 +38,6 @@ Con@TeX{}t
@set SUPPORTADDRESS @AUCTeX{} user mailing list (@email{auctex@@gnu.org})
@set DEVELADDRESS @AUCTeX{} developer mailing list (@email{auctex-devel@@gnu.org})
@set BUGADDRESS @AUCTeX{} bug mailing list (@email{bug-auctex@@gnu.org})
-@set XEMACSFTP @uref{ftp://ftp.xemacs.org/pub/xemacs/packages/,XEmacs FTP site}
@c %**end of header
@copying
@@ -249,10 +248,7 @@ reports or suggestions.
@cindex Installation
@RefTeX{} has been bundled and pre-installed with Emacs since
-version 20.2. It has also been bundled and pre-installed with XEmacs
-19.16--20.x. XEmacs 21.x users want to install the corresponding
-plug-in package which is available from the @value{XEMACSFTP}. See the
-XEmacs 21.x documentation on package installation for details.
+version 20.2.
@findex turn-on-reftex
@findex reftex-mode
@@ -3584,7 +3580,7 @@ the @value{BUGADDRESS}.
There are also several Usenet groups which have competent readers who
might be able to help: @code{comp.emacs}, @code{gnu.emacs.help},
-@code{comp.emacs.xemacs}, and @code{comp.text.tex}.
+and @code{comp.text.tex}.
Thanks to the people on the Net who have used @RefTeX{} and helped
developing it with their reports. In particular thanks to @i{Ralf
diff --git a/doc/misc/texinfo.tex b/doc/misc/texinfo.tex
index 8872e5e055f..67602b90537 100644
--- a/doc/misc/texinfo.tex
+++ b/doc/misc/texinfo.tex
@@ -1002,7 +1002,7 @@ where each line of input produces a line of output.}
\global\everypar = {}%
}
-% leave vertical mode without cancelling any first paragraph indent
+% leave vertical mode without canceling any first paragraph indent
\gdef\imageindent{%
\toks0=\everypar
\everypar={}%
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index cfbc96f4692..96ffb5c8809 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -2975,14 +2975,31 @@ where @samp{192.168.0.26} is the Android device's IP address.
(@pxref{Predefined connection information}).
@item
-@value{tramp} requires preserving @env{PATH} environment variable from
-user settings. Android devices prefer @file{/system/xbin} path over
-@file{/system/bin}. Both of these are set as follows:
+On the Android device the directory names are prefixed with an
+application specific prefix, which is
+@file{/data/data/com.termux/files/usr/bin} instead of @file{/usr/bin}
+in the @code{Termux} case. You must adapt the file names in
+@code{tramp-remote-path}, for example via connection-local
+@ifinfo
+settings (@pxref{Connection Variables, , , emacs}):
+@end ifinfo
+@ifnotinfo
+settings:
+@end ifnotinfo
@lisp
@group
-(add-to-list 'tramp-remote-path 'tramp-own-remote-path)
-(add-to-list 'tramp-remote-path "/system/xbin")
+(connection-local-set-profile-variables
+ 'tramp-connection-local-termux-profile
+ `((tramp-remote-path
+ . ,(mapcar
+ (lambda (x)
+ (if (stringp x) (concat "/data/data/com.termux/files" x) x))
+ (copy-tree tramp-remote-path)))))
+
+(connection-local-set-profiles
+ '(:application tramp :machine "192.168.0.26")
+ 'tramp-connection-local-termux-profile)
@end group
@end lisp
@@ -2991,7 +3008,9 @@ When the Android device is not @samp{rooted}, specify a writable
directory for temporary files:
@lisp
-(add-to-list 'tramp-remote-process-environment "TMPDIR=$HOME")
+(add-to-list 'tramp-connection-properties
+ (list (regexp-quote "192.168.0.26")
+ "tmpdir" "/data/data/com.termux/files/home/tmp"))
@end lisp
@item
@@ -3019,11 +3038,17 @@ the previous example, fix the connection properties as follows:
@group
(add-to-list 'tramp-connection-properties
(list (regexp-quote "android") "remote-shell" "sh"))
+(add-to-list 'tramp-connection-properties
+ (list (regexp-quote "android")
+ "tmpdir" "/data/data/com.termux/files/home/tmp"))
+(connection-local-set-profiles
+ '(:application tramp :machine "android")
+ 'tramp-connection-local-termux-profile)
@end group
@end lisp
@noindent
-Open a remote connection with a more concise command @kbd{C-x C-f
+Open a remote connection with the more concise command @kbd{C-x C-f
@trampfn{ssh,android,} @key{RET}}.
@end itemize
@@ -3383,7 +3408,7 @@ names. Beside the @code{default} value, @var{syntax} can be
@item @code{simplified}
@cindex simplified syntax
-The remote file name syntax is similar to the syntax used by Ange FTP@.
+This remote file name syntax is similar to the syntax used by Ange FTP@.
A remote file name has the form
@code{@value{prefix}user@@host@value{postfix}path/to/file}. The
@code{user@@} part is optional, and the method is determined by
@@ -3395,7 +3420,7 @@ A remote file name has the form
@clear unified
@set separate
@include trampver.texi
-The remote file name syntax is similar to the syntax used by XEmacs.
+This remote file name syntax originated in the XEmacs text editor.
A remote file name has the form
@code{@trampfn{method,user@@host,path/to/file}}. The @code{method}
and @code{user@@} parts are optional.
diff --git a/doc/misc/transient.texi b/doc/misc/transient.texi
index d634ad5197a..24c3090ef7a 100644
--- a/doc/misc/transient.texi
+++ b/doc/misc/transient.texi
@@ -47,9 +47,9 @@ General Public License for more details.
Taking inspiration from prefix keys and prefix arguments, Transient
implements a similar abstraction involving a prefix command, infix
arguments and suffix commands. We could call this abstraction a
-``transient command'', but because it always involves at least two
+“transient command”, but because it always involves at least two
commands (a prefix and a suffix) we prefer to call it just a
-``transient''.
+“transient”.
When the user calls a transient prefix command, a transient
(temporary) keymap is activated, which binds the transient's infix
@@ -97,7 +97,7 @@ Usage
* Getting Help for Suffix Commands::
* Enabling and Disabling Suffixes::
* Other Commands::
-* Other Options::
+* Configuration::
Defining New Commands
@@ -144,20 +144,20 @@ Related Abstractions and Packages
Taking inspiration from prefix keys and prefix arguments, Transient
implements a similar abstraction involving a prefix command, infix
arguments and suffix commands. We could call this abstraction a
-``transient command'', but because it always involves at least two
+“transient command”, but because it always involves at least two
commands (a prefix and a suffix) we prefer to call it just a
-``transient''.
+“transient”.
+@cindex transient prefix command
@quotation
Transient keymaps are a feature provided by Emacs. Transients as
implemented by this package involve the use of transient keymaps.
-@cindex transient prefix command
Emacs provides a feature that it calls @dfn{prefix commands}. When we
-talk about ``prefix commands'' in this manual, then we mean our own kind
-of ``prefix commands'', unless specified otherwise. To avoid ambiguity
+talk about “prefix commands” in this manual, then we mean our own kind
+of “prefix commands”, unless specified otherwise. To avoid ambiguity
we sometimes use the terms @dfn{transient prefix command} for our kind and
-``regular prefix command'' for the Emacs' kind.
+“regular prefix command” for Emacs' kind.
@end quotation
@@ -208,7 +208,7 @@ looks a bit like this:
@quotation
This is a simplified version of @code{magit-tag}. Info manuals do not
-support images or colored text, so the above ``screenshot'' lacks some
+support images or colored text, so the above “screenshot” lacks some
information; in practice you would be able to tell whether the
arguments @code{--force} and @code{--annotate} are enabled or not based on their
color.
@@ -216,11 +216,11 @@ color.
@end quotation
@cindex command dispatchers
-Transient can be used to implement simple ``command dispatchers''. The
+Transient can be used to implement simple “command dispatchers”. The
main benefit then is that the user can see all the available commands
in a popup buffer. That is useful by itself because it frees the user
from having to remember all the keys that are valid after a certain
-prefix key or command. Magit's @code{magit-dispatch} (on @code{C-x M-g}) command is
+prefix key or command. Magit's @code{magit-dispatch} (on @kbd{C-x M-g}) command is
an example of using Transient to merely implement a command
dispatcher.
@@ -235,22 +235,22 @@ argument means to a certain command.
Transient suffix commands, on the other hand, can accept dozens of
different arguments without the user having to remember anything.
-When using Transient, one can call a command with arguments that
-are just as complex as when calling the same function non-interactively
+When using Transient, one can call a command with arguments that are
+just as complex as when calling the same function non-interactively
from Lisp.
Invoking a transient command with arguments is similar to invoking a
command in a shell with command-line completion and history enabled.
One benefit of the Transient interface is that it remembers history
-not only on a global level (``this command was invoked using these
-arguments, and previously it was invoked using those other arguments''),
+not only on a global level (“this command was invoked using these
+arguments, and previously it was invoked using those other arguments”),
but also remembers the values of individual arguments independently.
@xref{Using History}.
-After a transient prefix command is invoked, @kbd{C-h @var{key}} can be used to
-show the documentation for the infix or suffix command that @kbd{@var{key}} is
+After a transient prefix command is invoked, @kbd{C-h @var{KEY}} can be used to
+show the documentation for the infix or suffix command that @kbd{@var{KEY}} is
bound to (@pxref{Getting Help for Suffix Commands}), and infixes and
-suffixes can be removed from the transient using @kbd{C-x l @var{key}}. Infixes
+suffixes can be removed from the transient using @kbd{C-x l @var{KEY}}. Infixes
and suffixes that are disabled by default can be enabled the same way.
@xref{Enabling and Disabling Suffixes}.
@@ -273,11 +273,12 @@ to implementing yet).
* Getting Help for Suffix Commands::
* Enabling and Disabling Suffixes::
* Other Commands::
-* Other Options::
+* Configuration::
@end menu
@node Invoking Transients
@section Invoking Transients
+
@cindex invoking transients
A transient prefix command is invoked like any other command by
@@ -290,9 +291,9 @@ disabled while the transient state is in effect.
There are two kinds of commands that are available after invoking a
transient prefix command; infix and suffix commands. Infix commands
set some value (which is then shown in a popup buffer), without
-leaving the transient. Suffix commands, on the other hand, usually quit
-the transient and they may use the values set by the infix commands,
-i.e.@: the infix @strong{arguments}.
+leaving the transient. Suffix commands, on the other hand, usually
+quit the transient and they may use the values set by the infix
+commands, i.e., the infix @strong{arguments}.
Instead of setting arguments to be used by a suffix command, infix
commands may also set some value by side-effect, e.g., by setting the
@@ -300,11 +301,12 @@ value of some variable.
@node Aborting and Resuming Transients
@section Aborting and Resuming Transients
+
@cindex aborting transients
@cindex resuming transients
@cindex quit transient
-To quit the transient without invoking a suffix command press @code{C-g}.
+To quit the transient without invoking a suffix command press @kbd{C-g}.
Key bindings in transient keymaps may be longer than a single event.
After pressing a valid prefix key, all commands whose bindings do not
@@ -314,7 +316,7 @@ prefix key, but not the complete transient).
A transient prefix command can be bound as a suffix of another
transient. Invoking such a suffix replaces the current transient
-state with a new transient state, i.e.@: the available bindings change
+state with a new transient state, i.e., the available bindings change
and the information displayed in the popup buffer is updated
accordingly. Pressing @kbd{C-g} while a nested transient is active only
quits the innermost transient, causing a return to the previous
@@ -325,13 +327,12 @@ the latter, then you can later resume the stack of transients using
@kbd{M-x transient-resume}.
@table @asis
+@item @kbd{C-g} (@code{transient-quit-seq})
+@itemx @kbd{C-g} (@code{transient-quit-one})
@kindex C-g
-@findex transient-quit-seq
-@item @kbd{C-g} @tie{}@tie{}@tie{}@tie{}(@code{transient-quit-seq})
@kindex C-g
+@findex transient-quit-seq
@findex transient-quit-one
-@item @kbd{C-g} @tie{}@tie{}@tie{}@tie{}(@code{transient-quit-one})
-
This key quits the currently active incomplete key sequence, if any,
or else the current transient. When quitting the current transient,
it returns to the previous transient, if any.
@@ -342,22 +343,20 @@ To learn how to get that binding back see @code{transient-bind-q-to-quit}'s
doc string.
@table @asis
+@item @kbd{C-q} (@code{transient-quit-all})
@kindex C-q
@findex transient-quit-all
-@item @kbd{C-q} @tie{}@tie{}@tie{}@tie{}(@code{transient-quit-all})
-
This command quits the currently active incomplete key sequence, if
any, and all transients, including the active transient and all
suspended transients, if any.
+@item @kbd{C-z} (@code{transient-suspend})
@kindex C-z
@findex transient-suspend
-@item @kbd{C-z} @tie{}@tie{}@tie{}@tie{}(@code{transient-suspend})
-
Like @code{transient-quit-all}, this command quits an incomplete key
sequence, if any, and all transients. Additionally, it saves the
stack of transients so that it can easily be resumed (which is
-particularly useful if you quickly need to do ``something else'', and
+particularly useful if you quickly need to do “something else” and
the stack is deeper than a single transient, and/or you have already
changed the values of some infix arguments).
@@ -365,43 +364,39 @@ Note that only a single stack of transients can be saved at a time.
If another stack is already saved, then saving a new stack discards
the previous stack.
-@kindex M-x transient-resume
+@item @kbd{M-x transient-resume}
@findex transient-resume
-@item @kbd{M-x transient-resume} @tie{}@tie{}@tie{}@tie{}(@code{transient-resume})
-
This command resumes the previously suspended stack of transients,
if any.
@end table
@node Common Suffix Commands
@section Common Suffix Commands
+
@cindex common suffix commands
A few shared suffix commands are available in all transients. These
suffix commands are not shown in the popup buffer by default.
-This includes the aborting commands mentioned in the previous section, as
-well as some other commands that are all bound to @kbd{C-x @var{key}}. After
+This includes the aborting commands mentioned in the previous section,
+as well as some other commands that are all bound to @kbd{C-x @var{KEY}}. After
@kbd{C-x} is pressed, a section featuring all these common commands is
temporarily shown in the popup buffer. After invoking one of them,
-the section disappears again. Note, however, that one of these commands
-is described as ``Show common permanently''; invoke that if you want the
-common commands to always be shown for all transients.
+the section disappears again. Note, however, that one of these
+commands is described as “Show common permanently”; invoke that if you
+want the common commands to always be shown for all transients.
@table @asis
+@item @kbd{C-x t} (@code{transient-toggle-common})
@kindex C-x t
@findex transient-toggle-common
-@item @kbd{C-x t} @tie{}@tie{}@tie{}@tie{}(@code{transient-toggle-common})
-
This command toggles whether the generic commands that are common to
all transients are always displayed or only after typing the
incomplete prefix key sequence @kbd{C-x}. This only affects the current
Emacs session.
-
@end table
@defopt transient-show-common-commands
-
This option controls whether shared suffix commands are shown
alongside the transient-specific infix and suffix commands. By
default, the shared commands are not shown to avoid overwhelming
@@ -412,14 +407,15 @@ commands. The value of this option can be changed for the current
Emacs session by typing @kbd{C-x t} while a transient is active.
@end defopt
-The other common commands are described in either the previous or
-in one of the following sections.
+The other common commands are described in either the previous or in
+one of the following sections.
Some of Transient's key bindings differ from the respective bindings
of Magit-Popup; see @ref{FAQ} for more information.
@node Saving Values
@section Saving Values
+
@cindex saving values of arguments
After setting the infix arguments in a transient, the user can save
@@ -429,8 +425,7 @@ Most transients will start out with the saved arguments when they are
invoked. There are a few exceptions, though. Some transients are
designed so that the value that they use is stored externally as the
buffer-local value of some variable. Invoking such a transient again
-uses the buffer-local value.@footnote{
-@code{magit-diff} and @code{magit-log} are two prominent examples, and their
+uses the buffer-local value. @footnote{@code{magit-diff} and @code{magit-log} are two prominent examples, and their
handling of buffer-local values is actually a bit more complicated
than outlined above and even customizable.}
@@ -440,30 +435,32 @@ history. That value won't be used when the transient is next invoked,
but it is easily accessible (@pxref{Using History}).
@table @asis
+@item @kbd{C-x s} (@code{transient-set})
@kindex C-x s
@findex transient-set
-@item @kbd{C-x s} @tie{}@tie{}@tie{}@tie{}(@code{transient-set})
-
This command saves the value of the active transient for this Emacs
session.
+@item @kbd{C-x C-s} (@code{transient-save})
@kindex C-x C-s
@findex transient-save
-@item @kbd{C-x C-s} @tie{}@tie{}@tie{}@tie{}(@code{transient-save})
-
Save the value of the active transient persistently across Emacs
sessions.
+@item @kbd{C-x C-k} (@code{transient-save})
+@kindex C-x C-k
+@findex transient-save
+Clear the set and saved value of the active transient.
@end table
@defopt transient-values-file
-
This option names the file that is used to persist the values of
transients between Emacs sessions.
@end defopt
@node Using History
@section Using History
+
@cindex value history
Every time the user invokes a suffix command the transient's current
@@ -472,32 +469,28 @@ same way one can cycle through the history of commands that read
user-input in the minibuffer.
@table @asis
+@item @kbd{C-M-p} (@code{transient-history-prev})
+@itemx @kbd{C-x p}
@kindex C-M-p
-@findex transient-history-prev
-@item @kbd{C-M-p} @tie{}@tie{}@tie{}@tie{}(@code{transient-history-prev})
@kindex C-x p
@findex transient-history-prev
-@item @kbd{C-x p} @tie{}@tie{}@tie{}@tie{}(@code{transient-history-prev})
-
This command switches to the previous value used for the active
transient.
+@item @kbd{C-M-n} (@code{transient-history-next})
+@itemx @kbd{C-x n}
@kindex C-M-n
-@findex transient-history-next
-@item @kbd{C-M-n} @tie{}@tie{}@tie{}@tie{}(@code{transient-history-next})
@kindex C-x n
@findex transient-history-next
-@item @kbd{C-x n} @tie{}@tie{}@tie{}@tie{}(@code{transient-history-next})
-
This command switches to the next value used for the active
transient.
@end table
In addition to the transient-wide history, Transient of course
supports per-infix history. When an infix reads user-input using the
-minibuffer, the user can use the regular minibuffer history
-commands to cycle through previously used values. Usually the same
-keys as those mentioned above are bound to those commands.
+minibuffer, the user can use the regular minibuffer history commands
+to cycle through previously used values. Usually the same keys as
+those mentioned above are bound to those commands.
Authors of transients should arrange for different infix commands that
read the same kind of value to also use the same history key
@@ -506,19 +499,18 @@ read the same kind of value to also use the same history key
Both kinds of history are saved to a file when Emacs is exited.
@defopt transient-history-file
-
This option names the file that is used to persist the history of
transients and their infixes between Emacs sessions.
@end defopt
@defopt transient-history-limit
-
This option controls how many history elements are kept at the time
the history is saved in @code{transient-history-file}.
@end defopt
@node Getting Help for Suffix Commands
@section Getting Help for Suffix Commands
+
@cindex getting help
Transients can have many suffixes and infixes that the user might not
@@ -527,14 +519,13 @@ provides access to the documentation directly from the active
transient.
@table @asis
+@item @kbd{C-h} (@code{transient-help})
@kindex C-h
@findex transient-help
-@item @kbd{C-h} @tie{}@tie{}@tie{}@tie{}(@code{transient-help})
-
-This command enters help mode. When help mode is active,
-typing a key shows information about the suffix command that the key
-is normally bound to (instead of invoking it). Pressing @kbd{C-h} a
-second time shows information about the @emph{prefix} command.
+This command enters help mode. When help mode is active, typing a
+key shows information about the suffix command that the key normally
+is bound to (instead of invoking it). Pressing @kbd{C-h} a second time
+shows information about the @emph{prefix} command.
After typing a key, the stack of transient states is suspended and
information about the suffix command is shown instead. Typing @kbd{q} in
@@ -550,6 +541,7 @@ non-infix suffixes this is usually appropriate.
@node Enabling and Disabling Suffixes
@section Enabling and Disabling Suffixes
+
@cindex enabling suffixes
@cindex disabling suffixes
@@ -571,7 +563,7 @@ displayed at any level.
The levels of individual transients and/or their individual suffixes
can be changed interactively, by invoking the transient and then
-pressing @kbd{C-x l} to enter the ``edit'' mode, see below.
+pressing @kbd{C-x l} to enter the “edit” mode, see below.
The default level for both transients and their suffixes is 4. The
@code{transient-default-level} option only controls the default for
@@ -582,23 +574,20 @@ very important suffixes on a lower level, so that they remain
available even if the user lowers the transient level.
@defopt transient-default-level
-
This option controls which suffix levels are made available by
default. It sets the transient-level for transients for which the
user has not set that individually.
@end defopt
@defopt transient-levels-file
-
This option names the file that is used to persist the levels of
transients and their suffixes between Emacs sessions.
@end defopt
@table @asis
+@item @kbd{C-x l} (@code{transient-set-level})
@kindex C-x l
@findex transient-set-level
-@item @kbd{C-x l} @tie{}@tie{}@tie{}@tie{}(@code{transient-set-level})
-
This command enters edit mode. When edit mode is active, then all
infixes and suffixes that are currently usable are displayed along
with their levels. The colors of the levels indicate whether they
@@ -616,9 +605,9 @@ To change the transient level press @kbd{C-x l} again.
To exit edit mode press @kbd{C-g}.
Note that edit mode does not display any suffixes that are not
-currently usable. @code{magit-rebase}, for example, shows different suffixes
-depending on whether a rebase is already in progress or not. The
-predicates also apply in edit mode.
+currently usable. @code{magit-rebase}, for example, shows different
+suffixes depending on whether a rebase is already in progress or
+not. The predicates also apply in edit mode.
Therefore, to control which suffixes are available given a certain
state, you have to make sure that that state is currently active.
@@ -633,27 +622,29 @@ following commands. These commands are never shown in the transient
window, and the key bindings are the same as for @code{scroll-up-command} and
@code{scroll-down-command} in other buffers.
-@findex transient-scroll-up arg
@deffn Command transient-scroll-up arg
-
-This command scrolls text of transient popup window upward @var{arg}
-lines. If @var{arg} is @code{nil}, then it scrolls near full screen. This
+This command scrolls text of transient popup window upward @var{ARG}
+lines. If @var{ARG} is @code{nil}, then it scrolls near full screen. This
is a wrapper around @code{scroll-up-command} (which see).
@end deffn
-@findex transient-scroll-down arg
@deffn Command transient-scroll-down arg
-
-This command scrolls text of transient popup window down @var{arg}
-lines. If @var{arg} is @code{nil}, then it scrolls near full screen. This
+This command scrolls text of transient popup window down @var{ARG}
+lines. If @var{ARG} is @code{nil}, then it scrolls near full screen. This
is a wrapper around @code{scroll-down-command} (which see).
@end deffn
-@node Other Options
-@section Other Options
+@node Configuration
+@section Configuration
-@defopt transient-show-popup
+More options are described in @ref{Common Suffix Commands}, in @ref{Saving Values}, in @ref{Using History} and in @ref{Enabling and Disabling Suffixes}.
+
+@anchor{Essential Options}
+@subheading Essential Options
+
+Also see @ref{Common Suffix Commands}.
+@defopt transient-show-popup
This option controls whether the current transient's infix and
suffix commands are shown in the popup buffer.
@@ -662,13 +653,11 @@ suffix commands are shown in the popup buffer.
If @code{t} (the default) then the popup buffer is shown as soon as a
transient prefix command is invoked.
-
@item
If @code{nil}, then the popup buffer is not shown unless the user
explicitly requests it, by pressing an incomplete prefix key
sequence.
-
@item
If a number, then the a brief one-line summary is shown instead of
the popup buffer. If zero or negative, then not even that summary
@@ -676,45 +665,43 @@ is shown; only the pressed key itself is shown.
The popup is shown when the user explicitly requests it by
pressing an incomplete prefix key sequence. Unless this is zero,
-the popup is shown after that many seconds of inactivity
-(using the absolute value).
+the popup is shown after that many seconds of inactivity (using
+the absolute value).
@end itemize
@end defopt
@defopt transient-enable-popup-navigation
-
This option controls whether navigation commands are enabled in the
transient popup buffer.
While a transient is active the transient popup buffer is not the
current buffer, making it necessary to use dedicated commands to act
on that buffer itself. This is disabled by default. If this option
-is non-nil, then the following features are available:
+is non-@code{nil}, then the following features are available:
@itemize
@item
-@key{UP} moves the cursor to the previous suffix.
-@key{DOWN} moves the cursor to the next suffix.
-@key{RET} invokes the suffix the cursor is on.
-
+@kbd{@key{UP}} moves the cursor to the previous suffix.
@item
-@key{mouse-1} invokes the clicked on suffix.
-
+@kbd{@key{DOWN}} moves the cursor to the next suffix.
+@item
+@kbd{@key{RET}} invokes the suffix the cursor is on.
+@item
+@kbd{mouse-1} invokes the clicked on suffix.
@item
@kbd{C-s} and @kbd{C-r} start isearch in the popup buffer.
@end itemize
@end defopt
@defopt transient-display-buffer-action
-
This option specifies the action used to display the transient popup
buffer. The transient popup buffer is displayed in a window using
-@code{(display-buffer @var{buffer} transient-display-buffer-action)}.
+@code{(display-buffer @var{BUFFER} transient-display-buffer-action)}.
-The value of this option has the form @code{(@var{function} . @var{alist})},
-where @var{function} is a function or a list of functions. Each such
+The value of this option has the form @code{(@var{FUNCTION} . @var{ALIST})},
+where @var{FUNCTION} is a function or a list of functions. Each such
function should accept two arguments: a buffer to display and an
-alist of the same form as @var{alist}. @xref{Choosing Window,,,elisp,},
+alist of the same form as @var{ALIST}. @xref{Choosing Window,,,elisp,},
for details.
The default is:
@@ -727,7 +714,7 @@ The default is:
@end lisp
This displays the window at the bottom of the selected frame.
-Another useful @var{function} is @code{display-buffer-below-selected}, which
+Another useful @var{FUNCTION} is @code{display-buffer-below-selected}, which
is what @code{magit-popup} used by default. For more alternatives see
@ref{Buffer Display Action Functions,,,elisp,}, and see @ref{Buffer Display
Action Alists,,,elisp,}.
@@ -748,8 +735,20 @@ If you change the value of this option, then you might also
want to change the value of @code{transient-mode-line-format}.
@end defopt
-@defopt transient-mode-line-format
+@anchor{Accessibility Options}
+@subheading Accessibility Options
+
+@defopt transient-force-single-column
+This option controls whether the use of a single column to display
+suffixes is enforced. This might be useful for users with low
+vision who use large text and might otherwise have to scroll in two
+dimensions.
+@end defopt
+
+@anchor{Auxiliary Options}
+@subheading Auxiliary Options
+@defopt transient-mode-line-format
This option controls whether the transient popup buffer has a
mode-line, separator line, or neither.
@@ -759,23 +758,28 @@ good value.
If @code{line} (the default), then the buffer also has no mode-line, but a
thin line is drawn instead, using the background color of the face
-@code{transient-separator}. Text-mode frames cannot display thin lines, and
-therefore fall back to treating @code{line} like @code{nil}.
+@code{transient-separator}. Text-mode frames cannot display thin lines,
+and therefore fall back to treating @code{line} like @code{nil}.
Otherwise this can be any mode-line format. @xref{Mode Line
Format,,,elisp,}, for details.
@end defopt
-@defopt transient-read-with-initial-input
+@defopt transient-semantic-coloring
+This option controls whether prefixes and suffixes are colored in
+a Hydra-like fashion.
-This option controls whether the last history element is used as the
-initial minibuffer input when reading the value of an infix argument
-from the user. If @code{nil}, there is no initial input and the first
-element has to be accessed the same way as the older elements.
+If non-@code{nil}, then the key binding of each suffix is colorized to
+indicate whether it exits the transient state or not. The color of
+the prefix is indicated using the line that is drawn when the value
+of @code{transient-mode-line-format} is @code{line}.
+
+For more information about how Hydra uses colors see
+@uref{https://github.com/abo-abo/hydra#color} and
+@uref{https://oremacs.com/2015/02/19/hydra-colors-reloaded}.
@end defopt
@defopt transient-highlight-mismatched-keys
-
This option controls whether key bindings of infix commands that do
not match the respective command-line argument should be highlighted.
For other infix commands this option has no effect.
@@ -795,7 +799,6 @@ The highlighting is done using one of the faces
@end defopt
@defopt transient-substitute-key-function
-
This function is used to modify key bindings. If the value of this
option is @code{nil} (the default), then no substitution is performed.
@@ -819,14 +822,52 @@ optimized for lisp.
@end lisp
@end defopt
-@defopt transient-detect-key-conflicts
+@defopt transient-read-with-initial-input
+This option controls whether the last history element is used as the
+initial minibuffer input when reading the value of an infix argument
+from the user. If @code{nil}, there is no initial input and the first
+element has to be accessed the same way as the older elements.
+@end defopt
+
+@defopt transient-hide-during-minibuffer-read
+This option controls whether the transient buffer is hidden while
+user input is being read in the minibuffer.
+@end defopt
+
+@defopt transient-align-variable-pitch
+This option controls whether columns are aligned pixel-wise in the
+popup buffer.
+
+If this is non-@code{nil}, then columns are aligned pixel-wise to support
+variable-pitch fonts. Keys are not aligned, so you should use a
+fixed-pitch font for the @code{transient-key} face. Other key faces
+inherit from that face unless a theme is used that breaks that
+relationship.
+
+This option is intended for users who use a variable-pitch font for
+the @code{default} face.
+@end defopt
+
+@defopt transient-force-fixed-pitch
+This option controls whether to force the use of a monospaced font
+in popup buffer. Even if you use a proportional font for the
+@code{default} face, you might still want to use a monospaced font in
+transient's popup buffer. Setting this option to @code{t} causes @code{default}
+to be remapped to @code{fixed-pitch} in that buffer.
+@end defopt
+
+@anchor{Developer Options}
+@subheading Developer Options
+These options are mainly intended for developers.
+
+@defopt transient-detect-key-conflicts
This option controls whether key binding conflicts should be
-detected at the time the transient is invoked. If so, this
-results in an error, which prevents the transient from being used.
-Because of that, conflicts are ignored by default.
+detected at the time the transient is invoked. If so, this results
+in an error, which prevents the transient from being used. Because
+of that, conflicts are ignored by default.
-Conflicts cannot be determined earlier, i.e.@: when the transient is
+Conflicts cannot be determined earlier, i.e., when the transient is
being defined and when new suffixes are being added, because at that
time there can be false-positives. It is actually valid for
multiple suffixes to share a common key binding, provided the
@@ -834,48 +875,51 @@ predicates of those suffixes prevent that more than one of them is
enabled at a time.
@end defopt
-@defopt transient-force-fixed-pitch
+@defopt transient-highlight-higher-levels
+This option controls whether suffixes that would not be available by
+default are highlighted.
-This option controls whether to force the use of a monospaced font
-in popup buffer. Even if you use a proportional font for the
-@code{default} face, you might still want to use a monospaced font in
-transient's popup buffer. Setting this option to @code{t} causes @code{default}
-to be remapped to @code{fixed-pitch} in that buffer.
+When non-@code{nil} then the descriptions of suffixes are highlighted if
+their level is above 4, the default of @code{transient-default-level}.
+Assuming you have set that variable to 7, this highlights all
+suffixes that won't be available to users without them making the
+same customization.
@end defopt
@node Modifying Existing Transients
@chapter Modifying Existing Transients
+
@cindex modifying existing transients
-To an extent, transients can be customized interactively, see @ref{Enabling and Disabling Suffixes}. This section explains how existing transients
-can be further modified non-interactively.
+To an extent, transients can be customized interactively, see
+@ref{Enabling and Disabling Suffixes}. This section explains how existing
+transients can be further modified non-interactively.
The following functions share a few arguments:
@itemize
@item
-@var{prefix} is a transient prefix command, a symbol.
-
+@var{PREFIX} is a transient prefix command, a symbol.
@item
-@var{suffix} is a transient infix or suffix specification in the same form
+@var{SUFFIX} is a transient infix or suffix specification in the same form
as expected by @code{transient-define-prefix}. Note that an infix is a
-special kind of suffix. Depending on context ``suffixes'' means
-``suffixes (including infixes)'' or ``non-infix suffixes''. Here it
+special kind of suffix. Depending on context “suffixes” means
+“suffixes (including infixes)” or “non-infix suffixes”. Here it
means the former. @xref{Suffix Specifications}.
-@var{suffix} may also be a group in the same form as expected by
+@var{SUFFIX} may also be a group in the same form as expected by
@code{transient-define-prefix}. @xref{Group Specifications}.
@item
-@var{loc} is a command, a key vector, a key description (a string as
+@var{LOC} is a command, a key vector, a key description (a string as
returned by @code{key-description}), or a list specifying coordinates (the
last element may also be a command or key). For example @code{(1 0 -1)}
identifies the last suffix (@code{-1}) of the first subgroup (@code{0}) of the
second group (@code{1}).
-If @var{loc} is a list of coordinates, then it can be used to identify a
+If @var{LOC} is a list of coordinates, then it can be used to identify a
group, not just an individual suffix command.
The function @code{transient-get-suffix} can be useful to determine whether
@@ -885,55 +929,53 @@ at the definition of the transient prefix command.
@end itemize
These functions operate on the information stored in the
-@code{transient--layout} property of the @var{prefix} symbol. Suffix entries in
-that tree are not objects but have the form @code{(@var{level}
-@var{class} @var{plist})}, where
-@var{plist} should set at least @code{:key}, @code{:description} and
-@code{:command}.
-
-@defun transient-insert-suffix prefix loc suffix
+@code{transient--layout} property of the @var{PREFIX} symbol. Suffix entries in
+that tree are not objects but have the form @code{(@var{LEVEL} @var{CLASS} @var{PLIST})}, where
+@var{PLIST} should set at least @code{:key}, @code{:description} and @code{:command}.
-This function inserts suffix or group @var{suffix} into @var{prefix}
-before @var{loc}.
+@defun transient-insert-suffix prefix loc suffix &optional keep-other
@end defun
-
-@defun transient-append-suffix prefix loc suffix
-
-This function inserts suffix or group @var{suffix} into @var{prefix}
-after @var{loc}.
+@defun transient-append-suffix prefix loc suffix &optional keep-other
+These functions insert the suffix or group @var{SUFFIX} into @var{PREFIX} before
+or after @var{LOC}.
+
+Conceptually adding a binding to a transient prefix is similar to
+adding a binding to a keymap, but this is complicated by the fact
+that multiple suffix commands can be bound to the same key, provided
+they are never active at the same time, see @ref{Predicate Slots}.
+
+Unfortunately both false-positives and false-negatives are possible.
+To deal with the former use non-nil @var{KEEP-OTHER@.} To deal with the
+latter remove the conflicting binding explicitly.
@end defun
@defun transient-replace-suffix prefix loc suffix
-
-This function replaces the suffix or group at @var{loc} in @var{prefix} with
-suffix or group @var{suffix}.
+This function replaces the suffix or group at @var{LOC} in @var{PREFIX} with
+suffix or group @var{SUFFIX}.
@end defun
@defun transient-remove-suffix prefix loc
-
-This function removes the suffix or group at @var{loc} in @var{prefix}.
+This function removes the suffix or group at @var{LOC} in @var{PREFIX}.
@end defun
@defun transient-get-suffix prefix loc
-
-This function returns the suffix or group at @var{loc} in @var{prefix}. The
+This function returns the suffix or group at @var{LOC} in @var{PREFIX}. The
returned value has the form mentioned above.
@end defun
@defun transient-suffix-put prefix loc prop value
-
-This function edits the suffix or group at @var{loc} in @var{prefix},
-by setting the @var{prop} of its plist to @var{value}.
+This function edits the suffix or group at @var{LOC} in @var{PREFIX}, by setting
+the @var{PROP} of its plist to @var{VALUE}.
@end defun
Most of these functions do not signal an error if they cannot perform
the requested modification. The functions that insert new suffixes
-show a warning if @var{loc} cannot be found in @var{prefix}, without
-signaling an error. The reason for doing it like this is that
-establishing a key binding (and that is what we essentially are trying
-to do here) should not prevent the rest of the configuration from
-loading. Among these functions only @code{transient-get-suffix} and
-@code{transient-suffix-put} may signal an error.
+show a warning if @var{LOC} cannot be found in @var{PREFIX} without signaling an
+error. The reason for doing it like this is that establishing a key
+binding (and that is what we essentially are trying to do here) should
+not prevent the rest of the configuration from loading. Among these
+functions only @code{transient-get-suffix} and @code{transient-suffix-put} may
+signal an error.
@node Defining New Commands
@chapter Defining New Commands
@@ -957,12 +999,11 @@ defines the complete transient, not just the transient prefix command
that is used to invoke that transient.
@defmac transient-define-prefix name arglist [docstring] [keyword value]@dots{} group@dots{} [body@dots{}]
-
-This macro defines @var{name} as a transient prefix command and binds the
+This macro defines @var{NAME} as a transient prefix command and binds the
transient's infix and suffix commands.
-@var{arglist} are the arguments that the prefix command takes.
-@var{docstring} is the documentation string and is optional.
+@var{ARGLIST} are the arguments that the prefix command takes.
+@var{DOCSTRING} is the documentation string and is optional.
These arguments can optionally be followed by keyword-value pairs.
Each key has to be a keyword symbol, either @code{:class} or a keyword
@@ -970,11 +1011,11 @@ argument supported by the constructor of that class. The
@code{transient-prefix} class is used if the class is not specified
explicitly.
-@var{group}s add key bindings for infix and suffix commands and specify
+@var{GROUP}s add key bindings for infix and suffix commands and specify
how these bindings are presented in the popup buffer. At least one
-@var{group} has to be specified. @xref{Binding Suffix and Infix Commands}.
+@var{GROUP} has to be specified. @xref{Binding Suffix and Infix Commands}.
-The @var{body} is optional. If it is omitted, then @var{arglist} is ignored and
+The @var{BODY} is optional. If it is omitted, then @var{ARGLIST} is ignored and
the function definition becomes:
@lisp
@@ -983,15 +1024,15 @@ the function definition becomes:
(transient-setup 'NAME))
@end lisp
-If @var{body} is specified, then it must begin with an @code{interactive} form
-that matches @var{arglist}, and it must call @code{transient-setup}. It may,
+If @var{BODY} is specified, then it must begin with an @code{interactive} form
+that matches @var{ARGLIST}, and it must call @code{transient-setup}. It may,
however, call that function only when some condition is satisfied.
@cindex scope of a transient
All transients have a (possibly @code{nil}) value, which is exported when
suffix commands are called, so that they can consume that value.
For some transients it might be necessary to have a sort of
-secondary value, called a ``scope''. Such a scope would usually be
+secondary value, called a “scope”. Such a scope would usually be
set in the command's @code{interactive} form and has to be passed to the
setup function:
@@ -1013,8 +1054,8 @@ described below.
Users and third-party packages can add additional bindings using
functions such as @code{transient-insert-suffix} (@pxref{Modifying
-Existing Transients}). These functions take a ``suffix
-specification'' as one of their arguments, which has the same form as
+Existing Transients}). These functions take a “suffix
+specification” as one of their arguments, which has the same form as
the specifications used in @code{transient-define-prefix}.
@menu
@@ -1024,6 +1065,7 @@ the specifications used in @code{transient-define-prefix}.
@node Group Specifications
@subsection Group Specifications
+
@cindex group specifications
The suffix and infix commands of a transient are organized in groups.
@@ -1043,39 +1085,39 @@ brackets to do the latter.
Group specifications then have this form:
@lisp
-[@{@var{level}@} @{@var{description}@}
- @{@var{keyword} @var{value}@}...
- @var{element}...]
+[@{@var{LEVEL}@} @{@var{DESCRIPTION}@}
+ @{@var{KEYWORD} @var{VALUE}@}...
+ @var{ELEMENT}...]
@end lisp
-The @var{level} is optional and defaults to 4. @xref{Enabling and
+The @var{LEVEL} is optional and defaults to 4. @xref{Enabling and
Disabling Suffixes}.
-The @var{description} is optional. If present, it is used as the heading of
+The @var{DESCRIPTION} is optional. If present, it is used as the heading of
the group.
-The @var{keyword}-@var{value} pairs are optional. Each keyword has to be a
+The @var{KEYWORD}-@var{VALUE} pairs are optional. Each keyword has to be a
keyword symbol, either @code{:class} or a keyword argument supported by the
constructor of that class.
@itemize
@item
One of these keywords, @code{:description}, is equivalent to specifying
-@var{description} at the very beginning of the vector. The recommendation
+@var{DESCRIPTION} at the very beginning of the vector. The recommendation
is to use @code{:description} if some other keyword is also used, for
-consistency, or @var{description} otherwise, because it looks better.
+consistency, or @var{DESCRIPTION} otherwise, because it looks better.
@item
-Likewise @code{:level} is equivalent to @var{level}.
+Likewise @code{:level} is equivalent to @var{LEVEL}.
@item
Other important keywords include the @code{:if...} keywords. These
keywords control whether the group is available in a certain
situation.
-For example, one group of the @code{magit-rebase} transient uses
-@code{:if magit-rebase-in-progress-p}, which contains the suffixes
-that are useful while rebase is already in progress; and another that uses
+For example, one group of the @code{magit-rebase} transient uses @code{:if
+ magit-rebase-in-progress-p}, which contains the suffixes that are
+useful while rebase is already in progress; and another that uses
@code{:if-not magit-rebase-in-progress-p}, which contains the suffixes that
initiate a rebase.
@@ -1096,9 +1138,9 @@ suffixes, which assumes that a predicate like this is used:
@end lisp
@item
-The value of @code{:setup-children}, if non-@code{nil}, is a function
-that takes two arguments the group object itself and a list of children.
-The children are given as a, potentially empty, list consisting
+The value of @code{:setup-children}, if non-@code{nil}, is a function that takes
+two arguments the group object itself and a list of children.
+The children are given as a (potentially empty) list consisting
of either group or suffix specifications. It can make arbitrary
changes to the children including constructing new children from
scratch. Also see @code{transient-setup-children}.
@@ -1109,21 +1151,21 @@ contained in a group are right padded, effectively aligning the
descriptions.
@end itemize
-The @var{element}s are either all subgroups (vectors), or all suffixes
+The @var{ELEMENT}s are either all subgroups (vectors), or all suffixes
(lists) and strings. (At least currently no group type exists that
would allow mixing subgroups with commands at the same level, though
in principle there is nothing that prevents that.)
-If the @var{element}s are not subgroups, then they can be a mixture of lists
+If the @var{ELEMENT}s are not subgroups, then they can be a mixture of lists
that specify commands and strings. Strings are inserted verbatim.
The empty string can be used to insert gaps between suffixes, which is
particularly useful if the suffixes are outlined as a table.
Variables are supported inside group specifications. For example in
place of a direct subgroup specification, a variable can be used whose
-value is a vector that qualifies as a group specification. Likewise, a
-variable can be used where a suffix specification is expected. Lists
-of group or suffix specifications are also supported. Indirect
+value is a vector that qualifies as a group specification. Likewise,
+a variable can be used where a suffix specification is expected.
+Lists of group or suffix specifications are also supported. Indirect
specifications are resolved when the transient prefix is being
defined.
@@ -1131,6 +1173,7 @@ The form of suffix specifications is documented in the next node.
@node Suffix Specifications
@subsection Suffix Specifications
+
@cindex suffix specifications
A transient's suffix and infix commands are bound when the transient
@@ -1140,37 +1183,36 @@ prefix command is defined using @code{transient-define-prefix}, see
individual suffix command.
The same form is also used when later binding additional commands
-using functions such as @code{transient-insert-suffix},
-see @ref{Modifying Existing Transients}.
+using functions such as @code{transient-insert-suffix}, see @ref{Modifying Existing Transients}.
-Note that an infix is a special kind of suffix. Depending on context
-``suffixes'' means ``suffixes (including infixes)'' or ``non-infix
-suffixes''. Here it means the former.
+Note that an infix is a special kind of suffix. Depending on context
+“suffixes” means “suffixes (including infixes)” or “non-infix
+suffixes”. Here it means the former.
Suffix specifications have this form:
@lisp
-([@var{level}]
- [@var{key}] [@var{description}]
- @var{command}|@var{argument} [@var{keyword} @var{value}]...)
+([@var{LEVEL}]
+ [@var{KEY}] [@var{DESCRIPTION}]
+ @var{COMMAND}|@var{ARGUMENT} [@var{KEYWORD} @var{VALUE}]...)
@end lisp
-@var{level}, @var{key} and @var{description} can also be specified using the @var{keyword}s
+@var{LEVEL}, @var{KEY} and @var{DESCRIPTION} can also be specified using the @var{KEYWORD}s
@code{:level}, @code{:key} and @code{:description}. If the object that is associated with
-@var{command} sets these properties, then they do not have to be specified
+@var{COMMAND} sets these properties, then they do not have to be specified
here. You can however specify them here anyway, possibly overriding
the object's values just for the binding inside this transient.
@itemize
@item
-@var{level} is the suffix level, an integer between 1 and 7.
+@var{LEVEL} is the suffix level, an integer between 1 and 7.
@xref{Enabling and Disabling Suffixes}.
@item
-@var{key} is the key binding, either a vector or key description string.
+@var{KEY} is the key binding, either a vector or key description string.
@item
-@var{description} is the description, either a string or a function that
+@var{DESCRIPTION} is the description, either a string or a function that
returns a string. The function should be a lambda expression to
avoid ambiguity. In some cases a symbol that is bound as a function
would also work but to be safe you should use @code{:description} in that
@@ -1182,7 +1224,7 @@ argument that is mandatory in all cases.
@itemize
@item
-Usually @var{command} is a symbol that is bound as a function, which has
+@var{COMMAND} should be a symbol that is bound as a function, which has
to be defined or at least autoloaded as a command by the time the
containing prefix command is invoked.
@@ -1190,15 +1232,13 @@ Any command will do; it does not need to have an object associated
with it (as would be the case if @code{transient-define-suffix} or
@code{transient-define-infix} were used to define it).
-The command can also be a closure or lambda expression, but that
-should only be used for dynamic transients whose suffixes are
-defined when the prefix command is invoked. See information about
-the @code{:setup-children} function in @ref{Group Specifications}.
+Anonymous, dynamically defined suffix commands are also support.
+See information about the @code{:setup-children} function in @ref{Group Specifications}.
As mentioned above, the object that is associated with a command can
be used to set the default for certain values that otherwise have to
be set in the suffix specification. Therefore if there is no object,
-then you have to make sure to specify the @var{key} and the @var{description}.
+then you have to make sure to specify the @var{KEY} and the @var{DESCRIPTION}.
As a special case, if you want to add a command that might be neither
defined nor autoloaded, you can use a workaround like:
@@ -1209,8 +1249,8 @@ defined nor autoloaded, you can use a workaround like:
:if (lambda () (featurep 'no-library))))
@end lisp
-Instead of @code{featurep} you could also use @code{require} with a
-non-nil value for @var{noerror}.
+Instead of @code{featurep} you could also use @code{require} with a non-@code{nil} value
+for @var{NOERROR}.
@item
The mandatory argument can also be a command-line argument, a
@@ -1227,30 +1267,29 @@ used.
Unless the class is specified explicitly, the appropriate class is
guessed based on the long argument. If the argument ends with @samp{=}
-(e.g. @samp{--format=}) then @code{transient-option} is used, otherwise
+(e.g., @samp{--format=}) then @code{transient-option} is used, otherwise
@code{transient-switch}.
@end itemize
-Finally, details can be specified using optional
-@var{keyword}-@var{value} pairs.
+Finally, details can be specified using optional @var{KEYWORD}-@var{VALUE} pairs.
Each keyword has to be a keyword symbol, either @code{:class} or a keyword
argument supported by the constructor of that class. See @ref{Suffix Slots}.
@node Defining Suffix and Infix Commands
@section Defining Suffix and Infix Commands
+
@cindex defining suffix commands
@cindex defining infix commands
-Note that an infix is a special kind of suffix. Depending on context
-``suffixes'' means ``suffixes (including infixes)'' or ``non-infix
-suffixes''.
+Note that an infix is a special kind of suffix. Depending on context
+“suffixes” means “suffixes (including infixes)” or “non-infix
+suffixes”.
@defmac transient-define-suffix name arglist [docstring] [keyword value]@dots{} body@dots{}
+This macro defines @var{NAME} as a transient suffix command.
-This macro defines @var{name} as a transient suffix command.
-
-@var{arglist} are the arguments that the command takes.
-@var{docstring} is the documentation string and is optional.
+@var{ARGLIST} are the arguments that the command takes.
+@var{DOCSTRING} is the documentation string and is optional.
These arguments can optionally be followed by keyword-value pairs.
Each keyword has to be a keyword symbol, either @code{:class} or a keyword
@@ -1258,17 +1297,16 @@ argument supported by the constructor of that class. The
@code{transient-suffix} class is used if the class is not specified
explicitly.
-The @var{body} must begin with an @code{interactive} form that matches @var{arglist}.
+The @var{BODY} must begin with an @code{interactive} form that matches @var{ARGLIST}.
The infix arguments are usually accessed by using @code{transient-args}
inside @code{interactive}.
@end defmac
@defmac transient-define-infix name arglist [docstring] [keyword value]@dots{}
+This macro defines @var{NAME} as a transient infix command.
-This macro defines @var{name} as a transient infix command.
-
-@var{arglist} is always ignored (but mandatory never-the-less) and
-reserved for future use. @var{docstring} is the documentation string and
+@var{ARGLIST} is always ignored (but mandatory never-the-less) and
+reserved for future use. @var{DOCSTRING} is the documentation string and
is optional.
The keyword-value pairs are mandatory. All transient infix commands
@@ -1297,13 +1335,12 @@ Different infix commands behave differently because the concrete
methods are different for different infix command classes. In rare
cases the above command function might not be suitable, even if you
define your own infix command class. In that case you have to use
-@code{transient-suffix-command} to define the infix command and use @code{t} as
-the value of the @code{:transient} keyword.
+@code{transient-define-suffix} to define the infix command and use @code{t} as the
+value of the @code{:transient} keyword.
@end defmac
@defmac transient-define-argument name arglist [docstring] [keyword value]@dots{}
-
-This macro defines @var{name} as a transient infix command.
+This macro defines @var{NAME} as a transient infix command.
This is an alias for @code{transient-define-infix}. Only use this alias
to define an infix command that actually sets an infix argument.
@@ -1313,7 +1350,6 @@ To define an infix command that, for example, sets a variable, use
@node Using Infix Arguments
@section Using Infix Arguments
-@cindex using infix arguments
The functions and the variables described below allow suffix commands
to access the value of the transient from which they were invoked;
@@ -1332,61 +1368,56 @@ function, which for infix arguments serves about the same purpose as
@code{prefix-arg} serves for prefix arguments.
@defun transient-args prefix
-
This function returns the value of the transient prefix command
-@var{prefix}.
+@var{PREFIX}.
If the current command was invoked from the transient prefix command
-@var{prefix}, then it returns the active infix arguments. If the current
-command was not invoked from @var{prefix}, then it returns the set, saved
-or default value for @var{prefix}.
+@var{PREFIX}, then it returns the active infix arguments. If the current
+command was not invoked from @var{PREFIX}, then it returns the set, saved
+or default value for @var{PREFIX}.
@end defun
@defun transient-arg-value arg args
-
-This function return the value of @var{arg} as it appears in @var{args}.
+This function return the value of @var{ARG} as it appears in @var{ARGS}.
For a switch a boolean is returned. For an option the value is
returned as a string, using the empty string for the empty value,
-or @code{nil} if the option does not appear in @var{args}.
+or @code{nil} if the option does not appear in @var{ARGS}.
@end defun
@defun transient-suffixes prefix
-
This function returns the suffixes of the transient prefix command
-@var{prefix}. This is a list of objects. This function should only be
+@var{PREFIX}. This is a list of objects. This function should only be
used if you need the objects (as opposed to just their values) and
-if the current command is not being invoked from @var{prefix}.
+if the current command is not being invoked from @var{PREFIX}.
@end defun
@defvar transient-current-suffixes
-
The suffixes of the transient from which this suffix command was
invoked. This is a list of objects. Usually it is sufficient to
instead use the function @code{transient-args}, which returns a list of
values. In complex cases it might be necessary to use this variable
-instead, i.e.@: if you need access to information beside the value.
+instead, i.e., if you need access to information beside the value.
@end defvar
@defvar transient-current-prefix
-
The transient from which this suffix command was invoked. The
returned value is a @code{transient-prefix} object, which holds information
associated with the transient prefix command.
@end defvar
@defvar transient-current-command
-
The transient from which this suffix command was invoked. The
returned value is a symbol, the transient prefix command.
@end defvar
@node Transient State
@section Transient State
+
@cindex transient state
-Invoking a transient prefix command ``activates'' the respective
-transient, i.e.@: it puts a transient keymap into effect, which binds
+Invoking a transient prefix command “activates” the respective
+transient, i.e., it puts a transient keymap into effect, which binds
the transient's infix and suffix commands.
The default behavior while a transient is active is as follows:
@@ -1397,20 +1428,20 @@ Invoking an infix command does not affect the transient state; the
transient remains active.
@item
-Invoking a (non-infix) suffix command ``deactivates'' the transient
+Invoking a (non-infix) suffix command “deactivates” the transient
state by removing the transient keymap and performing some
additional cleanup.
@item
Invoking a command that is bound in a keymap other than the
transient keymap is disallowed and trying to do so results in a
-warning. This does not ``deactivate'' the transient.
+warning. This does not “deactivate” the transient.
@end itemize
But these are just the defaults. Whether a certain command
-deactivates or ``exits'' the transient is configurable. There is more
-than one way in which a command can be ``transient'' or ``non-transient'';
-the exact behavior is implemented by calling a so-called ``pre-command''
+deactivates or “exits” the transient is configurable. There is more
+than one way in which a command can be “transient” or “non-transient”;
+the exact behavior is implemented by calling a so-called “pre-command”
function. Whether non-suffix commands are allowed to be called is
configurable per transient.
@@ -1426,10 +1457,8 @@ Valid values are booleans and the pre-commands described below.
@itemize
@item
@code{t} is equivalent to @code{transient--do-stay}.
-
@item
@code{nil} is equivalent to @code{transient--do-exit}.
-
@item
If @code{transient} is unbound (and that is actually the default for
non-infix suffixes) then the value of the prefix's
@@ -1439,18 +1468,18 @@ essentially equivalent to it being @code{nil}.
@end itemize
@item
-A suffix command can be a prefix command itself, i.e. a
-``sub-prefix''. While a sub-prefix is active we nearly always want
-@kbd{C-g} to take the user back to the ``super-prefix''. However in rare
+A suffix command can be a prefix command itself, i.e., a
+“sub-prefix”. While a sub-prefix is active we nearly always want
+@kbd{C-g} to take the user back to the “super-prefix”. However in rare
cases this may not be desirable, and that makes the following
complication necessary:
For @code{transient-suffix} objects the @code{transient} slot is unbound. We can
ignore that for the most part because, as stated above, @code{nil} and the
-slot being unbound are equivalent, and mean ``do exit''. That isn't
+slot being unbound are equivalent, and mean “do exit”. That isn't
actually true for suffixes that are sub-prefixes though. For such
-suffixes unbound means ``do exit but allow going back'', which is the
-default, while @code{nil} means ``do exit permanently'', which requires that
+suffixes unbound means “do exit but allow going back”, which is the
+default, while @code{nil} means “do exit permanently”, which requires that
slot to be explicitly set to that value.
@item
@@ -1465,7 +1494,7 @@ called by @code{transient--pre-command}, a function on @code{pre-command-hook} a
the value that they return determines whether the transient is exited.
To do so the value of one of the constants @code{transient--exit} or
@code{transient--stay} is used (that way we don't have to remember if @code{t} means
-``exit'' or ``stay'').
+“exit” or “stay”).
Additionally, these functions may change the value of @code{this-command}
(which explains why they have to be called using @code{pre-command-hook}),
@@ -1480,7 +1509,6 @@ The default for infixes is @code{transient--do-stay}. This is also the only
function that makes sense for infixes.
@defun transient--do-stay
-
Call the command without exporting variables and stay transient.
@end defun
@@ -1490,27 +1518,55 @@ Call the command without exporting variables and stay transient.
The default for suffixes is @code{transient--do-exit}.
@defun transient--do-exit
-
Call the command after exporting variables and exit the transient.
@end defun
-@defun transient--do-call
+@defun transient--do-return
+Call the command after exporting variables and return to parent
+prefix. If there is no parent prefix, then call @code{transient--do-exit}.
+@end defun
+@defun transient--do-call
Call the command after exporting variables and stay transient.
@end defun
-@defun transient--do-replace
+The following pre-commands are suitable for sub-prefixes. Only the
+first should ever explicitly be set as the value of the @code{transient}
+slot.
+
+@defun transient--do-recurse
+Call the transient prefix command, preparing for return to active
+transient.
+
+Whether we actually return to the parent transient is ultimately
+under the control of each invoked suffix. The difference between
+this pre-command and @code{transient--do-replace} is that it changes the
+value of the @code{transient-suffix} slot to @code{transient--do-return}.
+
+If there is no parent transient, then only call this command and
+skip the second step.
+@end defun
+@defun transient--do-replace
Call the transient prefix command, replacing the active transient.
-This is used for suffixes that are prefixes themselves, i.e.@: for
-sub-prefixes.
+Unless @code{transient--do-recurse} is explicitly used, this pre-command
+is automatically used for suffixes that are prefixes themselves,
+i.e., for sub-prefixes.
+@end defun
+
+@defun transient--do-suspend
+Suspend the active transient, saving the transient stack.
+
+This is used by the command @code{transient-suspend} and optionally also by
+“external events” such as @code{handle-switch-frame}. Such bindings should
+be added to @code{transient-predicate-map}.
@end defun
@anchor{Pre-commands for Non-Suffixes}
@subheading Pre-commands for Non-Suffixes
-The default for non-suffixes, i.e@: commands that are bound in other
+The default for non-suffixes, i.e., commands that are bound in other
keymaps beside the transient keymap, is @code{transient--do-warn}. Silently
ignoring the user-error is also an option, though probably not a good
one.
@@ -1520,12 +1576,10 @@ If you want to let the user invoke non-suffix commands, then use
slot.
@defun transient--do-warn
-
Call @code{transient-undefined} and stay transient.
@end defun
@defun transient--do-noop
-
Call @code{transient-noop} and stay transient.
@end defun
@@ -1533,21 +1587,18 @@ Call @code{transient-noop} and stay transient.
@subheading Special Pre-Commands
@defun transient--do-quit-one
-
If active, quit help or edit mode, else exit the active transient.
This is used when the user pressed @kbd{C-g}.
@end defun
@defun transient--do-quit-all
-
Exit all transients without saving the transient stack.
This is used when the user pressed @kbd{C-q}.
@end defun
@defun transient--do-suspend
-
Suspend the active transient, saving the transient stack.
This is used when the user pressed @kbd{C-z}.
@@ -1555,6 +1606,7 @@ This is used when the user pressed @kbd{C-z}.
@node Classes and Methods
@chapter Classes and Methods
+
@cindex classes and methods
Transient uses classes and generic functions to make it possible to
@@ -1591,7 +1643,7 @@ holds a function that is used to read a new value for an infix
command. The values of such slots are regular functions.
Generic functions are used when a function should do something
-different based on the type of the command, i.e. when all commands
+different based on the type of the command, i.e., when all commands
of a certain type should behave the same way but different from the
behavior for other types. Object slots that hold a regular function
as value are used when the task that they perform is likely to
@@ -1613,7 +1665,7 @@ differ even between different commands of the same type.
@section Group Classes
The type of a group can be specified using the @code{:class} property at the
-beginning of the class specification, e.g. @code{[:class transient-columns
+beginning of the class specification, e.g., @code{[:class transient-columns
...]} in a call to @code{transient-define-prefix}.
@itemize
@@ -1622,7 +1674,7 @@ The abstract @code{transient-child} class is the base class of both
@code{transient-group} (and therefore all groups) as well as of
@code{transient-suffix} (and therefore all suffix and infix commands).
-This class exists because the elements (a.k.a.@: ``children'') of certain
+This class exists because the elements (or “children”) of certain
groups can be other groups instead of suffix and infix commands.
@item
@@ -1632,8 +1684,8 @@ group classes.
@item
The @code{transient-column} class is the simplest group.
-This is the default ``flat'' group. If the class is not specified
-explicitly and the first element is not a vector (i.e. not a group),
+This is the default “flat” group. If the class is not specified
+explicitly and the first element is not a vector (i.e., not a group),
then this class is used.
This class displays each element on a separate line.
@@ -1648,8 +1700,8 @@ Direct elements have to be groups whose elements have to be commands
or strings. Each subgroup represents a column. This class takes
care of inserting the subgroups' elements.
-This is the default ``nested'' group. If the class is not specified
-explicitly and the first element is a vector (i.e.@: a group), then
+This is the default “nested” group. If the class is not specified
+explicitly and the first element is a vector (i.e., a group), then
this class is used.
@item
@@ -1665,12 +1717,11 @@ elements.
@section Group Methods
@defun transient-setup-children group children
-
This generic function can be used to setup the children or a group.
The default implementation usually just returns the children
-unchanged, but if the @code{setup-children} slot of @var{group} is non-nil, then
-it calls that function with @var{children} as the only argument and
+unchanged, but if the @code{setup-children} slot of @var{GROUP} is non-@code{nil}, then
+it calls that function with @var{CHILDREN} as the only argument and
returns the value.
The children are given as a (potentially empty) list consisting of
@@ -1680,7 +1731,6 @@ children from scratch.
@end defun
@defun transient--insert-group group
-
This generic function formats the group and its elements and inserts
the result into the current buffer, which is a temporary buffer.
The contents of that buffer are later inserted into the popup buffer.
@@ -1698,7 +1748,6 @@ commands and there is only a single generic function that can be
specialized based on the class of a prefix command.
@defun transient--history-init obj
-
This generic function is called while setting up the transient and
is responsible for initializing the @code{history} slot. This is the
transient-wide history; many individual infixes also have a history
@@ -1784,8 +1833,7 @@ functions use @code{describe-function}.
@subsection Suffix Value Methods
@defun transient-init-value obj
-
-This generic function sets the initial value of the object @var{obj}.
+This generic function sets the initial value of the object @var{OBJ}.
This function is called for all suffix commands, but unless a
concrete method is implemented this falls through to the default
@@ -1797,9 +1845,8 @@ a method.
@end defun
@defun transient-infix-read obj
-
This generic function determines the new value of the infix object
-@var{obj}.
+@var{OBJ}.
This function merely determines the value; @code{transient-infix-set} is
used to actually store the new value in the object.
@@ -1809,40 +1856,36 @@ user using the reader specified by the @code{reader} slot (using the
@code{transient-infix-value} method described below).
For some infix classes the value is changed without reading
-anything in the minibuffer, i.e.@: the mere act of invoking the
+anything in the minibuffer, i.e., the mere act of invoking the
infix command determines what the new value should be, based
on the previous value.
@end defun
@defun transient-prompt obj
-
This generic function returns the prompt to be used to read infix
-object @var{obj}'s value.
+object @var{OBJ}'s value.
@end defun
@defun transient-infix-set obj value
-
-This generic function sets the value of infix object @var{obj} to @var{value}.
+This generic function sets the value of infix object @var{OBJ} to @var{VALUE}.
@end defun
@defun transient-infix-value obj
-
-This generic function returns the value of the suffix object @var{obj}.
+This generic function returns the value of the suffix object @var{OBJ}.
This function is called by @code{transient-args} (which see), meaning this
function is how the value of a transient is determined so that the
invoked suffix command can use it.
Currently most values are strings, but that is not set in stone.
-@code{nil} is not a value, it means ``no value''.
+@code{nil} is not a value, it means “no value”.
Usually only infixes have a value, but see the method for
@code{transient-suffix}.
@end defun
@defun transient-init-scope obj
-
-This generic function sets the scope of the suffix object @var{obj}.
+This generic function sets the scope of the suffix object @var{OBJ}.
The scope is actually a property of the transient prefix, not of
individual suffixes. However it is possible to invoke a suffix
@@ -1859,8 +1902,7 @@ implementation, which is a noop.
@subsection Suffix Format Methods
@defun transient-format obj
-
-This generic function formats and returns @var{obj} for display.
+This generic function formats and returns @var{OBJ} for display.
When this function is called, then the current buffer is some
temporary buffer. If you need the buffer from which the prefix
@@ -1869,27 +1911,23 @@ making @code{transient--source-buffer} current.
@end defun
@defun transient-format-key obj
-
-This generic function formats @var{obj}'s @code{key} for display and returns the
+This generic function formats @var{OBJ}'s @code{key} for display and returns the
result.
@end defun
@defun transient-format-description obj
-
-This generic function formats @var{obj}'s @code{description} for display and
+This generic function formats @var{OBJ}'s @code{description} for display and
returns the result.
@end defun
@defun transient-format-value obj
-
-This generic function formats @var{obj}'s value for display and returns
+This generic function formats @var{OBJ}'s value for display and returns
the result.
@end defun
@defun transient-show-help obj
-
Show help for the prefix, infix or suffix command represented by
-@var{obj}.
+@var{OBJ}.
For prefixes, show the info manual, if that is specified using the
@code{info-manual} slot. Otherwise, show the manpage if that is specified
@@ -1906,10 +1944,10 @@ the command's doc string.
@itemize
@item
-@code{man-page} or @code{info-manual} can be used to specify the documentation for
-the prefix and its suffixes. The command @code{transient-help} uses the
-method @code{transient-show-help} (which see) to lookup and use these
-values.
+@code{show-help}, @code{man-page} or @code{info-manual} can be used to specify the
+documentation for the prefix and its suffixes. The command
+@code{transient-help} uses the method @code{transient-show-help} (which see) to
+lookup and use these values.
@item
@code{history-key} If multiple prefix commands should share a single value,
@@ -1930,7 +1968,7 @@ multiple sub-lists.
@item
@code{scope} For some transients it might be necessary to have a sort of
-secondary value, called a ``scope''. See @code{transient-define-prefix}.
+secondary value, called a “scope”. See @code{transient-define-prefix}.
@end itemize
@anchor{Internal Prefix Slots}
@@ -1995,10 +2033,8 @@ It must contain the following %-placeholders:
@itemize
@item
@code{%k} For the key.
-
@item
@code{%d} For the description.
-
@item
@code{%v} For the infix value. Non-infix suffixes don't have a value.
@end itemize
@@ -2006,6 +2042,11 @@ It must contain the following %-placeholders:
@item
@code{description} The description, either a string or a function that is
called with no argument and returns a string.
+
+@item
+@code{show-help} A function used to display help for the suffix. If
+unspecified, the prefix controls how hlep is displayed for its
+suffixes.
@end itemize
@anchor{Slots of @code{transient-infix}}
@@ -2016,10 +2057,10 @@ They are defined here anyway to allow sharing certain methods.
@itemize
@item
-@code{argument} The long argument, e.g. @code{--verbose}.
+@code{argument} The long argument, e.g., @code{--verbose}.
@item
-@code{shortarg} The short argument, e.g. @code{-v}.
+@code{shortarg} The short argument, e.g., @code{-v}.
@item
@code{value} The value. Should not be accessed directly.
@@ -2036,7 +2077,34 @@ the prefixes.
@item
@code{multi-value} For options, whether the option can have multiple
-values. If non-nil, then default to use @code{completing-read-multiple}.
+values. If this is non-@code{nil}, then the values are read using
+@code{completing-read-multiple} by default and if you specify your own
+reader, then it should read the values using that function or
+similar.
+
+Supported non-@code{nil} values are:
+
+@itemize
+@item
+Use @code{rest} for an option that can have multiple values. This is
+useful e.g., for an @code{--} argument that indicates that all remaining
+arguments are files (such as @code{git log -- file1 file2}).
+
+In the list returned by @code{transient-args} such an option and its
+values are represented by a single list of the form @code{(ARGUMENT
+ . VALUES)}.
+
+@item
+Use @code{repeat} for an option that can be specified multiple times.
+
+In the list returned by @code{transient-args} each instance of the option
+and its value appears separately in the usual from, for example:
+@code{("--another-argument" "--option=first" "--option=second")}.
+@end itemize
+
+In both cases the option's values have to be specified in the
+default value of a prefix using the same format as returned by
+@code{transient-args}, e.g., @code{("--other" "--o=1" "--o=2" ("--" "f1" "f2"))}.
@item
@code{always-read} For options, whether to read a value on every invocation.
@@ -2053,8 +2121,8 @@ same history because their values are of the same kind.
@item
@code{reader} The function used to read the value of an infix. Not used
-for switches. The function takes three arguments, @var{prompt},
-@var{initial-input} and @var{history}, and must return a string.
+for switches. The function takes three arguments, @var{PROMPT},
+@var{INITIAL-INPUT} and @var{HISTORY}, and must return a string.
@item
@code{prompt} The prompt used when reading the value, either a string or a
@@ -2098,25 +2166,18 @@ what happens if you use more than one.
@itemize
@item
@code{if} Enable if predicate returns non-@code{nil}.
-
@item
@code{if-not} Enable if predicate returns @code{nil}.
-
@item
@code{if-non-nil} Enable if variable's value is non-@code{nil}.
-
@item
@code{if-nil} Enable if variable's value is @code{nil}.
-
@item
@code{if-mode} Enable if major-mode matches value.
-
@item
@code{if-not-mode} Enable if major-mode does not match value.
-
@item
@code{if-derived} Enable if major-mode derives from value.
-
@item
@code{if-not-derived} Enable if major-mode does not derive from value.
@end itemize
@@ -2146,16 +2207,13 @@ The following diagrams illustrate some of the differences.
@itemize
@item
-@code{(c)} represents a return to the command loop.
-
+@samp{(c)} represents a return to the command loop.
@item
-@code{(+)} represents the user's choice to press one key or another.
-
+@samp{(+)} represents the user's choice to press one key or another.
@item
-@code{@{@var{word}@}} are possible behaviors.
-
+@samp{@{WORD@}} are possible behaviors.
@item
-@code{@{@var{number}@}} is a footnote.
+@samp{@{NUMBER@}} is a footnote.
@end itemize
@anchor{Regular Prefix Commands}
@@ -2331,7 +2389,7 @@ and also takes external state into account.
@itemize
@item
-@code{@{1@}} Transients can be configured to be exited when a suffix command
+@samp{@{1@}} Transients can be configured to be exited when a suffix command
is invoked. The default is to do so for all suffixes except for
those that are common to all transients and which are used to
perform tasks such as providing help and saving the value of the
@@ -2340,7 +2398,7 @@ specified for individual suffix commands and may even depend on
state.
@item
-@code{@{2@}} Transients can be configured to allow the user to invoke
+@samp{@{2@}} Transients can be configured to allow the user to invoke
non-suffix commands. The default is to not allow that and instead
warn the user.
@end itemize
@@ -2386,9 +2444,9 @@ Both packages use transient keymaps to make a set of commands
temporarily available and show the available commands in a popup
buffer.
-A Hydra ``body'' is equivalent to a Transient ``prefix'' and a Hydra
-``head'' is equivalent to a Transient ``suffix''. Hydra has no equivalent
-of a Transient ``infix''.
+A Hydra “body” is equivalent to a Transient “prefix” and a Hydra
+“head” is equivalent to a Transient “suffix”. Hydra has no equivalent
+of a Transient “infix”.
Both hydras and transients can be used as simple command dispatchers.
Used like this they are similar to regular prefix commands and prefix
@@ -2406,7 +2464,7 @@ command dispatchers:
@item
Invoking a command from a hydra does not necessarily exit the hydra.
That makes it possible to invoke the same command again, but using a
-shorter key sequence (i.e. the key that was used to enter the hydra
+shorter key sequence (i.e., the key that was used to enter the hydra
does not have to be pressed again).
Transient supports that too, but for now this feature is not a focus
@@ -2421,7 +2479,6 @@ using the current interface:
("n" "next visible heading" outline-next-visible-heading)])
@end lisp
-
@item
Transient supports infix arguments; values that are set by infix
commands and then consumed by the invoked suffix command(s).
@@ -2465,13 +2522,13 @@ currently exist.
@anchor{Can I control how the popup buffer is displayed?}
@appendixsec Can I control how the popup buffer is displayed?
-Yes, see @code{transient-display-buffer-action} in @ref{Other Options}.
+Yes, see @code{transient-display-buffer-action} in @ref{Configuration}.
@anchor{Why did some of the key bindings change?}
@appendixsec Why did some of the key bindings change?
You may have noticed that the bindings for some of the common commands
-do @strong{not} have the prefix @code{C-x} and that furthermore some of these commands
+do @strong{not} have the prefix @kbd{C-x} and that furthermore some of these commands
are grayed out while others are not. That unfortunately is a bit
confusing if the section of common commands is not shown permanently,
making the following explanation necessary.
@@ -2486,42 +2543,41 @@ bindings. The bindings that do use a prefix do so to avoid wasting
too many non-prefix bindings, keeping them available for use in
individual transients. The bindings that do not use a prefix and that
are @strong{not} grayed out are very important bindings that are @strong{always}
-available, even when invoking the ``common command key prefix'' or @strong{any
+available, even when invoking the “common command key prefix” or @strong{any
other} transient-specific prefix. The non-prefix keys that @strong{are} grayed
out however, are not available when any incomplete prefix key sequence
-is active. They do not use the ``common command key prefix'' because it
+is active. They do not use the “common command key prefix” because it
is likely that users want to invoke them several times in a row and
-e.g. @kbd{M-p M-p M-p} is much more convenient than
-@kbd{C-x M-p C-x M-p C-x M-p}.
+e.g., @kbd{M-p M-p M-p} is much more convenient than @kbd{C-x M-p C-x M-p C-x M-p}.
-You may also have noticed that the "Set" command is bound to @kbd{C-x s},
+You may also have noticed that the “Set” command is bound to @kbd{C-x s},
while Magit-Popup used to bind @kbd{C-c C-c} instead. I have seen several
users praise the latter binding (sic), so I did not change it
willy-nilly. The reason that I changed it is that using different
prefix keys for different common commands, would have made the
-temporary display of the common commands even more confusing,
-i.e. after pressing @kbd{C-c} all the @kbd{C-x ...} bindings would be grayed out.
+temporary display of the common commands even more confusing, i.e.,
+after pressing @kbd{C-c} all the bindings that begin with the @kbd{C-x} prefix
+would be grayed out.
Using a single prefix for common commands key means that all other
potential prefix keys can be used for transient-specific commands
-@strong{without} the section of common commands also popping up. @code{C-c} in
+@strong{without} the section of common commands also popping up. @kbd{C-c} in
particular is a prefix that I want to (and already do) use for Magit, and
also using that for a common command would prevent me from doing so.
(Also see the next question.)
-@anchor{Why does @code{q} not quit popups anymore?}
-@appendixsec Why does @code{q} not quit popups anymore?
+@anchor{Why does @kbd{q} not quit popups anymore?}
+@appendixsec Why does @kbd{q} not quit popups anymore?
I agree that @kbd{q} is a good binding for commands that quit something.
This includes quitting whatever transient is currently active, but it
also includes quitting whatever it is that some specific transient is
-controlling. The transient @code{magit-blame} for example binds @code{q} to the
+controlling. The transient @code{magit-blame} for example binds @kbd{q} to the
command that turns @code{magit-blame-mode} off.
So I had to decide if @kbd{q} should quit the active transient (like
-Magit-Popup used to) or whether @kbd{C-g} should do that instead, so
-that @kbd{q}
+Magit-Popup used to) or whether @kbd{C-g} should do that instead, so that @kbd{q}
could be bound in individual transient to whatever commands make sense
for them. Because all other letters are already reserved for use by
individual transients, I have decided to no longer make an exception
@@ -2548,7 +2604,7 @@ necessary changes. See its doc string for more information.
@printindex vr
@node Concept Index
-@appendix Concept and Feature Index
+@appendix Concept Index
@printindex cp
diff --git a/doc/misc/url.texi b/doc/misc/url.texi
index a9d06d7f5b9..5644027f952 100644
--- a/doc/misc/url.texi
+++ b/doc/misc/url.texi
@@ -950,7 +950,6 @@ containing the data cached for that URL.
@node Proxies
@section Proxies and Gatewaying
-@c fixme: check/document url-ns stuff
@cindex proxy servers
@cindex proxies
@cindex environment variables
diff --git a/doc/misc/viper.texi b/doc/misc/viper.texi
index b0deb31d108..0703667ecce 100644
--- a/doc/misc/viper.texi
+++ b/doc/misc/viper.texi
@@ -1842,7 +1842,7 @@ usually most effective:
(set-face-background viper-replace-overlay-face "yellow")
@end smallexample
For a complete list of colors available to you, evaluate the expression
-@code{(x-defined-colors)}. (Type it in the buffer @file{*scratch*} and then
+@code{(defined-colors)}. (Type it in the buffer @file{*scratch*} and then
hit the @kbd{C-j} key.
@item viper-replace-overlay-cursor-color "Red"
@@ -2571,7 +2571,7 @@ The GNU Emacs Manual}, for more information on tags.
The following two commands are normally bound to a mouse click and are part
of Viper. They work only if Emacs runs as an application under X
-Windows (or under some other window system for which a port of GNU Emacs 20
+Windows (or under some other window system for which a port of GNU Emacs
is available). Clicking the mouse when Emacs is invoked in an Xterm window
(using @code{emacs -nw}) will do no good.
diff --git a/doc/misc/vtable.texi b/doc/misc/vtable.texi
index 296dc520a1b..59cd9d0f564 100644
--- a/doc/misc/vtable.texi
+++ b/doc/misc/vtable.texi
@@ -465,9 +465,9 @@ When point is placed on a vtable, the following keys are bound:
Sort the table by the current column
(@code{vtable-sort-by-current-column}). Note that the table is sorted
according to the data returned by the getter function (@pxref{Making A
-Table}), not by how it's
-displayed in the buffer. Columns that have only numerical data is
-sorted as numbers, the rest are sorted as strings.
+Table}), not by how it's displayed in the buffer. Columns that have
+only numerical data are sorted as numbers, the rest are sorted as
+strings.
@findex vtable-narrow-current-column
@item @{
diff --git a/etc/AUTHORS b/etc/AUTHORS
index b5444e60a76..f6349df5bc2 100644
--- a/etc/AUTHORS
+++ b/etc/AUTHORS
@@ -281,8 +281,8 @@ Andrea Corallo: wrote comp-cstr-tests.el comp-cstr.el comp-tests.el
comp.el
and changed comp.c pdumper.c lread.c bytecomp.el comp.h configure.ac
lisp.h startup.el loadup.el alloc.c data.c emacs.c .gitlab-ci.yml
- nadvice.el cl-macs.el advice.el help.el lisp/Makefile.in package.el
- Makefile.in comp-test-funcs.el and 62 other files
+ nadvice.el cl-macs.el advice.el comp-test-funcs.el help.el
+ lisp/Makefile.in package.el Makefile.in and 61 other files
André A. Gomes: changed ispell.el
@@ -1573,7 +1573,7 @@ Eli Zaretskii: wrote [bidirectional display in xdisp.c]
and co-wrote help-tests.el
and changed xdisp.c display.texi w32.c msdos.c w32fns.c simple.el
files.el fileio.c emacs.c keyboard.c w32term.c text.texi dispnew.c
- w32proc.c files.texi frames.texi configure.ac dispextern.h lisp.h
+ w32proc.c files.texi frames.texi configure.ac lisp.h dispextern.h
process.c ms-w32.h and 1236 other files
Eliza Velasquez: changed server.el
@@ -1733,6 +1733,8 @@ Etienne Prud’Homme: changed align.el css-mode-tests.el css-mode.el
Eugene Exarevsky: changed sql.el
+Eugene Ha: changed configure.ac
+
Evangelos Evangelou: changed progmodes/f90.el
Evan Moses: changed progmodes/python.el
@@ -1981,7 +1983,7 @@ Gerd Möllmann: wrote authors.el ebrowse.el jit-lock.el tooltip.el
and changed xdisp.c xterm.c dispnew.c dispextern.h xfns.c xfaces.c
window.c keyboard.c lisp.h faces.el alloc.c buffer.c startup.el xterm.h
fns.c simple.el term.c configure.ac frame.c xmenu.c emacs.c
- and 607 other files
+ and 609 other files
Gergely Nagy: changed erc.el
@@ -3311,7 +3313,7 @@ and co-wrote gnus-kill.el gnus-mh.el gnus-msg.el gnus-score.el
and changed gnus.texi simple.el subr.el files.el process.c display.texi
text.texi dired.el gnutls.c gnus-ems.el smtpmail.el help-fns.el
auth-source.el url-http.el edebug.el image.el gnus-cite.el pop3.el
- dired-aux.el fns.c image.c and 866 other files
+ dired-aux.el fns.c image.c and 867 other files
Lars Rasmusson: changed ebrowse.c
@@ -3930,8 +3932,8 @@ Miguel Ruiz: changed ob-gnuplot.el
Mihai Olteanu: changed hexl.el
Miha Rihtaršič: changed keyboard.c commands.texi minibuf.c minibuffer.el
- simple.el comint.el data.c delsel.el errors.texi esh-mode.el eval.c
- ibuffer.el macros.c process.c sh-script.el
+ simple.el bindings.el comint.el data.c delsel.el errors.texi
+ esh-mode.el eval.c ibuffer.el macros.c process.c sh-script.el
Mihir Rege: changed js.el
@@ -4327,9 +4329,9 @@ and changed message.el gnus-util.el gnus-int.el gnus.el gnus-agent.el
Paul Pogonyshev: changed subr.el byte-opt.el bytecomp.el
emacs-lisp/debug.el eval.c progmodes/python.el which-func.el align.el
- bytecode.c cc-langs.el cl-macs.el configure.ac dabbrev.el display.texi
- eldoc.el elisp-mode.el ert.el ert.texi etags.el fns-tests.el fns.c
- and 20 other files
+ bytecode.c cc-langs.el cl-macs.el configure.ac dabbrev.el desktop.el
+ display.texi eldoc.el elisp-mode.el ert.el ert.texi etags.el
+ fns-tests.el and 21 other files
Paul Rankin: changed outline.el
@@ -4785,7 +4787,7 @@ Robert Pluim: wrote nsm-tests.el
and changed configure.ac process.c blocks.awk network-stream-tests.el
font.c processes.texi ftfont.c gtkutil.c vc-git.el process-tests.el
emoji-zwj.awk gnutls.el network-stream.el nsm.el tramp.texi mml-sec.el
- nsterm.m unicode xfns.c auth.texi composite.c and 136 other files
+ nsterm.m unicode xfns.c auth.texi composite.c and 138 other files
Robert Thorpe: changed cus-start.el indent.el rmail.texi
@@ -5179,7 +5181,7 @@ and co-wrote help-tests.el keymap-tests.el
and changed efaq.texi checkdoc.el package.el cperl-mode.el bookmark.el
help.el keymap.c subr.el simple.el erc.el ediff-util.el idlwave.el
time.el bytecomp-tests.el comp.el speedbar.el bytecomp.el edebug.el
- emacs-lisp-intro.texi flyspell.el ibuffer.el and 1339 other files
+ emacs-lisp-intro.texi flyspell.el ibuffer.el and 1344 other files
Stefan Merten: co-wrote rst.el
@@ -6060,6 +6062,6 @@ Zoran Milojevic: changed avoid.el
উৎসব রায়: changed quail/indian.el
Local Variables:
-mode: etc-authors
+mode: emacs-authors
coding: utf-8
End:
diff --git a/etc/NEWS b/etc/NEWS
index 57845df9792..5d87bc9e2eb 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -59,7 +59,7 @@ If a constant file name is required, the file can be renamed to
"emacs.pdmp", and Emacs will find it during startup anyway.
---
-** Emacs now uses of XInput 2 for input events.
+** Emacs now uses XInput 2 for input events.
If your X server has support and you have the XInput 2 development
headers installed, Emacs will use the X Input Extension for handling
input. If this causes problems, you can configure Emacs with the
@@ -81,7 +81,7 @@ by saying
make -C leim generate-ja-dic JA_DIC_NO_REDUCTION_OPTION=''
-after deleting lisp/leim/ja-dic/ja-dic.el.
+after deleting "lisp/leim/ja-dic/ja-dic.el".
+++
** Emacs now supports being built with pure GTK.
@@ -117,7 +117,7 @@ Emacs Sessions" node in the Emacs manual for more details.
* Startup Changes in Emacs 29.1
+++
-** -batch and -script now adjusts the garbage collection levels.
+** '--batch' and '--script' now adjust the garbage collection levels.
These switches now set 'gc-cons-percentage' to 1.0 (up from the
default of 0.1). This means that batch processes will typically use
more memory than before, but use less time doing garbage collection.
@@ -152,7 +152,7 @@ time.
---
*** New command 'native-compile-prune-cache'.
-This command deletes older .eln cache entries (but not the ones for
+This command deletes older ".eln" cache entries (but not the ones for
the current Emacs version).
---
@@ -160,21 +160,43 @@ the current Emacs version).
This function can be called in your init files to change the
user-specific directory where Emacs stores the "*.eln" files produced
by native compilation of Lisp packages Emacs loads. The default
-eln-cache directory is unchanged: it is the 'eln-cache' subdirectory
+eln-cache directory is unchanged: it is the "eln-cache" subdirectory
of 'user-emacs-directory'.
* Incompatible changes in Emacs 29.1
+---
+*** The Gtk selection face is no longer used for the region.
+The combination of a Gtk-controlled background and a foreground color
+controlled by the internal Emacs machinery led to low-contrast faces
+in common default setups. Emacs now uses the same 'region' face on
+Gtk and non-Gtk setups.
+
+** Dired
+
+---
+*** 'w' ('dired-copy-filename-as-kill') has changed behavior.
+If there are several files marked, file names containing space and
+quote characters will be quoted "like this".
+
+---
+*** The 'd' command now more consistently skips dot files.
+In previous Emacs versions, commands like 'C-u 10 d' would put the "D"
+mark on the next ten files, no matter whether they were dot files
+(i.e., "." and "..") or not, while marking the next ten lines with the
+mouse (in 'transient-mark-mode') and then hitting 'd' would skip dot
+files. These now work equivalently.
+
+++
** Warning about "eager macro-expansion failure" is changed into an error.
---
-** Previously, the X reverseVideo value at startup was heeded for all frames.
-This meant that if you had a reverseVideo resource on the initial
+** Previously, the X "reverseVideo" value at startup was heeded for all frames.
+This meant that if you had a "reverseVideo" resource on the initial
display, and then opened up a new frame on a display without any
-explicit reverseVideo setting, it would get heeded there, too. (This
-included terminal frames.) In Emacs 29, the reverseVideo X resource
+explicit "reverseVideo" setting, it would get heeded there, too. (This
+included terminal frames.) In Emacs 29, the "reverseVideo" X resource
is handled like all the other X resources, and set on a per-frame basis.
+++
@@ -182,7 +204,7 @@ is handled like all the other X resources, and set on a per-frame basis.
Previously, this command did the same as 'e'.
---
-** '/ a' in *Packages* now limits by package name(s) instead of regexp.
+** '/ a' in "*Packages*" buffer now limits by archive name(s) instead of regexp.
+++
** Setting the goal columns now also affects '<prior>' and '<next>'.
@@ -190,14 +212,6 @@ Previously, 'C-x C-n' only affected 'next-line' and 'previous-line',
but it now also affects 'scroll-up-command' and 'scroll-down-command'.
---
-** The 'd' command in Dired now more consistently skip dot files.
-In previous Emacs versions, commands like `C-u 10 d' would put the "D"
-mark on the next ten files, no matter whether they were dot files
-(i.e., "." and "..") or not, while marking the next ten lines with the
-mouse (in 'transient-mark-mode') and then hitting 'd' would skip dot
-files. These now work equivalently.
-
----
** Isearch in "*Help*" and "*info*" now char-folds quote characters by default.
This means that you can say 'C-s `foo' (GRAVE ACCENT) if the buffer
contains "‘foo" (LEFT SINGLE QUOTATION MARK) and the like. These
@@ -314,7 +328,7 @@ variable set to nil, as it will default to nil in a future Emacs
version and will be removed some time after that.
+++
-** Functions which recreate the "*scratch*" buffer now also initialize it.
+** Functions that recreate the "*scratch*" buffer now also initialize it.
When functions like 'other-buffer' and 'server-execute' recreate
"*scratch*", they now also insert 'initial-scratch-message' and set
the major mode according to 'initial-major-mode', like at Emacs
@@ -322,14 +336,72 @@ startup. Previously, these functions ignored
'initial-scratch-message' and left "*scratch*" in 'fundamental-mode'.
---
-** The rlogin.el library and 'rsh' command are now obsolete.
+** The autoarg.el library is now marked obsolete.
+This library provides the 'autoarg-mode' and 'autoarg-kp-mode' minor
+modes to emulate the behavior of the historical editor Twenex Emacs.
+It is believed to no longer be useful.
+
+---
+** The quickurl.el library is now obsolete.
+Use 'abbrev', 'skeleton' or 'tempo' instead.
+
+---
+** The rlogin.el library, and the 'rsh' command are now obsolete.
Use something like 'M-x shell RET ssh <host> RET' instead.
+---
+** The url-about.el library is now obsolete.
+
+---
+** The autoload.el library is now obsolete.
+It is superseded by the loaddefs-gen.el library.
+
+---
+** The netrc.el library is now obsolete.
+Use the 'auth-source-netrc-parse-all' function in auth-source.el
+instead.
+
+---
+** The url-dired.el library is now obsolete.
+
+---
+** The fast-lock.el and lazy-lock.el library have been removed.
+They have been obsolete since Emacs 22.1.
+
+The variable 'font-lock-support-mode' is occasionally useful for
+debugging purposes. It is now a regular variable (instead of a user
+option) and can be set to nil to disable Just-in-time Lock mode.
+
* Changes in Emacs 29.1
---
-** 'longlines-mode' is no longer obsolete.
+** New user option 'electric-quote-replace-consecutive'.
+
+---
+** Emacs is now capable of editing files with very long lines.
+The display of long lines has been optimized, and Emacs should no
+longer choke when a buffer on display contains long lines. The
+variable 'long-line-threshold' controls whether and when these display
+optimizations are in effect.
+
+A companion variable 'large-hscroll-threshold' controls when another
+set of display optimizations are in effect, which are aimed
+specifically at speeding up display of long lines that are truncated.
+
+If you still experience slowdowns while editing files with long lines,
+this may be due to line truncation, or to one of the enabled minor
+modes, or to the current major mode. Try turning off line truncation
+with 'C-x x t', or try disabling all known slow minor modes with
+'M-x so-long-minor-mode', or try disabling both known slow minor modes
+and the major mode with 'M-x so-long-mode', or visit the file with
+'M-x find-file-literally' instead of the usual 'C-x C-f'.
+
+Note that the display optimizations in these cases may cause the
+buffer to be occasionally mis-fontified.
+
+The new function 'long-line-optimizations-p' returns non-nil when
+these optimizations are in effect in the current buffer.
+++
** New command to change the font size globally.
@@ -338,9 +410,9 @@ decrease it, type 'C-x C-M--'; to restore the font size, type 'C-x
C-M-0'. The final key in these commands may be repeated without the
leading 'C-x' and without the modifiers, e.g. 'C-x C-M-+ C-M-+ C-M-+'
and 'C-x C-M-+ + +' increase the font size by three steps. When
-mouse-wheel-mode is enabled, 'C-M-wheel-up' and 'C-M-wheel-down' also
+'mouse-wheel-mode' is enabled, 'C-M-wheel-up' and 'C-M-wheel-down' also
increase and decrease the font size globally. Additionally, the
-variable 'global-text-scale-adjust-resizes-frames' controls whether
+user option 'global-text-scale-adjust-resizes-frames' controls whether
the frames are resized when the font size is changed.
+++
@@ -351,10 +423,10 @@ Get the parent directory of a file.
This variable is used by some operations (mostly syntax-propertization
and font-locking) to treat lines longer than this variable as if they
were made up of various smaller lines. This can help reduce the
-pathological slowdowns seen in buffers made of a single long line, but
-can also cause misbehavior in the presence of such long lines (tho
-most of that misbehavior should usually be limited to mis-highlighting).
-You can recover the previous behavior with:
+slowdowns seen in buffers made of a single long line, but can also
+cause misbehavior in the presence of such long lines (tho most of that
+misbehavior should usually be limited to mis-highlighting). You can
+recover the previous behavior with:
(setq syntax-wholeline-max most-positive-fixnum)
@@ -378,11 +450,23 @@ between these modes while the user is inputting a command by hitting
** Interactively, 'kill-buffer' will now offer to save the buffer if unsaved.
---
-** New command 'duplicate-line'.
-This command duplicates the current line the specified number of times.
+** New commands 'duplicate-line' and 'duplicate-dwim'.
+'duplicate-line' duplicates the current line the specified number of times.
+'duplicate-dwim' duplicates the region if it is active. If not, it
+works like 'duplicate-line'. An active rectangular region is
+duplicated on its right-hand side.
---
-** Files with the '.eld' extension are now visited in 'lisp-data-mode'.
+** Files with the ".eld" extension are now visited in 'lisp-data-mode'.
+
++++
+** 'network-lookup-address-info' can now check numeric IP address validity.
+Specifying 'numeric' as the new optional 'hints' argument makes it
+check if the passed address is a valid IPv4/IPv6 address (without DNS
+traffic).
+
+ (network-lookup-address-info "127.1" 'ipv4 'numeric)
+ => ([127 0 0 1 0])
+++
** New command 'find-sibling-file'.
@@ -467,11 +551,6 @@ previous behavior). The default is nil, which inhibits recording of
passwords.
+++
-** New user option 'longlines-break-chars'.
-This is a string containing chars that could be used as break point in
-longlines mode.
-
-+++
** New function 'command-query'.
This function makes its argument command prompt the user for
confirmation before executing.
@@ -545,7 +624,12 @@ This controls the style of the pre-edit and status areas of X input
methods.
+++
-** On X11, Emacs now tries to synchronize window resize with the window manager.
+** New X resources: "highlightForeground" and "highlightBackground".
+Only in the Lucid build, this controls colors used for highlighted
+menu item widgets.
+
++++
+** On X, Emacs now tries to synchronize window resize with the window manager.
This leads to less flicker and empty areas of a frame being displayed
when a frame is being resized. Unfortunately, it does not work on
some ancient buggy window managers, so if Emacs appears to freeze, but
@@ -553,6 +637,18 @@ is still responsive to input, you can turn it off by setting the X
resource "synchronizeResize" to "off".
+++
+** On X, Emacs can optionally synchronize display with the graphics hardware.
+When this is enabled by setting the X resource "synchronizeResize" to
+"extended", frame content "tearing" is drastically reduced. This is
+only supported on the Motif, Lucid, and no-toolkit builds, and
+requires an X compositing manager supporting the extended frame
+synchronization protocol (see
+https://fishsoup.net/misc/wm-spec-synchronization.html).
+
+This behavior can be toggled on and off via the frame parameter
+'use-frame-synchronization'.
+
++++
** New frame parameter 'alpha-background' and X resource "alphaBackground".
This controls the opacity of the text background when running on a
composited display.
@@ -687,19 +783,19 @@ or ':scream:'.
** Help
---
-*** Variable values displayed by 'C-h v' in *Help* are now font-locked.
+*** Variable values displayed by 'C-h v' in "*Help*" are now font-locked.
+++
*** New user option 'help-clean-buttons'.
-If non-nil, link buttons in *Help* will have any surrounding quotes
+If non-nil, link buttons in "*Help*" will have any surrounding quotes
removed.
---
*** 'M-x apropos-variable' output now includes values of variables.
+++
-*** New doc string syntax to indicate that symbols shouldn't be links.
-When displaying doc strings in "*Help*" buffers, strings that are
+*** New docstring syntax to indicate that symbols shouldn't be links.
+When displaying docstrings in "*Help*" buffers, strings that are
"`like-this'" are made into links (if they point to a bound
function/variable). This can lead to false positives when talking
about values that are symbols that happen to have the same names as
@@ -789,11 +885,8 @@ or is itself too long.
+++
*** New user option 'outline-minor-mode-use-buttons'.
If non-nil, Outline Minor Mode will use buttons to hide/show outlines
-in addition to the ellipsis. The default is nil.
-
----
-*** New user option 'outline-minor-mode-buttons'.
-This is a list of pairs of open/close strings used to display buttons.
+in addition to the ellipsis. The default is nil in editing modes, but
+non-nil in 'special-mode' and its derivatives.
+++
** Support for the WebP image format.
@@ -804,6 +897,7 @@ specifiers can now use ':type webp'.
** Windows
++++
*** New user option 'display-buffer-avoid-small-windows'.
If non-nil, this should be a window height, a number. Windows smaller
than this will be avoided by 'display-buffer', if possible.
@@ -909,7 +1003,7 @@ option 'cycle-spacing-actions'.
** 'zap-to-char' and 'zap-up-to-char' are case-sensitive for upper-case chars.
These commands now behave as case-sensitive for interactive calls when
they are invoked with an uppercase character, regardless of the
-`case-fold-search' value.
+'case-fold-search' value.
---
** 'scroll-other-window' and 'scroll-other-window-down' now respect remapping.
@@ -980,6 +1074,12 @@ The user option 'comint-terminfo-terminal' and the variable
'system-uses-terminfo' can now be set as connection-local variables to
change the terminal used on a remote host.
+---
+*** New user option 'comint-delete-old-input'.
+When nil, this prevents comint from deleting the current input when
+inserting previous input using '<mouse-2>'. The default is t, to
+preserve past behavior.
+
** Mwheel
---
@@ -1009,31 +1109,31 @@ now has font-selection and character composition rules, a language
environment, and an input method. The newly-added scripts and the
corresponding language environments are:
-**** Tai Tham script and the Northern Thai language environment
-**** Brahmi script and language environment
-**** Kaithi script and language environment
-**** Tirhuta script and language environment
-**** Sharada script and language environment
-**** Siddham script and language environment
-**** Syloti Nagri script and language environment
-**** Modi script and language environment
-**** Baybayin script and Tagalog language environment
-**** Hanunoo script and language environment
-**** Buhid script and language environment
-**** Tagbanwa script and language environment
-**** Limbu script and language environment
-**** Balinese script and language environment
-**** Javanese script and language environment
-**** Sundanese script and language environment
-**** Batak script and language environment
-**** Rejang script and language environment
-**** Makasar script and language environment
-**** Lontara script and language environment
-**** Hanifi Rohingya script and language environment
-**** Grantha script and language environment
-**** Kharoshthi script and language environment
-**** Lepcha script and language environment
-**** Meetei Mayek script and language environment
+Tai Tham script and the Northern Thai language environment
+Brahmi script and language environment
+Kaithi script and language environment
+Tirhuta script and language environment
+Sharada script and language environment
+Siddham script and language environment
+Syloti Nagri script and language environment
+Modi script and language environment
+Baybayin script and Tagalog language environment
+Hanunoo script and language environment
+Buhid script and language environment
+Tagbanwa script and language environment
+Limbu script and language environment
+Balinese script and language environment
+Javanese script and language environment
+Sundanese script and language environment
+Batak script and language environment
+Rejang script and language environment
+Makasar script and language environment
+Lontara script and language environment
+Hanifi Rohingya script and language environment
+Grantha script and language environment
+Kharoshthi script and language environment
+Lepcha script and language environment
+Meetei Mayek script and language environment
---
*** The "Oriya" language environment was renamed to "Odia".
@@ -1070,21 +1170,21 @@ related user option 'dired-clean-confirm-killing-deleted-buffers'
+++
*** 'dired-do-relsymlink' moved from dired-x to dired.
-The corresponding key "Y" is now bound by default in Dired.
+The corresponding key 'Y' is now bound by default in Dired.
+++
*** 'dired-do-relsymlink-regexp' moved from dired-x to dired.
-The corresponding key "% Y" is now bound by default in Dired.
+The corresponding key '% Y' is now bound by default in Dired.
---
*** 'M-G' is now bound to 'dired-goto-subdir'.
-Before, that binding was only available if the 'dired-x' package was
+Before, that binding was only available if the dired-x package was
loaded.
+++
*** 'dired-info' and 'dired-man' moved from dired-x to dired.
The 'dired-info' and 'dired-man' commands have been moved from the
-'dired-x' package to 'dired'. They have also been renamed to
+dired-x package to dired. They have also been renamed to
'dired-do-info' and 'dired-do-man'; the old command names are obsolete
aliases.
@@ -1095,9 +1195,9 @@ in Dired mode by default. The user options 'dired-bind-man' and
To get the old behavior back and unbind these keys in Dired mode, add
the following to your Init file:
-(with-eval-after-load 'dired
- (keymap-set dired-mode-map "N" nil)
- (keymap-set dired-mode-map "I" nil))
+ (with-eval-after-load 'dired
+ (keymap-set dired-mode-map "N" nil)
+ (keymap-set dired-mode-map "I" nil))
---
*** New command 'dired-do-eww'.
@@ -1105,9 +1205,11 @@ This command visits the file on the current line with EWW.
** Elisp
+---
*** New command 'elisp-eval-buffer' (bound to 'C-c C-e').
This command evals the forms in the current buffer.
+---
*** New commands 'elisp-byte-compile-file' and 'elisp-byte-compile-buffer'.
These commands (bound to 'C-c C-f' and 'C-c C-b', respectively)
byte-compile the visited file and the current buffer, respectively.
@@ -1130,7 +1232,7 @@ This can be used to trigger actions based on the battery status.
+++
*** New command 'enriched-toggle-markup'.
This allows you to see the markup in 'enriched-mode' buffers (e.g.,
-the HELLO file).
+the "HELLO" file).
** Shell Script Mode
@@ -1142,6 +1244,7 @@ This controls how statements like the following are indented:
bar
** Cperl Mode
+
---
*** New user option 'cperl-file-style'.
This option determines the indentation style to be used. It can also
@@ -1154,6 +1257,12 @@ be used as a file-local variable.
If given a prefix, it will query the user for an argument to use for
the run/continue command.
+---
+*** 'perldb' now recognizes '-E'.
+As of Perl 5.10, 'perl -E 0' behaves like 'perl -e 0' but also activates
+all optional features of the Perl version in use. 'perldb' now uses
+this invocation as its default.
+
** Customize
---
@@ -1161,6 +1270,14 @@ the run/continue command.
This is bound to 'H' and toggles whether to hide or show the widget
contents.
+** Diff mode
+
+---
+*** New user option 'diff-whitespace-style'.
+Sets the value of the buffer-local variable 'whitespace-style' in
+'diff-mode' buffers. By default, this variable is '(face trailing)',
+which preserves behavior from previous Emacs versions.
+
** Ispell
---
@@ -1192,7 +1309,7 @@ This command allows updating all packages without any queries.
+++
*** New commands 'package-recompile' and 'package-recompile-all'.
-These commands can be useful if the .elc files are out of date
+These commands can be useful if the ".elc" files are out of date
(invalid byte code and macros).
+++
@@ -1211,7 +1328,7 @@ inadvertently delete the "*scratch*" buffer.
** Debugging
---
-*** 'q' in a *Backtrace* buffer no longer clears the buffer.
+*** 'q' in a "*Backtrace*" buffer no longer clears the buffer.
Instead it just buries the buffer and switches the mode from
'debugger-mode' to 'backtrace-mode', since commands like 'e' are no
longer available after exiting the recursive edit.
@@ -1234,6 +1351,13 @@ When invoked with a non-zero prefix argument, as in 'C-u C-x C-e',
this command will pop up a new buffer and show the full pretty-printed
value there.
++++
+*** You can now generate a backtrace from Lisp errors in redisplay.
+To do this, set the new variable 'backtrace-on-redisplay-error' to a
+non-nil value. The backtrace will be written to a special buffer
+named "*Redisplay-trace*". This buffer will not be automatically
+displayed in a window.
+
** Compile
+++
@@ -1261,12 +1385,16 @@ files that have few newlines.
+++
** New minor mode 'word-wrap-whitespace-mode' for extending 'word-wrap'.
This mode switches 'word-wrap' on, and breaks on all the whitespace
-characters instead of just SPC and TAB.
+characters instead of just 'SPC' and 'TAB'.
---
** New mode, 'emacs-news-mode', for editing the NEWS file.
This mode adds some highlighting, fixes the 'M-q' command, and has
-commands for doing maintenance.
+commands for doing maintenance of the Emacs NEWS files. In addition,
+this mode turns on 'outline-minor-mode', and thus displays
+customizable icons (see 'icon-preference') on heading lines. To
+disable these icons, customize 'outline-minor-mode-use-buttons' to a
+nil value.
---
** Kmacro
@@ -1322,9 +1450,9 @@ the completions if they are already visible. The default value 't'
always hides the completion buffer after some completion is made.
*** New commands to complete the minibuffer history.
-'minibuffer-complete-history' ('C-x up') is like 'minibuffer-complete'
+'minibuffer-complete-history' ('C-x <up>') is like 'minibuffer-complete'
but completes on the history items instead of the default completion
-table. 'minibuffer-complete-defaults' ('C-x down') completes
+table. 'minibuffer-complete-defaults' ('C-x <down>') completes
on the list of default items.
+++
@@ -1371,6 +1499,11 @@ yank the text at mouse cursor. But if 'mouse-yank-at-point' is
non-nil, the text will now be added to the Isearch instead.
+++
+*** Changes for values 'no' and 'no-ding' of 'isearch-wrap-pause'.
+Now with these values the search will wrap around not only on repeating
+with 'C-s C-s', but also after typing a character.
+
++++
*** New user option 'char-fold-override'.
Non-nil means that the default definitions of equivalent characters
are overridden.
@@ -1497,6 +1630,12 @@ EUDC can now contribute email addresses to 'completion-at-point' by
adding the new function 'eudc-capf-complete' to
'completion-at-point-functions' in 'message-mode'.
++++
+*** Additional attributes of query and results in eudcb-macos-contacts.el.
+The EUDC back-end for the macOS Contacts app now provides a wider set
+of attributes to use for queries, and delivers more attributes in
+query results.
+
** EWW/SHR
+++
@@ -1526,6 +1665,7 @@ the common "utm_" trackers from URLs.
** Find-Dired
+---
*** New command 'find-dired-with-command'.
This enables users to run 'find-dired' with an arbitrary command,
enabling running commands previously unsupported and also enabling new
@@ -1544,9 +1684,15 @@ well as the icons used), and the "Gnome" tool bars are now the only
pre-defined toolbars.
---
+*** 'gnus-summary-up-thread' and 'gnus-summary-down-thread' bindings removed.
+The 'gnus-summary-down-thread' binding to "M-C-d" was shadowed by
+'gnus-summary-read-document', and these commands are also available on
+"T-u" and "T-d" respectively.
+
+---
*** Gnus now uses a variable-pitch font in the headers by default.
To get the monospace font back, you can put something like the
-following in your .gnus file:
+following in your ".gnus" file:
(set-face-attribute 'gnus-header nil :inherit 'unspecified)
@@ -1614,11 +1760,6 @@ The new ':doc-spec-function' element can be used to compute the
':doc-spec' element when the user asks for info on that particular
mode (instead of at load time).
-** Subr-x
-
-+++
-*** New macro 'with-memoization' provides a very primitive form of memoization.
-
** Ansi-color
---
@@ -1872,6 +2013,11 @@ recently set.
*** When editing a bookmark annotation, 'C-c C-k' will now cancel.
It is bound to the new command 'bookmark-edit-annotation-cancel'.
+---
+*** New option 'bookmark-fringe-mark'.
+This option controls the bitmap used to indicate bookmarks in the
+fringe (or 'nil' to disable showing this marker).
+
** Exif
---
@@ -1908,7 +2054,7 @@ This command displays a buffer containing the page load history of
the current WebKit widget, and allows you to navigate it.
---
-*** On X11, the WebKit inspector is now available inside xwidgets.
+*** On X, the WebKit inspector is now available inside xwidgets.
To access the inspector, right click on the widget and select "Inspect
Element".
@@ -1958,7 +2104,7 @@ This support has been obsolete since Emacs 25.1. The final version of
the Galeon web browser was released in September, 2008.
---
-*** Support for the "Mozilla" web browser is now obsolete.
+*** Support for the Mozilla web browser is now obsolete.
Note that this historical web browser is different from Mozilla
Firefox; it is its predecessor.
@@ -2022,12 +2168,19 @@ Additionally, globs ending with '**/' or '***/' no longer raise an
error, and now expand to all directories recursively (following
symlinks in the latter case).
++++
+*** Lisp forms in Eshell now treat a 'nil' result as a failed exit status.
+When executing a command that looks like '(lisp form)', Eshell will
+set the exit status (available in the '$?' variable) to 2. This
+allows commands like that to be used as conditionals. To change this
+behavior, customize the new 'eshell-lisp-form-nil-is-failure' option.
+
** Shell
---
*** New user option 'shell-kill-buffer-on-exit'.
-Enabling this will automatically kill a *shell* buffer as soon as the
-shell session terminates.
+Enabling this will automatically kill a "*shell*" buffer as soon as
+the shell session terminates.
** Calc
@@ -2078,7 +2231,7 @@ If non-nil, files untracked by a VCS are considered to be part of
the project by a VC project based on that VCS.
---
-*** 'recentf-mode' now uses shortened filenames by default.
+*** 'recentf-mode' now uses abbreviated file names by default.
This means that e.g. "/home/foo/bar" is now displayed as "~/bar".
Customize the user option 'recentf-filename-handlers' to nil to get
back the old behavior.
@@ -2098,19 +2251,27 @@ instead of also trying to ping it. Customize the user option
*** The 'run-dig' command is now obsolete; use 'dig' instead.
---
-** The autoarg.el library is now marked obsolete.
-This library provides the 'autoarg-mode' and 'autoarg-kp-mode' minor
-modes to emulate the behavior of the historical editor Twenex Emacs.
-It is believed to no longer be useful.
+*** Some `bib-mode' commands and variables have been renamed.
+To respect Emacs naming conventions, the variable 'unread-bib-file'
+has been renamed to 'bib-unread-file'. The following commands have
+also been renamed:
+ 'addbib' to 'bib-add'
+ 'return-key-bib' to 'bib-return-key'
+ 'mark-bib' to 'bib-mark'
+ 'unread-bib' to 'bib-unread'
---
-** proced.el shows system processes of remote hosts.
+*** proced.el shows system processes of remote hosts.
When 'default-directory' is remote, and 'proced' is invoked with a
negative argument like 'C-u - proced', the system processes of that
remote host are shown. Alternatively, the user option
'proced-show-remote-processes' can be set to non-nil.
'proced-signal-function' has been marked obsolete.
+---
+*** 'outlineify-sticky' command is renamed to 'allout-outlinify-sticky'.
+The old name is still available as an obsolete function alias.
+
* New Modes and Packages in Emacs 29.1
@@ -2119,6 +2280,7 @@ remote host are shown. Alternatively, the user option
Allows the creation of "functions with slots" or "function objects"
via the macros 'oclosure-define' and 'oclosure-lambda'.
++++
*** New generic function 'oclosure-interactive-form'.
Used by 'interactive-form' when called on an OClosure.
This allows specific OClosure types to compute their interactive specs
@@ -2134,41 +2296,46 @@ This mode is used to edit files geared towards testing actions in
Emacs buffers, like indentation and the like. The new ert function
'ert-test-erts-file' is used to parse these files.
+---
+** New mode 'js-json-mode'.
+This is a lightweight variant of 'js-mode' that is used by default
+when visiting JSON files.
+
* Incompatible Lisp Changes in Emacs 29.1
---
** 'find-image' now uses 'create-image'.
-This means that images found through 'find-image' also has
+This means that images found through 'find-image' also have
auto-scaling applied. (This only makes a difference on HiDPI
displays.)
+++
** Changes to "raw" in-memory xbm images are specified.
Some years back Emacs gained the ability to scale images, and you
-could then specify :width and :height when using 'create-image' on all
+could then specify ':width' and ':height' when using 'create-image' on all
image types -- except xbm images, because this format already used the
-:width and :height arguments to specify the width/height of the "raw"
+':width' and ':height' arguments to specify the width/height of the "raw"
in-memory format. This meant that if you used these specifications
on, for instance, xbm files, Emacs would refuse to display them. This
-has been changed, and :width/:height now works as with all other image
+has been changed, and ':width'/':height' now works as with all other image
formats, and the way to specify the width/height of the "raw"
-in-memory format is now by using :data-width and :data-height.
+in-memory format is now by using ':data-width' and ':data-height'.
+++
-** loaddefs.el generation has been reimplemented.
-The various loaddefs.el files in the Emacs tree (which contain
+** "loaddefs.el" generation has been reimplemented.
+The various "loaddefs.el" files in the Emacs tree (which contain
information about autoloads, built-in packages and package prefixes)
-used to be generated by functions in autoloads.el. These are now
-generated by loaddefs-gen.el instead. This leads to functionally
+used to be generated by functions in "autoloads.el". These are now
+generated by "loaddefs-gen.el" instead. This leads to functionally
equivalent loaddef files, but they do not use exactly the same syntax,
so using 'M-x update-file-autoloads' no longer works. (This didn't
work well in most files in the past, either, but it will now signal an
error in any file.)
In addition, files are scanned in a slightly different way.
-Previously ;;;### specs inside a top-level form (i.e., something like
-(when ... ;;;### ...) would be ignored. They are now parsed as
+Previously ';;;###' specs inside a top-level form (i.e., something
+like '(when ... ;;;### ...)' would be ignored. They are now parsed as
normal.
+++
@@ -2209,6 +2376,12 @@ they will still be escaped, so the '.foo' symbol is still printed as
and remapping parent of basic faces does not work reliably.
Instead of remapping 'mode-line', you have to remap 'mode-line-active'.
++++
+** 'make-process' has been extended to support ptys when ':stderr' is set.
+Previously, setting ':stderr' to a non-nil value would force the
+process's connection to use pipes. Now, Emacs will use a pty for
+stdin and stdout if requested no matter the value of ':stderr'.
+
---
** User option 'mail-source-ignore-errors' is now obsolete.
The whole mechanism for prompting users to continue in case of
@@ -2294,6 +2467,18 @@ Use 'exif-parse-file' and 'exif-field' instead.
This change is now applied in 'dired-insert-directory'.
---
+** 'compilation-last-buffer' is (finally) declared obsolete.
+It's been obsolete since Emacs-22.1, actually.
+
+---
+** Calling 'lsh' now elicits a byte-compiler warning.
+'lsh' behaves in somewhat surprising and platform-dependent ways for
+negative arguments, and is generally slower than 'ash', which should be
+used instead. This warning can be suppressed by surrounding calls to
+'lsh' with the construct '(with-suppressed-warnings ((suspicious lsh)) ...)',
+but switching to `ash` is generally much preferable.
+
+---
** Some functions and variables obsolete since Emacs 24 have been removed:
'Info-edit-map', 'allout-abbreviate-flattened-numbering',
'allout-mode-deactivate-hook', 'ansi-color-unfontify-region',
@@ -2304,16 +2489,18 @@ This change is now applied in 'dired-insert-directory'.
'chart-map', 'comint-dynamic-complete',
'comint-dynamic-complete-as-filename',
'comint-dynamic-simple-complete', 'command-history-map',
-'completion-annotate-function', 'condition-case-no-debug',
-'count-lines-region', 'data-debug-map', 'deferred-action-list',
-'deferred-action-function', 'dired-x-submit-report',
-'eieio-defgeneric', 'eieio-defmethod', 'emacs-lock-from-exiting',
-'erc-complete-word', 'eshell-cmpl-suffix-list', 'eshell-for',
-'font-lock-maximum-size', 'gnus-carpal',
+'compilation-parse-errors-function', 'completion-annotate-function',
+'condition-case-no-debug', 'count-lines-region', 'data-debug-map',
+'deferred-action-list', 'deferred-action-function',
+'dired-x-submit-report', 'eieio-defgeneric', 'eieio-defmethod',
+'emacs-lock-from-exiting', 'erc-complete-word',
+'eshell-cmpl-suffix-list', 'eshell-for', 'font-lock-maximum-size',
+'font-lock-reference-face', 'gnus-carpal',
'gnus-debug-exclude-variables', 'gnus-debug-files',
'gnus-local-domain', 'gnus-outgoing-message-group',
-'gnus-registry-user-format-function-M', 'image-extension-data',
-'image-library-alist', 'inhibit-first-line-modes-regexps',
+'gnus-secondary-servers', 'gnus-registry-user-format-function-M',
+'image-extension-data', 'image-library-alist',
+'inhibit-first-line-modes-regexps',
'inhibit-first-line-modes-suffixes', 'intdos',
'mail-complete-function', 'mail-completion-at-point-function',
'mail-mailer-swallows-blank-line', 'mail-sent-via', 'make-register',
@@ -2321,14 +2508,15 @@ This change is now applied in 'dired-insert-directory'.
'meta-complete-symbol', 'meta-mode-map',
'minibuffer-completing-symbol',
'minibuffer-local-filename-must-match-map', 'mode25', 'mode4350',
-'msb-after-load-hooks', 'nnimap-split-rule', 'ns-alternatives-map',
-'ns-store-cut-buffer-internal', 'package-menu-view-commentary',
-'pascal-last-completions', 'pascal-show-completions',
-'pascal-toggle-completions', 'prolog-char-quote-workaround',
-'read-filename-at-point', 'reftex-index-map',
-'reftex-index-phrases-map', 'reftex-select-bib-map',
-'reftex-select-label-map', 'reftex-toc-map', 'register-name-alist',
-'register-value', 'report-emacs-bug-pretest-address',
+'msb-after-load-hooks', 'nnimap-split-rule', 'nntp-authinfo-file',
+'ns-alternatives-map', 'ns-store-cut-buffer-internal',
+'package-menu-view-commentary', 'pascal-last-completions',
+'pascal-show-completions', 'pascal-toggle-completions',
+'prolog-char-quote-workaround', 'read-filename-at-point',
+'reftex-index-map', 'reftex-index-phrases-map',
+'reftex-select-bib-map', 'reftex-select-label-map', 'reftex-toc-map',
+'register-name-alist', 'register-value',
+'report-emacs-bug-pretest-address',
'rmail-default-dont-reply-to-names', 'rmail-dont-reply-to',
'rmail-dont-reply-to-names', 'rst-block-face', 'rst-comment-face',
'rst-definition-face', 'rst-directive-face', 'rst-emphasis1-face',
@@ -2345,11 +2533,17 @@ This change is now applied in 'dired-insert-directory'.
---
** Some functions and variables obsolete since Emacs 23 have been removed:
'find-emacs-lisp-shadows', 'newsticker-cache-filename',
+'redisplay-end-trigger-functions', 'set-window-redisplay-end-trigger',
'unify-8859-on-decoding-mode', 'unify-8859-on-encoding-mode',
-'vc-arch-command'.
+'vc-arch-command', 'window-redisplay-end-trigger', 'x-selection'.
+
+---
+** Some functions and variables obsolete since Emacs 21 or 22 have been removed:
+'c-toggle-auto-state', 'find-file-not-found-hooks',
+'ls-lisp-dired-ignore-case', 'query-replace-regexp-eval'.
+++
-** New generic function 'function-doumentation'.
+** New generic function 'function-documentation'.
Can dynamically generate a raw docstring depending on the type of
a function.
Used mainly for docstrings of OClosures.
@@ -2373,6 +2567,7 @@ functions.
** '?\' at the end of a line now signals an error.
Previously it produced a nonsense value, -1, that was never intended.
+---
** Some libraries obsolete since Emacs 24.1 and 24.3 have been removed:
abbrevlist.el, assoc.el, complete.el, cust-print.el,
erc-hecomplete.el, mailpost.el, mouse-sel.el, old-emacs-lock.el,
@@ -2382,6 +2577,33 @@ patcomp.el, pc-mode.el, pc-select.el, s-region.el, and sregex.el.
* Lisp Changes in Emacs 29.1
+++
+** New function 'compiled-function-p'.
+This returns non-nil if its argument is either a built-in, or a
+byte-compiled, or a natively-compiled function object, or a function
+loaded from a dynamic module.
+
+---
+** 'deactivate-mark' can have new value 'dont-save'.
+This value means that Emacs should deactivate the mark as usual, but
+without setting the primary selection, if 'select-active-regions' is
+enabled.
+
++++
+** New 'declare' form 'interactive-args'.
+This can be used to specify what forms to put into 'command-history'
+when executing commands interactively.
+
++++
+** The FORM arg of 'time-convert' is mandatory.
+'time-convert' can still be called without it, as before, but the
+compiler now emits a warning about this deprecated usage.
+
++++
+** Emacs now supports user-customizable and themable icons.
+These can be used for buttons in buffers and the like. See the
+"(elisp) Icons" and "(emacs) Icons" nodes in the manuals for details.
+
++++
** New arguments MESSAGE and TIMEOUT of 'set-transient-map'.
MESSAGE specifies a message to display after activating the transient
map, including a special formatting spec to list available keys.
@@ -2425,15 +2647,28 @@ If DATA is a string, then its text properties are searched for values
for each specific data type while the selection is being converted.
---
-** New eldoc function: 'elisp-eldoc-var-docstring-with-value'.
+** New eldoc function 'elisp-eldoc-var-docstring-with-value'.
This function includes the current value of the variable in eldoc display
and can be used as a more detailed alternative to 'elisp-eldoc-var-docstring'.
++++
** 'save-some-buffers' can now be extended to save other things.
Traditionally, 'save-some-buffers' saved buffers, and also saved
abbrevs. This has been generalized via the
-'save-some-buffers-functions', and packages can now register things to
-be saved.
+'save-some-buffers-functions' variable, and packages can now register
+things to be saved.
+
++++
+** New function 'string-equal-ignore-case'.
+This compares strings ignoring case differences.
+
+** 'symbol-file' can now report natively-compiled ".eln" files.
+If Emacs was built with native-compilation enabled, Lisp programs can
+now call 'symbol-file' with the new optional 3rd argument non-nil to
+request the name of the ".eln" file which defined a given symbol.
+
++++
+** New macro 'with-memoization' provides a very primitive form of memoization.
** Themes
@@ -2473,7 +2708,7 @@ selecting some text into the clipboard or primary selection, and then
delete the current frame, you will still be able to insert the
contents of that selection into other programs as long as another
frame is open on the same display. This behavior can be disabled by
-setting the variable 'x-auto-preserve-selections' to nil.
+setting the user option 'x-auto-preserve-selections' to nil.
+++
** New predicate 'char-uppercase-p'.
@@ -2482,18 +2717,18 @@ This returns non-nil if its argument its an uppercase character.
** Byte compilation
---
-*** Byte compilation will now warn about some quoting mistakes in doc strings.
-When writing code snippets that contains the ' character (APOSTROPHE),
+*** Byte compilation will now warn about some quoting mistakes in docstrings.
+When writing code snippets that contains the "'" character (APOSTROPHE),
that quote character has to be escaped to avoid Emacs displaying it as
-’ (LEFT SINGLE QUOTATION MARK), which would make code examples like
+"’" (LEFT SINGLE QUOTATION MARK), which would make code examples like
(setq foo '(1 2 3))
invalid. Emacs will now warn during byte compilation if it seems
something like that, and also warn about when using RIGHT/LEFT SINGLE
QUOTATION MARK directly. In both these cases, if these characters
-should really be present in the doc string, they should be quoted with
-\=.
+should really be present in the docstring, they should be quoted with
+"\=".
---
*** Byte compilation will now warn about some malformed 'defcustom' types.
@@ -2506,12 +2741,12 @@ value. The byte compiler will now issue a warning if it encounters
these forms.
+++
-*** 'restore-buffer-modified-p' can now alter buffer auto-save state.
+** 'restore-buffer-modified-p' can now alter buffer auto-save state.
With a FLAG value of 'autosaved', it will mark the buffer as having
been auto-saved since the time of last modification.
---
-*** New minor mode 'isearch-fold-quotes-mode'.
+** New minor mode 'isearch-fold-quotes-mode'.
This sets up 'search-default-mode' so that quote characters are
char-folded into each other. It is used, by default, in "*Help*" and
"*info*" buffers.
@@ -2665,7 +2900,7 @@ This is like 'get-text-property', but works on the 'display' text
property.
+++
-** New function 'add-text-display-property'.
+** New function 'add-display-text-property'.
This is like 'put-text-property', but works on the 'display' text
property.
@@ -2696,10 +2931,12 @@ them towards or away from each other.
This hook is run before 'x-popup-menu' is about to display a
deck-of-cards menu on screen.
+---
** New hook 'post-select-region-hook'.
This hook is run immediately after 'select-active-regions' causes the
region to be set as the primary selection.
++++
** New function 'buffer-match-p'.
Check if a buffer satisfies some condition. Some examples for
conditions can be regular expressions that match a buffer name, a
@@ -2707,6 +2944,7 @@ cons-cell like '(major-mode . shell-mode)' that matches any buffer
where 'major-mode' is 'shell-mode' or a combined with a condition like
'(and "\\`\\*.+\\*\\'" (major-mode . special-mode))'.
++++
** New function 'match-buffers'.
Use 'buffer-match-p' to gather a list of buffers that match a
condition.
@@ -2746,7 +2984,7 @@ option.
+++
*** 'where-is-internal' can now filter events marked as non key events.
-If a command maps to a key binding like [some-event], and 'some-event'
+If a command maps to a key binding like '[some-event]', and 'some-event'
has a symbol plist containing a non-nil 'non-key-event' property, then
that binding is ignored by 'where-is-internal'.
@@ -3163,6 +3401,15 @@ This is useful when quoting shell arguments for a remote shell
invocation. Such shells are POSIX conformant by default.
+++
+** 'make-process' can set connection type independently for input and output.
+When calling 'make-process', communication via pty can be enabled
+selectively for just input or output by passing a cons cell for
+':connection-type', e.g. '(pipe . pty)'. When examining a process
+later, you can determine whether a particular stream for a process
+uses a pty by passing one of 'stdin', 'stdout', or 'stderr' as the
+second argument to 'process-tty-name'.
+
++++
** 'signal-process' now consults the list 'signal-process-functions'.
This is to determine which function has to be called in order to
deliver the signal. This allows Tramp to send the signal to remote
@@ -3186,6 +3433,11 @@ to preserve the old behavior, apply
(let ((default-directory temporary-file-directory))
(process-attributes pid))
++++
+** New functions 'take' and 'ntake'.
+'(take N LIST)' returns the first N elements of LIST; 'ntake' does
+the same but works by modifying LIST destructively.
+
* Changes in Emacs 29.1 on Non-Free Operating Systems
diff --git a/etc/NEWS.1-17 b/etc/NEWS.1-17
index ee6fa82b29f..9d7bacc9ec8 100644
--- a/etc/NEWS.1-17
+++ b/etc/NEWS.1-17
@@ -41,10 +41,10 @@ that Emacs has not been run on before.
See etc/MACHINES.
-** Portable `alloca' provided.
+** Portable 'alloca' provided.
Emacs can now run on machines that do not and cannot support the library
-subroutine `alloca' in the canonical fashion, using an `alloca' emulation
+subroutine 'alloca' in the canonical fashion, using an 'alloca' emulation
written in C.
** On-line manual.
@@ -74,39 +74,39 @@ highest previously used.
Thus, the active, current file does not have a version number.
Only the backups have them.
-This feature is controlled by the variable `version-control'. If it
-is `nil', as normally, then numbered backups are made only for files
+This feature is controlled by the variable 'version-control'. If it
+is 'nil', as normally, then numbered backups are made only for files
that already have numbered backups. Backup names with just `~' are
used for files that have no numbered backups.
-If `version-control' is `never', then the backup file's name is
+If 'version-control' is 'never', then the backup file's name is
made with just `~' in any case.
-If `version-control' is not `nil' or `never', numbered backups are
+If 'version-control' is not 'nil' or 'never', numbered backups are
made unconditionally.
To prevent unlimited consumption of disk space, Emacs can delete
old backup versions automatically. Generally Emacs keeps the first
few backups and the latest few backups, deleting any in between.
This happens every time a new backup is made. The two variables that
-control the deletion are `kept-old-versions' and `kept-new-versions'.
+control the deletion are 'kept-old-versions' and 'kept-new-versions'.
Their values are, respectively, the number of oldest backups to keep
and the number of newest ones to keep, each time a new backup is made.
-The value of `kept-new-versions' includes the backup just created.
+The value of 'kept-new-versions' includes the backup just created.
By default, both values are 2.
-If `trim-versions-without-asking' is non-`nil', the excess middle versions
-are deleted without a murmur. If it is `nil', the default, then you
+If 'trim-versions-without-asking' is non-'nil', the excess middle versions
+are deleted without a murmur. If it is 'nil', the default, then you
are asked whether the excess middle versions should really be deleted.
Dired has a new command `.' which marks for deletion all but the latest
-and oldest few of every numeric series of backups. `kept-old-versions'
-controls the number of oldest versions to keep, and `dired-kept-versions'
+and oldest few of every numeric series of backups. 'kept-old-versions'
+controls the number of oldest versions to keep, and 'dired-kept-versions'
controls the number of latest versions to keep. A numeric argument to
the `.' command, if positive, specifies the number of latest versions
-to keep, overriding `dired-kept-versions'. A negative argument specifies
+to keep, overriding 'dired-kept-versions'. A negative argument specifies
the number of oldest versions to keep, using minus the argument to override
-`kept-old-versions'.
+'kept-old-versions'.
** Immediate conflict detection.
@@ -182,17 +182,17 @@ is now C-c C-o, and C-x C-v (show output) is now C-c C-r.
The old M-= (copy previous input) command is now C-c C-y.
-** Shell mode recognizes aliases for `pushd', `popd' and `cd'.
+** Shell mode recognizes aliases for 'pushd', 'popd' and 'cd'.
-Shell mode now uses the variable `shell-pushd-regexp' as a
+Shell mode now uses the variable 'shell-pushd-regexp' as a
regular expression to recognize any command name that is
-equivalent to a `pushd' command. By default it is set up
-to recognize just `pushd' itself. If you use aliases for
-`pushd', change the regexp to recognize them as well.
+equivalent to a 'pushd' command. By default it is set up
+to recognize just 'pushd' itself. If you use aliases for
+'pushd', change the regexp to recognize them as well.
-There are also `shell-popd-regexp' to recognize commands
-with the effect of a `popd', and `shell-cd-regexp' to recognize
-commands with the effect of a `cd'.
+There are also 'shell-popd-regexp' to recognize commands
+with the effect of a 'popd', and 'shell-cd-regexp' to recognize
+commands with the effect of a 'cd'.
** "Exit" command in certain modes now C-c C-c.
@@ -203,7 +203,7 @@ modes, the command to exit used to be just C-c.
** Outline mode changes.
Lines that are not heading lines are now called "body" lines.
-The command `hide-text' is renamed to `hide-body'.
+The command 'hide-text' is renamed to 'hide-body'.
The key M-H is renamed to C-c C-h.
The key M-S is renamed to C-c C-s.
The key M-s is renamed to C-c C-i.
@@ -229,7 +229,7 @@ o now outputs to an Rmail file, and C-o to a Unix mail file.
The F command (rmail-find) is renamed to M-s (rmail-search).
Various new commands and features exist; see the Emacs manual.
-** Local bindings described first in describe-bindings.
+** Local bindings described first in 'describe-bindings'.
** [...], {...} now balance in Fundamental mode.
@@ -238,9 +238,9 @@ Various new commands and features exist; see the Emacs manual.
There are two new major modes for editing nroff input and TeX input.
See the Emacs manual for full information.
-** New C indentation style variable `c-brace-imaginary-offset'.
+** New C indentation style variable 'c-brace-imaginary-offset'.
-The value of `c-brace-imaginary-offset', normally zero, controls the
+The value of 'c-brace-imaginary-offset', normally zero, controls the
indentation of a statement inside a brace-group where the open-brace
is not the first thing on a line. The value says where the open-brace
is imagined to be, relative to the first nonblank character on the line.
@@ -251,47 +251,47 @@ Dired now normally keeps the cursor at the beginning of the file name,
not at the beginning of the line. The most used motion commands are
redefined in Dired to position the cursor this way.
-`n' and `p' are now equivalent in dired to `C-n' and `C-p'.
+'n' and 'p' are now equivalent in dired to 'C-n' and 'C-p'.
If any files to be deleted cannot be deleted, their names are
printed in an error message.
-If the `v' command is invoked on a file which is a directory,
+If the 'v' command is invoked on a file which is a directory,
dired is run on that directory.
-** `visit-tag-table' renamed `visit-tags-table'.
+** 'visit-tag-table' renamed 'visit-tags-table'.
-This is so apropos of `tags' finds everything you need to
+This is so apropos of 'tags' finds everything you need to
know about in connection with Tags.
-** `mh-e' library uses C-c as prefix.
+** 'mh-e' library uses C-c as prefix.
-All the special commands of `mh-rmail' now are placed on a
+All the special commands of 'mh-rmail' now are placed on a
C-c prefix rather than on the C-x prefix. This is for
consistency with other special modes with their own commands.
-** M-$ or `spell-word' checks word before point.
+** M-$ or 'spell-word' checks word before point.
It used to check the word after point.
** Quitting during autoloading no longer causes trouble.
Now, when a file is autoloaded, all function redefinitions
-and `provide' calls are recorded and are undone if you quit
+and 'provide' calls are recorded and are undone if you quit
before the file is finished loading.
As a result, it no longer happens that some of the entry points
which are normally autoloading have been defined already, but the
entire file is not really present to support them.
-** `else' can now be indented correctly in C mode.
+** 'else' can now be indented correctly in C mode.
-TAB in C mode now knows which `if' statement an `else' matches
-up with, and can indent the `else' correctly under the `if',
-even if the `if' contained such things as another `if' statement,
-or a `while' or `for' statement, with no braces around it.
+TAB in C mode now knows which 'if' statement an 'else' matches
+up with, and can indent the 'else' correctly under the 'if',
+even if the 'if' contained such things as another 'if' statement,
+or a 'while' or 'for' statement, with no braces around it.
-** `batch-byte-compile'
+** 'batch-byte-compile'
Runs byte-compile-file on the files specified on the command line.
All the rest of the command line arguments are taken as files to
@@ -300,10 +300,10 @@ Must be used only with -batch, and kills emacs on completion.
Each file will be processed even if an error occurred previously.
For example, invoke `emacs -batch -f batch-byte-compile *.el'.
-** `-batch' changes.
+** '-batch' changes.
-`-batch' now implies `-q': no init file is loaded by Emacs when
-`-batch' is used. Also, no `term/TERMTYPE.el' file is loaded. Auto
+'-batch' now implies '-q': no init file is loaded by Emacs when
+'-batch' is used. Also, no `term/TERMTYPE.el' file is loaded. Auto
saving is not done except in buffers in which it is explicitly
requested. Also, many echo-area printouts describing what is going on
are inhibited in batch mode, so that the only output you get is the
@@ -311,7 +311,7 @@ output you program specifically.
One echo-area message that is not suppressed is the one that says
that a file is being loaded. That is because you can prevent this
-message by passing `t' as the third argument to `load'.
+message by passing 't' as the third argument to 'load'.
** Display of search string in incremental search.
@@ -324,12 +324,12 @@ is actually going on.
** View commands.
The commands C-x ], C-x [, C-x /, C-x j and C-x o are now
-available inside `view-buffer' and `view-file', with their
+available inside 'view-buffer' and 'view-file', with their
normal meanings.
** Full-width windows preferred.
-The ``other-window'' commands prefer other full width windows,
+The 'other-window' commands prefer other full width windows,
and will split only full width windows.
** M-x rename-file can copy if necessary.
@@ -367,7 +367,7 @@ distance rather than a single column if used with no argument.
** Auto Save Files Deleted.
-The default value of `delete-auto-save-files' is now `t', so that
+The default value of 'delete-auto-save-files' is now 't', so that
when you save a file for real, its auto save file is deleted.
** Rnews changes.
@@ -392,18 +392,18 @@ to specify files in which copies of the message should be put.
The message is written into those files in Unix mail file format.
The message as sent does not contain any Fcc fields in its header.
You can use any number of Fcc fields, but only one file name in each one.
-The variable `mail-archive-file-name', if non-`nil', can be a string
+The variable 'mail-archive-file-name', if non-'nil', can be a string
which is a file name; an Fcc to that file will be inserted in every
message when you begin to compose it.
A new command C-c q now exists in Mail mode. It fills the
paragraphs of an old message that had been inserted with C-c y.
-When the *mail* buffer is put in Mail mode, text-mode-hook
-is now run in addition to mail-mode-hook. text-mode-hook
+When the *mail* buffer is put in Mail mode, 'text-mode-hook'
+is now run in addition to 'mail-mode-hook'. text-mode-hook
is run first.
-The new variable `mail-header-separator' now specifies the string
+The new variable 'mail-header-separator' now specifies the string
to use on the line that goes between the headers and the message text.
By default it is still "--text follows this line--".
@@ -434,38 +434,38 @@ with
(defun foo-1 (x y z) ...
-** Functions `region-to-string' and `region-around-match' removed.
+** Functions 'region-to-string' and 'region-around-match' removed.
These functions were made for compatibility with Gosling Emacs, but it
turns out to be undesirable to use them in GNU Emacs because they use
the mark. They have been eliminated from Emacs proper, but are
present in mlsupport.el for the sake of converted mocklisp programs.
-If you were using `region-to-string', you should instead use
-`buffer-substring'; then you can pass the bounds as arguments and
+If you were using 'region-to-string', you should instead use
+'buffer-substring'; then you can pass the bounds as arguments and
can avoid setting the mark.
-If you were using `region-around-match', you can use instead
-the two functions `match-beginning' and `match-end'. These give
+If you were using 'region-around-match', you can use instead
+the two functions 'match-beginning' and 'match-end'. These give
you one bound at a time, as a numeric value, without changing
point or the mark.
-** Function `function-type' removed.
+** Function 'function-type' removed.
This just appeared not to be very useful. It can easily be written in
-Lisp if you happen to want it. Just use `symbol-function' to get the
+Lisp if you happen to want it. Just use 'symbol-function' to get the
function definition of a symbol, and look at its data type or its car
if it is a list.
-** Variable `buffer-number' removed.
+** Variable 'buffer-number' removed.
-You can still use the function `buffer-number' to find out
+You can still use the function 'buffer-number' to find out
a buffer's unique number (assigned in order of creation).
-** Variable `executing-macro' renamed `executing-kbd-macro'.
+** Variable 'executing-macro' renamed 'executing-kbd-macro'.
This variable is the currently executing keyboard macro, as
-a string, or `nil' when no keyboard macro is being executed.
+a string, or 'nil' when no keyboard macro is being executed.
** Loading term/$TERM.
@@ -478,15 +478,15 @@ term-$TERM; thus, for example, term-vt100.el, but now they live
in a special subdirectory named term, and have names like
term/vt100.el.
-** `command-history' format changed.
+** 'command-history' format changed.
The elements of this list are now Lisp expressions which can
be evaluated directly to repeat a command.
** Unused editing commands removed.
-The functions `forward-to-word', `backward-to-word',
-`upcase-char', `mark-beginning-of-buffer' and `mark-end-of-buffer'
+The functions 'forward-to-word', 'backward-to-word',
+'upcase-char', 'mark-beginning-of-buffer' and 'mark-end-of-buffer'
have been removed. Their definitions can be found in file
lisp/unused.el if you need them.
@@ -496,53 +496,53 @@ lisp/unused.el if you need them.
** You can now continue after errors and quits.
When the debugger is entered because of a C-g, due to
-a non-`nil' value of `debug-on-quit', the `c' command in the debugger
+a non-'nil' value of 'debug-on-quit', the 'c' command in the debugger
resumes execution of the code that was running when the quit happened.
-Use the `q' command to go ahead and quit.
+Use the 'q' command to go ahead and quit.
The same applies to some kinds of errors, but not all. Errors
-signaled with the Lisp function `signal' can be continued; the `c'
-command causes `signal' to return. The `r' command causes `signal' to
-return the value you specify. The `c' command is equivalent to `r'
-with the value `nil'.
+signaled with the Lisp function 'signal' can be continued; the 'c'
+command causes 'signal' to return. The 'r' command causes 'signal' to
+return the value you specify. The 'c' command is equivalent to 'r'
+with the value 'nil'.
-For a `wrong-type-argument' error, the value returned with the `r'
+For a 'wrong-type-argument' error, the value returned with the 'r'
command is used in place of the invalid argument. If this new value
is not valid, another error occurs.
-Errors signaled with the function `error' cannot be continued.
+Errors signaled with the function 'error' cannot be continued.
If you try to continue, the error just happens again.
-** `dot' renamed `point'.
+** 'dot' renamed 'point'.
-The word `dot' has been replaced with `point' in all
+The word 'dot' has been replaced with 'point' in all
function and variable names, including:
- point, point-min, point-max,
- point-marker, point-min-marker, point-max-marker,
- window-point, set-window-point,
- point-to-register, register-to-point,
- exchange-point-and-mark.
+ 'point', 'point-min', 'point-max',
+ 'point-marker', 'point-min-marker', 'point-max-marker',
+ 'window-point', 'set-window-point',
+ 'point-to-register', 'register-to-point',
+ 'exchange-point-and-mark'.
The old names are still supported, for now.
-** `string-match' records position of end of match.
+** 'string-match' records position of end of match.
-After a successful call to `string-match', `(match-end 0)' will
+After a successful call to 'string-match', `(match-end 0)' will
return the index in the string of the first character after the match.
-Also, `match-begin' and `match-end' with nonzero arguments can be
+Also, 'match-begin' and 'match-end' with nonzero arguments can be
used to find the indices of beginnings and ends of substrings matched
by subpatterns surrounded by parentheses.
-** New function `insert-before-markers'.
+** New function 'insert-before-markers'.
-This function is just like `insert' except in the handling of any
+This function is just like 'insert' except in the handling of any
relocatable markers that are located at the point of insertion.
-With `insert', such markers end up pointing before the inserted text.
-With `insert-before-markers', they end up pointing after the inserted
+With 'insert', such markers end up pointing before the inserted text.
+With 'insert-before-markers', they end up pointing after the inserted
text.
-** New function `copy-alist'.
+** New function 'copy-alist'.
This function takes one argument, a list, and makes a disjoint copy
of the alist structure. The list itself is copied, and each element
@@ -550,32 +550,32 @@ that is a cons cell is copied, but the cars and cdrs of elements
remain shared with the original argument.
This is what it takes to get two alists disjoint enough that changes
-in one do not change the result of `assq' on the other.
+in one do not change the result of 'assq' on the other.
-** New function `copy-keymap'.
+** New function 'copy-keymap'.
This function takes a keymap as argument and returns a new keymap
containing initially the same bindings. Rebindings in either one of
them will not alter the bindings in the other.
-** New function `copy-syntax-table'.
+** New function 'copy-syntax-table'.
This function takes a syntax table as argument and returns a new
syntax table containing initially the same syntax settings. Changes
in either one of them will not alter the other.
-** Randomizing the random numbers.
+** Randomizing the 'random' numbers.
`(random t)' causes the random number generator's seed to be set
based on the current time and Emacs's process id.
-** Third argument to `modify-syntax-entry'.
+** Third argument to 'modify-syntax-entry'.
-The optional third argument to `modify-syntax-entry', if specified
+The optional third argument to 'modify-syntax-entry', if specified
should be a syntax table. The modification is made in that syntax table
rather than in the current syntax table.
-** New function `run-hooks'.
+** New function 'run-hooks'.
This function takes any number of symbols as arguments.
It processes the symbols in order. For each symbol which
@@ -584,29 +584,29 @@ called as a function, with no arguments.
This is useful in major mode commands.
-** Second arg to `switch-to-buffer'.
+** Second arg to 'switch-to-buffer'.
-If this function is given a non-`nil' second argument, then the
+If this function is given a non-'nil' second argument, then the
selection being done is not recorded on the selection history.
The buffer's position in the history remains unchanged. This
feature is used by the view commands, so that the selection history
after exiting from viewing is the same as it was before.
-** Second arg to `display-buffer' and `pop-to-buffer'.
+** Second arg to 'display-buffer' and 'pop-to-buffer'.
These two functions both accept an optional second argument which
-defaults to `nil'. If the argument is not `nil', it means that
+defaults to 'nil'. If the argument is not 'nil', it means that
another window (not the selected one) must be found or created to
display the specified buffer in, even if it is already shown in
the selected window.
-This feature is used by `switch-to-buffer-other-window'.
+This feature is used by 'switch-to-buffer-other-window'.
-** New variable `completion-ignore-case'.
+** New variable 'completion-ignore-case'.
-If this variable is non-`nil', completion allows strings
+If this variable is non-'nil', completion allows strings
in different cases to be considered matching. The global value
-is `nil'
+is 'nil'
This variable exists for the sake of commands that are completing
an argument in which case is not significant. It is possible
@@ -617,13 +617,13 @@ where case makes a difference.
** Major modes related to Text mode call text-mode-hook, then their own hooks.
For example, turning on Outline mode first calls the value of
-`text-mode-hook' as a function, if it exists and is non-`nil',
-and then does likewise for the variable `outline-mode-hook'.
+'text-mode-hook' as a function, if it exists and is non-'nil',
+and then does likewise for the variable 'outline-mode-hook'.
** Defining new command line switches.
You can define a new command line switch in your .emacs file
-by putting elements on the value of `command-switch-alist'.
+by putting elements on the value of 'command-switch-alist'.
Each element of this list should look like
(SWITCHSTRING . FUNCTION)
where SWITCHSTRING is a string containing the switch to be
@@ -633,35 +633,35 @@ receives the command line argument, a string, as its argument.
To implement a switch that uses up one or more following arguments,
use the fact that the remaining command line arguments are kept
-as a list in the variable `command-line-args'. FUNCTION can
+as a list in the variable 'command-line-args'. FUNCTION can
examine this variable, and do
(setq command-line-args (cdr command-line-args)
to "use up" an argument.
-** New variable `load-in-progress'.
+** New variable 'load-in-progress'.
-This variable is non-`nil' when a file of Lisp code is being read
-and executed by `load'.
+This variable is non-'nil' when a file of Lisp code is being read
+and executed by 'load'.
-** New variable `print-length'.
+** New variable 'print-length'.
-The value of this variable is normally `nil'. It may instead be
-a number; in that case, when a list is printed by `prin1' or
-`princ' only that many initial elements are printed; the rest are
+The value of this variable is normally 'nil'. It may instead be
+a number; in that case, when a list is printed by 'prin1' or
+'princ' only that many initial elements are printed; the rest are
replaced by `...'.
-** New variable `find-file-not-found-hook'.
+** New variable 'find-file-not-found-hook'.
-If `find-file' or any of its variants is used on a nonexistent file,
-the value of `find-file-not-found-hook' is called (if it is not `nil')
+If 'find-file' or any of its variants is used on a nonexistent file,
+the value of 'find-file-not-found-hook' is called (if it is not 'nil')
with no arguments, after creating an empty buffer. The file's name
-can be found as the value of `buffer-file-name'.
+can be found as the value of 'buffer-file-name'.
** Processes without buffers.
-In the function `start-process', you can now specify `nil' as
-the process's buffer. You can also set a process's buffer to `nil'
-using `set-process-buffer'.
+In the function 'start-process', you can now specify 'nil' as
+the process's buffer. You can also set a process's buffer to 'nil'
+using 'set-process-buffer'.
The reason you might want to do this is to prevent the process
from being killed because any particular buffer is killed.
@@ -672,18 +672,18 @@ When a process has no buffer, its output is lost unless it has a
filter, and no indication of its being stopped or killed is given
unless it has a sentinel.
-** New function `user-variable-p'. `v' arg prompting changed.
+** New function 'user-variable-p'. 'v' arg prompting changed.
-This function takes a symbol as argument and returns `t' if
+This function takes a symbol as argument and returns 't' if
the symbol is defined as a user option variable. This means
-that it has a `variable-documentation' property whose value is
+that it has a 'variable-documentation' property whose value is
a string starting with `*'.
-Code `v' in an interactive arg reading string now accepts
+Code 'v' in an interactive arg reading string now accepts
user variables only, and completion is limited to the space of
user variables.
-The function `read-variable' also now accepts and completes
+The function 'read-variable' also now accepts and completes
over user variables only.
** CBREAK mode input is the default in Unix 4.3 bsd.
@@ -691,33 +691,33 @@ over user variables only.
In Berkeley 4.3 Unix, there are sufficient features for Emacs to
work fully correctly using CBREAK mode and not using SIGIO.
Therefore, this mode is the default when running under 4.3.
-This mode corresponds to `nil' as the first argument to
-`set-input-mode'. You can still select either mode by calling
+This mode corresponds to 'nil' as the first argument to
+'set-input-mode'. You can still select either mode by calling
that function.
** Information on memory usage.
-The new variable `data-bytes-used' contains the number
+The new variable 'data-bytes-used' contains the number
of bytes of impure space allocated in Emacs.
-`data-bytes-free' contains the number of additional bytes
+'data-bytes-free' contains the number of additional bytes
Emacs could allocate. Note that space formerly allocated
-and freed again still counts as `used', since it is still
+and freed again still counts as 'used', since it is still
in Emacs's address space.
-** No limit on size of output from `format'.
+** No limit on size of output from 'format'.
-The string output from `format' used to be truncated to
+The string output from 'format' used to be truncated to
100 characters in length. Now it can have any length.
-** New errors `void-variable' and `void-function' replace `void-symbol'.
+** New errors 'void-variable' and 'void-function' replace 'void-symbol'.
This change makes it possible to have error messages that
clearly distinguish undefined variables from undefined functions.
-It also allows `condition-case' to handle one case without the other.
+It also allows 'condition-case' to handle one case without the other.
-** `replace-match' handling of `\'.
+** 'replace-match' handling of `\'.
-In `replace-match', when the replacement is not literal,
+In 'replace-match', when the replacement is not literal,
`\' in the replacement string is always treated as an
escape marker. The only two special `\' constructs
are `\&' and `\DIGIT', so `\' followed by anything other than
@@ -728,21 +728,21 @@ This level of escaping is comparable with what goes on in
a regular expression. It is over and above the level of `\'
escaping that goes on when strings are read in Lisp syntax.
-** New error `invalid-regexp'.
+** New error 'invalid-regexp'.
A regexp search signals this type of error if the argument does
not meet the rules for regexp syntax.
-** `kill-emacs' with argument.
+** 'kill-emacs' with argument.
If the argument is a number, it is returned as the exit status code
of the Emacs process. If the argument is a string, its contents
are stuffed as pending terminal input, to be read by another program
after Emacs is dead.
-** New fifth argument to `subst-char-in-region'.
+** New fifth argument to 'subst-char-in-region'.
-This argument is optional and defaults to `nil'. If it is not `nil',
+This argument is optional and defaults to 'nil'. If it is not 'nil',
then the substitutions made by this function are not recorded
in the Undo mechanism.
@@ -757,25 +757,25 @@ another while in the debugger.
Exiting from the debugger kills the `*Backtrace*' buffer, so you will
not try to give commands in it when no longer really in the debugger.
-** New function `switch-to-buffer-other-window'.
+** New function 'switch-to-buffer-other-window'.
This is the new primitive to select a specified buffer (the
argument) in another window. It is not quite the same as
-`pop-to-buffer', because it is guaranteed to create another
+'pop-to-buffer', because it is guaranteed to create another
window (assuming there is room on the screen) so that it can
leave the current window's old buffer displayed as well.
All functions to select a buffer in another window should
do so by calling this new function.
-** New variable `minibuffer-help-form'.
+** New variable 'minibuffer-help-form'.
-At entry to the minibuffer, the variable `help-form' is bound
-to the value of `minibuffer-help-form'.
+At entry to the minibuffer, the variable 'help-form' is bound
+to the value of 'minibuffer-help-form'.
-`help-form' is expected at all times to contain either `nil'
+'help-form' is expected at all times to contain either 'nil'
or an expression to be executed when C-h is typed (overriding
-the definition of C-h as a command). `minibuffer-help-form'
+the definition of C-h as a command). 'minibuffer-help-form'
can be used to provide a different default way of handling
C-h while in the minibuffer.
@@ -791,7 +791,7 @@ be quoted with a second `\', to include it in the doc string.)
This construct is normally used on a line by itself, with no blank
lines before or after.
-For example, the documentation string for the function `c-mode' contains
+For example, the documentation string for the function 'c-mode' contains
...
Paragraphs are separated by blank lines only.
Delete converts tabs to spaces as it moves back.
@@ -803,13 +803,13 @@ For example, the documentation string for the function `c-mode' contains
Punctuation characters behave like whitespace in word and
list parsing, but can be distinguished in regexps and in the
-function `char-syntax'. Punctuation syntax is represented by
-a period in `modify-syntax-entry'.
+function 'char-syntax'. Punctuation syntax is represented by
+a period in 'modify-syntax-entry'.
-** `auto-mode-alist' no longer needs entries for backup-file names,
+** 'auto-mode-alist' no longer needs entries for backup-file names,
Backup suffixes of all kinds are now stripped from a file's name
-before searching `auto-mode-alist'.
+before searching 'auto-mode-alist'.
@@ -846,14 +846,14 @@ arguments and then confirm, or abort with C-g.
** Incremental search does less redisplay on slow terminals.
-If the terminal baud rate is <= the value of `isearch-slow-speed',
+If the terminal baud rate is <= the value of 'isearch-slow-speed',
incremental searching outside the text on the screen creates
a single-line window and uses that to display the line on which
a match has been found. Exiting or quitting the search restores
the previous window configuration and redisplays the window you
were searching in.
-The initial value of `isearch-slow-speed' is 1200.
+The initial value of 'isearch-slow-speed' is 1200.
This feature is courtesy of crl@purdue.
@@ -871,17 +871,17 @@ if you know enough to switch windows while in the minibuffer,
you can probably understand recursive minibuffers.
This may be overridden by binding the variable
-`enable-recursive-minibuffers' to t.
+'enable-recursive-minibuffers' to t.
** New major mode Emacs-Lisp mode, for editing Lisp code to run in Emacs.
-The mode in which emacs lisp files is edited is now called emacs-lisp-mode
-and is distinct from lisp-mode. The latter is intended for use with
-lisps external to emacs.
+The mode in which emacs lisp files is edited is now called 'emacs-lisp-mode'
+and is distinct from 'lisp-mode'. The latter is intended for use with
+lisps external to Emacs.
The hook which is funcalled (if non-nil) on entry to elisp-mode is now
-called emacs-lisp-mode-hook. A consequence of this changes is that
-.emacs init files which set the value of lisp-mode-hook may need to be
+called 'emacs-lisp-mode-hook'. A consequence of this changes is that
+.emacs init files which set the value of 'lisp-mode-hook' may need to be
changed to use the new names.
** Correct matching of parentheses is checked on insertion.
@@ -898,18 +898,18 @@ This feature was originally written by shane@mit-ajax.
** M-x command-history-mode
** M-x electric-command-history
-`list-command-history' displays forms from the command history subject
+'list-command-history' displays forms from the command history subject
to user controlled filtering and limit on number of forms. It leaves
-the buffer in `command-history-mode'. M-x command-history-mode
+the buffer in 'command-history-mode'. M-x command-history-mode
recomputes the command history each time it is invoked via
-`list-command-history'. It is like Emacs-Lisp mode except that characters
+'list-command-history'. It is like Emacs-Lisp mode except that characters
don't insert themselves and provision is made for re-evaluating an
-expression from the list. `electric-command-history' pops up a type
+expression from the list. 'electric-command-history' pops up a type
out window with the command history displayed. If the very next
character is Space, the window goes away and the previous window
configuration is restored. Otherwise you can move around in the
history and select an expression for evaluation *inside* the buffer
-which invoked `electric-command-history'. The original window
+which invoked 'electric-command-history'. The original window
configuration is restored on exit unless the command selected changes
it.
@@ -924,7 +924,7 @@ Special commands for hacking tabs and tab stops are provided. Special
commands for killing rectangles and overlaying them are provided. See
the documentation of function edit-picture for more details.
-Calls value of `edit-picture-hook' on entry if non-nil.
+Calls value of 'edit-picture-hook' on entry if non-nil.
** Stupid C-s/C-q `flow control' supported.
@@ -977,15 +977,15 @@ lisp-mode-hook, in that order, if non-nil.
Meanwhile, in lisp-mode, the command C-M-x is defined to
send the current defun as input to the `*lisp*' subprocess.
-** Mode line says `Narrow' when buffer is clipped.
+** Mode line says 'Narrow' when buffer is clipped.
-If a buffer has a clipping restriction (made by `narrow-to-region')
-then its mode line contains the word `Narrow' after the major and
+If a buffer has a clipping restriction (made by 'narrow-to-region')
+then its mode line contains the word 'Narrow' after the major and
minor modes.
-** Mode line says `Abbrev' when abbrev mode is on.
+** Mode line says 'Abbrev' when abbrev mode is on.
-** add-change-log-entry takes prefix argument
+** 'add-change-log-entry' takes prefix argument
Giving a prefix argument makes it prompt for login name, full name,
and site name, with defaults. Otherwise the defaults are used
@@ -994,27 +994,27 @@ with no confirmation.
** M-x view-buffer and M-x view-file
view-buffer selects the named buffer, view-file finds the named file; the
-resulting buffer is placed into view-mode (a recursive edit). The normal
+resulting buffer is placed into 'view-mode' (a recursive edit). The normal
emacs commands are not available. Instead a set of special commands is
provided which facilitate moving around in the buffer, searching and
scrolling by screenfuls. Exiting view-mode returns to the buffer in which
the view-file or view-buffer command was given.
Type ? or h when viewing for a complete list of view commands.
-Each calls value of `view-hook' if non-nil on entry.
+Each calls value of 'view-hook' if non-nil on entry.
written by shane@mit-ajax.
** New key commands in dired.
-`v' views (like more) the file on the current line.
+'v' views (like more) the file on the current line.
`#' marks auto-save files for deletion.
`~' marks backup files for deletion.
-`r' renames a file and updates the directory listing if the
+'r' renames a file and updates the directory listing if the
file is renamed to same directory.
-`c' copies a file and updates the directory listing if the file is
+'c' copies a file and updates the directory listing if the file is
copied to the same directory.
-** New function `electric-buffer-list'.
+** New function 'electric-buffer-list'.
This pops up a buffer describing the set of emacs buffers.
Immediately typing space makes the buffer list go away and returns
@@ -1026,18 +1026,18 @@ cursor's line. There are a number of other commands which are the same
as those of buffer-menu-mode.
This is a useful thing to bind to c-x c-b in your `.emacs' file if the
-rather non-standard `electric' behavior of the buffer list suits your taste.
+rather non-standard 'electric' behavior of the buffer list suits your taste.
Type C-h after invoking electric-buffer-list for more information.
-Calls value of `electric-buffer-menu-mode-hook' if non-nil on entry.
-Calls value of `after-electric-buffer-menu' on exit (select) if non-nil.
+Calls value of 'electric-buffer-menu-mode-hook' if non-nil on entry.
+Calls value of 'after-electric-buffer-menu' on exit (select) if non-nil.
** Changes in version 16 for mail reading and sending
*** sendmail prefix character is C-c (and not C-z). New command C-c w.
For instance C-c C-c (or C-c C-s) sends mail now rather than C-z C-z.
-C-c w inserts your `signature' (contents of ~/.signature) at the end
+C-c w inserts your 'signature' (contents of ~/.signature) at the end
of mail.
*** New feature in C-c y command in sending mail.
@@ -1063,26 +1063,26 @@ C-c and C-] are the only ways "back into Rmail", but you
can switch to other buffers and edit them as usual.
C-r in Rmail changes only the handling of the Rmail buffer.
-*** Rmail command `t' toggles header display.
+*** Rmail command 't' toggles header display.
Normally Rmail reformats messages to hide most header fields.
-`t' switches to display of all the header fields of the
+'t' switches to display of all the header fields of the
current message, as long as it remains current.
-Another `t' switches back to the usual display.
+Another 't' switches back to the usual display.
*** Rmail command '>' goes to the last message.
-*** Rmail commands `a' and `k' set message attributes.
-`a' adds an attribute and `k' removes one. You specify
+*** Rmail commands 'a' and 'k' set message attributes.
+'a' adds an attribute and 'k' removes one. You specify
the attribute by name. You can specify either a built-in
flag such as "deleted" or "filed", or a user-defined keyword
(anything not recognized as built-in).
-*** Rmail commands `l' and `L' summarize by attributes.
+*** Rmail commands 'l' and 'L' summarize by attributes.
These commands create a summary with one line per message,
-like `h', but they list only some of the messages. You
-specify which attribute (for `l') or attributes (for `L')
+like 'h', but they list only some of the messages. You
+specify which attribute (for 'l') or attributes (for 'L')
the messages should have.
*** Rmail can parse mmdf mail files.
@@ -1092,11 +1092,11 @@ the messages should have.
mh-e is a front end for GNU emacs and the MH mail system. It
provides a friendly and convenient interface to the MH commands.
-To read mail, invoke mh-rmail. This will inc new mail and display the
+To read mail, invoke 'mh-rmail'. This will inc new mail and display the
scan listing on the screen. To see a summary of the mh-e commands,
type ?. Help is available through the usual facilities.
-To send mail, invoke mh-smail.
+To send mail, invoke 'mh-smail'.
mh-e requires a copy of MH.5 that has been compiled with the MHE
compiler switch.
@@ -1105,39 +1105,39 @@ From larus@berkeley.
** New hooks and parameters in version 16
-*** New variable `blink-matching-paren-distance'.
+*** New variable 'blink-matching-paren-distance'.
This is the maximum number of characters to search for
an open-paren to match an inserted close-paren.
The matching open-paren is shown and checked if it is found
within this distance.
-`nil' means search all the way to the beginning of the buffer.
+'nil' means search all the way to the beginning of the buffer.
In this case, a warning message is printed if no matching
open-paren is found.
This feature was originally written by shane@mit-ajax.
-*** New variable `find-file-run-dired'
+*** New variable 'find-file-run-dired'
If nil, find-file will report an error if an attempt to visit a
directory is detected; otherwise, it runs dired on that directory.
The default is t.
-*** Variable `dired-listing-switches' holds switches given to `ls' by dired.
+*** Variable 'dired-listing-switches' holds switches given to 'ls' by dired.
-The value should be a string containing `-' followed by letters.
-The letter `l' had better be included and letter 'F' had better be excluded!
+The value should be a string containing '-' followed by letters.
+The letter 'l' had better be included and letter 'F' had better be excluded!
The default is "-al".
This feature was originally written by shane@mit-ajax.
-*** New variable `display-time-day-and-date'.
+*** New variable 'display-time-day-and-date'.
-If this variable is set non-`nil', the function M-x display-time
+If this variable is set non-'nil', the function M-x display-time
displays the day and date, as well as the time.
-*** New parameter `c-continued-statement-indent'.
+*** New parameter 'c-continued-statement-indent'.
This controls the extra indentation given to a line
that continues a C statement started on the previous line.
@@ -1147,19 +1147,20 @@ By default it is 2, which is why you would see
bar ();
-*** Changed meaning of `c-indent-level'.
+*** Changed meaning of 'c-indent-level'.
-The value of `c-brace-offset' used to be
-subtracted from the value of `c-indent-level' whenever
+The value of 'c-brace-offset' used to be
+subtracted from the value of 'c-indent-level' whenever
that value was used. Now it is not.
-As a result, `c-indent-level' is now the offset of
+As a result, 'c-indent-level' is now the offset of
statements within a block, relative to the line containing
the open-brace that starts the block.
-*** turn-on-auto-fill is useful value for text-mode-hook.
+*** 'turn-on-auto-fill' is useful value for 'text-mode-hook'.
+
+ (setq text-mode-hook 'turn-on-auto-fill)
-(setq text-mode-hook 'turn-on-auto-fill)
is all you have to do to make sure Auto Fill mode is turned
on whenever you enter Text mode.
@@ -1187,8 +1188,8 @@ the following text, up to the next `]', is taken as a function name.
Instead of printing that function name, the command that runs it is printed.
(M-x is used to construct a command if no shorter one exists.)
-For example, instead of putting `C-n' in a documentation string
-to refer to the C-n command, put in `\[next-line]'. (In practice
+For example, instead of putting 'C-n' in a documentation string
+to refer to the 'next-line' command, put in `\[next-line]'. (In practice
you will need to quote the backslash with another backslash,
due to the syntax for strings in Lisp and C.)
@@ -1197,34 +1198,34 @@ precede them with `\='. To include the characters `\=', precede
them with `\='. For example, "\\=\\= is the way to quote \\=\\["
will come out as `\= is the way to quote \['.
-The new function `substitute-command-keys' takes a string possibly
+The new function 'substitute-command-keys' takes a string possibly
containing \[...] constructs and replaces those constructs with
the key sequences they currently stand for.
-*** Primitives `find-line-comment' and `find-line-comment-body' flushed.
+*** Primitives 'find-line-comment' and 'find-line-comment-body' flushed.
-Search for the value of `comment-start-skip' if you want to find
+Search for the value of 'comment-start-skip' if you want to find
whether and where a line has a comment.
-*** New function `auto-save-file-name-p'
+*** New function 'auto-save-file-name-p'
-Should return non-`nil' if given a string which is the name of an
+Should return non-'nil' if given a string which is the name of an
auto-save file (sans directory name). If you redefine
-`make-auto-save-file-name', you should redefine this accordingly. By
-default, this function returns `t' for filenames beginning with
+'make-auto-save-file-name', you should redefine this accordingly. By
+default, this function returns 't' for filenames beginning with
character `#'.
-*** The value of `exec-directory' now ends in a slash.
+*** The value of 'exec-directory' now ends in a slash.
This is to be compatible with most directory names in GNU Emacs.
*** Dribble files and termscript files.
-(open-dribble-file FILE) opens a dribble file named FILE. When a
+'open-dribble-file' opens a dribble file. When a
dribble file is open, every character Emacs reads from the terminal is
written to the dribble file.
-(open-termscript FILE) opens a termscript file named FILE. When a
+'open-termscript' opens a termscript file. When a
termscript file is open, all characters sent to the terminal by Emacs
are also written in the termscript file.
@@ -1240,15 +1241,15 @@ a synonym for C-x u (undo).
*** Undefined function errors versus undefined variable errors.
-Void-symbol errors now say "boundp" if the symbol's value was void
-or "fboundp" if the function definition was void.
+Void-symbol errors now say 'boundp' if the symbol's value was void
+or 'fboundp' if the function definition was void.
-*** New function `bury-buffer'.
+*** New function 'bury-buffer'.
-The new function `bury-buffer' takes one argument, a buffer object,
+The new function 'bury-buffer' takes one argument, a buffer object,
and puts that buffer at the end of the internal list of buffers.
So it is the least preferred candidate for use as the default value
-of C-x b, or for other-buffer to return.
+of C-x b, or for 'other-buffer' to return.
*** Already-displayed buffers have low priority for display.
@@ -1256,14 +1257,14 @@ When a buffer is chosen automatically for display, or to be the
default in C-x b, buffers already displayed in windows have lower
priority than buffers not currently visible.
-*** `set-window-start' accepts a third argument NOFORCE.
+*** 'set-window-start' accepts a third argument NOFORCE.
This argument, if non-nil, prevents the window's force_start flag
from being set. Setting the force_start flag causes the next
redisplay to insist on starting display at the specified starting
point, even if dot must be moved to get it onto the screen.
-*** New function `send-string-to-terminal'.
+*** New function 'send-string-to-terminal'.
This function takes one argument, a string, and outputs its contents
to the terminal exactly as specified: control characters, escape
@@ -1273,9 +1274,9 @@ sequences, and all.
The terminal's keypad is now put into command mode, as opposed to
numeric mode, while Emacs is running. This is done by means of the
-termcap `ks' and `ke' strings.
+termcap 'ks' and 'ke' strings.
-*** New function `generate-new-buffer'
+*** New function 'generate-new-buffer'
This function takes a string as an argument NAME and looks for a
creates and returns a buffer called NAME if one did not already exist.
@@ -1283,38 +1284,38 @@ Otherwise, it successively tries appending suffixes of the form "<1>",
"<2>" etc to NAME until it creates a string which does not name an
existing buffer. A new buffer with that name is the created and returned.
-*** New function `prin1-to-string'
+*** New function 'prin1-to-string'
This function takes one argument, a lisp object, and returns a string
-containing that object's printed representation, such as `prin1'
+containing that object's printed representation, such as 'prin1'
would output.
-*** New function `read-from-minibuffer'
+*** New function 'read-from-minibuffer'
Lets you supply a prompt, initial-contents, a keymap, and specify
whether the result should be interpreted as a string or a lisp object.
-Old functions `read-minibuffer', `eval-minibuffer', `read-string' all
+Old functions 'read-minibuffer', 'eval-minibuffer', 'read-string' all
take second optional string argument which is initial contents of
minibuffer.
*** minibuffer variable names changed (names of keymaps)
-minibuf-local-map -> minibuffer-local-map
-minibuf-local-ns-map -> minibuffer-local-ns-map
-minibuf-local-completion-map -> minibuffer-local-completion-map
-minibuf-local-must-match-map -> minibuffer-local-must-match-map
+'minibuf-local-map' -> 'minibuffer-local-map'
+'minibuf-local-ns-map' -> 'minibuffer-local-ns-map'
+'minibuf-local-completion-map' -> 'minibuffer-local-completion-map'
+'minibuf-local-must-match-map' -> 'minibuffer-local-must-match-map'
** Changes in version 16 affecting configuring and building Emacs
*** Configuration switch VT100_INVERSE eliminated.
You can control the use of inverse video on any terminal by setting
-the variable `inverse-video', or by changing the termcap entry. If
-you like, set `inverse-video' in your `.emacs' file based on
+the variable 'inverse-video', or by changing the termcap entry. If
+you like, set 'inverse-video' in your `.emacs' file based on
examination of (getenv "TERM").
-*** New switch `-batch' makes Emacs run noninteractively.
+*** New switch '-batch' makes Emacs run noninteractively.
-If the switch `-batch' is used, Emacs treats its standard output
+If the switch '-batch' is used, Emacs treats its standard output
and input like ordinary files (even if they are a terminal).
It does not display buffers or windows; the only output to standard output
is what would appear as messages in the echo area, and each
@@ -1322,13 +1323,13 @@ message is followed by a newline.
The terminal modes are not changed, so that C-z and C-c retain
their normal Unix meanings. Emacs does still read commands from
-the terminal, but the idea of `-batch' is that you use it with
+the terminal, but the idea of '-batch' is that you use it with
other command line arguments that tell Emacs a complete task to perform,
-including killing itself. `-kill' used as the last argument is a good
+including killing itself. '-kill' used as the last argument is a good
way to accomplish this.
-The Lisp variable `noninteractive' is now defined, to be `nil'
-except when `-batch' has been specified.
+The Lisp variable 'noninteractive' is now defined, to be 'nil'
+except when '-batch' has been specified.
*** Emacs can be built with output redirected to a file.
@@ -1359,7 +1360,7 @@ This is because -batch (see above) is now used in building Emacs.
Note that lisp code converted from Mocklisp code will not necessarily
run as fast as code specifically written for GNU Emacs, nor will it use
the many features of GNU Emacs which are not present in Gosling's emacs.
- (In particular, the byte-compiler (m-x byte-compile-file) knows little
+ (In particular, the byte-compiler (M-x byte-compile-file) knows little
about compilation of code directly converted from mocklisp.)
It is envisaged that old mocklisp code will be incrementally converted
to GNU lisp code, with M-x convert-mocklisp-buffer being the first
@@ -1382,63 +1383,66 @@ This is because -batch (see above) is now used in building Emacs.
specify the tag table file name initially, or to switch
to a new tag table.
-** If truncate-partial-width-windows is non-nil (as it initially is),
+** If 'truncate-partial-width-windows' is non-nil (as it initially is),
all windows less than the full screen width (that is,
made by side-by-side splitting) truncate lines rather than continuing
them.
** Emacs now checks for Lisp stack overflow to avoid fatal errors.
- The depth in eval, apply and funcall may not exceed max-lisp-eval-depth.
+ The depth in 'eval', 'apply' and 'funcall' may not exceed
+ 'max-lisp-eval-depth'.
The depth in variable bindings and unwind-protects may not exceed
- max-specpdl-size. If either limit is exceeded, an error occurs.
+ 'max-specpdl-size'. If either limit is exceeded, an error occurs.
You can set the limits to larger values if you wish, but if you make them
too large, you are vulnerable to a fatal error if you invoke
Lisp code that does infinite recursion.
-** New hooks find-file-hook and write-file-hook.
+** New hooks 'find-file-hook' and 'write-file-hook'.
Both of these variables if non-nil should be functions of no arguments.
At the time they are called (current-buffer) will be the buffer being
read or written respectively.
- find-file-hook is called whenever a file is read into its own buffer,
- such as by calling find-file, revert-buffer, etc. It is not called by
- functions such as insert-file which do not read the file into a buffer of
+ 'find-file-hook' is called whenever a file is read into its own buffer,
+ such as by calling 'find-file', 'revert-buffer', etc. It is not called by
+ functions such as 'insert-file' which do not read the file into a buffer of
its own.
- find-file-hook is called after the file has been read in and its
+ 'find-file-hook' is called after the file has been read in and its
local variables (if any) have been processed.
- write-file-hook is called just before writing out a file from a buffer.
+ 'write-file-hook' is called just before writing out a file from a buffer.
-** The initial value of shell-prompt-pattern is now "^[^#$%>]*[#$%>] *"
+** The initial value of 'shell-prompt-pattern' is now "^[^#$%>]*[#$%>] *"
-** If the .emacs file sets inhibit-startup-message to non-nil,
+** If the .emacs file sets 'inhibit-startup-message' to non-nil,
the messages normally printed by Emacs at startup time
are inhibited.
** Facility for run-time conditionalization on the basis of emacs features.
- The new variable features is a list of symbols which represent "features"
+ The new variable 'features' is a list of symbols which represent "features"
of the executing emacs, for use in run-time conditionalization.
- The function featurep of one argument may be used to test for the
+ The function 'featurep' of one argument may be used to test for the
presence of a feature. It is just the same as
- (not (null (memq FEATURE features))) where FEATURE is its argument.
- For example, (if (featurep 'magic-window-hack)
- (transmogrify-window 'vertical)
- (split-window-vertically))
+ (not (null (memq FEATURE features)))
+ where FEATURE is its argument. For example,
+
+ (if (featurep 'magic-window-hack)
+ (transmogrify-window 'vertical)
+ (split-window-vertically))
- The function provide of one argument "announces" that FEATURE is present.
+ The function 'provide' of one argument "announces" that FEATURE is present.
It is much the same as (if (not (featurep FEATURE))
(setq features (cons FEATURE features)))
- The function require with arguments FEATURE and FILE-NAME loads FILE-NAME
+ The function 'require' with arguments FEATURE and FILE-NAME loads FILE-NAME
(which should contain the form (provide FEATURE)) unless FEATURE is present.
It is much the same as (if (not (featurep FEATURE))
(progn (load FILE-NAME)
(if (not featurep FEATURE) (error ...))))
FILE-NAME is optional and defaults to FEATURE.
-** New function load-average.
+** New function 'load-average'.
This returns a list of three integers, which are
the current 1 minute, 5 minute and 15 minute load averages,
@@ -1460,10 +1464,10 @@ This is because -batch (see above) is now used in building Emacs.
** Programmer's note: detecting killed buffers.
Buffers are eliminated by explicitly killing them, using
- the function kill-buffer. This does not eliminate or affect
+ the function 'kill-buffer'. This does not eliminate or affect
the pointers to the buffer which may exist in list structure.
If you have a pointer to a buffer and wish to tell whether
- the buffer has been killed, use the function buffer-name.
+ the buffer has been killed, use the function 'buffer-name'.
It returns nil on a killed buffer, and a string on a live buffer.
** New ways to access the last command input character.
@@ -1471,13 +1475,13 @@ This is because -batch (see above) is now used in building Emacs.
The function last-key-struck, which used to return the last
input character that was read by command input, is eliminated.
Instead, you can find this information as the value of the
- variable last-command-char. (This variable used to be called
+ variable 'last-command-char'. (This variable used to be called
last-key).
- Another new variable, last-input-char, holds the last character
+ Another new variable, 'last-input-char', holds the last character
read from the command input stream regardless of what it was
read for. last-input-char and last-command-char are different
- only inside a command that has called read-char to read input.
+ only inside a command that has called 'read-char' to read input.
** The new switch -kill causes Emacs to exit after processing the
preceding command line arguments. Thus,
@@ -1517,9 +1521,9 @@ This is because -batch (see above) is now used in building Emacs.
user can explain why it is not called mdl-mode.
You must load the library mim-mode explicitly to use this.
-** GNU documentation formatter `texinfo'.
+** GNU documentation formatter 'texinfo'.
- The `texinfo' library defines a format for documentation
+ The 'texinfo' library defines a format for documentation
files which can be passed through Tex to make a printed manual
or passed through texinfo to make an Info file. Texinfo is
documented fully by its own Info file; compare this file
@@ -1532,7 +1536,7 @@ This is because -batch (see above) is now used in building Emacs.
This is not ready for distribution yet, but will appear at
a later time.
-** New function read-from-string (emacs 15.29)
+** New function 'read-from-string' (emacs 15.29)
read-from-string takes three arguments: a string to read from,
and optionally start and end indices which delimit a substring
@@ -1558,25 +1562,25 @@ This is because -batch (see above) is now used in building Emacs.
These messages appear after the text in the minibuffer, and remain
on the screen until a few seconds go by or you type a key.
-** The buffer-read-only flag is implemented.
+** The 'buffer-read-only' flag is implemented.
Setting or binding this per-buffer variable to a non-nil value
makes illegal any operation which would modify the textual content of
the buffer. (Such operations signal a buffer-read-only error)
- The read-only state of a buffer may be altered using toggle-read-only
+ The read-only state of a buffer may be altered using 'toggle-read-only'
(C-x C-q)
The buffers used by Rmail, Dired, Rnews, and Info are now read-only
by default to prevent accidental damage to the information in those
buffers.
-** Functions car-safe and cdr-safe.
+** Functions 'car-safe' and 'cdr-safe'.
These functions are like car and cdr when the argument is a cons.
Given an argument not a cons, car-safe always returns nil, with
no error; the same for cdr-safe.
-** The new function user-real-login-name returns the name corresponding
+** The new function 'user-real-login-name' returns the name corresponding
to the real uid of the Emacs process. This is usually the same
- as what user-login-name returns; however, when Emacs is invoked
- from su, user-real-login-name returns "root" but user-login-name
+ as what 'user-login-name' returns; however, when Emacs is invoked
+ from su, 'user-real-login-name' returns "root" but user-login-name
returns the name of the user who invoked su.
@@ -1603,7 +1607,7 @@ This is because -batch (see above) is now used in building Emacs.
This syntax can be used in strings too. Note, however, that
Meta characters are not meaningful in key sequences being passed
- to define-key or lookup-key; you must use ESC characters (\e)
+ to 'define-key' or 'lookup-key'; you must use ESC characters (\e)
in them instead.
?\C- can be used likewise for control characters. (13.9)
@@ -1627,14 +1631,14 @@ This is because -batch (see above) is now used in building Emacs.
This is a shift key which causes the high bit to be turned on
in all input characters typed while it is held down.
- read-char now returns a value in the range 128-255 if
+ 'read-char' now returns a value in the range 128-255 if
a Meta character is typed. When interpreted as command
input, a Meta character is equivalent to a two character
sequence, the meta prefix character followed by the unmetized
character (Meta-G unmetized is G).
The meta prefix character
- is specified by the value of the variable meta-prefix-char.
+ is specified by the value of the variable 'meta-prefix-char'.
If this character (normally Escape) has been redefined locally
with a non-prefix definition (such as happens in completing
minibuffers) then the local redefinition is suppressed when
@@ -1643,10 +1647,10 @@ This is because -batch (see above) is now used in building Emacs.
explicitly, but not effective if the character comes from
the use of the Meta key.
-** `-' is no longer a completion command in the minibuffer.
+** '-' is no longer a completion command in the minibuffer.
It is an ordinary self-inserting character.
-** The list load-path of directories load to search for Lisp files
+** The list 'load-path' of directories load to search for Lisp files
is now controlled by the EMACSLOADPATH environment variable
[[ Note this was originally EMACS-LOAD-PATH and has been changed
again; sh does not deal properly with hyphens in env variable names]]
@@ -1720,20 +1724,20 @@ you will not on its account be queried about active subprocesses.
** The commands C-c and C-z have been interchanged,
for greater compatibility with normal Unix usage.
- C-z now runs suspend-emacs and C-c runs exit-recursive-edit.
+ C-z now runs suspend-emacs and C-c runs 'exit-recursive-edit'.
-** The value returned by file-name-directory now ends
+** The value returned by 'file-name-directory' now ends
with a slash. (file-name-directory "foo/bar") => "foo/".
This avoids confusing results when dealing with files
in the root directory.
- The value of the per-buffer variable default-directory
+ The value of the per-buffer variable 'default-directory'
is also supposed to have a final slash now.
** There are now variables to control the switches passed to
- `ls' by the C-x C-d command (list-directory).
- list-directory-brief-switches is a string, initially "-CF",
- used for brief listings, and list-directory-verbose-switches
+ 'ls' by the C-x C-d command (list-directory).
+ 'list-directory-brief-switches' is a string, initially "-CF",
+ used for brief listings, and 'list-directory-verbose-switches'
is a string, initially "-l", used for verbose ones.
** For Ann Arbor Ambassador terminals, the termcap "ti" string
@@ -1757,7 +1761,7 @@ you will not on its account be queried about active subprocesses.
to the specified filename BEFORE it tries the filename
without change.
-** rmail now makes the mode line display the total number
+** 'rmail' now makes the mode line display the total number
of messages and the current message number.
The "f" command now means forward a message to another user.
The command to search through all messages for a string is now "F".
@@ -1767,13 +1771,13 @@ you will not on its account be queried about active subprocesses.
** The hyphen character is now equivalent to a Space while
in completing minibuffers. Both mean to complete an additional word.
-** The Lisp function error now takes args like format
+** The Lisp function 'error' now takes args like 'format'
which are used to construct the error message.
** Redisplay will refuse to start its display at the end of the buffer.
It will pick a new place to display from, rather than use that.
-** The value returned by garbage-collect has been changed.
+** The value returned by 'garbage-collect' has been changed.
Its first element is no longer a number but a cons,
whose car is the number of cons cells now in use,
and whose cdr is the number of cons cells that have been
@@ -1782,9 +1786,9 @@ you will not on its account be queried about active subprocesses.
The third element is similar but describes markers.
** The variable buffer-name has been eliminated.
- The function buffer-name still exists. This is to prevent
+ The function 'buffer-name' still exists. This is to prevent
user programs from changing buffer names without going
- through the rename-buffer function.
+ through the 'rename-buffer' function.
@@ -1795,7 +1799,7 @@ you will not on its account be queried about active subprocesses.
Also, a line which consists of the fill prefix followed by
white space separates paragraphs.
-** C-x C-v runs the new function find-alternate-file.
+** C-x C-v runs the new function 'find-alternate-file'.
It finds the specified file, switches to that buffer,
and kills the previous current buffer. (It requires
confirmation if that buffer had changes.) This is
@@ -1807,18 +1811,18 @@ you will not on its account be queried about active subprocesses.
** Meta-g (fill-region) now fills each paragraph in the
region individually. To fill the region as if it were
a single paragraph (for when the paragraph-delimiting mechanism
- does the wrong thing), use fill-region-as-paragraph.
+ does the wrong thing), use 'fill-region-as-paragraph'.
-** Tab in text mode now runs the function tab-to-tab-stop.
- A new mode called indented-text-mode is like text-mode
- except that in it Tab runs the function indent-relative,
+** Tab in text mode now runs the function 'tab-to-tab-stop'.
+ A new mode called 'indented-text-mode' is like 'text-mode'
+ except that in it Tab runs the function 'indent-relative',
which indents the line under the previous line.
If auto fill is enabled while in indented-text-mode,
the new lines that it makes are indented.
-** Functions kill-rectangle and yank-rectangle.
+** Functions 'kill-rectangle' and 'yank-rectangle'.
kill-rectangle deletes the rectangle specified by dot and mark
- (or by two arguments) and saves it in the variable killed-rectangle.
+ (or by two arguments) and saves it in the variable 'killed-rectangle'.
yank-rectangle inserts the rectangle in that variable.
Tab characters in a rectangle being saved are replaced
@@ -1859,7 +1863,7 @@ you will not on its account be queried about active subprocesses.
C-r -- enter a recursive edit, then on exit ask again for a character
C-l -- redisplay screen and ask again."
-** write-kbd-macro and append-kbd-macro are used to save
+** 'write-kbd-macro' and 'append-kbd-macro' are used to save
a kbd macro definition in a file (as Lisp code to
redefine the macro when the file is loaded).
These commands differ in that write-kbd-macro
@@ -1868,11 +1872,11 @@ you will not on its account be queried about active subprocesses.
record the keys which invoke the macro as well as the
macro's definition.
-** The variable global-minor-modes is used to display
+** The variable 'global-minor-modes' is used to display
strings in the mode line of all buffers. It should be
a list of elements that are conses whose cdrs are strings
to be displayed. This complements the variable
- minor-modes, which has the same effect but has a separate
+ 'minor-modes', which has the same effect but has a separate
value in each buffer.
** C-x = describes horizontal scrolling in effect, if any.
@@ -1887,7 +1891,7 @@ you will not on its account be queried about active subprocesses.
This release mostly fixes bugs. There are a few new features:
-** apropos now sorts the symbols before displaying them.
+** 'apropos' now sorts the symbols before displaying them.
Also, it returns a list of the symbols found.
apropos now accepts a second arg PRED which should be a function
@@ -1898,7 +1902,7 @@ This release mostly fixes bugs. There are a few new features:
If the third argument to apropos is non-nil, apropos does not
display anything; it merely returns the list of symbols found.
- C-h a now runs the new function command-apropos rather than
+ C-h a now runs the new function 'command-apropos' rather than
apropos, and shows only symbols with definitions as commands.
** M-x shell sends the command
@@ -1908,8 +1912,8 @@ This release mostly fixes bugs. There are a few new features:
as it came from your ESHELL or SHELL environment variable
but with directory name, if any, removed.
-** M-, now runs the command tags-loop-continue, which is used
- to resume a terminated tags-search or tags-query-replace.
+** M-, now runs the command 'tags-loop-continue', which is used
+ to resume a terminated 'tags-search' or 'tags-query-replace'.
@@ -1921,60 +1925,60 @@ It's Beat CCA Week.
so that all buffer names used automatically by Emacs now have *'s.
** Undo information is now stored separately for each buffer.
- The Undo command (C-x u) always applies to the current
- buffer only.
+The Undo command (C-x u) always applies to the current
+buffer only.
C-_ is now a synonym for C-x u.
- (buffer-flush-undo BUFFER) causes undo information not to
- be kept for BUFFER, and frees the space that would have
- been used to hold it. In any case, no undo information is
- kept for buffers whose names start with spaces. (These
- buffers also do not appear in the C-x C-b display.)
+'buffer-flush-undo' causes undo information not to
+be kept for BUFFER, and frees the space that would have
+been used to hold it. In any case, no undo information is
+kept for buffers whose names start with spaces. (These
+buffers also do not appear in the C-x C-b display.)
** Rectangle operations are now implemented.
- C-x r stores the rectangle described by dot and mark
- into a register; it reads the register name from the keyboard.
- C-x g, the command to insert the contents of a register,
- can be used to reinsert the rectangle elsewhere.
+C-x r stores the rectangle described by dot and mark
+into a register; it reads the register name from the keyboard.
+C-x g, the command to insert the contents of a register,
+can be used to reinsert the rectangle elsewhere.
Other rectangle commands include
- open-rectangle:
+ 'open-rectangle':
insert a blank rectangle in the position and size
described by dot and mark, at its corners;
the existing text is pushed to the right.
- clear-rectangle:
+ 'clear-rectangle':
replace the rectangle described by dot and mark
with blanks. The previous text is deleted.
- delete-rectangle:
+ 'delete-rectangle':
delete the text of the specified rectangle,
moving the text beyond it on each line leftward.
** Side-by-side windows are allowed. Use C-x 5 to split the
- current window into two windows side by side.
- C-x } makes the selected window ARG columns wider at the
- expense of the windows at its sides. C-x { makes the selected
- window ARG columns narrower. An argument to C-x 5 specifies
- how many columns to give to the leftmost of the two windows made.
+current window into two windows side by side.
+C-x } makes the selected window ARG columns wider at the
+expense of the windows at its sides. C-x { makes the selected
+window ARG columns narrower. An argument to C-x 5 specifies
+how many columns to give to the leftmost of the two windows made.
- C-x 2 now accepts a numeric argument to specify the number of
- lines to give to the uppermost of the two windows it makes.
+C-x 2 now accepts a numeric argument to specify the number of
+lines to give to the uppermost of the two windows it makes.
** Horizontal scrolling of the lines in a window is now implemented.
- C-x < (scroll-left) scrolls all displayed lines left,
- with the numeric argument (default 1) saying how far to scroll.
- When the window is scrolled left, some amount of the beginning
- of each nonempty line is replaced by an "$".
- C-x > scrolls right. If a window has no text hidden at the left
- margin, it cannot be scrolled any farther right than that.
- When nonzero leftwards scrolling is in effect in a window.
- lines are automatically truncated at the window's right margin
- regardless of the value of the variable truncate-lines in the
- buffer being displayed.
-
-** C-x C-d now uses the default output format of `ls',
- which gives just file names in multiple columns.
- C-u C-x C-d passes the -l switch to `ls'.
+C-x < (scroll-left) scrolls all displayed lines left,
+with the numeric argument (default 1) saying how far to scroll.
+When the window is scrolled left, some amount of the beginning
+of each nonempty line is replaced by an "$".
+C-x > scrolls right. If a window has no text hidden at the left
+margin, it cannot be scrolled any farther right than that.
+When nonzero leftwards scrolling is in effect in a window.
+lines are automatically truncated at the window's right margin
+regardless of the value of the variable 'truncate-lines' in the
+buffer being displayed.
+
+** C-x C-d now uses the default output format of 'ls',
+which gives just file names in multiple columns.
+C-u C-x C-d passes the -l switch to 'ls'.
** C-t at the end of a line now exchanges the two preceding characters.
@@ -1995,7 +1999,7 @@ It's Beat CCA Week.
** The mode line will now say "Def" after the major mode
while a keyboard macro is being defined.
-** The variable fill-prefix is now used by Meta-q.
+** The variable 'fill-prefix' is now used by Meta-q.
Meta-q removes the fill prefix from lines that start with it
before filling, and inserts the fill prefix on each line
after filling.
@@ -2057,7 +2061,7 @@ It's Beat CCA Week.
including the terminating slash, requests the use
of the default file name (usually the visited file's name).
- Set the variable insert-default-directory to nil
+ Set the variable 'insert-default-directory' to nil
to turn off this feature.
** M-x shell now uses the environment variable ESHELL,
@@ -2095,83 +2099,82 @@ It's Beat CCA Week.
** The file of Lisp code Emacs reads on startup is now
called ~/.emacs rather than ~/.emacs_pro.
-** copy-file now gives the copied file the same mode bits
+** 'copy-file' now gives the copied file the same mode bits
as the original file.
** Output from a process inserted into the process's buffer
no longer sets the buffer's mark. Instead it sets a
marker associated with the process to point to the end
of the inserted text. You can access this marker with
- (process-mark PROCESS)
- and then either examine its position with marker-position
- or set its position with set-marker.
+ 'process-mark' and then either examine its position with
+ 'marker-position' or set its position with 'set-marker'.
-** completing-read takes a new optional fifth argument which,
+** 'completing-read' takes a new optional fifth argument which,
if non-nil, should be a string of text to insert into
the minibuffer before reading user commands.
-** The Lisp function elt now exists:
+** The Lisp function 'elt' now exists:
(elt ARRAY N) is like (aref ARRAY N),
(elt LIST N) is like (nth N LIST).
-** rplaca is now a synonym for setcar, and rplacd for setcdr.
- eql is now a synonym for eq; it turns out that the Common Lisp
+** 'rplaca' is now a synonym for 'setcar', and 'rplacd' for 'setcdr'.
+ 'eql' is now a synonym for 'eq'; it turns out that the Common Lisp
distinction between eq and eql is insignificant in Emacs.
- numberp is a new synonym for integerp.
+ 'numberp' is a new synonym for 'integerp'.
-** auto-save has been renamed to auto-save-mode.
+** auto-save has been renamed to 'auto-save-mode'.
** Auto save file names for buffers are now created by the
- function make-auto-save-file-name. This is so you can
+ function 'make-auto-save-file-name'. This is so you can
redefine that function to change the way auto save file names
are chosen.
-** expand-file-name no longer discards a final slash.
+** 'expand-file-name' no longer discards a final slash.
(expand-file-name "foo" "/lose") => "/lose/foo"
(expand-file-name "foo/" "/lose") => "/lose/foo/"
- Also, expand-file-name no longer substitutes $ constructs.
- A new function substitute-in-file-name does this. Reading
- a file name with read-file-name or the `f' or`F' option
- of interactive calling uses substitute-in-file-name
- on the file name that was read and returns the result.
+Also, expand-file-name no longer substitutes $ constructs.
+A new function 'substitute-in-file-name' does this. Reading
+a file name with 'read-file-name' or the 'f' or'F' option
+of 'interactive' calling uses substitute-in-file-name
+on the file name that was read and returns the result.
- All I/O primitives including insert-file-contents and
- delete-file call expand-file-name on the file name supplied.
- This change makes them considerably faster in the usual case.
+All I/O primitives including 'insert-file-contents' and
+'delete-file' call 'expand-file-name' on the file name supplied.
+This change makes them considerably faster in the usual case.
** Interactive calling spec strings allow the new code letter 'D'
- which means to read a directory name. It is like 'f' except
- that the default if the user makes no change in the minibuffer
- is to return the current default directory rather than the
- current visited file name.
+which means to read a directory name. It is like 'f' except
+that the default if the user makes no change in the minibuffer
+is to return the current default directory rather than the
+current visited file name.
* Changes in Emacs 1.5
-** suspend-emacs now accepts an optional argument
- which is a string to be stuffed as terminal input
- to be read by Emacs's superior shell after Emacs exits.
+** 'suspend-emacs' now accepts an optional argument
+which is a string to be stuffed as terminal input
+to be read by Emacs's superior shell after Emacs exits.
A library called ledit exists which uses this feature
to transmit text to a Lisp job running as a sibling of
Emacs.
-** If find-file is given the name of a directory,
+** If 'find-file' is given the name of a directory,
it automatically invokes dired on that directory
rather than reading in the binary data that make up
the actual contents of the directory according to Unix.
** Saving an Emacs buffer now preserves the file modes
of any previously existing file with the same name.
- This works using new Lisp functions file-modes and
- set-file-modes, which can be used to read or set the mode
+ This works using new Lisp functions 'file-modes' and
+ 'set-file-modes', which can be used to read or set the mode
bits of any file.
-** The Lisp function cond now exists, with its traditional meaning.
+** The Lisp function 'cond' now exists, with its traditional meaning.
-** defvar and defconst now permit the documentation string
+** 'defvar' and 'defconst' now permit the documentation string
to be omitted. defvar also permits the initial value
to be omitted; then it acts only as a comment.
@@ -2180,9 +2183,9 @@ It's Beat CCA Week.
* Changes in Emacs 1.4
** Auto-filling now normally indents the new line it creates
- by calling indent-according-to-mode. This function, meanwhile,
+ by calling 'indent-according-to-mode'. This function, meanwhile,
has in Fundamental and Text modes the effect of making the line
- have an indentation of the value of left-margin, a per-buffer variable.
+ have an indentation of the value of 'left-margin', a per-buffer variable.
Tab no longer precisely does indent-according-to-mode;
it does that in all modes that supply their own indentation routine,
@@ -2215,33 +2218,33 @@ It's Beat CCA Week.
an integer.
** The Lisp function 'function' now exists. function is the
- same as quote, except that it serves as a signal to the
+ same as 'quote', except that it serves as a signal to the
Lisp compiler that the argument should be compiled as
a function. Example:
(mapcar (function (lambda (x) (+ x 5))) list)
-** The function set-key has been renamed to global-set-key.
- undefine-key and local-undefine-key has been renamed to
- global-unset-key and local-unset-key.
+** The function set-key has been renamed to 'global-set-key'.
+ 'undefine-key' and 'local-undefine-key' has been renamed to
+ 'global-unset-key' and 'local-unset-key'.
** Emacs now collects input from asynchronous subprocesses
- while waiting in the functions sleep-for and sit-for.
+ while waiting in the functions 'sleep-for' and 'sit-for'.
** Shell mode's Newline command attempts to distinguish subshell
prompts from user input when issued in the middle of the buffer.
It no longer reexecutes from dot to the end of the line;
it reeexecutes the entire line minus any prompt.
The prompt is recognized by searching for the value of
- shell-prompt-pattern, starting from the beginning of the line.
+ 'shell-prompt-pattern', starting from the beginning of the line.
Anything thus skipped is not reexecuted.
* Changes in Emacs 1.3
-** An undo facility exists now. Type C-x u to undo a batch of
+** An undo facility exists now. Type C-x u to 'undo' a batch of
changes (usually one command's changes, but some commands
- such as query-replace divide their changes into multiple
+ such as 'query-replace' divide their changes into multiple
batches. You can repeat C-x u to undo further. As long
as no commands other than C-x u intervene, each one undoes
another batch. A numeric argument to C-x u acts as a repeat
@@ -2283,12 +2286,12 @@ It's Beat CCA Week.
to be in effect when the file is edited. See the file DIFF
in the same directory as this file for full details.
-** A function nth is defined. It means the same thing as in Common Lisp.
+** A function 'nth' is defined. It means the same thing as in Common Lisp.
** The function install-command has been renamed to set-key.
It now takes the key sequence as the first argument
and the definition for it as the second argument.
- Likewise, local-install-command has been renamed to local-set-key.
+ Likewise, local-install-command has been renamed to 'local-set-key'.
@@ -2296,11 +2299,11 @@ It's Beat CCA Week.
** A Lisp single-stepping and debugging facility exists.
To cause the debugger to be entered when an error
- occurs, set the variable debug-on-error non-nil.
+ occurs, set the variable 'debug-on-error' non-nil.
To cause the debugger to be entered whenever function foo
- is called, do (debug-on-entry 'foo). To cancel this,
- do (cancel-debug-on-entry 'foo). debug-on-entry does
+ is called, use 'debug-on-entry'. To cancel this,
+ use 'cancel-debug-on-entry'. debug-on-entry does
not work for primitives (written in C), only functions
written in Lisp. Most standard Emacs commands are in Lisp.
@@ -2311,31 +2314,31 @@ It's Beat CCA Week.
by the argument values unless arguments are still being
calculated. At the beginning of the buffer is a description
of why the debugger was entered: function entry, function exit,
- error, or simply that the user called the function `debug'.
+ error, or simply that the user called the function 'debug'.
- To exit the debugger and return to top level, type `q'.
+ To exit the debugger and return to top level, type 'q'.
In the debugger, you can evaluate Lisp expressions by
- typing `e'. This is equivalent to `M-ESC'.
+ typing 'e'. This is equivalent to 'M-ESC'.
When the debugger is entered due to an error, that is
all you can do. When it is entered due to function entry
(such as, requested by debug-on-entry), you have two
options:
Continue execution and reenter debugger after the
- completion of the function being entered. Type `c'.
+ completion of the function being entered. Type 'c'.
Continue execution but enter the debugger before
- the next subexpression. Type `d'.
+ the next subexpression. Type 'd'.
You will see that some stack frames are marked with *.
This means the debugger will be entered when those
frames exit. You will see the value being returned
in the first line of the backtrace buffer. Your options:
- Continue execution, and return that value. Type `c'.
- Continue execution, and return a specified value. Type `r'.
+ Continue execution, and return that value. Type 'c'.
+ Continue execution, and return a specified value. Type 'r'.
You can mark a frame to enter the debugger on exit
- with the `b' command, or clear such a mark with `u'.
+ with the 'b' command, or clear such a mark with 'u'.
** Lisp macros now exist.
For example, you can write
@@ -2373,7 +2376,7 @@ It's Beat CCA Week.
** The value of a Lisp expression evaluated using M-ESC
is now printed in the minibuffer.
-** M-q now runs fill-paragraph, independent of major mode.
+** M-q now runs 'fill-paragraph', independent of major mode.
** C-h m now prints documentation on the current buffer's
major mode. What it prints is the documentation of the
@@ -2429,12 +2432,12 @@ It's Beat CCA Week.
All editing commands treat hidden outline-mode lines
as part of the preceding visible line.
-** C-x C-z runs save-buffers-kill-emacs
+** C-x C-z runs 'save-buffers-kill-emacs'
offers to save each file buffer, then exits.
-** C-c's function is now called suspend-emacs.
+** C-c's function is now called 'suspend-emacs'.
-** The command C-x m runs mail, which switches to a buffer *mail*
+** The command C-x m runs 'mail', which switches to a buffer *mail*
and lets you compose a message to send. C-x 4 m runs mail in
another window. Type C-z C-s in the mail buffer to send the
message according to what you have entered in the buffer.
@@ -2442,7 +2445,7 @@ It's Beat CCA Week.
You must separate the headers from the message text with
an empty line.
-** You can now dired partial directories (specified with names
+** You can now 'dired' partial directories (specified with names
containing *'s, etc, all processed by the shell). Also, you
can dired more than one directory; dired names the buffer
according to the filespec or directory name. Reinvoking
@@ -2464,13 +2467,13 @@ It's Beat CCA Week.
contains text put there for some other reason, it is cleared
first.
- t is now the top-level value of standard-output.
+ t is now the top-level value of 'standard-output'.
t as an input stream now means "read via the minibuffer".
The minibuffer is used to read a line of input, with editing,
- and this line is then parsed. Any excess not used by `read'
- is ignored; each `read' from t reads fresh input.
- t is now the top-level value of standard-input.
+ and this line is then parsed. Any excess not used by 'read'
+ is ignored; each 'read' from t reads fresh input.
+ t is now the top-level value of 'standard-input'.
*** A marker may be used as an input stream or an output stream.
The effect is to grab input from where the marker points,
@@ -2482,29 +2485,32 @@ It's Beat CCA Week.
and the buffer's mark is set to the end of the inserted output
each time output is inserted.
-*** (pos-visible-in-window-p POS WINDOW)
- returns t if position POS in WINDOW's buffer is in the range
- that is being displayed in WINDOW; nil if it is scrolled
- vertically out of visibility.
+*** New function 'pos-visible-in-window-p'
+
+ (pos-visible-in-window-p POS WINDOW)
+
+returns t if position POS in WINDOW's buffer is in the range
+that is being displayed in WINDOW; nil if it is scrolled
+vertically out of visibility.
- If display in WINDOW is not currently up to date, this function
- calculates carefully whether POS would appear if display were
- done immediately based on the current (window-start WINDOW).
+If display in WINDOW is not currently up to date, this function
+calculates carefully whether POS would appear if display were
+done immediately based on the current 'window-start'.
- POS defaults to (dot), and WINDOW to (selected-window).
+POS defaults to (dot), and WINDOW to (selected-window).
*** Variable buffer-alist replaced by function (buffer-list).
- The actual alist of buffers used internally by Emacs is now
- no longer accessible, to prevent the user from crashing Emacs
- by modifying it. The function buffer-list returns a list
- of all existing buffers. Modifying this list cannot hurt anything
- as a new list is constructed by each call to buffer-list.
+The actual alist of buffers used internally by Emacs is now
+no longer accessible, to prevent the user from crashing Emacs
+by modifying it. The function buffer-list returns a list
+of all existing buffers. Modifying this list cannot hurt anything
+as a new list is constructed by each call to buffer-list.
-*** load now takes an optional third argument NOMSG which, if non-nil,
- prevents load from printing a message when it starts and when
- it is done.
+*** 'load' now takes an optional third argument NOMSG which, if non-nil,
+prevents load from printing a message when it starts and when
+it is done.
-*** byte-recompile-directory is a new function which finds all
+*** 'byte-recompile-directory' is a new function which finds all
the .elc files in a directory, and regenerates each one which
is older than the corresponding .el (Lisp source) file.
diff --git a/etc/NEWS.18 b/etc/NEWS.18
index 78d63e5db71..a90d0bd0ea6 100644
--- a/etc/NEWS.18
+++ b/etc/NEWS.18
@@ -29,18 +29,18 @@ run, Emacs now tries the entire terminal type first. If that doesn't
yield a file that exists, the last hyphen and what follows it is
stripped. If that doesn't yield a file that exists, the previous
hyphen is stripped, and so on until all hyphens are gone. For
-example, if the terminal type is `aaa-48-foo', Emacs will try first
+example, if the terminal type is 'aaa-48-foo', Emacs will try first
`term/aaa-48-foo.el', then `term/aaa-48.el' and finally `term/aaa.el'.
Underscores now receive the same treatment as hyphens.
-** Texinfo features: @defun, etc. texinfo-show-structure.
-New template commands. texinfo-format-region.
+** Texinfo features: @defun, etc. 'texinfo-show-structure'.
+New template commands. 'texinfo-format-region'.
-** The special "local variable" `eval' is now ignored if you are running
+** The special "local variable" 'eval' is now ignored if you are running
as root.
-** New command `c-macro-expand' shows the result of C macro expansion
+** New command 'c-macro-expand' shows the result of C macro expansion
in the region. It works using the C preprocessor, so its results
are completely accurate.
@@ -50,21 +50,21 @@ are completely accurate.
** New hooks.
-*** `spell-region' now allows you to filter the text before spelling-checking.
-If the value of `spell-filter' is non-nil, it is called, with no arguments,
+*** 'spell-region' now allows you to filter the text before spelling-checking.
+If the value of 'spell-filter' is non-nil, it is called, with no arguments,
looking at a temporary buffer containing a copy of the text to be checked.
It can alter the text freely before the spell program sees it.
-*** The variable `lpr-command' now specifies the command to be used when
+*** The variable 'lpr-command' now specifies the command to be used when
you use the commands to print text (such as M-x print-buffer).
-*** Posting netnews now calls the value of `news-inews-hook' (if not nil)
+*** Posting netnews now calls the value of 'news-inews-hook' (if not nil)
as a function of no arguments before the actual posting.
-*** Rmail now calls the value of `rmail-show-message-hook' (if not nil)
+*** Rmail now calls the value of 'rmail-show-message-hook' (if not nil)
as a function of no arguments, each time a new message is selected.
-*** `kill-emacs' calls the value of `kill-emacs-hook' as a function of no args.
+*** 'kill-emacs' calls the value of 'kill-emacs-hook' as a function of no args.
** New libraries.
See the source code of each library for more information.
@@ -100,20 +100,20 @@ comes from a directory of files created by you.
** New programming features.
-*** The variable `window-system-version' now contains the version number
+*** The variable 'window-system-version' now contains the version number
of the window system you are using (if appropriate). When using X windows,
its value is either 10 or 11.
*** (interactive "N") uses the prefix argument if any; otherwise, it reads
a number using the minibuffer.
-*** VMS: there are two new functions `vms-system-info' and `shrink-to-icon'.
+*** VMS: there are two new functions 'vms-system-info' and 'shrink-to-icon'.
The former allows you to get many kinds of system status information.
See its self-documentation for full details.
The second is used with the window system: it iconifies the Emacs window.
-*** VMS: the new function `define-logical-name' allows you to create
-job-wide logical names. The old function `define-dcl-symbol' has been
+*** VMS: the new function 'define-logical-name' allows you to create
+job-wide logical names. The old function 'define-dcl-symbol' has been
removed.
@@ -134,8 +134,8 @@ code is displayed in another window with an arrow added to the line
where the program is executing.
Special GDB-mode commands include M-s, M-n, M-i, M-u, M-d, and C-c C-f
-which send the GDB commands `step', `next', `stepi', `up', `down'
-and `finish'.
+which send the GDB commands 'step', 'next', 'stepi', 'up', 'down'
+and 'finish'.
In any source file, the commands C-x SPC tells GDB to set a breakpoint
on the current line.
@@ -146,28 +146,28 @@ on the current line.
This is a way you can explicitly request not to make a backup.
-** `term-setup-hook' is for users only.
+** 'term-setup-hook' is for users only.
Emacs never uses this variable for internal purposes, so you can freely
set it in your `.emacs' file to make Emacs do something special after
loading any terminal-specific setup file from `lisp/term'.
-** `copy-keymap' now copies recursive submaps.
+** 'copy-keymap' now copies recursive submaps.
** New overlay-arrow feature.
-If you set the variable `overlay-arrow-string' to a string
-and `overlay-arrow-position' to a marker, that string is displayed on
+If you set the variable 'overlay-arrow-string' to a string
+and 'overlay-arrow-position' to a marker, that string is displayed on
the screen at the position of that marker, hiding whatever text would
have appeared there. If that position isn't on the screen, or if
the buffer the marker points into isn't displayed, there is no effect.
** -batch mode can read from the terminal.
-It now works to use `read-char' to do terminal input in a noninteractive
+It now works to use 'read-char' to do terminal input in a noninteractive
Emacs run. End of file causes Emacs to exit.
-** Variables `data-bytes-used' and `data-bytes-free' removed.
+** Variables 'data-bytes-used' and 'data-bytes-free' removed.
These variables cannot really work because the 24-bit range of an
integer in (most ports of) GNU Emacs is not large enough to hold their
@@ -177,7 +177,7 @@ values on many systems.
* Changes in Emacs 18.45, since version 18.41.
-** C indentation parameter `c-continued-brace-offset'.
+** C indentation parameter 'c-continued-brace-offset'.
This parameter's value is added to the indentation of any
line that is in a continuation context and starts with an open-brace.
@@ -195,7 +195,7 @@ abbreviation, if the expansion found is all lower case except perhaps
for its first letter, then the case pattern of the abbreviation
is carried over to the expansion that replaces it.
-** TeX-mode syntax.
+** 'TeX-mode' syntax.
\ is no longer given "escape character" syntax in TeX mode. It now
has the syntax of an ordinary punctuation character. As a result,
@@ -203,13 +203,13 @@ has the syntax of an ordinary punctuation character. As a result,
** Mail-mode automatic Reply-To field.
-If the variable `mail-default-reply-to' is non-`nil', then each time
+If the variable 'mail-default-reply-to' is non-'nil', then each time
you start to compose a message, a Reply-To field is inserted with
-its contents taken from the value of `mail-default-reply-to'.
+its contents taken from the value of 'mail-default-reply-to'.
** Where is your .emacs file?
-If you run Emacs under `su', so your real and effective uids are
+If you run Emacs under 'su', so your real and effective uids are
different, Emacs uses the home directory associated with the real uid
(the name you actually logged in under) to find the .emacs file.
@@ -228,7 +228,7 @@ case. You can use either upper or lower case indiscriminately.
** VMS-only function 'define-dcl-symbol'.
This is a new name for the function formerly called
-`define-logical-name'.
+'define-logical-name'.
@@ -288,26 +288,26 @@ normally print such a message.
*** Cursor appears in last line during y-or-n questions.
-Questions that want a `y' or `n' answer now move the cursor
+Questions that want a 'y' or 'n' answer now move the cursor
to the last line, following the question.
** Library loading changes.
-`load' now considers all possible suffixes (`.elc', `.el' and none)
-for each directory in `load-path' before going on to the next directory.
+'load' now considers all possible suffixes (`.elc', `.el' and none)
+for each directory in 'load-path' before going on to the next directory.
It now accepts an optional fourth argument which, if non-nil, says to
use no suffixes; then the file name must be given in full. The search
-of the directories in `load-path' goes on as usual in this case, but
+of the directories in 'load-path' goes on as usual in this case, but
it too can be prevented by passing an absolute file name.
-The value of `load-path' no longer by default includes nil (meaning to
-look in the current default directory). The idea is that `load' should
+The value of 'load-path' no longer by default includes nil (meaning to
+look in the current default directory). The idea is that 'load' should
be used to search the path only for libraries to be found in the standard
places. If you want to override system libraries with your own, place
your own libraries in one special directory and add that directory to the
-front of `load-path'.
+front of 'load-path'.
-The function `load' is no longer a command; that is to say, `M-x load'
+The function 'load' is no longer a command; that is to say, `M-x load'
is no longer allowed. Instead, there are two commands for loading files.
`M-x load-library' is equivalent to the old meaning of `M-x load'.
`M-x load-file' reads a file name with completion and defaulting
@@ -315,11 +315,11 @@ and then loads exactly that file, with no searching and no suffixes.
** Emulation of other editors.
-*** `edt-emulation-on' starts emulating DEC's EDT editor.
+*** 'edt-emulation-on' starts emulating DEC's EDT editor.
-Do `edt-emulation-off' to return Emacs to normal.
+Do 'edt-emulation-off' to return Emacs to normal.
-*** `vi-mode' and `vip-mode' starts emulating vi.
+*** 'vi-mode' and 'vip-mode' starts emulating vi.
These are two different vi emulations provided by GNU Emacs users.
We are interested in feedback as to which emulation is preferable.
@@ -327,18 +327,18 @@ We are interested in feedback as to which emulation is preferable.
See the documentation and source code for these functions
for more information.
-*** `set-gosmacs-bindings' emulates Gosling Emacs.
+*** 'set-gosmacs-bindings' emulates Gosling Emacs.
This command changes many global bindings to resemble those of
Gosling Emacs. The previous bindings are saved and can be restored using
-`set-gnu-bindings'.
+'set-gnu-bindings'.
** Emulation of a display terminal.
Within Emacs it is now possible to run programs (such as emacs or
supdup) which expect to do output to a visual display terminal.
-See the function `terminal-emulator' for more information.
+See the function 'terminal-emulator' for more information.
** New support for keypads and function keys.
@@ -366,7 +366,7 @@ assigned to the standard key-names.
One other change in terminal-specific files: if the value of the TERM
variable contains a hyphen, only the part before the first hyphen is
used in forming the name of the terminal-specific file. Thus, for
-terminal type `aaa-48', the file loaded is now `term/aaa.el' rather
+terminal type 'aaa-48', the file loaded is now `term/aaa.el' rather
than `term/aaa-48.el'.
** New startup command line options.
@@ -375,53 +375,54 @@ than `term/aaa-48.el'.
insert the contents of FILE into the current buffer at that point in
command line processing. This is like using the command M-x insert-file.
-`-funcall', `-load', `-user' and `-no-init-file' are new synonyms for
-`-f', `-l', `-u' and `-q'.
+'-funcall', '-load', '-user' and '-no-init-file' are new synonyms for
+'-f', '-l', '-u' and '-q'.
-`-nw' means don't use a window system. If you are using a terminal
+'-nw' means don't use a window system. If you are using a terminal
emulator on the X window system and you want to run Emacs to work through
the terminal emulator instead of working directly with the window system,
use this switch.
** Buffer-sorting commands.
-Various M-x commands whose names start with `sort-' sort parts of
+Various M-x commands whose names start with 'sort-' sort parts of
the region:
-sort-lines divides the region into lines and sorts them alphabetically.
-sort-pages divides into pages and sorts them alphabetically.
-sort-paragraphs divides into paragraphs and sorts them alphabetically.
-sort-fields divides into lines and sorts them alphabetically
+'sort-lines' divides the region into lines and sorts them alphabetically.
+'sort-pages' divides into pages and sorts them alphabetically.
+'sort-paragraphs'
+ divides into paragraphs and sorts them alphabetically.
+'sort-fields' divides into lines and sorts them alphabetically
according to one field in the line.
The numeric argument specifies which field (counting
from field 1 at the beginning of the line). Fields in a line
are separated by whitespace.
-sort-numeric-fields
+'sort-numeric-fields'
is similar but converts the specified fields to numbers
and sorts them numerically.
-sort-columns divides into lines and sorts them according to the contents
+'sort-columns' divides into lines and sorts them according to the contents
of a specified range of columns.
Refer to the self-documentation of these commands for full usage information.
** Changes in various commands.
-*** `tags-query-replace' and `tags-search' change.
+*** 'tags-query-replace' and 'tags-search' change.
These functions now display the name of the file being searched at the moment.
-*** `occur' output now serves as a menu. `occur-menu' command deleted.
+*** 'occur' output now serves as a menu. 'occur-menu' command deleted.
`M-x occur' now allows you to move quickly to any of the occurrences
-listed. Select the `*Occur*' buffer that contains the output of `occur',
+listed. Select the `*Occur*' buffer that contains the output of 'occur',
move point to the occurrence you want, and type C-c C-c.
This will move point to the same occurrence in the buffer that the
occurrences were found in.
-The command `occur-menu' is thus obsolete, and has been deleted.
+The command 'occur-menu' is thus obsolete, and has been deleted.
One way to get a list of matching lines without line numbers is to
-copy the text to another buffer and use the command `keep-lines'.
+copy the text to another buffer and use the command 'keep-lines'.
*** Incremental search changes.
@@ -441,20 +442,20 @@ incremental regexp search with C-M-s C-r.
If you add a `*', `?' or `\|' to an incremental search regexp,
point will back up if that is appropriate. For example, if
-you have searched for `ab' and add a `*', point moves to the
-first match for `ab*', which may be before the match for `ab'
+you have searched for 'ab' and add a `*', point moves to the
+first match for `ab*', which may be before the match for 'ab'
that was previously found.
If an incremental search is failing and you ask to repeat it,
it will start again from the beginning of the buffer (or the end,
if it is a backward search).
-The search-controlling parameters `isearch-slow-speed' and
-`isearch-slow-window-lines' have now been renamed to start with
-`search' instead of `isearch'. Now all the parameters' names start
-with `search'.
+The search-controlling parameters 'isearch-slow-speed' and
+'isearch-slow-window-lines' have now been renamed to start with
+'search' instead of 'isearch'. Now all the parameters' names start
+with 'search'.
-If `search-slow-window-lines' is negative, the slow search window
+If 'search-slow-window-lines' is negative, the slow search window
is put at the top of the screen, and the absolute value or the
negative number specifies the height of it.
@@ -490,9 +491,9 @@ by searching the buffer for words that start with the abbreviation.
*** Changes in saving kbd macros.
-The commands `write-kbd-macro' and `append-kbd-macro' have been
+The commands 'write-kbd-macro' and 'append-kbd-macro' have been
deleted. The way to save a keyboard macro is to use the new command
-`insert-kbd-macro', which inserts Lisp code to define the macro as
+'insert-kbd-macro', which inserts Lisp code to define the macro as
it is currently defined into the buffer before point. Visit a Lisp
file such as your Emacs init file `~/.emacs', insert the macro
definition (perhaps deleting an old definition for the same macro)
@@ -507,14 +508,14 @@ an abbrev, even if abbrev-mode is not turned on.
The command C-M-x in Lisp mode, which sends the current defun to
an inferior Lisp process, now works by writing the text into a temporary
-file and actually sending only a `load'-form to load the file.
+file and actually sending only a 'load'-form to load the file.
As a result, it avoids the Unix bugs that used to strike when the
text was above a certain length.
With a prefix argument, this command now makes the inferior Lisp buffer
appear on the screen and scrolls it so that the bottom is showing.
-Two variables `inferior-lisp-load-command' and `inferior-lisp-prompt',
+Two variables 'inferior-lisp-load-command' and 'inferior-lisp-prompt',
exist to customize these feature for different Lisp implementations.
*** C-x p now disabled.
@@ -552,7 +553,7 @@ When you change the visited file name of a buffer, the auto save file
is now renamed to belong to the new visited file name.
You can customize the way auto save file names are made by redefining
-the two functions `make-auto-save-file-name' and `auto-save-file-name-p',
+the two functions 'make-auto-save-file-name' and 'auto-save-file-name-p',
both of which are defined in `files.el'.
*** Modifying a buffer whose file is changed on disk is detected instantly.
@@ -566,7 +567,7 @@ If it has, you are asked to confirm that you want to change the buffer.
Emacs can now know about buffers that it should offer to save on exit
even though they are not visiting files. This is done for any buffer
-which has a non-nil local value of `buffer-offer-save'. By default,
+which has a non-nil local value of 'buffer-offer-save'. By default,
Mail mode provides such a local value.
*** Backup file changes.
@@ -592,9 +593,9 @@ give the user name and password for use on that host. FTP is reinvoked
each time you ask to use it, but previously specified user names and
passwords are remembered automatically.
-*** Dired `g' command.
+*** Dired 'g' command.
-`g' in Dired mode is equivalent to M-x revert-buffer; it causes the
+'g' in Dired mode is equivalent to M-x revert-buffer; it causes the
current contents of the same directory to be read in.
** Changes in major modes.
@@ -608,11 +609,11 @@ afterward.
The old definition did one additional thing: it reindented the line
before the new newline. This has been removed because it made the
command twice as slow. The only time it was really useful was after the
-insertion of an `else', since the fact of starting with `else' may change
+insertion of an 'else', since the fact of starting with 'else' may change
the way that line is indented. Now you will have to type TAB again
-yourself to reindent the `else' properly.
+yourself to reindent the 'else' properly.
-If the variable `c-tab-always-indent' is set to `nil', the TAB command
+If the variable 'c-tab-always-indent' is set to 'nil', the TAB command
in C mode, with no argument, will just insert a tab character if there
is non-whitespace preceding point on the current line. Giving it a
prefix argument will force reindentation of the line (as well as
@@ -622,7 +623,7 @@ of the compound statement that begins after point, if any).
This mode provides commands for motion and indentation of Fortran code,
plus built-in abbrevs for Fortran keywords. For details, see the manual
-or the on-line documentation of the command `fortran-mode'.
+or the on-line documentation of the command 'fortran-mode'.
*** Scribe mode now exists.
@@ -641,7 +642,7 @@ Most of them are the same as in Shell mode.
*** Picture mode changes.
-The special picture-mode commands to specify the direction of cursor
+The special 'picture-mode' commands to specify the direction of cursor
motion after insertion have been moved to C-c keys. The commands to
specify diagonal motion were already C-c keys; they are unchanged.
The keys to specify horizontal or vertical motion are now
@@ -659,7 +660,7 @@ LaTeX mode now exists. Use M-x latex-mode to select this mode, and
M-x plain-tex-mode to select the previously existing mode for Plain
TeX. M-x tex-mode attempts to examine the contents of the buffer and
choose between latex-mode and plain-tex-mode accordingly; if the
-buffer is empty or it cannot tell, the variable `TeX-default-mode'
+buffer is empty or it cannot tell, the variable 'TeX-default-mode'
controls the choice. Its value should be the symbol for the mode to
be used.
@@ -693,7 +694,7 @@ C-c C-f Move to next visible heading at the same level.
C-c C-b Move to previous visible heading at the same level.
C-c C-u Move up to previous visible heading at a higher level.
-The variable `outline-regexp' now controls recognition of heading lines.
+The variable 'outline-regexp' now controls recognition of heading lines.
Any line whose beginning matches this regexp is a heading line.
The depth in outline structure is determined by the length of
the string that matches.
@@ -729,7 +730,7 @@ Thus, C-c LETTER is always unassigned.
*** Rmail C-r command changed to w.
-The Rmail command to edit the current message is now `w'. This change
+The Rmail command to edit the current message is now 'w'. This change
has been made because people frequently type C-r while in Rmail hoping
to do a reverse incremental search. That now works.
@@ -742,7 +743,7 @@ decryption of the body of a news message. It defaults to the USENET
standard of 13, and accepts any numeric arg between 1 to 25 and -25 to -1.
The function is bound to C-c C-r in both news-mode and news-reply-mode.
-*** rmail-output command added.
+*** 'rmail-output' command added.
The C-o command has been bound to rmail-output in news-mode.
This allows one to append an article to a file which is in either Unix
@@ -785,7 +786,7 @@ either you are using a window system and give Emacs a separate window
or you run the other programs as inferiors of Emacs (such as, using
M-x shell).
-First prepare the existing Emacs process by loading the `server'
+First prepare the existing Emacs process by loading the 'server'
library and executing M-x server-start. (Your .emacs can do this
automatically.)
@@ -820,24 +821,24 @@ Emacs will no longer load a file named `.emacs.el' or `emacs.elc'
in place of `.emacs'. This is so that it will take less time to
find `.emacs'. If you want to compile your init file, give it another
name and make `.emacs' a link to the `.elc' file, or make it contain
-a call to `load' to load the `.elc' file.
+a call to 'load' to load the `.elc' file.
-*** `default-profile' renamed to `default', and loaded after `.emacs'.
+*** 'default-profile' renamed to 'default', and loaded after `.emacs'.
-It used to be the case that the file `default-profile' was loaded if
+It used to be the case that the file 'default-profile' was loaded if
and only if `.emacs' was not found.
-Now the name `default-profile' is not used at all. Instead, a library
-named `default' is loaded after the `.emacs' file. `default' is loaded
-whether the `.emacs' file exists or not. However, loading of `default'
-can be prevented if the `.emacs' file sets `inhibit-default-init' to non-nil.
+Now the name 'default-profile' is not used at all. Instead, a library
+named 'default' is loaded after the `.emacs' file. 'default' is loaded
+whether the `.emacs' file exists or not. However, loading of 'default'
+can be prevented if the `.emacs' file sets 'inhibit-default-init' to non-nil.
In fact, you would call the default file `default.el' and probably would
-byte-compile it to speed execution.
+'byte-compile' it to speed execution.
-Note that for most purposes you are better off using a `site-init' library
+Note that for most purposes you are better off using a 'site-init' library
since that will be loaded before the runnable Emacs is dumped. By using
-a `site-init' library, you avoid taking up time each time Emacs is started.
+a 'site-init' library, you avoid taking up time each time Emacs is started.
*** inhibit-command-line has been eliminated.
@@ -845,79 +846,79 @@ This variable used to exist for .emacs files to set. It has been
eliminated because you can get the same effect by setting
command-line-args to nil and setting inhibit-startup-message to t.
-** `apply' is more general.
+** 'apply' is more general.
-`apply' now accepts any number of arguments. The first one is a function;
+'apply' now accepts any number of arguments. The first one is a function;
the rest are individual arguments to pass to that function, except for the
last, which is a list of arguments to pass.
-Previously, `apply' required exactly two arguments. Its old behavior
+Previously, 'apply' required exactly two arguments. Its old behavior
follows as a special case of the new definition.
-** New code-letter for `interactive'.
+** New code-letter for 'interactive'.
(interactive "NFoo: ") is like (interactive "nFoo: ") in reading
a number using the minibuffer to serve as the argument; however,
if a prefix argument was specified, it uses the prefix argument
value as the argument, and does not use the minibuffer at all.
-This is used by the `goto-line' and `goto-char' commands.
+This is used by the 'goto-line' and 'goto-char' commands.
** Semantics of variables.
*** Built-in per-buffer variables improved.
Several built-in variables which in the past had a different value in
-each buffer now behave exactly as if `make-variable-buffer-local' had
+each buffer now behave exactly as if 'make-variable-buffer-local' had
been done to them.
-These variables are `tab-width', `ctl-arrow', `truncate-lines',
-`fill-column', `left-margin', `mode-line-format', `abbrev-mode',
-`overwrite-mode', `case-fold-search', `auto-fill-hook',
-`selective-display', `selective-display-ellipses'.
+These variables are 'tab-width', 'ctl-arrow', 'truncate-lines',
+'fill-column', 'left-margin', 'mode-line-format', 'abbrev-mode',
+'overwrite-mode', 'case-fold-search', 'auto-fill-hook',
+'selective-display', 'selective-display-ellipses'.
To be precise, each variable has a default value which shows through
-in most buffers and can be accessed with `default-value' and set with
-`set-default'. Setting the variable with `setq' makes the variable
+in most buffers and can be accessed with 'default-value' and set with
+'set-default'. Setting the variable with 'setq' makes the variable
local to the current buffer. Changing the default value has retroactive
effect on all buffers in which the variable is not local.
-The variables `default-case-fold-search', etc., are now obsolete.
+The variables 'default-case-fold-search', etc., are now obsolete.
They now refer to the default value of the variable, which is not
quite the same behavior as before, but it should enable old init files
to continue to work.
*** New per-buffer variables.
-The variables `fill-prefix', `comment-column' and `indent-tabs-mode'
-are now per-buffer. They work just like `fill-column', etc.
+The variables 'fill-prefix', 'comment-column' and 'indent-tabs-mode'
+are now per-buffer. They work just like 'fill-column', etc.
-*** New function `setq-default'.
+*** New function 'setq-default'.
-`setq-default' sets the default value of a variable, and uses the
-same syntax that `setq' accepts: the variable name is not evaluated
+'setq-default' sets the default value of a variable, and uses the
+same syntax that 'setq' accepts: the variable name is not evaluated
and need not be quoted.
`(setq-default case-fold-search nil)' would make searches case-sensitive
-in all buffers that do not have local values for `case-fold-search'.
+in all buffers that do not have local values for 'case-fold-search'.
-*** Functions `global-set' and `global-value' deleted.
+*** Functions 'global-set' and 'global-value' deleted.
These functions were never used except by mistake by users expecting
-the functionality of `set-default' and `default-value'.
+the functionality of 'set-default' and 'default-value'.
** Changes in defaulting of major modes.
-When `default-major-mode' is `nil', new buffers are supposed to
+When 'default-major-mode' is 'nil', new buffers are supposed to
get their major mode from the buffer that is current. However,
certain major modes (such as Dired mode, Rmail mode, Rmail Summary mode,
and others) are not reasonable to use in this way.
-Now such modes' names have been given non-`nil' `mode-class' properties.
+Now such modes' names have been given non-'nil' 'mode-class' properties.
If the current buffer's mode has such a property, Fundamental mode is
used as the default for newly created buffers.
-** `where-is-internal' requires additional arguments.
+** 'where-is-internal' requires additional arguments.
This function now accepts three arguments, two of them required:
DEFINITION, the definition to search for; LOCAL-KEYMAP, the keymap
@@ -934,7 +935,7 @@ are required when previously only one argument was allowed. To get
the old behavior of this function, write `(current-local-map)' as
the expression for the second argument.
-The incompatibility is sad, but `nil' is a legitimate value for the
+The incompatibility is sad, but 'nil' is a legitimate value for the
second argument (it means there is no local keymap), so it cannot also
serve as a default meaning to use the current local keymap.
@@ -945,9 +946,9 @@ usual replacement of the abbrev with the expansion before running the
hook. Previously the abbrev itself was deleted but the expansion was
not inserted.
-** Function `scan-buffer' deleted.
+** Function 'scan-buffer' deleted.
-Use `search-forward' or `search-backward' in place of `scan-buffer'.
+Use 'search-forward' or 'search-backward' in place of 'scan-buffer'.
You will have to rearrange the arguments.
** X window interface improvements.
@@ -959,7 +960,7 @@ for details.
*** New pop-up menu facility.
-The new function `x-popup-menu' pops up a menu (in a X window)
+The new function 'x-popup-menu' pops up a menu (in a X window)
and returns an indication of which selection the user made.
For more information, see its self-documentation.
@@ -969,7 +970,7 @@ This command prints the disassembly of a byte-compiled Emacs Lisp function.
Would anyone like to interface this to the debugger?
-** `insert-buffer-substring' can insert part of the current buffer.
+** 'insert-buffer-substring' can insert part of the current buffer.
The old restriction that the text being inserted had to come from
a different buffer is now lifted.
@@ -977,41 +978,42 @@ a different buffer is now lifted.
When inserting text from the current buffer, the text to be inserted
is determined from the specified bounds before any copying takes place.
-** New function `substitute-key-definition'.
+** New function 'substitute-key-definition'.
This is a new way to replace one command with another command as the
binding of whatever keys may happen to refer to it.
-(substitute-key-definition OLDDEF NEWDEF KEYMAP) looks through KEYMAP
-for keys defined to run OLDDEF, and rebinds those keys to run NEWDEF
-instead.
+ (substitute-key-definition OLDDEF NEWDEF KEYMAP)
-** New function `insert-char'.
+looks through KEYMAP for keys defined to run OLDDEF, and rebinds those keys to
+run NEWDEF instead.
+
+** New function 'insert-char'.
Insert a specified character, a specified number of times.
-** `mark-marker' changed.
+** 'mark-marker' changed.
When there is no mark, this now returns a marker that points
-nowhere, rather than `nil'.
+nowhere, rather than 'nil'.
-** `ding' accepts argument.
+** 'ding' accepts argument.
-When given an argument, the function `ding' does not terminate
-execution of a keyboard macro. Normally, `ding' does terminate
+When given an argument, the function 'ding' does not terminate
+execution of a keyboard macro. Normally, 'ding' does terminate
all macros that are currently executing.
-** New function `minibuffer-depth'.
+** New function 'minibuffer-depth'.
This function returns the current depth in minibuffer activations.
The value is zero when the minibuffer is not in use.
Values greater than one are possible if the user has entered the
minibuffer recursively.
-** New function `documentation-property'.
+** New function 'documentation-property'.
(documentation-property SYMBOL PROPNAME) is like (get SYMBOL PROPNAME),
-except that if the property value is a number `documentation-property'
+except that if the property value is a number 'documentation-property'
will take that number (or its absolute value) as a character position
in the DOC file and return the string found there.
@@ -1032,8 +1034,8 @@ will expand into
"ESC C-x evaluates the defun containing point."
regardless of the current major mode, because ESC C-x is defined to
-run `eval-defun' in the keymap `emacs-lisp-mode-map'. The effect is
-to show the key for `eval-defun' in Emacs Lisp mode regardless of the
+run 'eval-defun' in the keymap 'emacs-lisp-mode-map'. The effect is
+to show the key for 'eval-defun' in Emacs Lisp mode regardless of the
current major mode.
The `\<...>' construct applies to all `\[...]' constructs that follow it,
@@ -1047,50 +1049,50 @@ has been used or not.
** Multiple hooks allowed in certain contexts.
-The old hook variables `find-file-hook', `find-file-not-found-hook' and
-`write-file-hook' have been replaced.
+The old hook variables 'find-file-hook', 'find-file-not-found-hook' and
+'write-file-hook' have been replaced.
-The replacements are `find-file-hooks', `find-file-not-found-hooks'
-and `write-file-hooks'. Each holds a list of functions to be called;
-by default, `nil', for no functions. The functions are called in
+The replacements are 'find-file-hooks', 'find-file-not-found-hooks'
+and 'write-file-hooks'. Each holds a list of functions to be called;
+by default, 'nil', for no functions. The functions are called in
order of appearance in the list.
-In the case of `find-file-hooks', all the functions are executed.
+In the case of 'find-file-hooks', all the functions are executed.
-In the case of `find-file-not-found-hooks', if any of the functions
-returns non-`nil', the rest of the functions are not called.
+In the case of 'find-file-not-found-hooks', if any of the functions
+returns non-'nil', the rest of the functions are not called.
-In the case of `write-file-hooks', if any of the functions returns
-non-`nil', the rest of the functions are not called, and the file is
+In the case of 'write-file-hooks', if any of the functions returns
+non-'nil', the rest of the functions are not called, and the file is
considered to have been written already; so actual writing in the
-usual way is not done. If `write-file-hooks' is local to a buffer,
-it is set to its global value if `set-visited-file-name' is called
+usual way is not done. If 'write-file-hooks' is local to a buffer,
+it is set to its global value if 'set-visited-file-name' is called
(and thus by C-x C-w as well).
-`find-file-not-found-hooks' and `write-file-hooks' can be used
+'find-file-not-found-hooks' and 'write-file-hooks' can be used
together to implement editing of files that are not stored as Unix
files: stored in archives, or inside version control systems, or on
other machines running other operating systems and accessible via ftp.
** New hooks for suspending Emacs.
-Suspending Emacs runs the hook `suspend-hook' before suspending
-and the hook `suspend-resume-hook' if the suspended Emacs is resumed.
+Suspending Emacs runs the hook 'suspend-hook' before suspending
+and the hook 'suspend-resume-hook' if the suspended Emacs is resumed.
Running a hook is done by applying the variable's value to no arguments
-if the variable has a non-`nil' value. If `suspend-hook' returns
-non-`nil', then suspending is inhibited and so is running the
-`suspend-resume-hook'. The non-`nil' value means that the `suspend-hook'
+if the variable has a non-'nil' value. If 'suspend-hook' returns
+non-'nil', then suspending is inhibited and so is running the
+'suspend-resume-hook'. The non-'nil' value means that the 'suspend-hook'
has done whatever suspending is required.
** Disabling commands can print a special message.
-A command is disabled by giving it a non-`nil' `disabled' property.
+A command is disabled by giving it a non-'nil' 'disabled' property.
Now, if this property is a string, it is included in the message
printed when the user tries to run the command.
** Emacs can open TCP connections.
-The function `open-network-stream' opens a TCP connection to
+The function 'open-network-stream' opens a TCP connection to
a specified host and service. Its value is a Lisp object that represents
the connection. The object is a kind of "subprocess", and I/O are
done like I/O to subprocesses.
@@ -1100,7 +1102,7 @@ done like I/O to subprocesses.
*** New mode-line control features.
The display of the mode line used to be controlled by a format-string
-that was the value of the variable `mode-line-format'.
+that was the value of the variable 'mode-line-format'.
This variable still exists, but it now allows more general values,
not just strings. Lists, cons cells and symbols are also meaningful.
@@ -1139,16 +1141,16 @@ used as mode elements, and what they do in the display:
at most the width specified by the integer.
There is always one mode element to start with, that being the value of
-`mode-line-format', but if this value is a list then it leads to several
+'mode-line-format', but if this value is a list then it leads to several
more mode elements, which can lead to more, and so on.
There is one new %-construct for mode elements that are strings:
`%n' displays ` Narrow' for a buffer that is narrowed.
-The default value of `mode-line-format' refers to several other variables.
-These variables are `mode-name', `mode-line-buffer-identification',
-`mode-line-process', `mode-line-modified', `global-mode-string' and
-`minor-mode-alist'. The first four are local in every buffer in which they
+The default value of 'mode-line-format' refers to several other variables.
+These variables are 'mode-name', 'mode-line-buffer-identification',
+'mode-line-process', 'mode-line-modified', 'global-mode-string' and
+'minor-mode-alist'. The first four are local in every buffer in which they
are changed from the default.
mode-name Name of buffer's major mode. Local in every buffer.
@@ -1156,7 +1158,7 @@ mode-name Name of buffer's major mode. Local in every buffer.
mode-line-buffer-identification
Normally the list ("Emacs: %17b"), it is responsible
for displaying text to indicate what buffer is being shown
- and what kind of editing it is doing. `Emacs' means
+ and what kind of editing it is doing. 'Emacs' means
that a file of characters is being edited. Major modes
such as Info and Dired which edit or view other kinds
of data often change this value. This variables becomes
@@ -1188,72 +1190,72 @@ global-mode-string
The idea of these variables is to eliminate the need for major modes
to alter mode-line-format itself.
-*** `window-point' valid for selected window.
+*** 'window-point' valid for selected window.
-The value returned by `window-point' used to be incorrect when its
+The value returned by 'window-point' used to be incorrect when its
argument was the selected window. Now the value is correct.
*** Window configurations may be saved as Lisp objects.
-The function `current-window-configuration' returns a special type of
+The function 'current-window-configuration' returns a special type of
Lisp object that represents the current layout of windows: the
sizes and positions of windows, which buffers appear in them, and
which parts of the buffers appear on the screen.
-The function `set-window-configuration' takes one argument, which must
+The function 'set-window-configuration' takes one argument, which must
be a window configuration object, and restores that configuration.
-*** New hook `temp-output-buffer-show-hook'.
+*** New hook 'temp-output-buffer-show-hook'.
This hook allows you to control how help buffers are displayed.
-Whenever `with-output-to-temp-buffer' has executed its body and wants
-to display the temp buffer, if this variable is bound and non-`nil'
+Whenever 'with-output-to-temp-buffer' has executed its body and wants
+to display the temp buffer, if this variable is bound and non-'nil'
then its value is called with one argument, the temp buffer.
The hook function is solely responsible for displaying the buffer.
The standard manner of display--making the buffer appear in a window--is
used only if there is no hook function.
-*** New function `minibuffer-window'.
+*** New function 'minibuffer-window'.
This function returns the window used (sometimes) for displaying
the minibuffer. It can be used even when the minibuffer is not active.
-*** New feature to `next-window'.
+*** New feature to 'next-window'.
-If the optional second argument is neither `nil' nor `t', the minibuffer
+If the optional second argument is neither 'nil' nor 't', the minibuffer
window is omitted from consideration even when active; if the starting
window was the last non-minibuffer window, the value will be the first
non-minibuffer window.
-*** New variable `minibuffer-scroll-window'.
+*** New variable 'minibuffer-scroll-window'.
-When this variable is non-`nil', the command `scroll-other-window'
+When this variable is non-'nil', the command 'scroll-other-window'
uses it as the window to be scrolled. Displays of completion-lists
set this variable to the window containing the display.
-*** New argument to `sit-for'.
+*** New argument to 'sit-for'.
-A non-nil second argument to `sit-for' means do not redisplay;
+A non-nil second argument to 'sit-for' means do not redisplay;
just wait for the specified time or until input is available.
-*** Deleted function `set-minor-mode'; minor modes must be changed.
+*** Deleted function 'set-minor-mode'; minor modes must be changed.
-The function `set-minor-mode' has been eliminated. The display
+The function 'set-minor-mode' has been eliminated. The display
of minor mode names in the mode line is now controlled by the
-variable `minor-mode-alist'. To specify display of a new minor
+variable 'minor-mode-alist'. To specify display of a new minor
mode, it is sufficient to add an element to this list. Once that
is done, you can turn the mode on and off just by setting a variable,
and the display will show its status automatically.
-*** New variable `cursor-in-echo-area'.
+*** New variable 'cursor-in-echo-area'.
If this variable is non-nil, the screen cursor appears on the
last line of the screen, at the end of the text displayed there.
Binding this variable to t is useful at times when reading single
-characters of input with `read-char'.
+characters of input with 'read-char'.
-*** New per-buffer variable `selective-display-ellipses'.
+*** New per-buffer variable 'selective-display-ellipses'.
If this variable is non-nil, an ellipsis (`...') appears on the screen
at the end of each text line that is followed by invisible text.
@@ -1262,16 +1264,16 @@ If this variable is nil, no ellipses appear. Then there is no sign
on the screen that invisible text is present.
Text is made invisible under the control of the variable
-`selective-display'; this is how Outline mode and C-x $ work.
+'selective-display'; this is how Outline mode and C-x $ work.
-*** New variable `no-redraw-on-reenter'.
+*** New variable 'no-redraw-on-reenter'.
If you set this variable non-nil, Emacs will not clear the screen when
you resume it after suspending it. This is for the sake of terminals
with multiple screens of memory, where the termcap entry has been set
up to switch between screens when Emacs is suspended and resumed.
-*** New argument to `set-screen-height' or `set-screen-width'.
+*** New argument to 'set-screen-height' or 'set-screen-width'.
These functions now take an optional second argument which says
what significance the newly specified height or width has.
@@ -1295,21 +1297,21 @@ needed.
** File-related changes.
-*** New parameter `backup-by-copying-when-mismatch'.
+*** New parameter 'backup-by-copying-when-mismatch'.
-If this variable is non-`nil', then when Emacs is about to save a
+If this variable is non-'nil', then when Emacs is about to save a
file, it will create the backup file by copying if that would avoid
changing the file's uid or gid.
-The default value of this variable is `nil', because usually it is
+The default value of this variable is 'nil', because usually it is
useful to have the uid of a file change according to who edited it
-last. I recommend that this variable be left normally `nil' and
+last. I recommend that this variable be left normally 'nil' and
changed with a local variables list in those particular files where
the uid needs to be preserved.
-*** New parameter `file-precious-flag'.
+*** New parameter 'file-precious-flag'.
-If this variable is non-`nil', saving the buffer tries to avoid
+If this variable is non-'nil', saving the buffer tries to avoid
leaving an incomplete file due to disk full or other I/O errors.
It renames the old file before saving. If saving is successful,
the renamed file is deleted; if saving gets an error, the renamed
@@ -1317,29 +1319,29 @@ file is renamed back to the name you visited.
Backups are always made by copying for such files.
-*** New variable `buffer-offer-save'.
+*** New variable 'buffer-offer-save'.
-If the value of this variable is non-`nil' in a buffer then exiting
+If the value of this variable is non-'nil' in a buffer then exiting
Emacs will offer to save the buffer (if it is modified and nonempty)
even if the buffer is not visiting a file. This variable is
automatically made local to the current buffer whenever it is set.
-*** `rename-file', `copy-file', `add-name-to-file' and `make-symbolic-link'.
+*** 'rename-file', 'copy-file', 'add-name-to-file' and 'make-symbolic-link'.
-The third argument to these functions used to be `t' or `nil'; `t'
+The third argument to these functions used to be 't' or 'nil'; 't'
meaning go ahead even if the specified new file name already has a file,
-and `nil' meaning to get an error.
+and 'nil' meaning to get an error.
Now if the third argument is a number it means to ask the user for
confirmation in this case.
-*** New optional argument to `copy-file'.
+*** New optional argument to 'copy-file'.
-If `copy-file' receives a non-nil fourth argument, it attempts
+If 'copy-file' receives a non-nil fourth argument, it attempts
to give the new copy the same time-of-last-modification that the
original file has.
-*** New function `file-newer-than-file-p'.
+*** New function 'file-newer-than-file-p'.
(file-newer-than-file-p FILE1 FILE2) returns non-nil if FILE1 has been
modified more recently than FILE2. If FILE1 does not exist, the value
@@ -1347,19 +1349,19 @@ is always nil; otherwise, if FILE2 does not exist, the value is t.
This is meant for use when FILE2 depends on FILE1, to see if changes
in FILE1 make it necessary to recompute FILE2 from it.
-*** Changed function `file-exists-p'.
+*** Changed function 'file-exists-p'.
-This function is no longer the same as `file-readable-p'.
-`file-exists-p' can now return t for a file that exists but which
+This function is no longer the same as 'file-readable-p'.
+'file-exists-p' can now return t for a file that exists but which
the fascists won't allow you to read.
-*** New function `file-locked-p'.
+*** New function 'file-locked-p'.
-This function receives a file name as argument and returns `nil'
-if the file is not locked, `t' if locked by this Emacs, or a
+This function receives a file name as argument and returns 'nil'
+if the file is not locked, 't' if locked by this Emacs, or a
string giving the name of the user who has locked it.
-*** New function `file-name-sans-versions'.
+*** New function 'file-name-sans-versions'.
(file-name-sans-versions NAME) returns a substring of NAME, with any
version numbers or other backup suffixes deleted from the end.
@@ -1379,9 +1381,9 @@ directory, but the name of the file that holds that directory is
`du:[rms]foo.dir'.
There are two new functions for converting between directory names
-and file names. `directory-file-name' takes a directory name and
+and file names. 'directory-file-name' takes a directory name and
returns the name of the file in which that directory's data is stored.
-`file-name-as-directory' takes the name of a file and returns
+'file-name-as-directory' takes the name of a file and returns
the corresponding directory name. These always understand Unix file name
syntax; on VMS, they understand VMS syntax as well.
@@ -1390,30 +1392,30 @@ and (directory-file-name "/usr/rms/") returns "/usr/rms".
On VMS, (file-name-as-directory "du:[rms]foo.dir") returns "du:[rms.foo]"
and (directory-file-name "du:[rms.foo]") returns "du:[rms]foo.dir".
-*** Value of `file-attributes' changed.
+*** Value of 'file-attributes' changed.
The function file-attributes returns a list containing many kinds of
information about a file. Now the list has eleven elements.
-The tenth element is `t' if deleting the file and creating another
+The tenth element is 't' if deleting the file and creating another
file of the same name would result in a change in the file's group;
-`nil' if there would be no change. You can also think of this as
+'nil' if there would be no change. You can also think of this as
comparing the file's group with the default group for files created in
the same directory by you.
The eleventh element is the inode number of the file.
-*** VMS-only function `file-name-all-versions'.
+*** VMS-only function 'file-name-all-versions'.
This function returns a list of all the completions, including version
number, of a specified version-number-less file name. This is like
-`file-name-all-completions', except that the latter returns values
+'file-name-all-completions', except that the latter returns values
that do not include version numbers.
-*** VMS-only variable `vms-stmlf-recfm'.
+*** VMS-only variable 'vms-stmlf-recfm'.
On a VMS system, if this variable is non-nil, Emacs will give newly
-created files the record format `stmlf'. This is necessary for files
+created files the record format 'stmlf'. This is necessary for files
that must contain lines of arbitrary length, such as compiled Emacs
Lisp.
@@ -1423,35 +1425,35 @@ no effect.
This variable has no effect on Unix systems.
-*** `insert-file-contents' on an empty file.
+*** 'insert-file-contents' on an empty file.
This no longer sets the buffer's "modified" flag.
-*** New function (VMS only) `define-logical-name':
+*** New function (VMS only) 'define-logical-name':
(define-logical-name LOGICAL TRANSLATION) defines a VMS logical name
LOGICAL whose translation is TRANSLATION. The new name applies to
the current process only.
-*** Deleted variable `ask-about-buffer-names'.
+*** Deleted variable 'ask-about-buffer-names'.
If you want buffer names for files to be generated in a special way,
-you must redefine `create-file-buffer'.
+you must redefine 'create-file-buffer'.
** Subprocess-related changes.
-*** New function `process-list'.
+*** New function 'process-list'.
This function takes no arguments and returns a list of all
of Emacs's asynchronous subprocesses.
-*** New function `process-exit-status'.
+*** New function 'process-exit-status'.
This function, given a process, process name or buffer as argument,
returns the exit status code or signal number of the process.
If the process has not yet exited or died, this function returns 0.
-*** Process output ignores `buffer-read-only'.
+*** Process output ignores 'buffer-read-only'.
Output from a process will go into the process's buffer even if the
buffer is read only.
@@ -1464,57 +1466,57 @@ permanently alter the selected buffer in a straightforward manner.
*** Specifying environment variables for subprocesses.
-When a subprocess is started with `start-process' or `call-process',
-the value of the variable `process-environment' is taken to
+When a subprocess is started with 'start-process' or 'call-process',
+the value of the variable 'process-environment' is taken to
specify the environment variables to give the subprocess. The
value should be a list of strings, each of the form "VAR=VALUE".
-`process-environment' is initialized when Emacs starts up
+'process-environment' is initialized when Emacs starts up
based on Emacs's environment.
-*** New variable `process-connection-type'.
+*** New variable 'process-connection-type'.
-If this variable is `nil', when a subprocess is created, Emacs uses
+If this variable is 'nil', when a subprocess is created, Emacs uses
a pipe rather than a pty to communicate with it. Normally this
-variable is `t', telling Emacs to use a pty if ptys are supported
+variable is 't', telling Emacs to use a pty if ptys are supported
and one is available.
-*** New function `waiting-for-user-input-p'.
+*** New function 'waiting-for-user-input-p'.
-This function, given a subprocess as argument, returns `t' if that
+This function, given a subprocess as argument, returns 't' if that
subprocess appears to be waiting for input sent from Emacs,
-or `nil' otherwise.
+or 'nil' otherwise.
-*** New hook `shell-set-directory-error-hook'.
+*** New hook 'shell-set-directory-error-hook'.
The value of this variable is called, with no arguments, whenever
Shell mode gets an error trying to keep track of directory-setting
-commands (such as `cd' and `pushd') used in the shell buffer.
+commands (such as 'cd' and 'pushd') used in the shell buffer.
-** New functions `user-uid' and `user-real-uid'.
+** New functions 'user-uid' and 'user-real-uid'.
These functions take no arguments and return, respectively,
the effective uid and the real uid of the Emacs process.
The value in each case is an integer.
-** New variable `print-escape-newlines' controls string printing.
+** New variable 'print-escape-newlines' controls string printing.
-If this variable is non-`nil', then when a Lisp string is printed
-by the Lisp printing function `prin1' or `print', newline characters
+If this variable is non-'nil', then when a Lisp string is printed
+by the Lisp printing function 'prin1' or 'print', newline characters
are printed as `\n' rather than as a literal newline.
-** New function `sysnetunam' on HPUX.
+** New function 'sysnetunam' on HPUX.
This function takes two arguments, a network address PATH and a
-login string LOGIN, and executes the system call `netunam'.
-It returns `t' if the call succeeds, otherwise `nil'.
+login string LOGIN, and executes the system call 'netunam'.
+It returns 't' if the call succeeds, otherwise 'nil'.
News regarding installation:
** Many `s-...' file names changed.
Many `s-...' files have been renamed. All periods in such names,
-except the ones just before the final `h', have been changed to
+except the ones just before the final 'h', have been changed to
hyphens. Thus, `s-bsd4.2.h' has been renamed to `s-bsd4-2.h'.
This is so a Unix distribution can be moved mechanically to VMS.
@@ -1533,7 +1535,7 @@ well as functions.
This may make it easier to port to some machines.
-** Macros `XPNTR' and `XSETPNTR'; flag `DATA_SEG_BITS'.
+** Macros 'XPNTR' and 'XSETPNTR'; flag `DATA_SEG_BITS'.
These macros exclusively are used to unpack a pointer from a Lisp_Object
and to insert a pointer into a Lisp_Object. Redefining them may help
@@ -1557,7 +1559,7 @@ for more information.
** `SYSTEM_MALLOC' prevents use of GNU `malloc.c'.
-SYSTEM_MALLOC, if defined, means use the system's own `malloc' routines
+SYSTEM_MALLOC, if defined, means use the system's own 'malloc' routines
rather than those that come with Emacs.
Use this only if absolutely necessary, because if it is used you do
@@ -1580,23 +1582,23 @@ These flags just say whether certain system calls are available.
** New macros control compiler switches, linker switches and libraries.
The m- and s- files can now control in a modular fashion the precise
-arguments passed to `cc' and `ld'.
+arguments passed to 'cc' and 'ld'.
-LIBS_STANDARD defines the standard C libraries. Default is `-lc'.
-LIBS_DEBUG defines the extra libraries to use when debugging. Default `-lg'.
+LIBS_STANDARD defines the standard C libraries. Default is '-lc'.
+LIBS_DEBUG defines the extra libraries to use when debugging. Default '-lg'.
LIBS_SYSTEM can be defined by the s- file to specify extra libraries.
LIBS_MACHINE can be defined by the m- file to specify extra libraries.
LIBS_TERMCAP defines the libraries for Termcap or Terminfo.
It is defined by default in a complicated fashion but the m- or s- file
can override it.
-LD_SWITCH_SYSTEM can be defined by the s- file to specify extra `ld' switches.
- The default is `-X' on BSD systems except those few that use COFF object files.
-LD_SWITCH_MACHINE can be defined by the m- file to specify extra `ld' switches.
+LD_SWITCH_SYSTEM can be defined by the s- file to specify extra 'ld' switches.
+ The default is '-X' on BSD systems except those few that use COFF object files.
+LD_SWITCH_MACHINE can be defined by the m- file to specify extra 'ld' switches.
-C_DEBUG_SWITCH defines the switches to give `cc' when debugging. Default `-g'.
-C_OPTIMIZE_SWITCH defines the switches to give `cc' to optimize. Default `-O'.
-C_SWITCH_MACHINE can be defined by the m- file to specify extra `cc' switches.
+C_DEBUG_SWITCH defines the switches to give 'cc' when debugging. Default '-g'.
+C_OPTIMIZE_SWITCH defines the switches to give 'cc' to optimize. Default '-O'.
+C_SWITCH_MACHINE can be defined by the m- file to specify extra 'cc' switches.
diff --git a/etc/NEWS.19 b/etc/NEWS.19
index 7eb4deaeba5..d21cd8187f1 100644
--- a/etc/NEWS.19
+++ b/etc/NEWS.19
@@ -17,8 +17,8 @@ This file is about changes in Emacs versions 19.
** Bibtex mode no longer turns on Auto Fill automatically. (No major
mode should do that--it is the user's choice.)
-** The variable normal-auto-fill-function specifies the function to
-use for auto-fill-function, if and when Auto Fill is turned on.
+** The variable 'normal-auto-fill-function' specifies the function to
+use for 'auto-fill-function', if and when Auto Fill is turned on.
Major modes can set this locally to alter how Auto Fill works.
@@ -53,7 +53,7 @@ This feature is not enabled by default; since the Alt key is also the
Meta key, it is too easy and painful to activate this feature by
accident.
-** The command apply-macro-to-region-lines repeats the last defined
+** The command 'apply-macro-to-region-lines' repeats the last defined
keyboard macro once for each complete line within the current region.
It does this line by line, by moving point to the beginning of that
line and then executing the macro.
@@ -71,13 +71,13 @@ characters.
Font Lock can be configured to use Fast Lock mode and Lazy Lock mode (see
below) in a flexible way. Rather than adding the appropriate function to the
-hook font-lock-mode-hook, you can use the new variable font-lock-support-mode
+hook font-lock-mode-hook, you can use the new variable 'font-lock-support-mode'
to control which modes have Fast Lock mode or Lazy Lock mode turned on when
Font Lock mode is enabled.
For example, to use Fast Lock mode when Font Lock mode is turned on, put:
- (setq font-lock-support-mode 'fast-lock-mode)
+ (setq font-lock-support-mode 'fast-lock-mode)
in your ~/.emacs.
@@ -93,9 +93,9 @@ Emacs has been idle for a given amount of time.
To use this package, put in your ~/.emacs:
- (setq font-lock-support-mode 'lazy-lock-mode)
+ (setq font-lock-support-mode 'lazy-lock-mode)
-To control the package behavior, see the documentation for `lazy-lock-mode'.
+To control the package behavior, see the documentation for 'lazy-lock-mode'.
** Changes in BibTeX mode.
@@ -142,7 +142,7 @@ referred.
*** An nn-like pick-and-read minor mode is available for the summary
buffers.
- (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
+ (add-hook 'gnus-summary-mode-hook #'gnus-pick-mode)
*** In binary groups you can use a special binary minor mode:
@@ -150,7 +150,7 @@ buffers.
*** Groups can be grouped in a folding topic hierarchy.
- (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
+ (add-hook 'gnus-group-mode-hook #'gnus-topic-mode)
*** Gnus can re-send and bounce mail.
@@ -159,7 +159,7 @@ buffers.
*** Groups can now have a score, and bubbling based on entry frequency
is possible.
- (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
+ (add-hook 'gnus-summary-exit-hook #'gnus-summary-bubble-group)
*** Groups can be process-marked, and commands can be performed on
groups of groups.
@@ -175,7 +175,7 @@ batches, ClariNet briefs collections, and just about everything else.
*** Groups can be sorted according to many criteria.
- For instance: (setq gnus-group-sort-function 'gnus-group-sort-by-rank)
+ For instance: (setq gnus-group-sort-function #'gnus-group-sort-by-rank)
*** New group parameters have been introduced to set list-address and
expiration times.
@@ -196,17 +196,17 @@ articles with the `*' command.
*** Article headers can be buttonized.
- (add-hook 'gnus-article-display-hook 'gnus-article-add-buttons-to-head)
+ (add-hook 'gnus-article-display-hook #'gnus-article-add-buttons-to-head)
*** All mail backends support fetching articles by Message-ID.
*** Duplicate mail can now be treated properly. See the
-`nnmail-treat-duplicates' variable.
+'nnmail-treat-duplicates' variable.
*** All summary mode commands are available directly from the article
buffer.
-*** Frames can be part of `gnus-buffer-configuration'.
+*** Frames can be part of 'gnus-buffer-configuration'.
*** Mail can be re-scanned by a daemonic process.
@@ -235,7 +235,7 @@ refetching.
*** A clean copy of the current article is always stored in a separate
buffer to allow easier treatment.
-*** Gnus can suggest where to save articles. See `gnus-split-methods'.
+*** Gnus can suggest where to save articles. See 'gnus-split-methods'.
*** Gnus doesn't have to do as much prompting when saving.
@@ -255,7 +255,7 @@ cited text to hide is now customizable.
*** Boring headers can be hidden.
- (add-hook 'gnus-article-display-hook 'gnus-article-hide-boring-headers)
+ (add-hook 'gnus-article-display-hook #'gnus-article-hide-boring-headers)
*** Default scoring values can now be set from the menu bar.
@@ -275,10 +275,10 @@ exists.
** The variable print-length applies to printing vectors and bitvectors,
as well as lists.
-** The new function keymap-parent returns the parent keymap
+** The new function 'keymap-parent' returns the parent keymap
of a given keymap.
-** The new function set-keymap-parent specifies a new parent for a
+** The new function 'set-keymap-parent' specifies a new parent for a
given keymap. The arguments are KEYMAP and PARENT. PARENT must be a
keymap or nil.
@@ -357,17 +357,17 @@ This command, not previously mentioned in NEWS, toggles a mode in
which the minibuffer window expands to show as many lines as the
minibuffer contains.
-** `title' frame parameter and resource.
+** 'title' frame parameter and resource.
-The `title' X resource now specifies just the frame title, nothing else.
+The 'title' X resource now specifies just the frame title, nothing else.
It does not affect the name used for looking up other X resources.
-It works by setting the new `title' frame parameter, which likewise
+It works by setting the new 'title' frame parameter, which likewise
affects just the displayed title of the frame.
-The `name' parameter continues to do what it used to do:
+The 'name' parameter continues to do what it used to do:
it specifies the frame name for looking up X resources,
and also serves as the default for the displayed title
-when the `title' parameter is unspecified or nil.
+when the 'title' parameter is unspecified or nil.
** Emacs now uses the X toolkit by default, if you have a new
enough version of X installed (X11R5 or newer).
@@ -406,7 +406,7 @@ Emacs or the operating system crashes, the file remains for M-x
recover-session.
You can turn off the writing of these files by setting
-auto-save-list-file-name to nil. If you do this, M-x recover-session
+'auto-save-list-file-name' to nil. If you do this, M-x recover-session
will not work.
Some previous Emacs versions failed to delete these files even on
@@ -417,13 +417,13 @@ now that the bug is fixed.
** Changes to Version Control (VC)
-There is a new variable, vc-follow-symlinks. It indicates what to do
+There is a new variable, 'vc-follow-symlinks'. It indicates what to do
when you visit a link to a file that is under version control.
Editing the file through the link bypasses the version control system,
which is dangerous and probably not what you want.
If this variable is t, VC follows the link and visits the real file,
-telling you about it in the echo area. If it is `ask' (the default),
+telling you about it in the echo area. If it is 'ask' (the default),
VC asks for confirmation whether it should follow the link. If nil,
the link is visited and a warning displayed.
@@ -449,27 +449,27 @@ Completion in fields that hold mail addresses works based on the list
of local users plus your aliases. Additionally, if your site provides
a mail directory or a specific host to use for any unrecognized user
name, you can arrange to query that host for completion also. (See the
-documentation of variables `mail-directory-process' and
-`mail-directory-stream'.)
+documentation of variables 'mail-directory-process' and
+'mail-directory-stream'.)
-** A greatly extended sgml-mode offers new features such as (to be configured)
+** A greatly extended 'sgml-mode' offers new features such as (to be configured)
skeletons with completing read for tags and attributes, typing named
characters including optionally all 8bit characters, making tags invisible
with optional alternate display text, skipping and deleting tag(pair)s.
Note: since Emacs' syntax feature cannot limit the special meaning of ', " and
- to inside <>, for some texts the result, especially of font locking, may be
-wrong (see `sgml-specials' if you get wrong results).
+wrong (see 'sgml-specials' if you get wrong results).
-The derived html-mode configures this with tags and attributes more or
+The derived 'html-mode' configures this with tags and attributes more or
less HTML3ish. It also offers optional quick keys like C-c 1 for
-headline or C-c u for unordered list (see `html-quick-keys'). Edit /
+headline or C-c u for unordered list (see 'html-quick-keys'). Edit /
Text Properties / Face or M-g combinations create tags as applicable.
Outline minor mode is supported and level 1 font-locking tries to
fontify tag contents (which only works when they fit on one line, due
to a limitation in font-lock).
-External viewing via browse-url can occur automatically upon saving.
+External viewing via 'browse-url' can occur automatically upon saving.
** M-x imenu-add-to-menubar now adds to the menu bar for the current
buffer only. If you want to put an Imenu item in the menu bar for all
@@ -494,7 +494,7 @@ isn't in sorted order, so you should finish each entry with C-c C-c
(bibtex-close-entry) after you have inserted or modified it.
The default value of bibtex-maintain-sorted-entries is nil.
-*** Function `show-all' is no longer bound to a key, since C-u C-c C-q
+*** Function 'show-all' is no longer bound to a key, since C-u C-c C-q
does the same job.
*** Entries with quotes inside quote-delimited fields (as `author =
@@ -509,13 +509,13 @@ text.
Font Lock mode can be turned on globally, in buffers that support it, by the
new command global-font-lock-mode. You can use the new variable
-font-lock-global-modes to control which modes have Font Lock mode automagically
-turned on. By default, this variable is set so that Font Lock mode is turned
-on globally where the buffer mode supports it.
+'font-lock-global-modes' to control which modes have Font Lock mode
+automagically turned on. By default, this variable is set so that
+Font Lock mode is turned on globally where the buffer mode supports it.
For example, to automagically turn on Font Lock mode where supported, put:
- (global-font-lock-mode t)
+ (global-font-lock-mode t)
in your ~/.emacs.
@@ -524,10 +524,10 @@ in your ~/.emacs.
In Font Lock mode, editing a line automatically refontifies that line only.
However, if your change alters the syntactic context for following lines,
those lines remain incorrectly fontified. To refontify them, use the new
-command M-g M-g (font-lock-fontify-block).
+command M-g M-g ('font-lock-fontify-block').
In certain major modes, M-g M-g refontifies the entire current function.
-(The variable font-lock-mark-block-function controls how to find the
+(The variable 'font-lock-mark-block-function' controls how to find the
current function.) In other major modes, M-g M-g refontifies 16 lines
above and below point.
@@ -535,7 +535,7 @@ With a prefix argument N, M-g M-g refontifies N lines above and below point.
** Follow mode
-Follow mode is a new minor mode combining windows showing the same
+'follow-mode' is a new minor mode combining windows showing the same
buffer into one tall "virtual window". The windows are typically two
side-by-side windows. Follow mode makes them scroll together as if
they were a unit. To use it, go to a frame with just one window,
@@ -554,7 +554,7 @@ to hs-hide-hook and hs-show-hook, to follow the convention for
normal hooks.
** Simula mode now has a menu containing the most important commands.
-The new command simula-indent-exp is bound to C-M-q.
+The new command 'simula-indent-exp' is bound to C-M-q.
** etags can now handle programs written in Erlang. Files are
recognized by the extensions .erl and .hrl. The tagged lines are
@@ -577,23 +577,23 @@ pressing both mouse buttons.
restricted functionality on MS-DOS, now work. The most important ones
are:
-**** Printing (both with `M-x lpr-buffer' and with `ps-print' package)
+**** Printing (both with `M-x lpr-buffer' and with 'ps-print' package)
now works.
-**** `Ediff' works (in a single-frame mode).
+**** 'Ediff' works (in a single-frame mode).
**** `M-x display-time' can be used on MS-DOS (due to the new
implementation of Emacs timers, see below).
-**** `Dired' supports Unix-style shell wildcards.
+**** 'Dired' supports Unix-style shell wildcards.
-**** The `c-macro-expand' command now works as on other platforms.
+**** The 'c-macro-expand' command now works as on other platforms.
**** `M-x recover-session' works.
**** `M-x list-colors-display' displays all the available colors.
-**** The `TPU-EDT' package works.
+**** The 'TPU-EDT' package works.
* Lisp changes in Emacs 19.31.
@@ -606,17 +606,17 @@ behavior, and invoking it with any other value deactivates it.
** Change in system-type and system-configuration values.
-The value of system-type on a Linux-based GNU system is now `lignux',
-not `linux'. This means that some programs which use `system-type'
-need to be changed. The value of `system-configuration' will also
+The value of system-type on a Linux-based GNU system is now 'lignux',
+not 'linux'. This means that some programs which use 'system-type'
+need to be changed. The value of 'system-configuration' will also
be different.
-It is generally recommended to use `system-configuration' rather
-than `system-type'.
+It is generally recommended to use 'system-configuration' rather
+than 'system-type'.
See <https://www.gnu.org/gnu/linux-and-gnu.html> for more about this.
-** The functions shell-command and dired-call-process
+** The functions 'shell-command' and 'dired-call-process'
now run file name handlers for default-directory, if it has them.
** Undoing the deletion of text now restores the positions of markers
@@ -626,7 +626,7 @@ that pointed into or next to the deleted text.
no longer use a separate process. Therefore, they now work more
reliably and can be used for shorter time delays.
-The new function run-with-timer is a convenient way to set up a timer
+The new function 'run-with-timer' is a convenient way to set up a timer
to run a specified amount of time after the present. A call looks
like this:
@@ -687,13 +687,13 @@ asks the question PROMPT (just like y-or-n-p). If the user answers
within SECONDS seconds, it returns the answer that the user gave.
Otherwise it gives up after SECONDS seconds, and returns DEFAULT-VALUE.
-** Minor change to `encode-time': you can now pass more than seven
+** Minor change to 'encode-time': you can now pass more than seven
arguments. If you do that, the first six arguments have the usual
meaning, the last argument is interpreted as the time zone, and the
arguments in between are ignored.
-This means that it works to use the list returned by `decode-time' as
-the list of arguments for `encode-time'.
+This means that it works to use the list returned by 'decode-time' as
+the list of arguments for 'encode-time'.
** The default value of load-path now includes the directory
/usr/local/share/emacs/VERSION/site-lisp In addition to
@@ -717,9 +717,9 @@ convert-standard-filename to convert the file name to a proper form
for each operating system. Here is an example of use, from the file
completions.el:
-(defvar save-completions-file-name
- (convert-standard-filename "~/.completions")
- "*The filename to save completions to.")
+ (defvar save-completions-file-name
+ (convert-standard-filename "~/.completions")
+ "*The filename to save completions to.")
This sets the variable save-completions-file-name to a value that
depends on the operating system, because the definition of
@@ -734,11 +734,11 @@ minibuffer if there is no prefix argument at all.)
** When a process is deleted, this no longer disconnects the process
marker from its buffer position.
-** The variable garbage-collection-messages now controls whether
+** The variable 'garbage-collection-messages' now controls whether
Emacs displays a message at the beginning and end of garbage collection.
The default is nil, meaning there are no messages.
-** The variable debug-ignored-errors specifies certain kinds of errors
+** The variable 'debug-ignored-errors' specifies certain kinds of errors
that should not enter the debugger. Its value is a list of error
condition symbols and/or regular expressions. If the error has any
of the condition symbols listed, or if any of the regular expressions
@@ -748,27 +748,28 @@ regardless of the value of debug-on-error.
This variable is initialized to match certain common but uninteresting
errors that happen often during editing.
-** The new function error-message-string converts an error datum
+** The new function 'error-message-string' converts an error datum
into its error message. The error datum is what condition-case
puts into the variable, to describe the error that happened.
** Anything that changes which buffer appears in a given window
now runs the window-scroll-functions for that window.
-** The new function get-buffer-window-list returns a list of windows displaying
-a buffer. The function is called with the buffer (a buffer object or a buffer
-name) and two optional arguments specifying the minibuffer windows and frames
-to search. Therefore this function takes optional args like next-window etc.,
-and not get-buffer-window.
+** The new function 'get-buffer-window-list' returns a list of windows
+displaying a buffer. The function is called with the buffer (a buffer
+object or a buffer name) and two optional arguments specifying the
+minibuffer windows and frames to search.
+Therefore this function takes optional args like 'next-window' etc.,
+and not 'get-buffer-window'.
-** buffer-substring now runs the hook buffer-access-fontify-functions,
+** 'buffer-substring' now runs the hook 'buffer-access-fontify-functions',
calling each function with two arguments--the range of the buffer
-being accessed. buffer-substring-no-properties does not call them.
+being accessed. 'buffer-substring-no-properties' does not call them.
If you use this feature, you should set the variable
-buffer-access-fontified-property to a non-nil symbol, which is a
+'buffer-access-fontified-property' to a non-nil symbol, which is a
property name. Then, if all the characters in the buffer range have a
-non-nil value for that property, the buffer-access-fontify-functions
+non-nil value for that property, the 'buffer-access-fontify-functions'
are not called. When called, these functions should put a non-nil
property on the text that they fontify, so that they won't get called
over and over for the same text.
@@ -776,7 +777,7 @@ over and over for the same text.
** Changes in lisp-mnt.el
*** The lisp-mnt package can now recognize file headers that are written
-in the formats used by the `what' command and the RCS `ident' command:
+in the formats used by the 'what' command and the RCS 'ident' command:
;; @(#) HEADER: text
;; $HEADER: text $
@@ -813,12 +814,13 @@ when narrowing is in effect.
** If you type a M-x command that has an equivalent key binding,
the equivalent is shown in the minibuffer before the command executes.
This feature is enabled by default for the sake of beginning users.
-You can turn the feature off by setting suggest-key-bindings to nil.
+You can turn the feature off by setting 'suggest-key-bindings' to nil.
** The menu bar is now visible on text-only terminals. To choose a
command from the menu bar when you have no mouse, type M-`
-(Meta-Backquote) or F10. To turn off menu bar display,
-do (menu-bar-mode -1).
+(Meta-Backquote) or F10. To turn off menu bar display, do:
+
+ (menu-bar-mode -1).
** Whenever you invoke a minibuffer, it appears in the minibuffer
window that the current frame uses.
@@ -848,7 +850,7 @@ Use M-x xterm-mouse-mode to let emacs take control over the mouse.
*** C-mouse-1 now once again provides a menu of buffers to select.
S-mouse-1 is now the way to select a default font for the frame.
-*** There is a new mouse-scroll-min-lines variable to control the
+*** There is a new 'mouse-scroll-min-lines' variable to control the
minimum number of lines scrolled by dragging the mouse outside a
window's edge.
@@ -869,11 +871,11 @@ you have already seen.
** Filling changes.
-*** If the variable colon-double-space is non-nil, the explicit fill
+*** If the variable 'colon-double-space' is non-nil, the explicit fill
commands put two spaces after a colon.
*** Auto-Fill mode now supports Adaptive Fill mode just as the
-explicit fill commands do. The variable adaptive-fill-regexp
+explicit fill commands do. The variable 'adaptive-fill-regexp'
specifies a regular expression to match text at the beginning of
a line that should be the fill prefix.
@@ -885,14 +887,14 @@ paragraph because they are indented. This indentation shouldn't
be copied to additional lines.
Whether indented lines are paragraph lines depends on the value of the
-variable paragraph-start. Some major modes set this; you can set it
+variable 'paragraph-start'. Some major modes set this; you can set it
by hand or in mode hooks as well. For editing text in which paragraph
first lines are not indented, and which contains paragraphs in which
all lines are indented, you should use Indented Text mode or arrange
for paragraph-start not to match these lines.
*** You can specify more complex ways of choosing a fill prefix
-automatically by setting `adaptive-fill-function'. This function
+automatically by setting 'adaptive-fill-function'. This function
is called with point after the left margin of a line, and it should
return the appropriate fill prefix based on that line.
If it returns nil, that means it sees no fill prefix in that line.
@@ -910,7 +912,7 @@ fail, though.
functions have changed names.
**** The summary mode gnus-uu commands have been moved from the `C-c
-C-v' keymap to the `X' keymap.
+C-v' keymap to the 'X' keymap.
**** There can now be several summary buffers active at once.
Variables that are relevant to each summary buffer are buffer-local to
@@ -920,7 +922,7 @@ that buffer.
highlighting based not only on what's visible in the buffer, but on
other data structures.
-**** Old packages like `expire-kill' will no longer work.
+**** Old packages like 'expire-kill' will no longer work.
**** `C-c C-l' in the group buffer no longer switches to a different
buffer, but instead lists killed groups in the group buffer.
@@ -987,8 +989,8 @@ to the servers.
*** General changes (all backends).
VC directory listings (C-x v d) are now kept up to date when you do a
-vc-next-action (C-x v v) on the marked files. The `g' command updates
-the buffer properly. `=' in a VC dired buffer produces a version
+vc-next-action (C-x v v) on the marked files. The 'g' command updates
+the buffer properly. '=' in a VC dired buffer produces a version
control diff, not an ordinary diff.
*** CVS changes.
@@ -1033,14 +1035,14 @@ locking for a file, use the "rcs -U" command.
If you share RCS subdirs with other users (through symbolic links),
and you always want to work on the latest version, set
-vc-consult-headers to nil and vc-mistrust-permissions to `t'.
+vc-consult-headers to nil and vc-mistrust-permissions to 't'.
Then you see the state of the *latest* version on the mode line, not
that of your working file. When you do a check out, VC overwrites
your working file with the latest version from the master.
*** RCS customization.
-There is a new variable vc-consult-headers. If it is t (the default),
+There is a new variable 'vc-consult-headers'. If it is t (the default),
VC searches for RCS headers in working files (like `$Id$') and
determines the state of the file from them, not from the master file.
This is fast and more reliable when you use branches. (The variable
@@ -1065,7 +1067,7 @@ Here are the commands for converting to and from these calendars:
Calendar mode now has commands to produce fancy printed calendars via
LaTeX. You can ask for a calendar for one or more days, weeks, months
-or years. The commands all start with `t'; see the manual for a list
+or years. The commands all start with 't'; see the manual for a list
of them.
*** New sexp diary entry type
@@ -1094,12 +1096,12 @@ you can do
to turn the mode on.
-** The new pc-select package emulates the key bindings for cutting and
+** The new 'pc-select' package emulates the key bindings for cutting and
pasting, and selection of regions, found in Windows, Motif, and the
Macintosh.
-** Help buffers now use a special major mode, Help mode. This mode
-normally turns on View mode; it also provides a hook, help-mode-hook,
+** Help buffers now use a special major mode, 'help-mode'. This mode
+normally turns on View mode; it also provides a hook, 'help-mode-hook',
which you can use for other customization.
** Apropos now uses faces for enhanced legibility. It now describes
@@ -1114,7 +1116,7 @@ function definition, variable, or property.
For example, to automatically turn on Font Lock mode in the *Help*
buffer, put:
- (add-hook 'help-mode-hook 'turn-on-font-lock)
+ (add-hook 'help-mode-hook #'turn-on-font-lock)
in your ~/.emacs.
@@ -1129,13 +1131,13 @@ before resuming with the keyword item of which it is part.
For example, a typical keyword item might be:
- ("\\<anchor\\>" (0 anchor-face))
+ ("\\<anchor\\>" (0 anchor-face))
which fontifies each occurrence of the discrete word "anchor" in the value of
the variable anchor-face. However, the highlighting information can be used to
fontify text that is anchored to the word "anchor". For example:
- ("\\<anchor\\>" (0 anchor-face) ("\\=[ ,]*\\(item\\)" nil nil (1 item-face)))
+ ("\\<anchor\\>" (0 anchor-face) ("\\=[ ,]*\\(item\\)" nil nil (1 item-face)))
which fontifies each occurrence of "anchor" as above, but for each occurrence
of "anchor", each occurrence of "item", in any following comma separated list,
@@ -1163,7 +1165,7 @@ These variables can now specify values for individual modes, by supplying
lists of mode names and values. For example, to use the above mentioned level
3 decoration for buffers in C/C++ modes, and default decoration otherwise, put:
- (setq font-lock-maximum-decoration '((c-mode . 3) (c++-mode . 3)))
+ (setq font-lock-maximum-decoration '((c-mode . 3) (c++-mode . 3)))
in your ~/.emacs. Maximum buffer size values for individual modes are
specified in the same way with the variable font-lock-maximum-size.
@@ -1171,15 +1173,16 @@ specified in the same way with the variable font-lock-maximum-size.
*** Font Lock configuration
The mechanism to provide default settings for Font Lock mode are the variables
-font-lock-defaults and font-lock-maximum-decoration. Typically, you should
+'font-lock-defaults' and 'font-lock-maximum-decoration'. Typically, you should
only need to change the value of font-lock-maximum-decoration. However, to
support Font Lock mode for buffers in modes that currently do not support Font
Lock mode, you should set a buffer local value of font-lock-defaults for that
mode, typically via its mode hook.
These variables are used by Font Lock mode to set the values of the variables
-font-lock-keywords, font-lock-keywords-only, font-lock-syntax-table,
-font-lock-beginning-of-syntax-function and font-lock-keywords-case-fold-search.
+'font-lock-keywords', 'font-lock-keywords-only', 'font-lock-syntax-table',
+'font-lock-beginning-of-syntax-function'
+and 'font-lock-keywords-case-fold-search'.
You need not set these variables directly, and should not set them yourself
since the underlining mechanism may change in future.
@@ -1188,13 +1191,16 @@ since the underlining mechanism may change in future.
archive files (files whose names end with .arc, .lzh, .zip, and .zoo).
** You can automatically update the years in copyright notice by
-means of (add-hook 'write-file-hooks 'copyright-update).
+means of
+
+ (add-hook 'write-file-hooks #'copyright-update).
+
Optionally it can update the GPL version as well.
** Scripts of various languages (Shell, AWK, Perl, makefiles ...) can
be automatically provided with a magic number and be made executable
by their respective modes under control of various user variables.
-The mode must call (executable-set-magic "perl") or
+The mode must call 'executable-set-magic', such as
(executable-set-magic "make" "-f"). The latter for example has no
effect on [Mm]akefile.
@@ -1202,15 +1208,15 @@ effect on [Mm]akefile.
command C-c ! executes the region, and optionally beginning of script
as well, by passing them to the shell.
-Cases such as `sh' being a `bash' are now accounted for.
+Cases such as 'sh' being a 'bash' are now accounted for.
Fontification now also does variables, the magic number and all
-builtin commands. Shell script mode no longer mingles `tab-width' and
-indentation style. The variable `sh-tab-width' has been renamed to
-`sh-indentation'. Empty lines are now indented like previous
+builtin commands. Shell script mode no longer mingles 'tab-width' and
+indentation style. The variable 'sh-tab-width' has been renamed to
+'sh-indentation'. Empty lines are now indented like previous
non-empty line, rather than just previous line.
The annoying $ variable prompting has been eliminated. Instead, shell
-script mode uses `comint-dynamic-completion' for commands, variables
+script mode uses 'comint-dynamic-completion' for commands, variables
and filenames.
** Two-column mode now automatically scrolls both buffers together,
@@ -1229,7 +1235,7 @@ element < no longer exists, ' is a new element.
** The autoinsert insert facility for prefilling empty files as soon
as they are found has been extended to accommodate skeletons or calling
-functions. See the function auto-insert.
+functions. See the function 'auto-insert'.
** TPU-edt Changes
@@ -1290,7 +1296,7 @@ from the command line.
** etags has now the ability to tag Perl files. They are recognized
either by the .pm and .pl suffixes or by a first line which starts
with `#!' and specifies a Perl interpreter. The tagged lines are
-those beginning with the `sub' keyword.
+those beginning with the 'sub' keyword.
New suffixes recognized are .hpp for C++; .f90 for Fortran; .bib,
.ltx, .TeX for TeX (.bbl, .dtx removed); .ml for Lisp; .prolog for
@@ -1322,25 +1328,25 @@ character table. It can be any of these values:
keyboard-translate-table
case-table
-The function `char-table-subtype' returns the subtype of a char-table.
+The function 'char-table-subtype' returns the subtype of a char-table.
You cannot alter the subtype of an existing char-table.
A char-table has an element for each character code. It also has some
"extra slots". The number of extra slots depends on the subtype and
their use depends on the subtype. (Each subtype symbol has a
-`char-table-extra-slots' property that says how many extra slots to
-make.) Use (char-table-extra-slot TABLE N) to access extra slot N and
-(set-char-table-extra-slot TABLE N VALUE) to store VALUE in slot N.
+'char-table-extra-slots' property that says how many extra slots to
+make.) Use 'char-table-extra-slot' to access extra slots and
+'set-char-table-extra-slot' to store a value in a slot.
A char-table T can have a parent, which should be another char-table
P. If you look for the value in T for character C, and the table T
actually holds nil, P's element for character C is used instead.
-The functions `char-table-parent' and `set-char-table-parent'
+The functions 'char-table-parent' and 'set-char-table-parent'
let you read or set the parent of a char-table.
To scan all the values in a char-table, do not try to loop through all
possible character codes. That would work for now, but will not work
-in the future. Instead, call map-char-table. (map-char-table
+in the future. Instead, call 'map-char-table'. (map-char-table
FUNCTION TABLE) calls FUNCTION once for each character or character
set that has a distinct value in TABLE. FUNCTION gets two arguments,
RANGE and VALUE. RANGE specifies a range of TABLE that has one
@@ -1349,23 +1355,23 @@ uniform value, and VALUE is the value in TABLE for that range.
Currently, RANGE is always a vector containing a single character
and it refers to that character alone. In the future, other kinds
of ranges will occur. You can set the value for a given range
-with (set-char-table-range TABLE RANGE VALUE) and examine the value
-for a range with (char-table-range TABLE RANGE).
+with 'set-char-table-range' and examine the value
+for a range with 'char-table-range'.
*** Syntax tables are now represented as char-tables.
All syntax tables other than the standard syntax table
normally have the standard syntax table as their parent.
-Their subtype is `syntax-table'.
+Their subtype is 'syntax-table'.
*** Display tables are now represented as char-tables.
-Their subtype is `display-table'.
+Their subtype is 'display-table'.
*** Case tables are now represented as char-tables.
-Their subtype is `case-table'.
+Their subtype is 'case-table'.
*** The value of keyboard-translate-table may now be a char-table
instead of a string. Normally the char-tables used for this purpose
-have the subtype `keyboard-translate-table', but that is not required.
+have the subtype 'keyboard-translate-table', but that is not required.
*** A new data type called a bool-vector is a vector of values
that are either t or nil. To create one, do
@@ -1375,25 +1381,25 @@ that are either t or nil. To create one, do
text is inserted at the place where the marker points. This is called
the "insertion type" of the marker.
-To set the insertion type, do (set-marker-insertion-type MARKER TYPE).
+To set the insertion type, use 'set-marker-insertion-type'.
If TYPE is t, it means the marker advances when text is inserted. If
TYPE is nil, it means the marker does not advance. (In Emacs 19.29,
markers did not advance.)
-The function marker-insertion-type reports the insertion type of a
-given marker. The function copy-marker takes a second argument TYPE
+The function 'marker-insertion-type' reports the insertion type of a
+given marker. The function 'copy-marker' takes a second argument TYPE
which specifies the insertion type of the new copied marker.
** When you create an overlay, you can specify the insertion type of
the beginning and of the end. To do this, you can use two new
-arguments to make-overlay: front-advance and rear-advance.
+arguments to 'make-overlay': front-advance and rear-advance.
-** The new function overlays-in returns a list of the overlays that
+** The new function 'overlays-in' returns a list of the overlays that
overlap a specified range of the buffer. The returned list includes
empty overlays at the beginning of this range, as well as within the
range.
-** The new hook window-scroll-functions is run when a window has been
+** The new hook 'window-scroll-functions' is run when a window has been
scrolled. The functions in this list are called just before
redisplay, after the new window-start has been computed. Each function
is called with two arguments--the window that has been scrolled, and its
@@ -1402,7 +1408,7 @@ new window-start position.
This hook is useful for on-the-fly fontification and other features
that affect how the redisplayed text will look when it is displayed.
-The window-end value of the window is not valid when these functions
+The 'window-end' value of the window is not valid when these functions
are called. The computation of window-end is byproduct of actual
redisplay of the window contents, which means it has not yet happened
when the hook is run. Computing window-end specially in advance for
@@ -1411,21 +1417,21 @@ the sake of these functions would cause a slowdown.
The hook functions can determine where the text on the window will end
by calling vertical-motion starting with the window-start position.
-** The new hook redisplay-end-trigger-functions is run whenever
+** The new hook 'redisplay-end-trigger-functions' is run whenever
redisplay in window uses text that extends past a specified end
trigger position. You set the end trigger position with the function
-set-window-redisplay-end-trigger. The functions are called with two
+'set-window-redisplay-end-trigger'. The functions are called with two
arguments: the window, and the end trigger position. Storing nil for
the end trigger position turns off the feature, and the trigger value
is automatically reset to nil just after the hook is run.
-You can use the function window-redisplay-end-trigger to read a
+You can use the function 'window-redisplay-end-trigger' to read a
window's current end trigger value.
-** The new function insert-file-contents-literally inserts the
+** The new function 'insert-file-contents-literally' inserts the
contents of a file without any character set translation or decoding.
-** The new function safe-length computes the length of a list.
+** The new function 'safe-length' computes the length of a list.
It never gets an error--it treats any non-list like nil.
If given a circular list, it returns an upper bound for the number
of elements before the circularity.
@@ -1436,19 +1442,19 @@ regexp that was matched, not the entire match. For example, after
matching `foo \(ba*r\)' calling replace-match with 1 as SUBEXP means
to replace just the text that matched `\(ba*r\)'.
-** The new keymap special-event-map defines bindings for certain
+** The new keymap 'special-event-map' defines bindings for certain
events that should be handled at a very low level--as soon as they
-are read. The read-event function processes these events itself,
+are read. The 'read-event' function processes these events itself,
and never returns them.
Events that are handled in this way do not echo, they are never
grouped into key sequences, and they never appear in the value of
-last-command-event or (this-command-keys). They do not discard a
-numeric argument, they cannot be unread with unread-command-events,
+'last-command-event' or (this-command-keys). They do not discard a
+numeric argument, they cannot be unread with 'unread-command-events',
they may not appear in a keyboard macro, and they are not recorded
in a keyboard macro while you are defining one.
-These events do, however, appear in last-input-event immediately after
+These events do, however, appear in 'last-input-event' immediately after
they are read, and this is the way for the event's definition to find
the actual event.
@@ -1460,7 +1466,7 @@ out-of-range values for its SEC, MINUTE, HOUR, DAY, and MONTH
arguments; for example, day 0 means the day preceding the given month.
Also, the ZONE argument can now be a TZ-style string.
-** command-execute and call-interactively now accept an optional third
+** 'command-execute' and 'call-interactively' now accept an optional third
argument KEYS. If specified and non-nil, this specifies the key
sequence containing the events that were used to invoke the command.
@@ -1542,7 +1548,7 @@ contain items that were formerly in the Files and Edit menus, as well
as some that did not exist in the menu bar menus before.
** Emacs can now display on more than one X display at the same time.
-Use the command make-frame-on-display to create a frame, specifying
+Use the command 'make-frame-on-display' to create a frame, specifying
which display to use.
** M-x talk-connect sets up a multi-user talk connection
@@ -1559,7 +1565,7 @@ This means the maximum size of a buffer is at least 2**27-1,
or 134,217,727.
** When you start Emacs, you can now specify option names in
-long GNU form (starting with `--') and you can abbreviate the names.
+long GNU form (starting with '--') and you can abbreviate the names.
You can now specify the options in any order.
The previous requirements about the order of options
@@ -1574,7 +1580,7 @@ active, now leaves the mark active and does not change its position.
You can make incremental search deactivate the mark once again with
this expression.
- (add-hook 'isearch-mode-hook 'deactivate-mark)
+ (add-hook 'isearch-mode-hook #'deactivate-mark)
** C-delete now deletes a word backwards. This is for compatibility
with some editors in the PC world. (This key is not available on
@@ -1602,7 +1608,7 @@ If you prefer the old ESC ESC binding, put in your `~/.emacs':
(global-set-key "\e\e" 'eval-expression)
** The f1 function key is now equivalent to the help key. This is
-done with key-translation-map; delete the binding for f1 in that map
+done with 'key-translation-map'; delete the binding for f1 in that map
if you want to use f1 for something else.
** Mouse-3, in the simplest case, still sets the region. But now, it
@@ -1638,15 +1644,15 @@ are used.
*** All fill functions now indent every line to the left-margin. If
there is also a fill-prefix, that goes after the margin indentation.
-*** Open-line and newline also make sure that the lines they create
+*** 'open-line' and 'newline' also make sure that the lines they create
are indented to the left margin.
*** It also allows you to set the "justification" of the region:
whether it should be centered, flush right, and so forth. The fill
-functions (including auto-fill-mode) will maintain the justification
+functions (including 'auto-fill-mode') will maintain the justification
and indentation that you request.
-*** The new function `list-colors-display' shows you what colors are
+*** The new function 'list-colors-display' shows you what colors are
available. This is also accessible from the C-mouse-2 menu.
** You can now save and load files including their faces and other
@@ -1676,7 +1682,7 @@ middle of an ordinary key sequence.
character.
** Echo area messages are now logged in the "*Messages*" buffer. The
-size of this buffer is limited to message-log-max lines.
+size of this buffer is limited to 'message-log-max' lines.
** RET in various special modes for read-only buffers that contain
lists of items now selects the item point is on. These modes include
@@ -1684,12 +1690,12 @@ Dired, Compilation buffers, Buffer-menu, Tar mode, and Occur mode.
(In Info, RET follows the reference near point; in completion list
buffers, RET chooses the completion around point.)
-** set-background-color now updates the modeline face in a special
+** 'set-background-color' now updates the modeline face in a special
way. If that face was previously set up to be reverse video, the
reverse of the default face, then set-background-color updates it so
that it remains the reverse of the default face.
-** The functions raise-frame and lower-frame are now commands.
+** The functions 'raise-frame' and 'lower-frame' are now commands.
When used interactively, they apply to the selected frame.
** M-x buffer-menu now displays the buffer list in the selected window.
@@ -1706,16 +1712,16 @@ default value, if there is one. Normal execution of defvar does not
alter the variable if it already has a non-void value.
** In completion list buffers, the left and right arrow keys run the
-new commands previous-completion and next-completion. They move one
+new commands 'previous-completion' and 'next-completion'. They move one
completion at a time.
-** While doing completion in the minibuffer, the `prior' or `pageup'
+** While doing completion in the minibuffer, the 'prior' or 'pageup'
key switches to the completion list window.
** When you exit the minibuffer with empty contents, the empty string
is not put in the minibuffer history.
-** The default buffer for insert-buffer is now the "first" buffer
+** The default buffer for 'insert-buffer' is now the "first" buffer
other than the current one. If you have more than one window, this
is a buffer visible in another window. (Usually it is the buffer
that C-M-v would scroll.)
@@ -1747,8 +1753,8 @@ and scribe-underline-word is on C-c C-u.
gomoku-human-plays is on C-c C-p, gomoku-human-resigns is on C-c C-r,
and gomoku-emacs-plays is on C-c C-e.
-*** In the Outline mode defined in allout.el,
-outline-rebullet-current-heading is now on C-c *.
+*** In the Outline mode defined in 'allout',
+'outline-rebullet-current-heading' is now on C-c *.
** M-s in Info now searches through the nodes of the Info file,
just like s. The alias M-s was added so that you can use the same
@@ -1760,14 +1766,14 @@ with the sequences ~! and ~?.
** M-x compare-windows now pushes mark in both windows before
it starts moving point.
-** There are two new commands in Dired, A (dired-do-search)
-and Q (dired-do-query-replace). These are similar to tags-search and
+** There are two new commands in Dired, A ('dired-do-search')
+and Q ('dired-do-query-replace'). These are similar to tags-search and
tags-query-replace, but instead of searching the list of files that
appears in a tags table, they search all the files marked in Dired.
** Changes to dabbrev.
-A new function, `dabbrev-completion' (bound to M-C-/), expands the
+A new function, 'dabbrev-completion' (bound to M-C-/), expands the
unique part of an abbreviation.
Dabbrev now looks for expansions in other buffers, looks for symbols
@@ -1788,7 +1794,7 @@ another way.
*** Bookmarks can have annotations; type "C-h m" after doing
"M-x list-bookmarks", for more information on annotations.
-*** The bookmark-jump popup menu function is now `bookmark-menu-jump', for
+*** The 'bookmark-jump' popup menu function is now 'bookmark-menu-jump', for
those who bind it to a mouse click.
*** The default bookmarks file name is now "~/.emacs.bmk". If you
@@ -1816,18 +1822,18 @@ command M-x cpp-highlight-buffer.
variable symbols. Also ++ and -- which mean 2* positive and negative
c-basic-offset respectively.
-*** New variable, c-recognize-knr-p, which controls whether K&R C
+*** New variable, 'c-recognize-knr-p', which controls whether K&R C
constructs will be recognized. Trying to recognize K&R constructs is a
time hog so if you're programming strictly in ANSI C, set this
variable to nil (it should already be nil in c++-mode).
-*** New variable, c-hanging-comment-ender-p for controlling
+*** New variable, 'c-hanging-comment-ender-p' for controlling
c-fill-paragraph's behavior.
*** New syntactic symbol: statement-case-open. This is assigned to lines
containing an open brace just after a case/default label.
-*** New variable, c-progress-interval, which controls minibuffer update
+*** New variable, 'c-progress-interval', which controls minibuffer update
message displays during long re-indentation. This is a new feature
which prints percentage complete messages at specified intervals.
@@ -1844,7 +1850,7 @@ which prints percentage complete messages at specified intervals.
** icomplete.el now works more like a minor mode. Use M-x icomplete-mode
to turn it on and off.
-Icomplete now supports an `icomplete-minibuffer-setup-hook', which is
+Icomplete now supports an 'icomplete-minibuffer-setup-hook', which is
run on minibuffer setup whenever icompletion will be occurring. This
hook can be used to customize interoperation of icomplete with other
minibuffer-specific packages, eg rsz-mini. See the doc string for
@@ -1852,10 +1858,10 @@ more info.
** Ediff change.
-Use ediff-revision instead of vc-ediff. It also replaces rcs-ediff,
+Use 'ediff-revision' instead of 'vc-ediff'. It also replaces rcs-ediff,
for those who use that; if you want to use a version control package
other than vc.el, you must set the variable
-ediff-version-control-package to specify which package.
+'ediff-version-control-package' to specify which package.
** VC now supports branches with RCS.
@@ -1878,7 +1884,7 @@ branch, then the new version automatically creates a new branch.
** VC now supports CVS as well as RCS and SCCS.
Since there are no locks in CVS, some things behave slightly
-different when the backend is CVS. When vc-next-action is invoked
+different when the backend is CVS. When 'vc-next-action' is invoked
in a directory handled by CVS, it does the following:
If the file is not already registered, this registers it for version
@@ -1895,7 +1901,7 @@ file remains in existence.
If vc-next-action changes the repository file, it asks you
whether to merge in the changes into your working copy.
-vc-directory, when started in a CVS file hierarchy, reports
+'vc-directory', when started in a CVS file hierarchy, reports
all files that are modified (and thus need to be committed).
(When the backend is RCS or SCCS vc-directory reports all
locked files).
@@ -1908,7 +1914,7 @@ You can disable the CVS support as follows:
(setq vc-master-templates (delq 'vc-find-cvs-master vc-master-templates))
-or by setting vc-handle-cvs to nil.
+or by setting 'vc-handle-cvs' to nil.
This may be desirable if you run a non-standard version of CVS, or
if CVS was compiled with FORCE_USE_EDITOR or (possibly)
@@ -1929,8 +1935,8 @@ of lines, specified by the variable comint-buffer-maximum-size. Just
like the command comint-strip-ctrl-m, this can be run automatically
during process output by doing this:
-(add-hook 'comint-output-filter-functions
- 'comint-truncate-buffer)
+ (add-hook 'comint-output-filter-functions
+ #'comint-truncate-buffer)
** Telnet mode buffer name changed.
@@ -1941,32 +1947,32 @@ The buffer name for a Telnet buffer is now *telnet-HOST*, not
entire man page is indented, the indentation is removed.
The user option names that used to end in -p now end in -flag. The
-new names are: Man-reuse-okay-flag, Man-downcase-section-letters-flag,
-Man-circular-pages-flag. The Man-notify user option has been renamed to
-Man-notify-method and accepts one more value, `pushy', that just
+new names are: 'Man-reuse-okay-flag', 'Man-downcase-section-letters-flag',
+'Man-circular-pages-flag'. The 'Man-notify' user option has been renamed to
+'Man-notify-method' and accepts one more value, 'pushy', that just
switches the current buffer to the manpage buffer, without switching
frames nor changing your windows configuration.
-A new user option Man-fontify-manpage-flag disables fontification
+A new user option 'Man-fontify-manpage-flag' disables fontification
(thus speeding up man) when set to nil. Default is to fontify if a
-window system is used. Two new user options Man-overstrike-face
-(default 'bold) and Man-underline-face (default 'underline) can be set
+window system is used. Two new user options 'Man-overstrike-face'
+(default 'bold) and 'Man-underline-face' (default 'underline) can be set
to the preferred faces to be used for the words that man overstrikes
and underlines. Useful for those who like colored man pages.
-Two new interactive functions are provided: Man-cleanup-manpage and
-Man-fontify-manpage. Both can be used on a buffer that contains the
+Two new interactive functions are provided: 'Man-cleanup-manpage' and
+'Man-fontify-manpage'. Both can be used on a buffer that contains the
output of a `rsh host man manpage' command, or the output of an
`nroff -man -Tman manpage' command to make them readable.
Man-cleanup-manpage is faster, but does not fontify.
-** The new function modify-face makes it easy to specify
+** The new function 'modify-face' makes it easy to specify
all the attributes of a face, all at once.
** Faces now support background stippling.
-Use the command set-face-stipple to specify the stipple-pattern for a
-face. Use face-stipple to access the specified stipple pattern. The
+Use the command 'set-face-stipple' to specify the stipple-pattern for a
+face. Use 'face-stipple' to access the specified stipple pattern. The
existing face functions now handle the stipple pattern when
appropriate.
@@ -1978,14 +1984,14 @@ stipple instead to get the same effect.
*** Fontification
-Two new default faces are provided; `font-lock-variable-name-face' and
-`font-lock-reference-face'. The face `font-lock-doc-string-face' has
+Two new default faces are provided; 'font-lock-variable-name-face' and
+'font-lock-reference-face'. The face 'font-lock-doc-string-face' has
been removed since it is the same as the existing
-`font-lock-string-face'. Where appropriate, fontification
+'font-lock-string-face'. Where appropriate, fontification
automatically uses these new faces.
-Fontification via commands `font-lock-mode' and
-`font-lock-fontify-buffer' is now cleanly interruptible (i.e., with
+Fontification via commands 'font-lock-mode' and
+'font-lock-fontify-buffer' is now cleanly interruptible (i.e., with
C-g). If you interrupt during the fontification process, the buffer
remains in its previous modified state and all highlighting is removed
from the buffer.
@@ -1994,14 +2000,14 @@ For C/C++ modes, Font Lock mode is much faster but highlights much
more. Other modes are faster/more extensive/more discriminatory, or a
combination of these.
-To enable Font Lock mode, add the new function `turn-on-font-lock' in
+To enable Font Lock mode, add the new function 'turn-on-font-lock' in
one of the following ways:
- (add-hook 'c-mode-hook 'turn-on-font-lock)
+ (add-hook 'c-mode-hook #'turn-on-font-lock)
Or for any visited file with:
- (add-hook 'find-file-hooks 'turn-on-font-lock)
+ (add-hook 'find-file-hooks #'turn-on-font-lock)
*** Supports color and grayscale displays
@@ -2010,26 +2016,26 @@ the type of display and background shade. Attributes (face color,
bold, italic and underline, and display type and background mode) can
be controlled either from Emacs Lisp or X resources.
-See the new variables `font-lock-display-type' and
-`font-lock-face-attributes'.
+See the new variables 'font-lock-display-type' and
+'font-lock-face-attributes'.
*** Supports more modes
The following modes are directly supported:
-ada-mode, asm-mode, bibtex-mode, c++-c-mode, c++-mode, c-mode,
-change-log-mode, compilation-mode, dired-mode, emacs-lisp-mode,
-fortran-mode, latex-mode, lisp-mode, mail-mode, makefile-mode,
-outline-mode, pascal-mode, perl-mode, plain-tex-mode, rmail-mode,
-rmail-summary-mode, scheme-mode, shell-mode, slitex-mode, tex-mode,
-texinfo-mode.
+'ada-mode', 'asm-mode', 'bibtex-mode', 'c++-c-mode', 'c++-mode', 'c-mode',
+'change-log-mode', 'compilation-mode', 'dired-mode', 'emacs-lisp-mode',
+'fortran-mode', 'latex-mode', 'lisp-mode', 'mail-mode', 'makefile-mode',
+'outline-mode', 'pascal-mode', 'perl-mode', 'plain-tex-mode', 'rmail-mode',
+'rmail-summary-mode', 'scheme-mode', 'shell-mode', 'slitex-mode', 'tex-mode',
+'texinfo-mode'.
-See the new variables `font-lock-defaults-alist' and
-`font-lock-defaults'.
+See the new variables 'font-lock-defaults-alist' and
+'font-lock-defaults'.
Some modes support different levels of fontification. You can choose
to use the minimum or maximum available decoration by changing the
-value of the new variable `font-lock-maximum-decoration'.
+value of the new variable 'font-lock-maximum-decoration'.
Programmers are urged to make available to the community their own
keywords for modes not yet supported. See font-lock.el for
@@ -2047,18 +2053,18 @@ highlighting.
To use this package, put in your `~/.emacs':
- (add-hook 'font-lock-mode-hook 'turn-on-fast-lock)
+ (add-hook 'font-lock-mode-hook #'turn-on-fast-lock)
-To control the use of caches, see the documentation for `fast-lock-mode'.
+To control the use of caches, see the documentation for 'fast-lock-mode'.
-** You can tell pop-to-buffer to display certain buffers in the selected
+** You can tell 'pop-to-buffer' to display certain buffers in the selected
window rather than finding some other window to display them in.
There are two variables you can use to specify these buffers.
-same-window-buffer-names holds a list of buffer names; if a buffer's
+'same-window-buffer-names' holds a list of buffer names; if a buffer's
name appears in this list, pop-to-buffer puts it in the selected window.
-same-window-regexps holds a list of regexps--if any one of them
+'same-window-regexps' holds a list of regexps--if any one of them
matches a buffer's name, then pop-to-buffer puts that buffer in the
selected window.
@@ -2068,7 +2074,7 @@ window. These include shell buffers, mail buffers, telnet buffers,
and others. By removing elements from these variables, you can ask
Emacs to display those buffers in separate windows.
-** The special-display-buffer-names and special-display-regexps lists
+** The 'special-display-buffer-names' and 'special-display-regexps' lists
have been generalized. An element may now be a list. The car of the list
is the buffer name or regular expression for matching buffer names.
@@ -2084,17 +2090,17 @@ FUNCTION; its first argument is the buffer, and its remaining
arguments are ARGS.
** If the environment variable REPLYTO is set, its value is the default
-for mail-default-reply-to.
+for 'mail-default-reply-to'.
** When you send a message in Emacs, if you specify an Rmail file with
the Fcc: header field, Emacs converts the message to Rmail format
before writing it. Thus, the file never contains anything but Rmail
format messages.
-** The new variable mail-from-style controls whether the From: header
+** The new variable 'mail-from-style' controls whether the From: header
should include the sender's full name, and if so, which format to use.
-** The new variable mail-personal-alias-file specifies the name of the
+** The new variable 'mail-personal-alias-file' specifies the name of the
user's personal aliases. This defaults to the file ~/.mailrc.
mailabbrev.el used to have its own variable for this purpose
(mail-abbrev-mailrc-file). That variable is no longer used.
@@ -2111,33 +2117,33 @@ crossreference entries are object to completion.
*** Braces are supported as field delimiters in addition to quotes.
BibTeX entries may have brace-delimited and quote-delimited fields
intermixed. The delimiters generated for new entries are specified by
-the variables bibtex-field-left-delimiter and
-bibtex-field-right-delimiter on a buffer-local basis. Those variables
+the variables 'bibtex-field-left-delimiter' and
+'bibtex-field-right-delimiter' on a buffer-local basis. Those variables
default to braces, since it is easier to put quote accented characters
(as the german umlauts) into a brace-delimited entry.
-*** The function bibtex-clean-entry can now be invoked with a prefix
+*** The function 'bibtex-clean-entry' can now be invoked with a prefix
argument. In this case, a label is automatically generated from
various fields in the record. If bibtex-clean-entry is invoked on a
record without label, a label is also generated automatically.
-Various variables (all beginning with `bibtex-autokey-') control the
-creation of that key. The variable bibtex-autokey-edit-before-use
+Various variables (all beginning with 'bibtex-autokey-') control the
+creation of that key. The variable 'bibtex-autokey-edit-before-use'
determines, if the user is allowed to edit auto-generated reference
keys before they are used.
-*** A New function bibtex-complete-string completes strings with
+*** A New function 'bibtex-complete-string' completes strings with
respect to the strings defined in this buffer and a set of predefined
strings (initialized to the string macros defined in the standard
BibTeX style files) in the same way in which ispell-complete-word
works with respect to words in a dictionary. Candidates for
bibtex-complete-string are initialized from variable
-bibtex-predefined-strings and by parsing the files found in
-bibtex-string-files for @String definitions.
+'bibtex-predefined-strings' and by parsing the files found in
+'bibtex-string-files' for @String definitions.
*** Every reference/field pair has now attached a comment which
appears in the echo area when this field is edited. These comments
should provide useful hints for BibTeX usage, especially for BibTeX
-beginners. New variable bibtex-help-message determines if these help
+beginners. New variable 'bibtex-help-message' determines if these help
messages are to appear in the minibuffer when moving to a text entry.
*** Inscriptions of menu bar changed from "Entry Types" to
@@ -2164,7 +2170,7 @@ didn't.
*** Default value for variables bibtex-maintain-sorted-entries and
bibtex-sort-ignore-string-entries is now t.
-*** All interactive functions are renamed to begin with `bibtex-'.
+*** All interactive functions are renamed to begin with 'bibtex-'.
*** Keybindings with \C-c\C-e entry changed for unification. Often
used reference types are now on control-modified keys, mediocre used
@@ -2184,8 +2190,8 @@ use --with-x if you need to request X support explicitly.
automatically enable X support if X is installed on your machine.)
** If you use the site-init.el file to set the variable
-mail-host-address to a string in the dumped Emacs, that string becomes
-the default host address for initializing user-mail-address.
+'mail-host-address' to a string in the dumped Emacs, that string becomes
+the default host address for initializing 'user-mail-address'.
It is used instead of the value of (system-name).
@@ -2202,11 +2208,11 @@ macros. Thus, you can now write `(x ,y z) instead of (` (x (, y) z)).
The old syntax is still accepted.
-*** The new function rassoc is like assoc, except that it compares the
+*** The new function 'rassoc' is like 'assoc', except that it compares the
key against the cdr of each alist element, where assoc would compare
it against the car of each alist element.
-*** The new function unintern deletes a symbol from an obarray. The
+*** The new function 'unintern' deletes a symbol from an obarray. The
first argument can be the symbol to delete, or a string giving its
name. The second argument specifies the obarray (nil means the
current default obarray).
@@ -2215,18 +2221,18 @@ If the specified symbol is not in the obarray, or if there's no symbol
in the obarray matching the specified string, unintern does nothing
and returns nil. If it does delete a symbol, it returns t.
-*** You can specify an alternative read function for use by load and
-eval-region by binding the variable load-read-function to some other
+*** You can specify an alternative read function for use by 'load' and
+'eval-region' by binding the variable 'load-read-function' to some other
function. This function should accept one argument just like read.
If load-read-function is nil, load and eval-region use ordinary read.
-*** The new function `type-of' takes any object as argument, and
-returns a symbol identifying the type of that object--one of `symbol',
-`integer', `float', `string', `cons', `vector', `marker', `overlay',
-`window', `buffer', `subr', `compiled-function',
-`window-configuration', `process'.
+*** The new function 'type-of' takes any object as argument, and
+returns a symbol identifying the type of that object--one of 'symbol',
+'integer', 'float', 'string', 'cons', 'vector', 'marker', 'overlay',
+'window', 'buffer', 'subr', 'compiled-function',
+'window-configuration', 'process'.
-*** When you use eval-after-load for a file that is already loaded, it
+*** When you use 'eval-after-load' for a file that is already loaded, it
executes the FORM right away. As before, if the file is not yet
loaded, it arranges to execute FORM if and when the file is loaded
later. The result is: if you have called eval-after-load for a file,
@@ -2239,24 +2245,24 @@ treating them as a comment.
You would not want to use this in a file you edit by hand, but it is
useful for commenting out parts of machine-generated files.
-*** Two new functions, `plist-get' and `plist-put',
+*** Two new functions, 'plist-get' and 'plist-put',
allow you to modify and retrieve values from lists formatted as property-lists.
-They work like `get' and `put', but operate on any list.
-`plist-put' returns the modified property-list; you must store it
+They work like 'get' and 'put', but operate on any list.
+'plist-put' returns the modified property-list; you must store it
back where you got it.
-*** The new function add-to-list is called with two elements,
+*** The new function 'add-to-list' is called with two elements,
a variable that holds a list and a new element.
It adds the element to the list unless it is already present.
-It compares elements using `equal'. Here is an example:
+It compares elements using 'equal'. Here is an example:
-(setq foo '(a b)) => (a b)
+ (setq foo '(a b)) => (a b)
-(add-to-list 'foo 'c) => (c a b)
+ (add-to-list 'foo 'c) => (c a b)
-(add-to-list 'foo 'b) => (c a b)
+ (add-to-list 'foo 'b) => (c a b)
-foo => (c a b)
+ foo => (c a b)
** Changes in compilation.
@@ -2281,7 +2287,7 @@ loading the compiled file does not actually bring the function
definitions into core. Instead it creates references to the compiled
file, and brings each function's definition into core the first time
you call that function, or when you force it with the new function
-`fetch-bytecode'.
+'fetch-bytecode'.
Using the lazy loading feature has a few consequences:
@@ -2294,7 +2300,7 @@ Using the lazy loading feature has a few consequences:
will get nonsense results.
To enable the lazy loading feature, set up a non-nil file local
-variable binding for the variable `byte-compile-dynamic' in the Lisp
+variable binding for the variable 'byte-compile-dynamic' in the Lisp
source file. For example, put this on the first line:
-*-byte-compile-dynamic: t;-*-
@@ -2304,26 +2310,26 @@ contains many functions, most of which are not actually used by a
given user in a given session.
To turn off the basic feature of referring to the file for doc
-strings, set byte-compile-dynamic-docstrings to nil. You can do this
+strings, set 'byte-compile-dynamic-docstrings' to nil. You can do this
globally, or for one source file by adding this to the first line:
-*-byte-compile-dynamic-docstrings: nil;-*-
** Strings
-*** Do not pass integer arguments to `concat' (or `vconcat' or
-`append'). We are phasing out the old unrecommended support for
+*** Do not pass integer arguments to 'concat' (or 'vconcat' or
+'append'). We are phasing out the old unrecommended support for
integers as arguments to these functions, in preparation for treating
numbers as single characters in a future release. To concatenate
-numbers in string form, use `number-to-string' first, or rewrite the
-call to use `format' instead of `concat'.
+numbers in string form, use 'number-to-string' first, or rewrite the
+call to use 'format' instead of 'concat'.
-*** The new function match-string returns the string of text matched at
+*** The new function 'match-string' returns the string of text matched at
the given parenthesized expression by the last regexp search, or nil
-if there was no match. If the last match was by `string-match' on a
+if there was no match. If the last match was by 'string-match' on a
string, the string must be given. Therefore, this function can be
-used in place of `buffer-substring' and `substring', when using
-`match-beginning' and `match-end' to find match positions.
+used in place of 'buffer-substring' and 'substring', when using
+'match-beginning' and 'match-end' to find match positions.
(match-string N) or (match-string N STRING)
@@ -2333,11 +2339,11 @@ the portion of STRING that was matched. When used in this way,
replace-match returns a newly created string which is the same as
STRING except for the matched portion.
-*** The new function buffer-substring-no-properties
-is like buffer-substring except that the string it returns
+*** The new function 'buffer-substring-no-properties'
+is like 'buffer-substring' except that the string it returns
has no text properties.
-*** The function `equal' now considers two strings to be different
+*** The function 'equal' now considers two strings to be different
if they don't have the same text properties.
** Completion
@@ -2352,7 +2358,7 @@ are ignored unless the initial string also starts with a space.
*** Local hook variables.
There is now a clean way to give a hook variable a buffer-local value.
-Call the function `make-local-hook' to do this.
+Call the function 'make-local-hook' to do this.
Once a hook variable is buffer-local, you can add hooks to it either
globally or locally. run-hooks runs the local hook functions
@@ -2365,12 +2371,12 @@ function or a global one.
Local hooks use t as an element of the (local) value of the hook
variable as a flag meaning to use the global value also.
-*** The new function local-variable-p tells you whether a particular
+*** The new function 'local-variable-p' tells you whether a particular
variable is buffer-local in the current buffer or a specified buffer.
** Editing Facilities
-*** The function copy-region-as-kill no longer sets this-command;
+*** The function 'copy-region-as-kill' no longer sets this-command;
as a result, a following kill command will not normally append
to the text saved by copy-region-as-kill.
@@ -2380,18 +2386,18 @@ instead of looking for the longest match--just as they did in Emacs 18.
The reason for this change is to get higher speed.
There are new functions you can use if you really want to search or
-match with Posix behavior: posix-search-forward,
-posix-search-backward, posix-looking-at, and posix-string-match. Call
-these just like re-search-forward, re-search-backward, looking-at, and
-string-match.
+match with Posix behavior: 'posix-search-forward',
+'posix-search-backward', 'posix-looking-at', and 'posix-string-match'.
+Call these just like 're-search-forward', 're-search-backward',
+'looking-at', and 'string-match'.
** Files
-*** The new variable `format-alist' defines file formats,
+*** The new variable 'format-alist' defines file formats,
which are ways of translating between the data in a file and things
(text, text-properties, and possibly other information) in a buffer.
-`format-alist' has one element for each format. Each element is a
+'format-alist' has one element for each format. Each element is a
list like this:
(NAME DOC-STRING REGEXP FROM-FN TO-FN MODIFY MODE-FN)
containing the name of the format, a documentation string, a regular
@@ -2405,41 +2411,41 @@ FROM-FN is called to decode files in that format; it gets two args, BEGIN
longer matches REGEXP, or else it will get called again.
TO-FN is called to encode a region into that format; it is also passed BEGIN
and END, and either returns a list of annotations as in
- `write-region-annotate-functions', or modifies the region and returns
+ 'write-region-annotate-functions', or modifies the region and returns
the new end position.
MODIFY, if non-nil, means the TO-FN modifies the region. If nil, TO-FN may
not make any changes and should return a list of annotations.
-`insert-file-contents' checks the beginning of the file that it is
+'insert-file-contents' checks the beginning of the file that it is
inserting to see if it matches one of the regexps. If so, then it
calls the decoding function, and then looks for another match. When
visiting a file, it also calls the mode function, and sets the
-variable `buffer-file-format' to the list of formats that the file
+variable 'buffer-file-format' to the list of formats that the file
used.
-`write-region' calls the encoding functions for each format in
-`buffer-file-format' before it writes the file. To save a file in a
-different format, either set `buffer-file-format' to a different
-value, or call the new function `format-write-file'.
+'write-region' calls the encoding functions for each format in
+'buffer-file-format' before it writes the file. To save a file in a
+different format, either set 'buffer-file-format' to a different
+value, or call the new function 'format-write-file'.
Since some encoding functions may be slow, you can request that
auto-save use a format different from the buffer's default by setting
-the variable `auto-save-file-format' to the desired format. This will
+the variable 'auto-save-file-format' to the desired format. This will
determine the format of all auto-save files.
-*** The new function file-ownership-preserved-p tells you whether
+*** The new function 'file-ownership-preserved-p' tells you whether
deleting a file and recreating it would keep the file's owner
unchanged.
-*** The new function file-regular-p returns t if a file
+*** The new function 'file-regular-p' returns t if a file
is a "regular" file (not a directory, symlink, named pipe,
terminal, or other I/O device).
-*** The new function file-name-sans-extension discards the extension
+*** The new function 'file-name-sans-extension' discards the extension
of a file name. You call it with a file name, and returns a string
lacking the extension.
-*** The variable path-separator is a string which says which
+*** The variable 'path-separator' is a string which says which
character separates directories in a search path. It is ":"
for Unix and GNU systems, ";" for MSDOG and Windows NT.
@@ -2462,20 +2468,20 @@ like (ctrl meta newline) or (meta ?d), as in XEmacs. (ctrl meta newline)
is equivalent to the event type symbol C-M-newline, and (meta ?d)
is equivalent to the character ?\M-d.
-*** The function event-convert-list converts a list such as
+*** The function 'event-convert-list' converts a list such as
(meta ?d) into the corresponding event type (a symbol or integer).
-*** In an interactive spec, `k' means to read a key sequence. In this
+*** In an interactive spec, 'k' means to read a key sequence. In this
key sequence, upper case characters and shifted function keys which
have no bindings are converted to lower case if that makes them
defined.
-The new interactive code `K' reads a key sequence similarly, but does
-not convert the last event. `K' is useful for reading a key sequence
+The new interactive code 'K' reads a key sequence similarly, but does
+not convert the last event. 'K' is useful for reading a key sequence
to be given a binding.
-*** The variable overriding-local-map now has no effect on the menu bar
-display unless overriding-local-map-menu-flag is non-nil. This is why
+*** The variable 'overriding-local-map' now has no effect on the menu bar
+display unless 'overriding-local-map-menu-flag' is non-nil. This is why
incremental search no longer temporarily changes the menu bars.
Note that overriding-local-map does still affect the execution of key
@@ -2486,10 +2492,10 @@ looked up and executed. But this is what you'd normally do anyway:
programs that use overriding-local-map normally exit and "put back"
any event such as menu-bar that they do not handle specially.
-*** The new variable `overriding-terminal-local-map' is like
-overriding-local-map, but is specific to a single terminal.
+*** The new variable 'overriding-terminal-local-map' is like
+'overriding-local-map', but is specific to a single terminal.
-*** delete-frame events.
+*** 'delete-frame' events.
When you use the X window manager's "delete window" command, this now
generates a delete-frame event. The standard definition of this event
@@ -2497,7 +2503,7 @@ is a command that deletes the frame that received the event, and kills
Emacs when the last visible or iconified frame is deleted. You can
rebind the event to some other command if you wish.
-*** Two new types of events, iconify-frame and make-frame-visible,
+*** Two new types of events, 'iconify-frame' and 'make-frame-visible',
indicate that the user iconified or deiconified a frame with the
window manager. Since the window manager has already done the work,
the default definition for both event types in Emacs is to do nothing.
@@ -2508,49 +2514,49 @@ the default definition for both event types in Emacs is to do nothing.
words, all the screens of a single X server). The value in effect, at
any given time, is the one that belongs to the terminal of the
selected frame. The terminal-local variables are
-default-minibuffer-frame, system-key-alist, defining-kbd-macro, and
-last-kbd-macro. There is no way for Lisp programs to create others.
+'default-minibuffer-frame', 'system-key-alist', 'defining-kbd-macro', and
+'last-kbd-macro'. There is no way for Lisp programs to create others.
The terminal-local variables cannot be buffer-local.
-*** When you create an X frame, for the `top' and `left' frame
+*** When you create an X frame, for the 'top' and 'left' frame
parameters, you can now use values of the form (+ N) or (- N), where N
is an integer. (+ N) means N pixels to the right of the left edge of
the screen and (- N) means N pixels to the left of the right edge. In
both cases, N may be zero (exactly at the edge) or negative (putting
the window partly off the screen).
-The function x-parse-geometry can return values of these forms
+The function 'x-parse-geometry' can return values of these forms
for certain inputs.
-*** The variable menu-bar-file-menu has been renamed to
-menu-bar-files-menu to match the actual item that appears in the menu.
+*** The variable 'menu-bar-file-menu' has been renamed to
+'menu-bar-files-menu' to match the actual item that appears in the menu.
(All the other such variable names do match.)
-*** The new function active-minibuffer-window returns the minibuffer window
+*** The new function 'active-minibuffer-window' returns the minibuffer window
currently active, or nil if none is now active.
-*** In the functions next-window, previous-window, next-frame,
-previous-frame, get-buffer-window, get-lru-window, get-largest-window
-and delete-windows-on, if you specify 0 for the last argument,
+*** In the functions 'next-window', 'previous-window', 'next-frame',
+'previous-frame', 'get-buffer-window', 'get-lru-window', 'get-largest-window'
+and 'delete-windows-on', if you specify 0 for the last argument,
it means to consider all visible and iconified frames.
-*** When you set a frame's cursor type with modify-frame-parameters,
+*** When you set a frame's cursor type with 'modify-frame-parameters',
you can now specify (bar . INTEGER) as the cursor type. This stands
for a bar cursor of width INTEGER.
-*** The new function facep returns t if its argument is a face name
+*** The new function 'facep' returns t if its argument is a face name
(or if it is a vector such as is used internally by the Lisp code
to represent a face).
*** Each frame can now have a buffer-predicate function,
-which is the `buffer-predicate' frame parameter.
-When `other-buffer' looks for an alternative buffer, it considers
+which is the 'buffer-predicate' frame parameter.
+When 'other-buffer' looks for an alternative buffer, it considers
only the buffers that fit the selected frame's buffer predicate (if it
has one). This is useful for applications that make their own frames.
*** When you create an X frame, you can now specify the frame parameter
-`display'. This says which display to put the frame on. The value
+'display'. This says which display to put the frame on. The value
should be a display name--a string of the form
"HOST:DPYNUMBER.SCREENNUMBER".
@@ -2560,11 +2566,11 @@ a display name string or a frame. A value of nil stands for the
selected frame.
To close the connection to an X display, use the function
-x-close-connection. Specify which display with a display name. You
+'x-close-connection'. Specify which display with a display name. You
cannot close the connection if Emacs still has frames open on that
display.
-x-display-list returns a list indicating which displays Emacs has
+'x-display-list' returns a list indicating which displays Emacs has
connections to. Its elements are display names (strings).
*** The icon-type frame parameter may now be a file name.
@@ -2572,27 +2578,28 @@ Then the contents of that file specify the icon bitmap to use
for that frame.
*** The title of an Emacs frame, displayed by most window managers, is
-set from frame-title-format or icon-title-format. These have the same
-structure as mode-line-format.
+set from 'frame-title-format' or 'icon-title-format'. These have the same
+structure as 'mode-line-format'.
-*** x-display-grayscale-p is a new function that returns non-nil if
+*** 'x-display-grayscale-p' is a new function that returns non-nil if
your X server can display shades of gray. Currently it returns
non-nil for color displays (because they can display shades of gray);
we may change it in the next version to return nil for color displays.
-*** The frame parameter scroll-bar-width specifies the width of the
+*** The frame parameter 'scroll-bar-width' specifies the width of the
scrollbar in pixels.
** Buffers
-*** Creating a buffer with get-buffer-create does not obey
-default-major-mode. That variable is now handled in a separate
-function, set-buffer-major-mode. get-buffer-create and generate-new-buffer
-always leave the newly created buffer in Fundamental mode.
+*** Creating a buffer with 'get-buffer-create' does not obey
+'default-major-mode'. That variable is now handled in a separate
+function, 'set-buffer-major-mode'. 'get-buffer-create' and
+'generate-new-buffer' always leave the newly created buffer
+in Fundamental mode.
-Creating a new buffer by visiting a file or with switch-to-buffer,
-pop-to-buffer, and similar functions does call set-buffer-major-mode
-to select the default major mode specified with default-major-mode.
+Creating a new buffer by visiting a file or with 'switch-to-buffer',
+'pop-to-buffer', and similar functions does call 'set-buffer-major-mode'
+to select the default major mode specified with 'default-major-mode'.
*** You can now create an "indirect buffer". An indirect buffer shares
its text, including text properties, with another buffer (the "base
@@ -2602,24 +2609,24 @@ those of the base buffer and all other buffers. An indirect buffer
cannot itself be visiting a file (though its base buffer can be).
The base buffer cannot itself be indirect.
-Use (make-indirect-buffer BASE-BUFFER NAME) to make an indirect buffer
-named NAME whose base is BASE-BUFFER. If BASE-BUFFER is an indirect
-buffer, its base buffer is used as the base for the new buffer.
+Use 'make-indirect-buffer' to make an indirect buffer.
+If the base buffer is an indirect buffer, its base buffer is used as
+the base for the new buffer.
You can make an indirect buffer current, or switch to it in a window,
just as you would a non-indirect buffer.
-The function buffer-base-buffer, given an indirect buffer, returns its
+The function 'buffer-base-buffer', given an indirect buffer, returns its
base buffer. It returns nil when given an ordinary buffer (not
indirect).
-The library `noutline' has versions of Outline mode and Outline minor
+The library 'noutline' has versions of Outline mode and Outline minor
mode which let you display different parts of the outline in different
indirect buffers.
** Subprocesses
-*** The functions call-process and call-process-region now allow
+*** The functions 'call-process' and 'call-process-region' now allow
you to direct error message output from the subprocess into a
separate destination, instead of mixing it with ordinary output.
To do this, specify for the third argument, BUFFER, a list of the form
@@ -2646,42 +2653,42 @@ names, respectively.
** Text properties
-*** You can now specify which values of the `invisible' property
+*** You can now specify which values of the 'invisible' property
make text invisible in a given buffer. The variable
-`buffer-invisibility-spec', which is always local in all buffers,
+'buffer-invisibility-spec', which is always local in all buffers,
controls this.
-If its value is t, then any non-nil `invisible' property makes
+If its value is t, then any non-nil 'invisible' property makes
a character invisible.
If its value is a list, then a character is invisible if its
-`invisible' property value appears as a member of the list, or if it
+'invisible' property value appears as a member of the list, or if it
appears as the car of a member of the list.
-When the `invisible' property value appears as the car of a member of
-the `buffer-invisibility-spec' list, then the cdr of that member has
+When the 'invisible' property value appears as the car of a member of
+the 'buffer-invisibility-spec' list, then the cdr of that member has
an effect. If it is non-nil, then an ellipsis appears in place of the
character. (This happens only for the *last* invisible character in a
series of consecutive invisible characters, and only at the end of a
line.)
-If a character's `invisible' property is a list, then Emacs checks each
-element of the list against `buffer-invisibility-spec'. If any element
+If a character's 'invisible' property is a list, then Emacs checks each
+element of the list against 'buffer-invisibility-spec'. If any element
matches, the character is invisible.
-*** The command `list-text-properties-at' shows what text properties
+*** The command 'list-text-properties-at' shows what text properties
are in effect at point.
*** Frame objects now exist in Emacs even on systems that don't support
X Windows. You can create multiple frames, and switch between them
-using select-frame. The selected frame is actually displayed on your
+using 'select-frame'. The selected frame is actually displayed on your
terminal; other frames are not displayed at all. The selected frame
-number appears in the mode line after `Emacs', except for frame 1.
+number appears in the mode line after 'Emacs', except for frame 1.
Switching frames on ASCII terminals is therefore more or less
equivalent to switching between different window configurations.
-*** The new variable window-size-change-functions holds a list of
+*** The new variable 'window-size-change-functions' holds a list of
functions to be called if window sizes change (or if windows are
created or deleted). The functions are called once for each frame on
which changes have occurred, with the frame as the sole argument.
@@ -2712,16 +2719,16 @@ are the same arguments that the after-change-functions receive.
This means the function must accept either four or five arguments.
*** You can set defaults for text-properties with the new variable
-`default-text-properties'. Its value is a property list; the values
+'default-text-properties'. Its value is a property list; the values
specified there are used whenever a character (or its category) does
not specify a value.
-*** The `face' property of a character or an overlay can now be a list
+*** The 'face' property of a character or an overlay can now be a list
of face names. Formerly it had to be just one face name.
-*** Changes in handling the `intangible' text property.
+*** Changes in handling the 'intangible' text property.
-**** If inhibit-point-motion-hooks is non-nil, then `intangible' properties
+**** If inhibit-point-motion-hooks is non-nil, then 'intangible' properties
are ignored.
**** Moving to just before a stretch of intangible text
@@ -2740,26 +2747,26 @@ place point between them.
*** Overlay changes.
-**** The new function previous-overlay-change returns the position of
+**** The new function 'previous-overlay-change' returns the position of
the previous overlay start or end, before a specified position. This
-is the backwards-moving counterpart of next-overlay-change.
+is the backwards-moving counterpart of 'next-overlay-change'.
-**** overlay-get now supports category properties on an overlay
-the same way get-text-property supports them as text properties.
+**** 'overlay-get' now supports category properties on an overlay
+the same way 'get-text-property' supports them as text properties.
Specifically, if an overlay does not have the property PROP that you
-ask for, but it does have a `category' property which is a symbol,
+ask for, but it does have a 'category' property which is a symbol,
then that symbol's PROP property is used.
-**** If an overlay has a non-nil `evaporate' property, it will be
+**** If an overlay has a non-nil 'evaporate' property, it will be
deleted if it ever becomes empty (i.e., when it spans no characters).
-**** If an overlay has a `before-string' and/or `after-string' property,
+**** If an overlay has a 'before-string' and/or 'after-string' property,
these strings are displayed at the overlay's endpoints.
** Filling
-*** The new variable fill-paragraph-function provides a way for major
+*** The new variable 'fill-paragraph-function' provides a way for major
modes to override the filling of paragraphs. If this is non-nil,
fill-paragraph calls it as a function, passing along its sole
argument. If the function returns non-nil, fill-paragraph assumes it
@@ -2770,57 +2777,57 @@ language modes.
*** Text filling and justification changes:
-**** The new variable use-hard-newlines can be used to make a
+**** The new variable 'use-hard-newlines' can be used to make a
distinction between "hard" and "soft" newlines; the fill functions
will then never remove a newline that was manually inserted. Hard
-newlines are marked with a non-nil `hard' text-property.
+newlines are marked with a non-nil 'hard' text-property.
-**** The fill-column and left-margin can now be modified by text-properties.
+**** The 'fill-column' and 'left-margin' can now be modified by text-properties.
Most lisp programs should use the new functions (current-fill-column) and
(current-left-margin), which return the proper values to use for the
current line.
**** There are new functions for dealing with margins:
-***** Set-left-margin and set-right-margin (set the value for a region
+***** 'set-left-margin' and 'set-right-margin' (set the value for a region
and re-fill). These functions take three arguments: two to specify
a region, and the desired margin value.
-***** Increase-left-margin, decrease-left-margin, increase-right-margin, and
-decrease-right-margin (change settings relative to current values, and
+***** 'increase-left-margin', 'decrease-left-margin', 'increase-right-margin',
+and 'decrease-right-margin' (change settings relative to current values, and
re-fill).
-***** move-to-left-margin moves point there, optionally adding
+***** 'move-to-left-margin' moves point there, optionally adding
indentation or changing tabs to spaces in order to make that possible.
-beginning-of-line-text also moves past the fill-prefix and any
+'beginning-of-line-text' also moves past the 'fill-prefix' and any
indentation added to center or right-justify a line, to the beginning
of the text that the user actually typed.
-***** delete-to-left-margin removes any left-margin indentation, but
+***** 'delete-to-left-margin' removes any left-margin indentation, but
does not change the property.
-**** The paragraph-movement functions look for the paragraph-start and
-paragraph-separate regexps at the current left margin, not at the
+**** The paragraph-movement functions look for the 'paragraph-start' and
+'paragraph-separate' regexps at the current left margin, not at the
beginning of the line. This means that those regexps should NOT use ^
to anchor the search. However, for backwards compatibility, a ^ at
the beginning of the regexp will be ignored, so most packages won't break.
-**** justify-current-line is now capable of doing left, center, or
+**** 'justify-current-line' is now capable of doing left, center, or
right justification as well as full justification.
**** The fill functions can do any kind of justification based on the new
-`justification' text-property and `default-justification' variable,
+'justification' text-property and 'default-justification' variable,
or arguments to the functions. They also have a new option which
defeats the normal removal of extra whitespace.
-**** The new function `current-justification' returns the kind of
+**** The new function 'current-justification' returns the kind of
justification used for the current line. The new function
-`set-justification' can be used to change it, including re-justifying
+'set-justification' can be used to change it, including re-justifying
the text of the region according to the new value.
-**** Filling and auto-fill are disabled if justification is `none'.
+**** Filling and auto-fill are disabled if justification is 'none'.
-**** The auto-fill-function is now called regardless of whether
+**** The 'auto-fill-function' is now called regardless of whether
the fill-column has been exceeded; the function can determine on its
own whether filling (or justification) is necessary.
@@ -2828,14 +2835,14 @@ own whether filling (or justification) is necessary.
** Processes
-*** process-tty-name is a new function that returns the name of the
+*** 'process-tty-name' is a new function that returns the name of the
terminal that the process itself reads and writes on (not the name of
the pty that Emacs uses to talk with that terminal).
*** Errors in process filters and sentinels are now normally caught
automatically, so that they don't abort other Lisp programs.
-Setting debug-on-error non-nil turns off this feature; then errors in
+Setting 'debug-on-error' non-nil turns off this feature; then errors in
filters and sentinels are not caught. As a result, they can invoke
the debugger, under the control of debug-on-error.
@@ -2846,10 +2853,10 @@ match data.
** Display
-*** The variable message-log-max controls how messages are logged in the
+*** The variable 'message-log-max' controls how messages are logged in the
"*Messages*" buffer. An integer value means to keep that many lines;
t means to log with no limit; nil means disable message logging. Lisp
-code that calls `message' excessively (e.g. isearch.el) should probably
+code that calls 'message' excessively (e.g. isearch.el) should probably
bind this variable to nil.
*** Display tables now have a new element, at index 261, specifying the
@@ -2859,22 +2866,22 @@ other useful character to store for this element is a space, to make
less visual separation between two side-by-side windows displaying
related information.
-*** The new mode-line-format spec %c displays the current column number.
+*** The new 'mode-line-format' spec %c displays the current column number.
-*** The new variable blink-matching-delay specifies how long to keep
+*** The new variable 'blink-matching-delay' specifies how long to keep
the cursor at the matching open-paren, after you insert a close-paren.
This is useful mainly on systems which can wait for a fraction of a
second--you can then specify fractional values such as 0.5.
*** Faster processing of buffers with long lines
-The new variable cache-long-line-scans determines whether Emacs
+The new variable 'cache-long-line-scans' determines whether Emacs
should use caches to handle long lines more quickly. This variable is
buffer-local, in all buffers.
Normally, the line-motion functions work by scanning the buffer for
-newlines. Columnar operations (like `move-to-column' and
-`compute-motion') also work by scanning the buffer, summing character
+newlines. Columnar operations (like 'move-to-column' and
+'compute-motion') also work by scanning the buffer, summing character
widths as they go. This works well for ordinary text, but if the
buffer's lines are very long (say, more than 500 characters), these
motion functions will take longer to execute. Emacs may also take
@@ -2899,30 +2906,30 @@ it should only affect their performance.
** System Interface
-*** The function user-login-name now accepts an optional
+*** The function 'user-login-name' now accepts an optional
argument uid. If the argument is non-nil, user-login-name
returns the login name for that user id.
-*** system-name, user-name, user-full-name and user-real-name are now
-variables as well as functions. The variables hold the same values
-that the functions would return. The new variable multiple-frames
+*** 'system-name', 'user-name', 'user-full-name' and 'user-real-name' are
+now variables as well as functions. The variables hold the same values
+that the functions would return. The new variable 'multiple-frames'
is non-nil if at least two non-minibuffer frames are visible. These
-variables may be useful in constructing the value of frame-title-format
-or icon-title-format.
+variables may be useful in constructing the value of 'frame-title-format'
+or 'icon-title-format'.
*** Changes in time-conversion functions.
-**** The new function format-time-string takes a format string and a
+**** The new function 'format-time-string' takes a format string and a
time value. It converts the time to a string, according to the format
specified. You can specify what kind of conversion to use with
%-specifications.
-**** The new function decode-time converts a time value into a list of
+**** The new function 'decode-time' converts a time value into a list of
specific items of information: the year, month, day of week, day of
month, hour, minute and second. (A time value is a list of two or
three integers.)
-**** The new function encode-time converts specific items of time
+**** The new function 'encode-time' converts specific items of time
information--the second, minute, hour, day, month, year, and time
zone--into a time value.
@@ -2977,7 +2984,7 @@ You must still explicitly load either iso-transl or iso-acc.
** For a read-only buffer that is also modified, the mode line now displays
%* instead of %%.
-** M-prior (scroll-other-window-down) is a new command that works like
+** M-prior ('scroll-other-window-down') is a new command that works like
M-next (and C-M-v) but scrolls in the opposite direction.
M-home moves to the beginning of the buffer, in the other window.
@@ -3001,7 +3008,7 @@ your .signature file, you now get a -- before the signature.
** Setting rmail-highlighted-headers to nil entirely turns off
highlighting in Rmail. However, if your motivation for doing this is
that the highlighted text doesn't look good on your display, it might
-be better to change the appearance of the `highlight' face. Once
+be better to change the appearance of the 'highlight' face. Once
you've done that, you may find Rmail highlighting is useful.
** In the calendar, mouse-2 is now used only for commands that apply to a date.
@@ -3018,18 +3025,18 @@ is now C-c C-v C-d, not C-c C-v C-h. Thus, C-c C-v C-h is now available
for asking for a list of the subcommands of C-c C-v.
** You can now specify "who you are" for various Emacs packages by
-setting just one variable, user-mail-address. This currently applies
+setting just one variable, 'user-mail-address'. This currently applies
to posting news with GNUS and to making change log entries. It may
apply to additional Emacs features in the future.
* Lisp-Level Changes in Emacs 19.26:
-** The function insert-char now takes an optional third argument
+** The function 'insert-char' now takes an optional third argument
which, if non-nil, says the inserted characters should inherit sticky
text properties from the surrounding text.
-** The `diary' library has been renamed to `diary-lib'. If you refer
+** The 'diary' library has been renamed to 'diary-lib'. If you refer
to this library in your Lisp code, you must update the references.
** Sending text to a subprocess can read input from subprocesses if it
@@ -3051,23 +3058,23 @@ The old meaning of %+ is now available on %&.
It displays * for a modified buffer and - for an unmodified buffer,
regardless of read-only status.
-** You can now use `underline' in the color list of a face.
+** You can now use 'underline' in the color list of a face.
It serves as a last resort, and says to underline the face
(if previous color list elements can't be used).
-** The new function x-color-values returns the list of color values
+** The new function 'x-color-values' returns the list of color values
for a given color name (a string). The list contains three integers
which give the amounts of red, green and blue in the color: (R G B).
-** In run-at-time, 0 as the repeat interval means "don't repeat".
+** In 'run-at-time', 0 as the repeat interval means "don't repeat".
-** The variable trim-versions-without-asking has been renamed to
-delete-old-versions.
+** The variable 'trim-versions-without-asking' has been renamed to
+'delete-old-versions'.
-** The new function other-window-for-scrolling returns the choice of
+** The new function 'other-window-for-scrolling' returns the choice of
other window for C-M-v to scroll.
-** Note that the function fceiling was mistakenly documented as fceil before.
+** Note that the function 'fceiling' was mistakenly documented as 'fceil' before.
* Changes in cc-mode.el in Emacs 19.26:
@@ -3081,7 +3088,7 @@ other window for C-M-v to scroll.
Note that the custom indent function c-adaptive-block-open has been
removed as obsolete.
-** You can now specify the `hanginess' of closing braces. See
+** You can now specify the 'hanginess' of closing braces. See
c-hanging-braces-alist.
** Recognizes try and catch blocks in C++. They are given the
@@ -3102,9 +3109,9 @@ other window for C-M-v to scroll.
cc-mode.el.
** internal defun c-indent-via-language-element has been renamed
- c-indent-line for compatibility with c-mode.el and awk-mode.
+ c-indent-line for compatibility with c-mode.el and 'awk-mode'.
-** new buffer-local variable c-comment-start-regexp for (potential)
+** new buffer-local variable 'c-comment-start-regexp' for (potential)
flexibility in adding new modes based on cc-mode.el
@@ -3112,7 +3119,7 @@ other window for C-M-v to scroll.
* Changes in Emacs 19.25
The variable x-cross-pointer-shape (which didn't really exist) has
-been renamed to x-sensitive-text-pointer-shape, and now does exist.
+been renamed to 'x-sensitive-text-pointer-shape', and now does exist.
@@ -3207,7 +3214,7 @@ move the mouse over them.
** In a completion list buffer, the command RET now chooses the completion
that is around or next to point.
-** If you specify the foreground color for the `mode-line' face, and
+** If you specify the foreground color for the 'mode-line' face, and
mode-line-inverse-video is non-nil, then the default background color
is the usual foreground color.
@@ -3228,7 +3235,7 @@ auto-save (as has been possible in Emacs 19).
** C-x r d now runs the command delete-rectangle.
-** The new command imenu shows you a menu of interesting places in the
+** The new command 'imenu' shows you a menu of interesting places in the
current buffer and lets you select one; then it moves point there.
The definition of interesting places depends on the major mode, but
typically this includes function definitions and such. Normally,
@@ -3237,29 +3244,29 @@ event, it shows a mouse popup menu.
** You can make certain chosen buffers, that normally appear in a
separate window, appear in special frames of their own. To do this,
-set special-display-buffer-names to a list of buffer names; any buffer
+set 'special-display-buffer-names' to a list of buffer names; any buffer
whose name is in that list automatically gets a special frame when it
is to be displayed in another window.
A good value to try is ("*compilation*" "*grep*" "*TeX Shell*").
-More generally, you can set special-display-regexps to a list of regular
+More generally, you can set 'special-display-regexps' to a list of regular
expressions; then each buffer whose name matches any of those regular
expressions gets its own frame.
-The variable special-display-frame-alist specifies the frame
+The variable 'special-display-frame-alist' specifies the frame
parameters for these frames. It has a default value, so you don't
need to set it.
-** If you set sentence-end-double-space to nil, the fill commands
+** If you set 'sentence-end-double-space' to nil, the fill commands
expect just one space at the end of a sentence. (If you want the
sentence commands to accept single spaces, you must modify the regexp
-sentence-end also.)
+'sentence-end' also.)
** You can suppress the startup echo area message by adding text like
this to your .emacs file:
-(setq inhibit-startup-echo-area-message "YOUR-LOGIN-NAME")
+ (setq inhibit-startup-echo-area-message "YOUR-LOGIN-NAME")
Simply setting inhibit-startup-echo-area-message to your login name is
not sufficient to inhibit the message; Emacs explicitly checks whether
@@ -3272,7 +3279,7 @@ message for someone else.
** Outline minor mode now uses C-c C-o as a prefix instead of just C-c.
-** In Outline mode, hide-subtree is now C-c C-d. (It was C-c C-h; but
+** In Outline mode, 'hide-subtree' is now C-c C-d. (It was C-c C-h; but
that is now a conventional way to ask for help about C-c commands.)
** There are two additional commands in Outline mode.
@@ -3315,19 +3322,19 @@ buffer to show the last batch of output from the subprogram.
point, rather than the word that point is within.
*** Comint mode file name completion ignores those files that end with a
-string in the new variable comint-completion-fignore. This variable's
+string in the new variable 'comint-completion-fignore'. This variable's
default value is nil.
*** Shell mode uses the variable shell-completion-fignore to set
comint-completion-fignore. The default value is nil, but some
people prefer ("~" "#" "%").
-*** The function `comint-watch-for-password-prompt' can be used to
+*** The function 'comint-watch-for-password-prompt' can be used to
suppress echoing when a subprocess asks for a password. To use it,
do this:
-(add-hook 'comint-output-filter-functions
- 'comint-watch-for-password-prompt)
+ (add-hook 'comint-output-filter-functions
+ #'comint-watch-for-password-prompt)
*** You can use M-x shell-strip-ctrl-m to strip ^M characters from
process output.
@@ -3353,23 +3360,23 @@ GDB-style symbol completion. This will work with GDB 4.13.
** Rmail no longer gets new mail automatically when you visit an Rmail
file specified by name--not even if it is your primary Rmail file. To
-get new mail, type `g'. This feature is an advantage because you now
+get new mail, type 'g'. This feature is an advantage because you now
have a choice of whether to get new mail. (This change actually
occurred in an earlier version, but wasn't listed here then, since it
made the code do what the documentation already said.)
** Rmail now highlights certain fields automatically, when you use X
-windows. The variable rmail-highlighted-headers controls which
+windows. The variable 'rmail-highlighted-headers' controls which
fields.
-** If you set rmail-summary-window-size to an integer, Rmail uses
+** If you set 'rmail-summary-window-size' to an integer, Rmail uses
a window that many lines high for the summary buffer.
-** rmail-input-menu is a new command that visits an Rmail file letting
-you choose which file with a mouse menu. rmail-output-menu is
+** 'rmail-input-menu' is a new command that visits an Rmail file letting
+you choose which file with a mouse menu. 'rmail-output-menu' is
similar; it outputs the current message, using a mouse menu to choose
which Rmail file. These commands use the variables
-rmail-secondary-file-directory and rmail-secondary-file-regexp.
+'rmail-secondary-file-directory' and 'rmail-secondary-file-regexp'.
** The mh-e package has been changed substantially.
See the file ./MH-E-NEWS for details.
@@ -3384,8 +3391,8 @@ date in the calendar window and common three-month-related commands
when clicked elsewhere in the calendar window.
You can set up colored/shaded highlighting of holidays, diary entry
-dates, and today's date, by setting calendar-holiday-marker,
-diary-entry-marker, and calendar-today-marker to a face instead of a
+dates, and today's date, by setting 'calendar-holiday-marker',
+'diary-entry-marker', and 'calendar-today-marker' to a face instead of a
character. Using a special face is now the default if you are using a
window system.
@@ -3393,16 +3400,16 @@ window system.
features.
*** The appt alarm window stays for the full duration of
-appt-display-duration. It no longer disappears when you start typing
+'appt-display-duration'. It no longer disappears when you start typing
text.
*** You can change the way the appointment window is created/deleted by
-setting the variables appt-disp-window-function and
-appt-delete-window-function.
+setting the variables 'appt-disp-window-function' and
+'appt-delete-window-function'.
For instance, these variables can be set to functions that display
appointments in pop-up frames, which are lowered or iconified after
-appt-display-duration seconds.
+'appt-display-duration' seconds.
** desktop.el can now save a list of buffer-local variables,
and saves more global ones.
@@ -3423,8 +3430,8 @@ now be debugged with Edebug.
*** Edebug specifications may now contain body, &define, name, arg or
arglist, def-body, and def-form, to support definitions.
-*** edebug-all-defuns is renamed to edebug-all-defs.
-def-edebug-form-spec is replaced by def-edebug-form whose arguments
+*** edebug-all-defuns is renamed to 'edebug-all-defs'.
+def-edebug-form-spec is replaced by 'def-edebug-form' whose arguments
are unevaluated. The old names are still available for now.
*** Frequency counts and coverage data may be displayed for functions being
@@ -3436,13 +3443,13 @@ debugged.
*** A new "next" mode stops only after expression evaluation.
-*** A new command, top-level-nonstop, does not even stop for unwind-protect,
+*** A new command, 'top-level-nonstop', does not even stop for 'unwind-protect',
as top-level would.
* Changes in CC mode in Emacs 19.23.
-`cc-mode' provides ANSI C, K&R C, and ARM C++ language editing. It
+'cc-mode' provides ANSI C, K&R C, and ARM C++ language editing. It
represents the merge of c++-mode.el and c-mode.el. cc-mode provides a
new, more flexible indentation engine so that indentation
customization is more intuitive. There are two steps to calculating
@@ -3450,8 +3457,8 @@ indentation: first, CC mode analyzes the line for syntactic content,
then based on this content it applies user defined offsets and adds
this offset to the indentation of some previous line.
-The syntactic analysis determines if the line describes a `statement',
-`substatement', `class-open', `member-init-intro', etc. These are
+The syntactic analysis determines if the line describes a 'statement',
+'substatement', 'class-open', 'member-init-intro', etc. These are
described in detail with C-h v c-offsets-alist. You can change the
offsets interactively with C-c C-o (c-set-offsets), or
programmatically in your c-mode-common-hook, which is run both by
@@ -3489,75 +3496,75 @@ int foo (int i)
you could add the following to your .emacs file:
-(defun my-c-mode-common-hook ()
- (c-set-offset 'case-label 2)
- (c-set-offset 'statement-case-intro 2))
-(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
+ (defun my-c-mode-common-hook ()
+ (c-set-offset 'case-label 2)
+ (c-set-offset 'statement-case-intro 2))
+ (add-hook 'c-mode-common-hook #'my-c-mode-common-hook)
** New variables:
-c-offsets-alist contains an association list of syntactic symbols and
+'c-offsets-alist' contains an association list of syntactic symbols and
their relative offsets. Do a "C-h v c-offsets-alist" to get a list of
all syntactic symbols currently defined, and their meanings. You
should not change this variable directly; use the supplied interface
-commands c-set-offset and c-set-style.
+commands 'c-set-offset' and 'c-set-style'.
-c-mode-common-hook is run by both c-mode and c++-mode during their
+'c-mode-common-hook' is run by both 'c-mode' and 'c++-mode' during their
common initializations. You should put any customizations that are
the same for both C and C++ into this hook.
-The variable c-strict-semantics-p is used mainly for debugging. When
+The variable 'c-strict-semantics-p' is used mainly for debugging. When
non-nil, CC mode signals an error if it returns a syntactic symbol
that can't be found in c-offsets-alist.
If you want CC mode to echo the syntactic analysis for a particular
-line when you hit the TAB key, set c-echo-semantic-information-p to
+line when you hit the TAB key, set 'c-echo-semantic-information-p' to
non-nil.
-c-basic-offset controls the standard amount of offset for a level of
+'c-basic-offset' controls the standard amount of offset for a level of
indentation. You can set a syntactic symbol's offset to + or - as a
short-hand for positive or negative c-basic-offset.
-c-comment-only-line-offset lets you control indentation given to lines
+'c-comment-only-line-offset' lets you control indentation given to lines
which contain only a comment, in the case of C++ line style comments,
or the introduction to a C block comment. Comment-only lines at
column zero can be anchored there independent of the indentation given
to other comment-only lines.
-c-block-comments-indent-p controls the style of C block comment
+'c-block-comments-indent-p' controls the style of C block comment
re-indentation. If you put leading stars in front of comment
continuation lines, you should set this variable to nil.
-c-cleanup-list is a list describing certain C and C++ constructs to be
+'c-cleanup-list' is a list describing certain C and C++ constructs to be
"cleaned up" as they are typed, but only when the auto-newline feature
is turned on. In C++, make sure this variable contains at least
'scope-operator so that double colons will not be separated by a
newline.
-Colons (`:') and braces (`{` and `}') are special in C and C++. For
+Colons (':') and braces (`{` and `}') are special in C and C++. For
certain constructs, you may like them to hang on the right edge of the
code, or you may like them to start a new line of code. You can use
-the two variables c-hanging-braces-alist and c-hanging-colons-alist
+the two variables 'c-hanging-braces-alist' and 'c-hanging-colons-alist'
to control whether newlines are placed before and/or after colons and
braces when certain C and C++ constructs are entered. For example,
you can control whether the colon that introduces a C++ member
initialization list hangs on the right edge, starts a new line, or has
no newlines either before or after it.
-c-special-indent-hook is run after a line is indented by CC mode. You
+'c-special-indent-hook' is run after a line is indented by CC mode. You
can perform any custom indentations here.
-c-delete-function is the function that is called when a single
+'c-delete-function' is the function that is called when a single
character is deleted with the c-electric-delete command (DEL).
-c-electric-pound-behavior describes what happens when you enter the
+'c-electric-pound-behavior' describes what happens when you enter the
`#' that introduces a cpp macro.
-If c-tab-always-indent is neither t nor nil, then TAB inserts a tab
+If 'c-tab-always-indent' is neither t nor nil, then TAB inserts a tab
when within strings, comments, and cpp directives, but it reindents
the line unconditionally.
-c-inhibit-startup-warnings-p inhibits warnings about any old
+'c-inhibit-startup-warnings-p' inhibits warnings about any old
version of Emacs you might be running, which could be incompatible
with cc-mode.
@@ -3613,7 +3620,7 @@ convention of VariableNamesWithoutUnderscoresButEachWordCapitalized.
* Lisp programming changes in Emacs 19.23.
-** To pop up a dialog box, call x-popup-dialog.
+** To pop up a dialog box, call 'x-popup-dialog'.
It takes two arguments, POSITION and CONTENTS.
POSITION specifies which frame to place the dialog box over;
@@ -3635,12 +3642,12 @@ If your Emacs is not using an X toolkit, then it cannot display a
real dialog box; so instead it displays a pop-up menu in the center
of the frame.
-** y-or-n-p, yes-or-no-p and map-y-or-n-p now use menus or dialog boxes
+** 'y-or-n-p', 'yes-or-no-p' and 'map-y-or-n-p' now use menus or dialog boxes
to ask their question(s) if the command that is running was reached by
a mouse event.
If you want to control which way these functions work, bind the
-variable last-nonmenu-event around the call. These functions use the
+variable 'last-nonmenu-event' around the call. These functions use the
keyboard if that variable holds a keyboard event (actually, any
non-list); they use the mouse if that variable holds a mouse event
(actually, any list).
@@ -3649,49 +3656,49 @@ non-list); they use the mouse if that variable holds a mouse event
a text property. It specifies a face to use when the mouse is in the
range of text for which the property is specified.
-** When text has a non-nil `intangible' property, you cannot move point
+** When text has a non-nil 'intangible' property, you cannot move point
within it or right before it. If you try, point actually moves to the
-end of the intangible text. Note that this means that backward-char
+end of the intangible text. Note that this means that 'backward-char'
is a no-op when there is an intangible character to the left of point.
-** minibuffer-exit-hook is a new normal hook that is run when you
+** 'minibuffer-exit-hook' is a new normal hook that is run when you
exit the minibuffer.
-** The variable x-cross-pointer-shape specifies the cursor shape to use
+** The variable 'x-cross-pointer-shape' specifies the cursor shape to use
when the mouse is over text that has a mouse-face property.
-** The new variable interpreter-mode-alist specifies major modes to use
+** The new variable 'interpreter-mode-alist' specifies major modes to use
for shell scripts that specify a command interpreter. Its elements
look like (INTERPRETER . MODE); for example, ("perl" . perl-mode) is
one element present by default. This feature applies only when the
file name doesn't indicate which mode to use.
** If you use a minibuffer-only frame, set the variable
-minibuffer-auto-raise to t, and entering the minibuffer will then
+'minibuffer-auto-raise' to t, and entering the minibuffer will then
raise the minibuffer frame.
-** If pop-up-frames is t, display-buffer now looks for an existing
+** If 'pop-up-frames' is t, display-buffer now looks for an existing
window in any visible frame, showing the specified buffer, and uses
such a window in preference to making a new frame.
-** In the functions next-window, previous-window, next-frame,
-previous-frame, get-buffer-window, get-lru-window, get-largest-window
-and delete-windows-on, if you specify `visible' for the last argument,
+** In the functions 'next-window', 'previous-window', 'next-frame',
+'previous-frame', 'get-buffer-window', 'get-lru-window', 'get-largest-window'
+and 'delete-windows-on', if you specify 'visible' for the last argument,
it means to consider all visible frames.
** Mouse events now give the X and Y coordinates in pixels, rather than
in characters. You can convert these values to characters by dividing by
the values of (frame-char-width) and (frame-char-height).
-** The new functions mouse-pixel-position and set-mouse-pixel-position
+** The new functions 'mouse-pixel-position' and 'set-mouse-pixel-position'
read and set the mouse position in units of pixels. The existing
-functions mouse-position and set-mouse-position continue to work with
+functions 'mouse-position' and 'set-mouse-position' continue to work with
units of characters.
-** The new function compute-motion is useful for computing the width
+** The new function 'compute-motion' is useful for computing the width
of certain text when it is displayed.
-** The function vertical-motion now takes an option second argument WINDOW
+** The function 'vertical-motion' now takes an option second argument WINDOW
which says which window to use for the display calculations.
vertical-motion always operates on the current buffer.
@@ -3699,7 +3706,7 @@ It is ok to specify a window displaying some other buffer.
Then vertical-motion uses the width, hscroll and display-table of
the specified window, but still scans the current buffer.
-** An error no longer sets last-command to t; the value of last-command
+** An error no longer sets 'last-command' to t; the value of last-command
does reflect the previous command (the one that got an error).
If you do not want a particular command to be recognized as the
@@ -3728,20 +3735,20 @@ The undo and yank commands do this.
** If you specify an explicit title for a new frame when you create it,
the title is used as the resource name when looking up X resources to
control the shape of that frame. If you don't specify the frame title,
-the value of x-resource-name is used, as before.
+the value of 'x-resource-name' is used, as before.
** The frame parameter user-position, if non-nil, says that the user
has specified the frame position. Emacs reports this to the window
manager, to tell it not to override the position that the user
specified.
-** Major modes can now set change-major-mode-hook to arrange for state
+** Major modes can now set 'change-major-mode-hook' to arrange for state
to be cleaned up when the user switches to a new major mode. The function
-kill-all-local-variables runs this hook. For best results, make the hook a
+'kill-all-local-variables' runs this hook. For best results, make the hook a
buffer-local variable so that it will disappear after doing its job and will
not interfere with the subsequent major mode.
-** The new variable overriding-local-map, if non-nil, specifies a keymap
+** The new variable 'overriding-local-map', if non-nil, specifies a keymap
that overrides the current local map, all minor mode keymaps, and all
text property keymaps. Incremental search uses this feature to override
all other keymaps temporarily.
@@ -3756,7 +3763,7 @@ key sequences that run the same command COMMAND. Displaying the menu
automatically creates and updates the sublist when appropriate; you
need never set these up yourself.
-lookup-key, key-binding, and similar functions return just COMMAND,
+'lookup-key', 'key-binding', and similar functions return just COMMAND,
not the whole binding.
To precompute this information for a given keymap, you can do
@@ -3783,7 +3790,7 @@ from the specifications above.)
If you pass the value of overriding-local-map as KEYMAP, where-is-internal
searches in exactly the same was as command execution does.
-** Use the macro define-derived-mode to define a new major mode that
+** Use the macro 'define-derived-mode' to define a new major mode that
inherits the definition of another major mode. Here's how to define a
command named hypertext-mode that inherits from the command text-mode:
@@ -3800,11 +3807,11 @@ its own mode hook. All are given names made by appending a suffix
to the name of the new mode.
** A syntax table can now inherit the data for some characters from
-standard-syntax-table, while specifying other characters itself.
+'standard-syntax-table', while specifying other characters itself.
Syntax code 13 means "inherit this character from the standard syntax
-table." In modify-syntax-entry, the character `@' represents this code.
+table." In 'modify-syntax-entry', the character `@' represents this code.
-The function `make-syntax-table' now creates a syntax table which
+The function 'make-syntax-table' now creates a syntax table which
inherits all letters and control characters (0 to 31 and 128 to 255)
from the standard syntax table, while copying the other characters
from the standard syntax table. Most syntax tables in Emacs are set
@@ -3815,15 +3822,15 @@ sets with additional alphabetic characters in the range 128 to 255.
Just changing the standard syntax for these characters affects all
major modes.
-** The new function transpose-regions swaps two regions of the buffer.
+** The new function 'transpose-regions' swaps two regions of the buffer.
It preserves the markers in those two regions, so that they stay with
the surrounding text as it is swapped.
-** revert-buffer now runs before-revert-hook at the beginning and
-after-revert-hook at the end. These can be used by minor modes
+** 'revert-buffer' now runs 'before-revert-hook' at the beginning and
+'after-revert-hook' at the end. These can be used by minor modes
that need to clean up state variables.
-** The new function get-char-property is like get-text-property, but
+** The new function 'get-char-property' is like 'get-text-property', but
checks for overlays with properties as well as for text properties.
It checks for overlays first, in order of descending priority, and
text properties last.
@@ -3832,9 +3839,9 @@ get-char-property allows windows as the OBJECT argument, as well
as buffers and strings. If you specify a window, then only overlays
active on that window are considered.
-** Overlays can have the `invisible' property.
+** Overlays can have the 'invisible' property.
-** The function insert-file-contents now takes an optional fifth
+** The function 'insert-file-contents' now takes an optional fifth
argument called REPLACE. If this is t, it means to replace the
contents of the buffer (actually, just the accessible portion)
with the contents of the file.
@@ -3843,72 +3850,72 @@ This is better than simply deleting and inserting the whole thing
because (1) it preserves some marker positions and (2) it puts less
data in the undo list.
-** The variable inhibit-first-line-modes-regexps specifies classes of
+** The variable 'inhibit-first-line-modes-regexps' specifies classes of
file names for which -*- on the first line should not be looked for.
-** The variables before-change-functions and after-change-functions
+** The variables 'before-change-functions' and 'after-change-functions'
hold lists of functions to call before and after a change in the
buffer's text. They work much like before-change-function and
after-change-function, except that they hold a list of functions
instead of just one.
-These variables will eventually make before-change-function and
-after-change-function obsolete.
+These variables will eventually make 'before-change-function' and
+'after-change-function' obsolete.
-** The variable kill-buffer-query-functions holds a list of functions
+** The variable 'kill-buffer-query-functions' holds a list of functions
to be called with no arguments when a buffer is about to be killed.
(That buffer is the current buffer when the function is called.)
If any of the functions returns nil, the buffer is not killed
(and the remaining functions in the list are not called).
-** The variable kill-emacs-query-functions holds a list of functions
+** The variable 'kill-emacs-query-functions' holds a list of functions
to be called with no arguments when you ask to exit Emacs.
If any of the functions returns nil, the exit is canceled
(and the remaining functions in the list are not called).
-** The argument for buffer-disable-undo is now optional,
-like the argument for buffer-enable-undo.
+** The argument for 'buffer-disable-undo' is now optional,
+like the argument for 'buffer-enable-undo'.
-** The new variable system-configuration holds the canonical three-part
+** The new variable 'system-configuration' holds the canonical three-part
GNU configuration name for which Emacs was built.
-** The function system-name now tries harder to return a fully qualified
+** The function 'system-name' now tries harder to return a fully qualified
domain name.
-** The variable emacs-major-version holds the major version number
+** The variable 'emacs-major-version' holds the major version number
of Emacs. (Currently 19.)
-** The variable emacs-minor-version holds the minor version number
+** The variable 'emacs-minor-version' holds the minor version number
of Emacs. (Currently 23.)
-** The default value of comint-input-autoexpand is now nil.
+** The default value of 'comint-input-autoexpand' is now nil.
However, Shell mode sets it from the value of shell-input-autoexpand,
-whose default value is `history'.
+whose default value is 'history'.
-** The new function set-process-window-size specifies the terminal window
+** The new function 'set-process-window-size' specifies the terminal window
size for a subprocess. On some systems it sends the subprocess a signal
to let it know that the size has changed.
** %P is a new way to display a percentage in the mode line. It
displays the percentage of the buffer text that is above the *bottom*
of the window (which includes the text visible, in the window as well
-as the text above the top). It displays `Top' as well as the
+as the text above the top). It displays 'Top' as well as the
percentage if the top of the buffer is visible on screen.
** %+ in the mode line specs displays `*' if the buffer is modified,
-and otherwise `-'. It never displays `%', as `%*' would do; whether the
+and otherwise '-'. It never displays `%', as `%*' would do; whether the
buffer is read-only has no effect on %+.
-** The new functions ffloor, fceiling, fround and ftruncate take a
+** The new functions 'ffloor', 'fceiling', 'fround' and 'ftruncate' take a
floating point argument and return a floating point result whose value
is a nearby integer. ffloor returns the nearest integer below; fceiling,
the nearest integer above; ftruncate, the nearest integer in the
direction towards zero; fround, the nearest integer.
-** Setting `print-escape-newlines' to a non-nil value now also makes
+** Setting 'print-escape-newlines' to a non-nil value now also makes
formfeeds print as ``\f''.
-** auto-mode-alist now has a new feature. If an element has the form
+** 'auto-mode-alist' now has a new feature. If an element has the form
(REGEXP FUNCTION t), and REGEXP matches the file name, then after calling
FUNCTION, Emacs deletes the part of the file name that matched REGEXP
and then searches auto-mode-alist again for a new match.
@@ -3917,26 +3924,26 @@ This is useful for uncompression packages. An entry of this sort for
.gz can uncompress the file and then put the uncompressed file in the
proper mode according to the name sans .gz.
-** The new function emacs-pid returns the process ID number of Emacs.
+** The new function 'emacs-pid' returns the process ID number of Emacs.
-** user-login-name now consistently checks the LOGNAME environment
-variable before USER. user-original-login-name is obsolete, since it
+** 'user-login-name' now consistently checks the LOGNAME environment
+variable before USER. 'user-original-login-name' is obsolete, since it
provides the same functionality. To ignore the environment variables,
use user-real-login-name.
** There is a more general way of handling the system-specific X
-keysyms. Set the variable system-key-alist to an alist containing
+keysyms. Set the variable 'system-key-alist' to an alist containing
elements of the form (CODE . SYMBOL), where CODE is the numeric keysym
code minus the "vendor specific" bit, and symbol is the name for the
function key.
-** You can use the variable command-line-functions to set up functions
+** You can use the variable 'command-line-functions' to set up functions
to process unrecognized command line arguments. The variable's value
should be a list of functions of no arguments. The functions are
called successively until one of them returns non-nil.
-Each function should access the free variables argi (the current
-argument) and command-line-args-left (the remaining arguments). The
+Each function should access the free variables 'argi' (the current
+argument) and 'command-line-args-left' (the remaining arguments). The
function should return non-nil only if it recognizes and processes the
argument in argi. If it does so, it may consume following arguments
as well by removing them from command-line-args-left.
@@ -3944,14 +3951,14 @@ as well by removing them from command-line-args-left.
** There's a new way for a magic file name handler to run a primitive
and inhibit handling of the file name. Here is how to do it:
-(let ((inhibit-file-name-handlers
- (cons 'ange-ftp-file-handler
- (and (eq inhibit-file-name-operation operation)
- inhibit-file-name-handlers)))
- (inhibit-file-name-operation operation))
- (apply this-operation args))
+ (let ((inhibit-file-name-handlers
+ (cons 'ange-ftp-file-handler
+ (and (eq inhibit-file-name-operation operation)
+ inhibit-file-name-handlers)))
+ (inhibit-file-name-operation operation))
+ (apply this-operation args))
-The function find-file-name-handler now takes two arguments. The
+The function 'find-file-name-handler' now takes two arguments. The
second argument is OPERATION, the operation for which the handler is
being sought.
@@ -3961,11 +3968,11 @@ it is not. There is simply no way for find-file-name-handler to do
the right thing without receiving the proper value for its second
argument.
-** The variable completion-regexp-list affects the completion
-primitives try-completion and all-completions. They consider
+** The variable 'completion-regexp-list' affects the completion
+primitives 'try-completion' and 'all-completions'. They consider
only the possible completions that match each regexp in the list.
-** Case conversion in the function replace-match has been changed.
+** Case conversion in the function 'replace-match' has been changed.
The old behavior was this: if any word in the old text was
capitalized, replace-match capitalized each word of the replacement
@@ -3977,24 +3984,24 @@ replace-match capitalizes the first word of the replacement text.
** You can now specify a case table with CANON non-nil and EQV nil.
Then the EQV part of the case table is deduced from CANON.
-** The new function minibuffer-prompt takes no arguments and returns
+** The new function 'minibuffer-prompt' takes no arguments and returns
the current minibuffer prompt string.
-The new function minibuffer-prompt-width takes no arguments and
+The new function 'minibuffer-prompt-width' takes no arguments and
returns the display width of the minibuffer prompt string.
-** The new function frame-first-window returns the window at the
+** The new function 'frame-first-window' returns the window at the
upper left corner of a given frame.
-** wholenump is a new alias for natnump.
+** 'wholenump' is a new alias for 'natnump'.
-** The variable installation-directory, if non-@code{nil}, names a
-directory within which to look for the `lib-src' and `etc'
+** The variable 'installation-directory', if non-@code{nil}, names a
+directory within which to look for the 'lib-src' and 'etc'
subdirectories. This is non-nil when Emacs can't find those
directories in their standard installed locations, but can find them
near where the Emacs executable was found.
-** invocation-name and invocation-directory are now variables as well
+** 'invocation-name' and 'invocation-directory' are now variables as well
as functions. The variable values are the same values that the
functions return: the Emacs program name sans directories, and the
directory it was found in. (invocation-directory may be nil, if Emacs
@@ -4019,9 +4026,9 @@ by building Emacs.
** The mouse click M-mouse-2 now inserts the current secondary
selection (from Emacs or any other X client) where you click.
It does not move point.
-This command is called mouse-yank-secondary.
+This command is called 'mouse-yank-secondary'.
-mouse-kill-secondary no longer has a key binding by default.
+'mouse-kill-secondary' no longer has a key binding by default.
Clicking M-mouse-3 (mouse-secondary-save-then-kill) twice
may be a convenient enough way of killing the secondary selection.
Or perhaps there should be a keyboard binding for killing the
@@ -4029,13 +4036,13 @@ secondary selection. Any suggestions?
** New packages:
-*** `icomplete' provides character-by-character information
+*** 'icomplete' provides character-by-character information
about what you could complete if you type TAB.
-*** `avoid' moves the mouse away from point so that it doesn't hide
+*** 'avoid' moves the mouse away from point so that it doesn't hide
your typing.
-*** `shadowfile' helps you update files that are supposed to be stored
+*** 'shadowfile' helps you update files that are supposed to be stored
identically in different places (perhaps on different machines).
** C-h p now knows about four additional keywords: data, faces, mouse,
@@ -4058,13 +4065,13 @@ This feature was added in 19.21 but did not work smoothly enough.
** Display of buffers with text properties is much faster now.
-** The feature previously announced whereby `insert' does not inherit
+** The feature previously announced whereby 'insert' does not inherit
text properties from surrounding text was not fully implemented
-before; but now it is. use `insert-and-inherit' if you wish to
+before; but now it is. use 'insert-and-inherit' if you wish to
inherit sticky properties from the surrounding text.
-** The functions next-property-change, previous-property-change,
-next-single-property-change, and previous-single-property-change
+** The functions 'next-property-change', 'previous-property-change',
+'next-single-property-change', and 'previous-single-property-change'
now take one additional optional argument LIMIT that is a position at
which to stop scanning. If scan ends without finding the property
change sought, these functions return the specified limit.
@@ -4151,7 +4158,7 @@ is expected.
To define case-conversion for these characters for ISO 8859/1,
load the library iso-syntax. (This is not new.)
-** M-TAB in Text mode now runs the command ispell-complete-word
+** M-TAB in Text mode now runs the command 'ispell-complete-word'
which performs completion using the spelling dictionary.
The spelling correction submenu now includes this command
@@ -4162,7 +4169,7 @@ beginning of a word.
** In incremental search, you can use M-y to yank the most recent kill
into the search string.
-** The new function ispell-message checks the spelling of a message
+** The new function 'ispell-message' checks the spelling of a message
you are about to send or post. It ignores text cited from other
messages.
@@ -4188,8 +4195,8 @@ Indented lines continue the paragraph that is in progress. This makes
the user option variable adaptive-fill-mode have its intended effect.
** Local variable specifications in files for variables whose names end
-in `-hook' and `-function' are now controlled by the variable
-`enable-local-eval', just like the `eval' variable.
+in '-hook' and '-function' are now controlled by the variable
+'enable-local-eval', just like the 'eval' variable.
** C-x r j (jump-to-register) when restoring a frame configuration now
makes all unwanted frames (existing frames not mentioned in the
@@ -4199,7 +4206,7 @@ If you want to delete these unwanted frames, use a prefix argument for
C-x r j.
** You can customize the calendar to display weeks beginning on
-Monday: set the variable `calendar-week-start-day' to 1.
+Monday: set the variable 'calendar-week-start-day' to 1.
** Rmail changes.
@@ -4220,7 +4227,7 @@ There are new menu bar items for completion/input/output/signal commands.
Input behavior is configurable. Variables control whether some windows
showing the buffer scroll to the bottom before insertion. These are
-`comint-scroll-to-bottom-on-input' and `before-change-function'. By default,
+'comint-scroll-to-bottom-on-input' and 'before-change-function'. By default,
insertion causes the selected window to scroll to the bottom before insertion
occurs.
@@ -4228,33 +4235,33 @@ Subprocess output now keeps point at the end of the buffer in each
window individually if point was already at the end of the buffer in
that window.
-If `comint-scroll-show-maximum-output' is non-nil (which is the
+If 'comint-scroll-show-maximum-output' is non-nil (which is the
default), then scrolling due to arrival of output tries to place the
last line of text at the bottom line of the window, so as to show as
much useful text as possible. (This mimics the scrolling behavior of
many terminals.)
-By setting `comint-scroll-to-bottom-on-output', you can opt for having
+By setting 'comint-scroll-to-bottom-on-output', you can opt for having
point jump to the end of the buffer whenever output arrives--no matter
-where in the buffer point was before. If the value is `this', point
-jumps in the selected window. If the value is `all', point jumps in
-each window that shows the comint buffer. If the value is `other',
+where in the buffer point was before. If the value is 'this', point
+jumps in the selected window. If the value is 'all', point jumps in
+each window that shows the comint buffer. If the value is 'other',
point jumps in all nonselected windows that show the current buffer.
The default value is nil, which means point does not jump to the end.
Input history insertion is configurable. A variable controls whether only the
first instance of successive identical inputs is stored in the input history.
-This is `comint-input-ignoredups'.
+This is 'comint-input-ignoredups'.
Completion (bound to TAB) is now more general. Depending on context,
completion now operates on the input history, on command names, or (as
before) on filenames.
Filename completion is configurable. Variables control whether
-file/directory suffix characters are added (`comint-completion-addsuffix'),
+file/directory suffix characters are added ('comint-completion-addsuffix'),
whether shortest completion is acceptable when no further unambiguous
-completion is possible (`comint-completion-recexact'), and the timing of
-completion candidate listing (`comint-completion-autolist').
+completion is possible ('comint-completion-recexact'), and the timing of
+completion candidate listing ('comint-completion-autolist').
Comint mode now provides history expansion. Insert input using `!'
and `^', in the same syntax that typical shells use; then type TAB.
@@ -4264,12 +4271,12 @@ comint buffer in place of the original input.
History references in the input may be expanded before insertion into
the input ring, or on input to the interpreter (and therefore
-visibly). The variable `comint-input-autoexpand' specifies which.
+visibly). The variable 'comint-input-autoexpand' specifies which.
You can make the SPC key perform history expansion by binding
-SPC to the command `comint-magic-space'.
+SPC to the command 'comint-magic-space'.
-The command `comint-dynamic-complete-variable' does variable name
+The command 'comint-dynamic-complete-variable' does variable name
completion using the environment variables as set within Emacs. The
variables controlling filename completion apply to variable name
completion too. This command is normally available through the menu
@@ -4283,54 +4290,54 @@ on output groups (i.e., shell prompt plus associated shell output).
TAB now completes commands, as well as file names and expand history.
Commands are searched for along the path that Emacs has on startup.
-C-c C-f now moves forward a command (`shell-forward-command') and
-C-c C-b now moves backward a command (`shell-backward-command').
+C-c C-f now moves forward a command ('shell-forward-command') and
+C-c C-b now moves backward a command ('shell-backward-command').
Command completion is configurable. The variables controlling
filename completion in comint mode apply, together with a variable
controlling whether to restrict possible completions to only files
-that are executable (`shell-command-execonly').
+that are executable ('shell-command-execonly').
The input history is initialized from the file name given in the
-variable `shell-input-ring-file-name'--normally `.history' in your
+variable 'shell-input-ring-file-name'--normally `.history' in your
home directory.
Directory tracking is more robust. It can cope with command sequences
and forked commands, and can detect the failure of directory changing
commands in most circumstances. It's still not infallible, of course.
-You can now configure the behavior of `pushd'. Variables control
-whether `pushd' behaves like `cd' if no argument is given
-(`shell-pushd-tohome'), pop rather than rotate with a numeric argument
-(`shell-pushd-dextract'), and only add directories to the directory
-stack if they are not already on it (`shell-pushd-dunique'). The
+You can now configure the behavior of 'pushd'. Variables control
+whether 'pushd' behaves like 'cd' if no argument is given
+('shell-pushd-tohome'), pop rather than rotate with a numeric argument
+('shell-pushd-dextract'), and only add directories to the directory
+stack if they are not already on it ('shell-pushd-dunique'). The
configuration you choose should match the underlying shell, of course.
* Emacs Lisp programming changes in Emacs 19.20.
-** A new function `remove-hook' is now used to remove a hook that you might
-have added with `add-hook'.
+** A new function 'remove-hook' is now used to remove a hook that you might
+have added with 'add-hook'.
-** There is now a Lisp pretty-printer in the library `pp'.
+** There is now a Lisp pretty-printer in the library 'pp'.
** The partial Common Lisp support has been entirely reimplemented.
-** When you insert text using `insert', `insert-before-markers' or
-`insert-buffer-substring', text properties are no longer inherited
+** When you insert text using 'insert', 'insert-before-markers' or
+'insert-buffer-substring', text properties are no longer inherited
from the surrounding text.
When you want to inherit text properties, use the new functions
-`insert-and-inherit' or `insert-before-markers-and-inherit'.
+'insert-and-inherit' or 'insert-before-markers-and-inherit'.
The self-inserting character command does do inheritance.
** Frame creation hooks.
-The function make-frame now runs the normal hooks
-before-make-frame-hook and after-make-frame-hook.
+The function 'make-frame' now runs the normal hooks
+'before-make-frame-hook' and 'after-make-frame-hook'.
-** You can now use function-key-map to make a key an alias for other
+** You can now use 'function-key-map' to make a key an alias for other
key sequences that can vary depending on circumstances. To do this,
give the key a definition in function-key-map which is a function
rather than a specific expansion key sequence.
@@ -4339,22 +4346,22 @@ If the function reads input itself, it can have the effect of altering
the event that follows. For example, here's how to define C-c h to
turn the character that follows into a hyper character:
-(define-key function-key-map "\C-ch" 'hyperify)
+ (define-key function-key-map "\C-ch" 'hyperify)
-(defun hyperify (prompt)
- (let ((e (read-event)))
- (vector (if (numberp e)
- (logior (ash 1 20) e)
- (if (memq 'hyper (event-modifiers e))
- e
- (add-event-modifier "H-" e))))))
+ (defun hyperify (prompt)
+ (let ((e (read-event)))
+ (vector (if (numberp e)
+ (logior (ash 1 20) e)
+ (if (memq 'hyper (event-modifiers e))
+ e
+ (add-event-modifier "H-" e))))))
-(defun add-event-modifier (string e)
- (let ((symbol (if (symbolp e) e (car e))))
- (setq symbol (intern (concat string (symbol-name symbol))))
- (if (symbolp e)
- symbol
- (cons symbol (cdr e)))))
+ (defun add-event-modifier (string e)
+ (let ((symbol (if (symbolp e) e (car e))))
+ (setq symbol (intern (concat string (symbol-name symbol))))
+ (if (symbolp e)
+ symbol
+ (cons symbol (cdr e)))))
The character translation function gets one argument, which is the
prompt that was specified in read-key-sequence--or nil if the key
@@ -4367,8 +4374,8 @@ New low-level Lisp features make it possible to write Lisp programs to
save text properties in files, and read text properties from files.
You can program any file format you like.
-The variable `write-region-annotation-functions' should contain a list
-of functions to be run by `write-region' to encode text properties in
+The variable 'write-region-annotation-functions' should contain a list
+of functions to be run by 'write-region' to encode text properties in
some fashion as annotations to the text that is written.
Each function in the list is called with two arguments: the start and
@@ -4384,13 +4391,13 @@ add there.
Each list returned by one of these functions must be already sorted in
increasing order by POSITION. If there is more than one function,
-`write-region' merges the lists destructively into one sorted list.
+'write-region' merges the lists destructively into one sorted list.
-When `write-region' actually writes the text from the buffer to the
+When 'write-region' actually writes the text from the buffer to the
file, it intermixes the specified annotations at the corresponding
positions. All this takes place without modifying the buffer.
-The variable `after-insert-file-functions' should contain a list of
+The variable 'after-insert-file-functions' should contain a list of
functions to be run each time a file's contents have been inserted into
a buffer. Each function receives one argument, the length of the
inserted text; point indicates the start of that text. The function
@@ -4400,7 +4407,7 @@ value returned by one function is used as the argument to the next.
These functions should always return with point at the beginning of
the inserted text.
-The intended use of `after-insert-file-functions' is for converting
+The intended use of 'after-insert-file-functions' is for converting
some sort of textual annotations into actual text properties. But many
other uses may be possible.
@@ -4453,16 +4460,16 @@ mode might want to set this to '("." "(" ")") or some such.
** Comint output hook.
-There is now a hook, comint-output-filter-hook, that is run-hooks'ed by the
-output filter, comint-output-filter. This is useful for scrolling (see
+There is now a hook, 'comint-output-filter-hook', that is run by the
+output filter, 'comint-output-filter'. This is useful for scrolling (see
below), but also things like processing output for specific text, output
highlighting, etc.
So that such output processing may be done efficiently, there is a new
-variable, comint-last-output-start, that records the position of the start of
+variable, 'comint-last-output-start', that records the position of the start of
the last output inserted into the buffer (effectively the previous value
of process-mark). Output processing functions should process the text
-between comint-last-output-start (or perhaps the beginning of the line that
+between 'comint-last-output-start' (or perhaps the beginning of the line that
the position lies on) and process-mark.
** Comint scrolling.
@@ -4478,8 +4485,8 @@ possible. But, then again, there is a comint-show-maximum-output command.
The input following point is not deleted when moving around the input history
(with M-p etc.). Emacs maintainers may not like this. However, I feel this
-is a useful feature. The simple remedy is to put end-of-line in before
-delete-region in comint-previous-matching-input.
+is a useful feature. The simple remedy is to put 'end-of-line' in before
+'delete-region' in 'comint-previous-matching-input'.
The input history retrieval commands still wrap-around the input ring, unlike
Emacs command history.
@@ -4495,23 +4502,23 @@ sessions.
** Another simpler package saveplace.el records your position in each
file when you kill its buffer (or kill Emacs), and jumps to the same
position when you visit the file again (even in another Emacs
-session). Use `toggle-save-place' to turn on place-saving in a given file;
+session). Use 'toggle-save-place' to turn on place-saving in a given file;
use (setq-default save-place t) to turn it on for all files.
** In Outline mode, you can now customize how to compute the level of a
-heading line. Set `outline-level' to a function of no arguments which
+heading line. Set 'outline-level' to a function of no arguments which
returns the level, assuming point is at the beginning of a heading
line.
** You can now specify the prefix key to use for Outline minor mode.
-(The default is C-c.) Set the variable outline-minor-mode-prefix to
+(The default is C-c.) Set the variable 'outline-minor-mode-prefix' to
the key sequence you want to use (as a string or vector).
** In Bibtex mode, C-c e has been changed to C-c C-b. This is because
C-c followed by a letter is reserved for users.
-** The `mod' function is no longer an alias for `%', but is a separate function
-that yields a result with the same sign as the divisor. `floor' now takes an
+** The 'mod' function is no longer an alias for `%', but is a separate function
+that yields a result with the same sign as the divisor. 'floor' now takes an
optional second argument, which divides the first argument before the floor is
taken.
@@ -4542,7 +4549,7 @@ does for windows.
command history.
** If the directory containing the Emacs executable has a sibling named
-`lisp', that `lisp' directory is added to the end of `load-path'
+'lisp', that 'lisp' directory is added to the end of 'load-path'
(provided you don't override the normal value with the EMACSLOADPATH
environment variable). This feature may make it easier to move
an installed Emacs from place to place.
@@ -4568,9 +4575,9 @@ COMPATIBLE with the old (version 18) format. See the documentation of
the variable calendar-holidays for details of the new, improved
format.
-The hook `diary-display-hook' has been split into two:
+The hook 'diary-display-hook' has been split into two:
diary-display-hook which should be used ONLY for the display and
-`diary-hook' which should be used for appointment notification. If
+'diary-hook' which should be used for appointment notification. If
diary-display-hook is nil (the default), simple-diary-display is
used. This allows the diary hooks to be correctly set with add-hook.
@@ -4592,23 +4599,23 @@ events, which are then discarded if not defined. Triple events that
are not defined convert to the corresponding double event; if that is
also not defined, it may convert further.
-** The new function event-click-count returns the number of clicks,
+** The new function 'event-click-count' returns the number of clicks,
from an event which is a list. It is 1 for an ordinary click, drag,
or button-down event, 2 for a double event, and 3 or more for a triple
event.
-** The new function previous-frame is like next-frame, but moves
+** The new function 'previous-frame' is like 'next-frame', but moves
around through the set of existing frames in the opposite order.
-** The post-command-hook now runs even after commands that get an error
+** The 'post-command-hook' now runs even after commands that get an error
and return to top level. As a consequence of the same change, this
hook also runs before Emacs reads the first command. That might sound
-paradoxical, as if this hook were the same as the pre-command-hook.
+paradoxical, as if this hook were the same as the 'pre-command-hook'.
Actually, they are not similar; the latter runs before *execution* of
a command, but after it has been read.
** You can turn off the text property hooks that run when point moves
-to certain places in the buffer, by binding inhibit-point-motion-hooks
+to certain places in the buffer, by binding 'inhibit-point-motion-hooks'
to a non-nil value.
** Inserting a string with no text properties into the buffer normally
@@ -4642,7 +4649,7 @@ rear-sticky for the property, and the property is non-nil, it
dominates. Otherwise, the following character's property value is
used if it is front-sticky for that property.
-** If you give a character a non-nil `invisible' text property, the
+** If you give a character a non-nil 'invisible' text property, the
character does not appear on the screen. This works much like
selective display.
@@ -4652,12 +4659,12 @@ versions.
** In Info, when you go to a node, it runs the normal hook
Info-selection-hook.
-** You can use the new function `invocation-directory' to get the name
+** You can use the new function 'invocation-directory' to get the name
of the directory containing the Emacs executable that was run.
-** Entry to the minibuffer runs the normal hook minibuffer-setup-hook.
+** Entry to the minibuffer runs the normal hook 'minibuffer-setup-hook'.
-** The new function minibuffer-window-active-p takes one argument, a
+** The new function 'minibuffer-window-active-p' takes one argument, a
minibuffer window, and returns t if the window is currently active.
@@ -4668,7 +4675,7 @@ minibuffer window, and returns t if the window is currently active.
you can select a completion by clicking mouse button 2
on that completion.
-** Use the command `list-faces-display' to display a list of
+** Use the command 'list-faces-display' to display a list of
all the currently defined faces, showing what they look like.
** Menu bar items from local maps now come after the usual items.
@@ -4690,9 +4697,9 @@ suitable menu bar items to other major modes.
** The key binding C-x a C-h has been eliminated.
This is because it got in the way of the general feature of typing
C-h after a prefix character. If you want to run
-inverse-add-global-abbrev, you can use C-x a - or C-x a i g instead.
+'inverse-add-global-abbrev', you can use C-x a - or C-x a i g instead.
-** If you set the variable `rmail-mail-new-frame' to a non-nil value,
+** If you set the variable 'rmail-mail-new-frame' to a non-nil value,
all the Rmail commands to send mail make a new frame to do it in.
When you send the message, or use the menu bar command not to send it,
that frame is deleted.
@@ -4703,43 +4710,43 @@ the message to it in Rmail format if it is an Rmail file, and in
inbox file format otherwise. C-o and o are different only when you
specify a new file.
-** The function `copy-face' now takes an optional fourth argument
+** The function 'copy-face' now takes an optional fourth argument
NEW-FRAME. If you specify this, it copies the definition of face
OLD-FACE on frame FRAME to face NEW-NAME on frame NEW-FRAME.
** A local map can now cancel out one of the global map's menu items.
-Just define that subcommand of the menu item with `undefined'
-as the definition. For example, this cancels out the `Buffers' item
+Just define that subcommand of the menu item with 'undefined'
+as the definition. For example, this cancels out the 'Buffers' item
for the current major mode:
(local-set-key [menu-bar buffer] 'undefined)
** To put global items at the end of the menu bar, use the new variable
-`menu-bar-final-items'. It should be a list of symbols--event types
+'menu-bar-final-items'. It should be a list of symbols--event types
bound in the menu bar. The menu bar items for these symbols are
moved to the end.
-** The list returned by `buffer-local-variables' now contains cons-cell
+** The list returned by 'buffer-local-variables' now contains cons-cell
elements of the form (SYMBOL . VALUE) only for buffer-local variables
that have values. For unbound buffer-local variables, the variable
name (symbol) appears directly as an element of the list.
-** The `modification-hooks' property of a character no longer affects
+** The 'modification-hooks' property of a character no longer affects
insertion; it runs only for deletion and modification of the character.
-To detect insertion, use `insert-in-front-hooks' and
-`insert-behind-hooks' properties. The former runs when text is
+To detect insertion, use 'insert-in-front-hooks' and
+'insert-behind-hooks' properties. The former runs when text is
inserted immediately preceding the character that has the property;
the latter runs when text is inserted immediately following the
character.
** Buffer modification now runs hooks belonging to overlays as well as
hooks belonging to characters. If an overlay has a
-`modification-hooks' property, it applies to any change to text in the
+'modification-hooks' property, it applies to any change to text in the
overlay, and any insertion within the overlay. If the overlay has a
-`insert-in-front-hooks' property, it runs for insertion at the
+'insert-in-front-hooks' property, it runs for insertion at the
beginning boundary of the overlay. If the overlay has an
-`insert-behind-hooks' property, it runs for insertion at the end
+'insert-behind-hooks' property, it runs for insertion at the end
boundary of the overlay.
The values of these properties should be lists of functions. Each
@@ -4747,7 +4754,7 @@ function is called, receiving as arguments the overlay in question,
followed by the bounds of the range being modified.
** The new `-name NAME' option directs Emacs to search for its X
-resources using the name `NAME', and sets the title of the initial
+resources using the name 'NAME', and sets the title of the initial
frame. This argument was added for consistency with other X clients.
** The new `-xrm DATABASE' option tells Emacs to treat the string
@@ -4786,7 +4793,7 @@ Emacs searches for X resources
The paths in the variables XFILESEARCHPATH, XUSERFILESEARCHPATH, and
XAPPLRESDIR may contain %-escapes (like the control strings passed to
-the Emacs lisp `format' function or C printf function), which Emacs expands.
+the Emacs lisp 'format' function or C printf function), which Emacs expands.
%N is replaced by the string "Emacs" wherever it occurs.
%T is replaced by "app-defaults" wherever it occurs.
@@ -4823,29 +4830,29 @@ If XFILESEARCHPATH is unset, Emacs uses the default value
This feature was added for consistency with other X applications.
-** The new function `text-property-any' scans the region of text from
-START to END to see if any character's property PROP is `eq' to
+** The new function 'text-property-any' scans the region of text from
+START to END to see if any character's property PROP is 'eq' to
VALUE. If so, it returns the position of the first such character.
Otherwise, it returns nil.
The optional fifth argument, OBJECT, specifies the string or buffer to
be examined.
-** The new function `text-property-not-all' scans the region of text from
-START to END to see if any character's property PROP is not `eq' to
+** The new function 'text-property-not-all' scans the region of text from
+START to END to see if any character's property PROP is not 'eq' to
VALUE. If so, it returns the position of the first such character.
Otherwise, it returns nil.
The optional fifth argument, OBJECT, specifies the string or buffer to
be examined.
-** The function `delete-windows-on' now takes an optional second
+** The function 'delete-windows-on' now takes an optional second
argument FRAME, which specifies which frames it should affect.
- + If FRAME is nil or omitted, then `delete-windows-on' deletes windows
+ + If FRAME is nil or omitted, then 'delete-windows-on' deletes windows
showing BUFFER (its first argument) on all frames.
- + If FRAME is t, then `delete-windows-on' only deletes windows on the
+ + If FRAME is t, then 'delete-windows-on' only deletes windows on the
selected frame; other frames are unaffected.
- + If FRAME is a frame, then `delete-windows-on' only deletes windows on
+ + If FRAME is a frame, then 'delete-windows-on' only deletes windows on
the given frame; other frames are unaffected.
@@ -4858,21 +4865,21 @@ continue the drag beyond the boundaries of the window, Emacs scrolls
the window at a steady rate until you either move the mouse back into
the window or release the button.
-** RET now exits `query-replace' and `query-replace-regexp'; this makes it
+** RET now exits 'query-replace' and 'query-replace-regexp'; this makes it
more consistent with the incremental search facility, which uses RET
to end the search.
** In C mode, C-c C-u now runs c-up-conditional.
C-c C-n and C-c C-p now run new commands that move forward
-and back over balanced sets of C conditionals (c-forward-conditional
-and c-backward-conditional).
+and back over balanced sets of C conditionals ('c-forward-conditional'
+and 'c-backward-conditional').
** The Edit entry in the menu bar has a new alternative:
"Choose Next Paste". It gives you a menu showing the various
strings in the kill ring; click on one to select it as the text
to be yanked ("pasted") the next time you yank.
-** If you enable Transient Mark mode and set `mark-even-if-inactive' to
+** If you enable Transient Mark mode and set 'mark-even-if-inactive' to
non-nil, then the region is highlighted in a transient fashion just as
normally in Transient Mark mode, but the mark really remains active
all the time; commands that use the region can be used even if the
@@ -4882,33 +4889,33 @@ region highlighting turns off.
that start with that prefix.
** The VC package now searches for version control commands in the
-directories named by the variable `vc-path'; its value should be a
+directories named by the variable 'vc-path'; its value should be a
list of strings.
** If you are visiting a file that has locks registered under RCS,
VC now displays each lock's owner and version number in the mode line
-after the string `RCS'. If there are no locks, VC displays the head
+after the string 'RCS'. If there are no locks, VC displays the head
version number.
-** When using X, if you load the `paren' library, Emacs automatically
+** When using X, if you load the 'paren' library, Emacs automatically
underlines or highlights the matching paren whenever point is
next to the outside of a paren. When point is before an open-paren,
this shows the matching close; when point is after a close-paren,
this shows the matching open.
-** The new function `define-key-after' is like `define-key',
+** The new function 'define-key-after' is like 'define-key',
but takes an extra argument AFTER. It places the newly defined
binding after the binding for the event AFTER.
-** `accessible-keymaps' now takes an optional second argument, PREFIX.
+** 'accessible-keymaps' now takes an optional second argument, PREFIX.
If PREFIX is non-nil, it means the value should include only maps for
keys that start with PREFIX.
-`describe-bindings' also accepts an optional argument PREFIX which
+'describe-bindings' also accepts an optional argument PREFIX which
means to describe only the keys that start with PREFIX.
-** The variable `prefix-help-command' hold a command to run to display help
-whenever the character `help-char' follows a prefix key and does not have
+** The variable 'prefix-help-command' hold a command to run to display help
+whenever the character 'help-char' follows a prefix key and does not have
a key binding in that context.
** Emacs now detects double- and triple-mouse clicks. A single mouse
@@ -4928,18 +4935,18 @@ their timestamps.
To count as double- and triple-clicks, mouse clicks must be at the
same location as the first click, and the number of milliseconds
between the first release and the second must be less than the value
-of the lisp variable `double-click-time'. Setting `double-click-time'
+of the lisp variable 'double-click-time'. Setting 'double-click-time'
to nil disables multi-click detection. Setting it to t removes the
time limit; Emacs then detects multi-clicks by position only.
-If `read-key-sequence' finds no binding for a double-click event, but
+If 'read-key-sequence' finds no binding for a double-click event, but
the corresponding single-click event would be bound,
-`read-key-sequence' demotes it to a single-click. Similarly, it
+'read-key-sequence' demotes it to a single-click. Similarly, it
demotes unbound triple-clicks to double- or single-clicks. This means
you don't have to distinguish between single- and multi-clicks if you
don't want to.
-Emacs reports all clicks after the third as `triple-mouse-N' clicks,
+Emacs reports all clicks after the third as 'triple-mouse-N' clicks,
but increments the click count after POSITION. For example, a fourth
click, soon after the third and at the same location, produces a pair
of events of the form:
@@ -4952,25 +4959,25 @@ slightly. If a mouse event includes a position list of the form:
this denotes exactly the same position as the list:
(WINDOW PLACE-SYMBOL (COLUMN . ROW) TIMESTAMP)
That is, the event occurred over a non-textual area of the frame,
-specified by PLACE-SYMBOL, a symbol like `mode-line' or
-`vertical-scroll-bar'.
+specified by PLACE-SYMBOL, a symbol like 'mode-line' or
+'vertical-scroll-bar'.
Enclosing PLACE-SYMBOL in a singleton list does not change the
-position denoted, but the `read-key-sequence' function uses the
+position denoted, but the 'read-key-sequence' function uses the
presence or absence of the singleton list to tell whether or not it
should prefix the event with its place symbol.
-Normally, `read-key-sequence' prefixes mouse events occurring over
+Normally, 'read-key-sequence' prefixes mouse events occurring over
non-textual areas with their PLACE-SYMBOLs, to select the sub-keymap
appropriate for the event; for example, clicking on the mode line
produces a sequence like
[mode-line (mouse-1 POSN)]
However, if lisp code elects to unread the resulting key sequence by
-placing it in the `unread-command-events' variable, it is important
-that `read-key-sequence' not insert the prefix symbol again; that
+placing it in the 'unread-command-events' variable, it is important
+that 'read-key-sequence' not insert the prefix symbol again; that
would produce a malformed key sequence like
[mode-line mode-line (mouse-1 POSN)]
-For this reason, `read-key-sequence' encloses the event's PLACE-SYMBOL
+For this reason, 'read-key-sequence' encloses the event's PLACE-SYMBOL
in a singleton list when it first inserts the prefix, but doesn't
insert the prefix when processing events whose PLACE-SYMBOLs are
already thus enclosed.
@@ -4979,7 +4986,7 @@ already thus enclosed.
* Changes in version 19.15.
-** `make-frame-visible', which uniconified frames, is now a command,
+** 'make-frame-visible', which uniconified frames, is now a command,
and thus may be bound to a key. This makes sense because frames
respond to user input while iconified.
@@ -4998,11 +5005,11 @@ at the other end.
Emacs has only one secondary selection at any time. Starting to set
a new one cancels any previous one. The secondary selection displays
-using a face named `secondary-selection'.
+using a face named 'secondary-selection'.
-** There's a new way to request use of Supercite (sc.el). Do this:
+** New hook 'mail-citation-hook'. E.g. to request use of Supercite (sc.el):
- (add-hook 'mail-citation-hook 'sc-cite-original)
+ (add-hook 'mail-citation-hook #'sc-cite-original)
Currently this works with Rmail. In the future, other Emacs based
mail-readers should be modified to understand this hook also.
@@ -5011,7 +5018,7 @@ for those other mail readers.
** When a regular expression contains `\(...\)' inside a repetition
operator such as `*' or `+', and you ask about the range that was matched
-using `match-beginning' and `match-end', the range you get corresponds
+using 'match-beginning' and 'match-end', the range you get corresponds
to the *last* repetition *only*. In Emacs 18, you would get a range
corresponding to all the repetitions.
@@ -5027,18 +5034,18 @@ and thus didn't document it.)
* Changes in version 19.14.
-** To modify read-only text, bind the variable `inhibit-read-only'
+** To modify read-only text, bind the variable 'inhibit-read-only'
to a non-nil value. If the value is t, then all reasons that might
-make text read-only are inhibited (including `read-only' text properties).
-If the value is a list, then a `read-only' property is inhibited
-if it is `memq' in the list.
+make text read-only are inhibited (including 'read-only' text properties).
+If the value is a list, then a 'read-only' property is inhibited
+if it is 'memq' in the list.
-** If you call `get-buffer-window' passing t as its second argument, it
+** If you call 'get-buffer-window' passing t as its second argument, it
will only search for windows on visible frames. Previously, passing t
-as the second argument caused `get-buffer-window' to search all
+as the second argument caused 'get-buffer-window' to search all
frames, visible or not.
-** If you call `other-buffer' with a nil or omitted second argument, it
+** If you call 'other-buffer' with a nil or omitted second argument, it
will ignore buffers displayed windows on any visible frame, not just
the selected frame.
@@ -5048,22 +5055,22 @@ to the window or frame that you want.
** The command M-( now inserts spaces outside the open-parentheses in
some cases--depending on the syntax classes of the surrounding
-characters. If the variable `parens-dont-require-spaces' is non-nil,
+characters. If the variable 'parens-dont-require-spaces' is non-nil,
it inhibits insertion of these spaces.
** The GUD package now supports the debugger known as xdb on HP/UX
-systems. Use M-x xdb. The variable `gud-xdb-directories' lets you
+systems. Use M-x xdb. The variable 'gud-xdb-directories' lets you
specify a list of directories to search for source code.
** If you are using the mailabbrev package, you should note that its
-function for defining an alias is now called `define-mail-abbrev'.
-This package no longer contains a definition for `define-mail-alias';
+function for defining an alias is now called 'define-mail-abbrev'.
+This package no longer contains a definition for 'define-mail-alias';
that name is used only in mailaliases.
** Inserted characters now inherit the properties of the text before
them, by default, rather than those of the following text.
-** The function `insert-file-contents' now takes optional arguments BEG
+** The function 'insert-file-contents' now takes optional arguments BEG
and END that specify which part of the file to insert. BEG defaults to
0 (the beginning of the file), and END defaults to the end of the file.
@@ -5073,7 +5080,7 @@ If you specify BEG or END, then the argument VISIT must be nil.
* Changes in version 19.13.
-** Magic file names can now handle the `load' operation.
+** Magic file names can now handle the 'load' operation.
** Bibtex mode now sets up special entries in the menu bar.
@@ -5094,7 +5101,7 @@ We may move them again for greater consistency with other modes.
* Changes in version 19.12.
** You can now make many of the sort commands ignore case by setting
-`sort-fold-case' to a non-nil value.
+'sort-fold-case' to a non-nil value.
@@ -5102,15 +5109,15 @@ We may move them again for greater consistency with other modes.
** Supercite is installed.
-** `write-file-hooks' functions that return non-nil are responsible
+** 'write-file-hooks' functions that return non-nil are responsible
for making a backup file if you want that to be done.
To do so, execute the following code:
(or buffer-backed-up (backup-buffer))
You might wish to save the file modes value returned by
-`backup-buffer' and use that to set the mode bits of the file
-that you write. This is what `basic-save-buffer' does when
+'backup-buffer' and use that to set the mode bits of the file
+that you write. This is what 'basic-save-buffer' does when
it writes a file in the usual way.
(This is not actually new, but wasn't documented before.)
@@ -5119,12 +5126,12 @@ it writes a file in the usual way.
* Changes in version 19.10.
-** The command `repeat-complex-command' is now on C-x ESC ESC.
+** The command 'repeat-complex-command' is now on C-x ESC ESC.
It used to be bound to C-x ESC.
The reason for this change is to make function keys work after C-x.
-** The variable `highlight-nonselected-windows' now controls whether
+** The variable 'highlight-nonselected-windows' now controls whether
the region is highlighted in windows other than the selected window
(in Transient Mark mode only, of course, and currently only when
using X).
@@ -5139,26 +5146,26 @@ buffer text according to the ISO Latin-1 standard. With a prefix
argument, this command enables European character display if and only
if the argument is positive.
-** The `-i' command-line argument tells Emacs to use a picture of the
+** The '-i' command-line argument tells Emacs to use a picture of the
GNU gnu as its icon, instead of letting the window manager choose an
icon for it. This option used to insert a file into the current
-buffer; use `-insert' to do that now.
+buffer; use '-insert' to do that now.
-** The `configure' script now supports `--prefix' and `--exec-prefix'
+** The 'configure' script now supports '--prefix' and '--exec-prefix'
options.
-The `--prefix=PREFIXDIR' option specifies where the installation process
+The '--prefix=PREFIXDIR' option specifies where the installation process
should put emacs and its data files. This defaults to `/usr/local'.
- Emacs (and the other utilities users run) go in PREFIXDIR/bin
- (unless the `--exec-prefix' option says otherwise).
+ (unless the '--exec-prefix' option says otherwise).
- The architecture-independent files go in PREFIXDIR/lib/emacs/VERSION
(where VERSION is the version number of Emacs, like `19.7').
- The architecture-dependent files go in
PREFIXDIR/lib/emacs/VERSION/CONFIGURATION
(where CONFIGURATION is the configuration name, like mips-dec-ultrix4.2),
- unless the `--exec-prefix' option says otherwise.
+ unless the '--exec-prefix' option says otherwise.
-The `--exec-prefix=EXECDIR' option allows you to specify a separate
+The '--exec-prefix=EXECDIR' option allows you to specify a separate
portion of the directory tree for installing architecture-specific
files, like executables and utility programs. If specified,
- Emacs (and the other utilities users run) go in EXECDIR/bin, and
@@ -5166,14 +5173,14 @@ files, like executables and utility programs. If specified,
EXECDIR/lib/emacs/VERSION/CONFIGURATION.
EXECDIR/bin should be a directory that is normally in users' PATHs.
-** When running under X, the new lisp function `x-list-fonts'
+** When running under X, the new lisp function 'x-list-fonts'
allows code to find out which fonts are available from the X server.
The first argument PATTERN is a string, perhaps with wildcard characters;
the * character matches any substring, and
the ? character matches any single character.
PATTERN is case-insensitive.
If the optional arguments FACE and FRAME are specified, then
-`x-list-fonts' returns only fonts the same size as FACE on FRAME.
+'x-list-fonts' returns only fonts the same size as FACE on FRAME.
@@ -5188,7 +5195,7 @@ their sizes, or reused by other processes if Emacs doesn't need it.
for input, which often avoids the need to do these things while you
are typing.
-The variable `auto-save-timeout' says how many seconds Emacs should
+The variable 'auto-save-timeout' says how many seconds Emacs should
wait, after you stop typing, before it does an auto save and a garbage
collection.
@@ -5200,12 +5207,12 @@ warning again.
If you reenable Auto Save mode in that buffer, Emacs will start saving
it again with no further warnings.
-** A new minor mode called Line Number mode displays the current line
+** A new minor mode called 'line-number-mode' displays the current line
number in the mode line, updating it as necessary when you move
point.
However, if the buffer is very large (larger than the value of
-`line-number-display-limit'), then the line number doesn't appear.
+'line-number-display-limit'), then the line number doesn't appear.
This is because computing the line number can be painfully slow if the
buffer is very large.
@@ -5215,7 +5222,7 @@ buffer is very large.
directions.
** You can suppress next-line's habit of inserting a newline when
-called at the end of a buffer by setting next-line-add-newlines to nil
+called at the end of a buffer by setting 'next-line-add-newlines' to nil
(it defaults to t).
** You can now get back recent minibuffer inputs conveniently. While
@@ -5233,8 +5240,8 @@ The history feature is available for all uses of the minibuffer, but
there are separate history lists for different kinds of input. For
example, there is a list for file names, used by all the commands that
read file names. There is a list for arguments of commands like
-`query-replace'. There are also very specific history lists, such
-as the one that `compile' uses for compilation commands.
+'query-replace'. There are also very specific history lists, such
+as the one that 'compile' uses for compilation commands.
** You can now display text in a mixture of fonts and colors, using the
"face" feature, together with the overlay and text property features.
@@ -5258,30 +5265,30 @@ C-x n is a prefix for narrowing.
C-x a is a prefix for abbrev commands.
C-x r C-SPC
-C-x r SPC point-to-register (Was C-x /)
-C-x r j jump-to-register (Was C-x j)
-C-x r s copy-to-register (Was C-x x)
-C-x r i insert-register (Was C-x g)
-C-x r r copy-rectangle-to-register (Was C-x r)
-C-x r k kill-rectangle
-C-x r y yank-rectangle
-C-x r o open-rectangle
-C-x r f frame-configuration-to-register
+C-x r SPC 'point-to-register' (Was C-x /)
+C-x r j 'jump-to-register' (Was C-x j)
+C-x r s 'copy-to-register' (Was C-x x)
+C-x r i 'insert-register' (Was C-x g)
+C-x r r 'copy-rectangle-to-register' (Was C-x r)
+C-x r k 'kill-rectangle'
+C-x r y 'yank-rectangle'
+C-x r o 'open-rectangle'
+C-x r f 'frame-configuration-to-register'
(This saves the state of all windows in all frames.)
-C-x r w window-configuration-to-register
+C-x r w 'window-configuration-to-register'
(This saves the state of all windows in the selected frame.)
(Use C-x r j to restore a configuration saved with C-x r f or C-x r w.)
-C-x n n narrow-to-region (Was C-x n)
-C-x n p narrow-to-page (Was C-x p)
-C-x n w widen (Was C-x w)
+C-x n n 'narrow-to-region' (Was C-x n)
+C-x n p 'narrow-to-page' (Was C-x p)
+C-x n w 'widen' (Was C-x w)
-C-x a l add-mode-abbrev (Was C-x C-a)
-C-x a g add-global-abbrev (Was C-x +)
-C-x a i l inverse-add-mode-abbrev (Was C-x C-h)
-C-x a i g inverse-add-global-abbrev (Was C-x -)
-C-x a e expand-abbrev (Was C-x ')
+C-x a l 'add-mode-abbrev' (Was C-x C-a)
+C-x a g 'add-global-abbrev' (Was C-x +)
+C-x a i l 'inverse-add-mode-abbrev' (Was C-x C-h)
+C-x a i g 'inverse-add-global-abbrev' (Was C-x -)
+C-x a e 'expand-abbrev' (Was C-x ')
(The old key bindings C-x /, C-x j, C-x x and C-x g
have not yet been removed.)
@@ -5300,12 +5307,12 @@ but that you don't want to keep in buffers all the time.
** The keys M-g (fill-region) and C-x a (append-to-buffer)
have been eliminated.
-** The new command `string-rectangle' inserts a specified string on
+** The new command 'string-rectangle' inserts a specified string on
each line of the region-rectangle.
-** C-x 4 r is now `find-file-read-only-other-window'.
+** C-x 4 r is now 'find-file-read-only-other-window'.
-** C-x 4 C-o is now `display-buffer', which displays a specified buffer
+** C-x 4 C-o is now 'display-buffer', which displays a specified buffer
in another window without selecting it.
** Picture mode has been substantially improved. The picture editing commands
@@ -5330,17 +5337,17 @@ to enable and disable the new mode.
M-x outline-mode is unchanged; it still switches to Outline mode as a
major mode.
-** The default setting of `version-control' comes from the environment
+** The default setting of 'version-control' comes from the environment
variable VERSION_CONTROL.
** The user option for controlling whether files can set local
-variables is now called `enable-local-variables'. A value of t means
+variables is now called 'enable-local-variables'. A value of t means
local-variables lists are obeyed; nil means they are ignored; anything
else means query the user.
-The user option for controlling use of the `eval' local variable is
-now called is `enable-local-eval'; its values are interpreted like
-those of `enable-local-variables'.
+The user option for controlling use of the 'eval' local variable is
+now called is 'enable-local-eval'; its values are interpreted like
+those of 'enable-local-variables'.
** X Window System changes:
@@ -5366,8 +5373,8 @@ one in the future.
deletion.
** The variables that control how much undo information to save have
-been renamed to `undo-limit' and `undo-strong-limit'. They used to be
-called `undo-threshold' and `undo-high-threshold'.
+been renamed to 'undo-limit' and 'undo-strong-limit'. They used to be
+called 'undo-threshold' and 'undo-high-threshold'.
** You can now use kill commands in read-only buffers. They don't
actually change the buffer, and Emacs will beep and warn you that the
@@ -5378,7 +5385,7 @@ the kill ring, so you can yank it into other buffers.
M-^ deletes the prefix (if it occurs) after the newline that it
deletes.
-** C-M-l now runs the command `reposition-window'. It scrolls the
+** C-M-l now runs the command 'reposition-window'. It scrolls the
window heuristically in a way designed to get useful information onto
the screen.
@@ -5433,14 +5440,14 @@ subsequently. You can no longer use M-, to find the next similar tag;
you must use M-. with a prefix argument, instead.
The motive for this change is so that you can more reliably use
-M-, to resume a suspended `tags-search' or `tags-query-replace'.
+M-, to resume a suspended 'tags-search' or 'tags-query-replace'.
-** C-x s (`save-some-buffers') now gives you more options when it asks
-whether to save a particular buffer. In addition to `y' or `n', you
+** C-x s ('save-some-buffers') now gives you more options when it asks
+whether to save a particular buffer. In addition to 'y' or 'n', you
can answer `!' to save all the remaining buffers, `.' to save this
buffer but not save any others, ESC to stop saving and exit the
command, and C-h to get help. These options are analogous to those
-of `query-replace'.
+of 'query-replace'.
** M-x make-symbolic-link does not expand its first argument.
This lets you make a link with a target that is a relative file name.
@@ -5454,22 +5461,22 @@ makes filling work conveniently. Each bunch of grouped entries is one
paragraph, and each collection of entries from one person on one day
is considered a page.
-** The `comment-region' command adds comment delimiters to the lines that
+** The 'comment-region' command adds comment delimiters to the lines that
start in the region, thus commenting them out. With a negative argument,
it deletes comment delimiters from the lines in the region--this cancels
-the effect of `comment-region' without an argument.
+the effect of 'comment-region' without an argument.
-With a positive argument, `comment-region' adds comment delimiters
+With a positive argument, 'comment-region' adds comment delimiters
but duplicates the last character of the comment start sequence as many
times as the argument specifies. This is a way of calling attention to
the comment. In Lisp, you should use an argument at least two, because
the indentation convention for single semicolon comments does not leave
them at the beginning of a line.
-** If `split-window-keep-point' is non-nil, C-x 2 tries to avoid
+** If 'split-window-keep-point' is non-nil, C-x 2 tries to avoid
shifting any text on the screen by putting point in whichever window
happens to contain the screen line the cursor is already on.
-The default is that `split-window-keep-point' is non-nil on slow
+The default is that 'split-window-keep-point' is non-nil on slow
terminals.
** M-x super-apropos is like M-x apropos except that it searches both
@@ -5506,10 +5513,10 @@ compilation buffers, and any Emacs feature which creates a special
buffer with a particular name.
** M-x compare-windows with a prefix argument ignores changes in whitespace.
-If `compare-ignore-case' is non-nil, then differences in case are also
+If 'compare-ignore-case' is non-nil, then differences in case are also
ignored.
-** `backward-paragraph' is now bound to M-{ by default, and `forward-paragraph'
+** 'backward-paragraph' is now bound to M-{ by default, and 'forward-paragraph'
to M-}. Originally, these commands were bound to M-[ and M-], but they were
running into conflicts with the use of function keys. On many terminals,
function keys send a sequence beginning ESC-[, so many users have defined this
@@ -5519,25 +5526,25 @@ as a prefix key.
default; these commands seem to be often hit by accident, and can be
quite destructive if their effects are not noticed immediately.
-** The function `erase-buffer' is now interactive, but disabled by default.
+** The function 'erase-buffer' is now interactive, but disabled by default.
** When visiting a new file, Emacs attempts to abbreviate the file's
-path using the symlinks listed in `directory-abbrev-alist'.
+path using the symlinks listed in 'directory-abbrev-alist'.
** When you visit the same file in under two names that translate into
the same name once symbolic links are handled, Emacs warns you that
you have two buffers for the same file.
** If you wish to avoid visiting the same file in two buffers under
-different names, set the variable `find-file-existing-other-name'
-non-nil. Then `find-file' uses the existing buffer visiting the file,
+different names, set the variable 'find-file-existing-other-name'
+non-nil. Then 'find-file' uses the existing buffer visiting the file,
no matter which of the file's names you specify.
-** If you set `find-file-visit-truename' non-nil, then the file name
+** If you set 'find-file-visit-truename' non-nil, then the file name
recorded for a buffer is the file's truename (in which all symbolic
links have been removed), rather than the name you specify. Setting
-`find-file-visit-truename' also implies the effect of
-`find-file-existing-other-name'.
+'find-file-visit-truename' also implies the effect of
+'find-file-existing-other-name'.
** C-x C-v now inserts the entire current file name in the minibuffer.
This is convenient if you made a small mistake in typing it. Point
@@ -5550,40 +5557,40 @@ it.
** C-x q now uses ESC to terminate all iterations of the keyboard
macro, rather than C-d as before.
-** Use the command `setenv' to set an individual environment variable
+** Use the command 'setenv' to set an individual environment variable
for Emacs subprocesses. Specify a variable name and a value, both as
strings. This command applies only to subprocesses yet to be
started.
-** Use `rot13-other-window' to examine a buffer with rot13.
+** Use 'rot13-other-window' to examine a buffer with rot13.
This command does not change the text in the buffer. Instead, it
creates a window with a funny display table that applies the code when
displaying the text.
** The command `M-x version' now prints the current Emacs version; The
-`version' command is an alias for the `emacs-version' command.
+'version' command is an alias for the 'emacs-version' command.
** More complex changes in existing packages.
-*** `fill-nonuniform-paragraphs' is a new command, much like
-`fill-individual-paragraphs' except that only separator lines separate
+*** 'fill-nonuniform-paragraphs' is a new command, much like
+'fill-individual-paragraphs' except that only separator lines separate
paragraphs. Since this means that the lines of one paragraph may have
different amounts of indentation, the fill prefix used is the smallest
amount of indentation of any of the lines of the paragraph.
-*** Filling is now partially controlled by a new minor mode, Adaptive
-Fill mode. When this mode is enabled (and it is enabled by default),
-if you use M-x fill-region-as-paragraph on an indented paragraph and
-you don't have a fill prefix, it uses the indentation of the second
-line of the paragraph as the fill prefix.
+*** Filling is now partially controlled by a new minor mode,
+'adaptive-fill-mode'. When this mode is enabled (and it is enabled
+by default), if you use M-x fill-region-as-paragraph on an indented
+paragraph and you don't have a fill prefix, it uses the indentation
+of the second line of the paragraph as the fill prefix.
Adaptive Fill mode doesn't have much effect on M-q in most major
modes, because an indented line will probably count as a paragraph
starter and thus each line of an indented paragraph will be considered
a paragraph of its own.
-*** M-q in C mode now runs `c-fill-paragraph', which is designed
+*** M-q in C mode now runs 'c-fill-paragraph', which is designed
for filling C comments. (We assume you don't want to fill
the code in a C program.)
@@ -5610,7 +5617,7 @@ i Insert this word in your private dictionary
r Replace the word this time with a string typed by you.
When the Ispell process starts, it reads your private dictionary which
-is the file `~/ispell.words'. If you "insert" words with the `i' command,
+is the file `~/ispell.words'. If you "insert" words with the 'i' command,
these words are added to that file, but not right away--only at the end
of the interactive replacement process.
@@ -5654,7 +5661,7 @@ superseding C-c C-y (copy-last-shell-input):
The C-x C-a bindings are also active in source files.
*** The old TeX mode bindings of M-{ and M-} have been moved to C-c {
-and C-c }. (These commands are `up-list' and `tex-insert-braces';
+and C-c }. (These commands are 'up-list' and 'tex-insert-braces';
they are the TeX equivalents of M-( and M-).) This is because M-{
and M-} are now globally defined commands.
@@ -5662,22 +5669,22 @@ and M-} are now globally defined commands.
`%' is now a word-separator character in Mail mode.
-`mail-signature', if non-nil, tells M-x mail to insert your
+'mail-signature', if non-nil, tells M-x mail to insert your
`.signature' file automatically. If you don't want your signature in
a particular message, just delete it before you send the message.
You can specify the text to insert at the beginning of each line when
you use C-c C-y to yank the message you are replying to. Set
-`mail-yank-prefix' to the desired string. A value of `nil' (the
+'mail-yank-prefix' to the desired string. A value of 'nil' (the
default) means to use indentation, as in Emacs 18. If you use just
C-u as the prefix argument to C-c C-y, then it does not insert
anything at the beginning of the lines, regardless of the value of
-`mail-yank-prefix'.
+'mail-yank-prefix'.
If you like, you can expand mail aliases as abbrevs, as soon as you
type them in. To enable this feature, execute the following:
- (add-hook 'mail-setup-hook 'mail-abbrevs-setup)
+ (add-hook 'mail-setup-hook #'mail-abbrevs-setup)
This can go in your .emacs file.
@@ -5691,25 +5698,25 @@ Rmail by default gets new mail only from the system inbox file,
not from `~/mbox'.
In Rmail, you can retry sending a message that failed
-by typing `M-m' on the failure message.
+by typing 'M-m' on the failure message.
By contrast, another new command M-x rmail-resend is used for
forwarding a message and marking it as "resent from" you
with header fields "Resent-From:" and "Resent-To:".
-`e' is now the command to edit a message.
-To expunge, type `x'. We know this will surprise people
+'e' is now the command to edit a message.
+To expunge, type 'x'. We know this will surprise people
some of the time, but the surprise will not be disastrous--if
-you type `e' meaning to expunge, just turn off editing with C-c C-c
-and then type `x'.
+you type 'e' meaning to expunge, just turn off editing with C-c C-c
+and then type 'x'.
Another new Rmail command is `<', which moves to the first message.
This is for symmetry with `>'.
-Use the `b' command to bury the Rmail buffer and its summary buffer,
+Use the 'b' command to bury the Rmail buffer and its summary buffer,
if any, removing both of them from display on the screen.
-The variable `rmail-output-file-alist' now controls the default
+The variable 'rmail-output-file-alist' now controls the default
for the file to output a message to.
In the Rmail summary buffer, all cursor motion commands select
@@ -5724,7 +5731,7 @@ line.
Conversely, motion and deletion commands in the Rmail buffer also
update the summary buffer. If you set the variable
-`rmail-redisplay-summary' to a non-nil value, then they bring the
+'rmail-redisplay-summary' to a non-nil value, then they bring the
summary buffer (if one exists) back onto the screen.
C-M-t is a new command to make a summary by topic. It uses regexp
@@ -5732,13 +5739,13 @@ matching against just the subjects of the messages to decide which
messages to show in the summary.
You can easily convert an Rmail file to system mailbox format with the
-command `unrmail'. This command reads two arguments, the name of
+command 'unrmail'. This command reads two arguments, the name of
the Rmail file to convert, and the name of the new mailbox file.
(This command does not change the Rmail file itself.)
Rmail now handles Content Length fields in messages.
-*** `mail-extract-address-components' unpacks mail addresses.
+*** 'mail-extract-address-components' unpacks mail addresses.
It takes an address as a string (the contents of the From field, for
example) and returns a list of the form (FULL-NAME
CANONICAL-ADDRESS).
@@ -5747,7 +5754,7 @@ CANONICAL-ADDRESS).
**** M-x c-up-conditional
-In C mode, `c-up-conditional' moves back to the containing
+In C mode, 'c-up-conditional' moves back to the containing
preprocessor conditional, setting the mark where point was
previously.
@@ -5757,7 +5764,7 @@ conditional. When going backwards, `#elif' acts like `#else' followed
by `#if'. When going forwards, `#elif' is ignored.
**** In C mode, M-a and M-e are now defined as
-`c-beginning-of-statement' and `c-end-of-statement'.
+'c-beginning-of-statement' and 'c-end-of-statement'.
**** In C mode, M-x c-backslash-region is a new command to insert or
align `\' characters at the ends of the lines of the region, except
@@ -5770,7 +5777,7 @@ whitespace before it. Otherwise, it inserts a new `\'.
*** New features in info.
When Info looks for an Info file, it searches the directories
-in `Info-directory-list'. This makes it easy to install the Info files
+in 'Info-directory-list'. This makes it easy to install the Info files
that come with various packages. You can specify the path with
the environment variable INFOPATH.
@@ -5790,15 +5797,15 @@ next node in depth-first order (like `]').
DEL scrolls backwards in the current node; at the end, it moves to the
previous node in depth-first order (like `[').
-After a menu select, the info `up' command now restores point in the
+After a menu select, the info 'up' command now restores point in the
menu. The combination of this and the previous two changes means that
repeated SPC keystrokes do the right (depth-first traverse forward) thing.
`i STRING RET' moves to the node associated with STRING in the index
or indices of this manual. If there is more than one match for
-STRING, the `i' command finds the first match.
+STRING, the 'i' command finds the first match.
-`,' finds the next match for the string in the previous `i' command
+`,' finds the next match for the string in the previous 'i' command
If you click the middle mouse button near a cross-reference,
menu item or node pointer while in Info, you will go to the node
@@ -5810,7 +5817,7 @@ You can repeat any previous compilation command conveniently using the
minibuffer history commands, while in the minibuffer entering the
compilation command.
-While a compilation is going on, the string `Compiling' appears in
+While a compilation is going on, the string 'Compiling' appears in
the mode line. When this string disappears, that tells you the
compilation is finished.
@@ -5828,8 +5835,8 @@ error, no matter how big the buffer is.
*** M-x diff and M-x diff-backup.
This new command compares two files, displaying the differences in an
-Emacs buffer. The options for the `diff' program come from the
-variable `diff-switches', whose value should be a string.
+Emacs buffer. The options for the 'diff' program come from the
+variable 'diff-switches', whose value should be a string.
The buffer of differences has Compilation mode as its major mode, so you
can use C-x ` to visit successive changed locations in the two
@@ -5839,7 +5846,7 @@ other special commands of Compilation mode: SPC and DEL for
scrolling, and M-n and M-p for cursor motion.
M-x diff-backup compares a file with its most recent backup.
-If you specify the name of a backup file, `diff-backup' compares it
+If you specify the name of a backup file, 'diff-backup' compares it
with the source file that it is a backup of.
*** The View commands (such as M-x view-buffer and M-x view-file) no
@@ -5877,12 +5884,12 @@ it easier to customize that behavior.
Emacs 19 eliminates the old variables `search-...-char' that used to
be the way to specify the characters to use for various special
purposes in incremental search. Instead, you can define the meaning
-of a character in incremental search by modifying `isearch-mode-map'.
+of a character in incremental search by modifying 'isearch-mode-map'.
*** New commands in Buffer Menu mode.
The command C-o now displays the current line's buffer in another
-window but does not select it. This is like the existing command `o'
+window but does not select it. This is like the existing command 'o'
which selects the current line's buffer in another window.
The command % toggles the read-only flag of the current line's buffer.
@@ -5919,18 +5926,18 @@ perform initial checkin on an unregistered file.
By default, VC uses RCS if RCS is installed on your machine;
otherwise, SCCS. If you want to make the choice explicitly, you can do
-it by setting `vc-default-back-end' to the symbol `RCS' or the symbol
-`SCCS'.
+it by setting 'vc-default-back-end' to the symbol 'RCS' or the symbol
+'SCCS'.
You can tell when a file you visit is maintained with version control
-because either `RCS' or `SCCS' appears in the mode line.
+because either 'RCS' or 'SCCS' appears in the mode line.
*** A new Calendar mode has been added, the work of Edward M. Reingold.
The mode can display the Gregorian calendar and a variety of other
calendars at any date, and interacts with a diary facility similar to
-the UNIX `calendar' utility.
+the UNIX 'calendar' utility.
-*** There is a new major mode for editing binary files: Hexl mode.
+*** There is a new major mode for editing binary files: 'hexl-mode'.
To use it, use M-x hexl-find-file instead of C-x C-f to visit the file.
This command converts the file's contents to hexadecimal and lets you
edit the translation. When you save the file, it is converted
@@ -5977,22 +5984,22 @@ in the Emacs distribution.
and certain other differences between C and C++. It also has a command
`fill-c++-comment' which fills a paragraph made of comment lines.
-The command `comment-region' is useful in C++ mode for commenting out
+The command 'comment-region' is useful in C++ mode for commenting out
several consecutive lines, or removing the commenting out of such lines.
*** A new package for merging two variants of the same text.
It's not unusual for programmers to get their signals crossed and
modify the same program in two different directions. Then somebody
-has to merge the two versions. The command `emerge-files' makes this
+has to merge the two versions. The command 'emerge-files' makes this
easier.
-`emerge-files' reads two file names and compares them. Then it
+'emerge-files' reads two file names and compares them. Then it
displays three buffers: one for each file, and one for the
differences.
If the original version of the file is available, you can make things
-even easier using `emerge-files-with-ancestor'. It reads three file
+even easier using 'emerge-files-with-ancestor'. It reads three file
names--variant 1, variant 2, and the common ancestor--and uses diff3
to compare them.
@@ -6007,7 +6014,7 @@ prevents you from doing more than selecting the A or the B version of
differences. In Edit mode, all emerge commands use the C-c prefix,
and the usual Emacs commands are available. This allows editing the
merge buffer, but slows down Emerge operations. Edit and fast modes
-are indicated by `F' and `E' in the minor modes in the mode line.
+are indicated by 'F' and 'E' in the minor modes in the mode line.
The Emerge commands are:
@@ -6067,7 +6074,7 @@ If you use a prefix argument, Emerge reads another file name to use
for the output file.
Once Emerge has prepared the buffer of differences, it runs the hooks
-in `emerge-startup-hooks'.
+in 'emerge-startup-hooks'.
*** Asm mode is a new major mode for editing files of assembler code.
It defines these commands:
@@ -6124,7 +6131,7 @@ type C-x 6 d, is empty, C-x 6 d kills it.)
*** You can supply command arguments such as files to visit to an Emacs
that is already running. To do this, you must do this in your .emacs
file:
- (add-hook 'suspend-hook 'resume-suspend-hook)
+ (add-hook 'suspend-hook #'resume-suspend-hook)
Also you must use the shellscript emacs.csh or emacs.sh, found in the
etc subdirectory.
@@ -6183,7 +6190,7 @@ VT-100 and H19 terminals; put the following in your `.emacs' file:
When flow control is enabled, you must type C-\ to get the effect of a
C-s, and type C-^ to get the effect of a C-q.
-The function `enable-flow-control' enables flow control unconditionally.
+The function 'enable-flow-control' enables flow control unconditionally.
** Changes in Dired
@@ -6199,15 +6206,15 @@ parent directory.
*** Setting and Clearing Marks
There are now two kinds of marker that you can put on a file in Dired:
-`D' for deletion, and `*' for any other kind of operation.
-The `x' command deletes only files marked with `D', and most
+'D' for deletion, and `*' for any other kind of operation.
+The 'x' command deletes only files marked with 'D', and most
other Dired commands operate only on the files marked with `*'.
-To mark files with `D' (also called "flagging" the files), you
-can use `d' as usual. Here are some commands for marking with
+To mark files with 'D' (also called "flagging" the files), you
+can use 'd' as usual. Here are some commands for marking with
`*' (and also for unmarking):
-**** `m' marks the current file with `*', for an operation other than
+**** 'm' marks the current file with `*', for an operation other than
deletion.
**** `*' marks all executable files. With a prefix argument, it
@@ -6223,7 +6230,7 @@ argument, it unmarks all those files.
argument, queries for each marked file. Type your help character,
usually C-h, at that time for help.
-**** `c' replaces all marks that use the character OLD with marks that
+**** 'c' replaces all marks that use the character OLD with marks that
use the character NEW. You can use almost any character as a mark
character by means of this command, to distinguish various classes of
files. If OLD is ` ', then the command operates on all unmarked
@@ -6248,48 +6255,48 @@ marked files.
These are the commands:
-**** `C' copies the specified files. You must specify a directory to
+**** 'C' copies the specified files. You must specify a directory to
copy into, or (if copying a single file) a new name.
-If `dired-copy-preserve-time' is non-`nil', then copying sets
+If 'dired-copy-preserve-time' is non-'nil', then copying sets
the modification time of the new file to be the same as that of the old
file.
-**** `R' renames the specified files. You must specify a directory to
+**** 'R' renames the specified files. You must specify a directory to
rename into, or (if renaming a single file) a new name.
Dired automatically changes the visited file name of buffers associated
with renamed files so that they refer to the new names.
-**** `H' makes hard links to the specified files. You must specify a
+**** 'H' makes hard links to the specified files. You must specify a
directory to make the links in, or (if making just one link) the name
to give the link.
-**** `S' makes symbolic links to the specified files. You must specify
+**** 'S' makes symbolic links to the specified files. You must specify
a directory to make the links in, or (if making just one link) the
name to give the link.
-**** `M' changes the mode of the specified files. This calls the
-`chmod' program, so you can describe the desired mode change with any
-argument that `chmod' would handle.
+**** 'M' changes the mode of the specified files. This calls the
+'chmod' program, so you can describe the desired mode change with any
+argument that 'chmod' would handle.
-**** `G' changes the group of the specified files.
+**** 'G' changes the group of the specified files.
-**** `O' changes the owner of the specified files. (On normal systems,
+**** 'O' changes the owner of the specified files. (On normal systems,
only the superuser can do this.)
-The variable `dired-chown-program' specifies the name of the
-program to use to do the work (different systems put `chown' in
+The variable 'dired-chown-program' specifies the name of the
+program to use to do the work (different systems put 'chown' in
different places.
-**** `Z' compresses or uncompresses the specified files.
+**** 'Z' compresses or uncompresses the specified files.
-**** `L' loads the specified Emacs Lisp files.
+**** 'L' loads the specified Emacs Lisp files.
-**** `B' byte compiles the specified Emacs Lisp files.
+**** 'B' byte compiles the specified Emacs Lisp files.
-**** `P' prints the specified files. It uses the variables
-`lpr-command' and `lpr-switches' just as `lpr-file' does.
+**** 'P' prints the specified files. It uses the variables
+'lpr-command' and 'lpr-switches' just as 'lpr-file' does.
*** Shell Commands in Dired
@@ -6300,17 +6307,17 @@ shell command to multiple files:
- If you use `*' in the command, then the shell command runs just
once, with the list of file names substituted for the `*'.
-Thus, `! tar cf foo.tar * RET' runs `tar' on the entire list of file
+Thus, `! tar cf foo.tar * RET' runs 'tar' on the entire list of file
names, putting them into one tar file `foo.tar'. The file names are
inserted in the order that they appear in the Dired buffer.
- If the command string doesn't contain `*', then it runs once for
each file, with the file name attached at the end. For example, `!
-uudecode RET' runs `uudecode' on each file.
+uudecode RET' runs 'uudecode' on each file.
To run the shell command once for each file but without being limited
to putting the file name inserted in the middle, use a shell loop.
-For example, this shell command would run `uuencode' on each of the
+For example, this shell command would run 'uuencode' on each of the
specified files, writing the output into a corresponding `.uu' file:
for file in *; uuencode $file $file >$file.uu; done
@@ -6334,7 +6341,7 @@ the regular expression REGEXP.
These four commands rename, copy, make hard links and make soft links,
in each case computing the new name by regular expression substitution
from the name of the old file. They effectively perform
-`query-replace-regexp' on the selected file names in the Dired buffer.
+'query-replace-regexp' on the selected file names in the Dired buffer.
The commands read two arguments: a regular expression, and a
substitution pattern. Each selected file name is matched against the
@@ -6362,30 +6369,30 @@ as a default the last regular expression specified in a `%' command.
*** File Comparison with Dired
-**** `=' compares the current file with another file (the file at the
-mark), by running the `diff' program. The file at the mark is given
-to `diff' first.
+**** '=' compares the current file with another file (the file at the
+mark), by running the 'diff' program. The file at the mark is given
+to 'diff' first.
-**** `M-=' compares the current file with its backup file. If there
+**** 'M-=' compares the current file with its backup file. If there
are several numerical backups, it uses the most recent one. If this
file is a backup, it is compared with its original.
-The backup file is the first file given to `diff'.
+The backup file is the first file given to 'diff'.
*** Subdirectories in Dired
You can display more than one directory in one Dired buffer.
-The simplest way to do this is to specify the options `-lR' for
-running `ls'. That produces a recursive directory listing showing
+The simplest way to do this is to specify the options '-lR' for
+running 'ls'. That produces a recursive directory listing showing
all subdirectories, all within the same Dired buffer.
You can also insert the contents of a particular subdirectory with the
-`i' command. Use this command on the line that describes a file which
+'i' command. Use this command on the line that describes a file which
is a directory. Inserted subdirectory contents follow the top-level
directory of the Dired buffer, just as they do in `ls -lR' output.
If the subdirectory's contents are already present in the buffer, the
-`i' command just moves to it (type `l' to refresh it). It sets the
+'i' command just moves to it (type 'l' to refresh it). It sets the
Emacs mark before moving, so C-x C-x takes you back to the old
position in the buffer.
@@ -6423,18 +6430,18 @@ away.
*** Editing the Dired Buffer
-**** `l' updates the specified files in a Dired buffer. This means
+**** 'l' updates the specified files in a Dired buffer. This means
reading their current status from the file system and changing the
buffer to reflect it properly.
If you use this command on a subdirectory header line, it updates the
contents of the subdirectory.
-**** `g' updates the entire contents of the Dired buffer. It preserves
+**** 'g' updates the entire contents of the Dired buffer. It preserves
all marks except for those on files that have vanished. Hidden
subdirectories are updated but remain hidden.
-**** `k' kills all marked lines (not the files). With a prefix
+**** 'k' kills all marked lines (not the files). With a prefix
argument, it kills that many lines starting with the current line.
This command does not delete files; it just deletes text from the Dired
@@ -6445,10 +6452,10 @@ are also deleted from the buffer. Typing `C-u k' on the header line
for a subdirectory is another way to delete a subdirectory from the
Dired buffer.
-*** `find' and Dired.
+*** 'find' and Dired.
To search for files with names matching a wildcard pattern use
-`find-name-dired'. Its arguments are DIRECTORY and
+'find-name-dired'. Its arguments are DIRECTORY and
PATTERN. It selects all the files in DIRECTORY or its
subdirectories whose own names match PATTERN.
@@ -6456,17 +6463,17 @@ The files thus selected are displayed in a Dired buffer in which the
ordinary Dired commands are available.
If you want to test the contents of files, rather than their names, use
-`find-grep-dired'. This command takes two minibuffer arguments,
+'find-grep-dired'. This command takes two minibuffer arguments,
DIRECTORY and REGEXP; it selects all the files in
DIRECTORY or its subdirectories that contain a match for
-REGEXP. It works by running `find' and `grep'.
+REGEXP. It works by running 'find' and 'grep'.
-The most general command in this series is `find-dired', which lets
-you specify any condition that `find' can test. It takes two
-minibuffer arguments, DIRECTORY and FIND-ARGS; it runs `find' in
-DIRECTORY with using FIND-ARGS as the arguments to `find' specifying
+The most general command in this series is 'find-dired', which lets
+you specify any condition that 'find' can test. It takes two
+minibuffer arguments, DIRECTORY and FIND-ARGS; it runs 'find' in
+DIRECTORY with using FIND-ARGS as the arguments to 'find' specifying
which files to accept. To use this command, you need to know how to
-use `find'.
+use 'find'.
** New amusements and novelties.
@@ -6498,14 +6505,14 @@ description of the steps required for installation.
*** If you create a Lisp file named `site-start.el', Emacs loads the file
whenever it starts up.
-*** A new Lisp variable, `data-directory', indicates the directory
+*** A new Lisp variable, 'data-directory', indicates the directory
containing the DOC file, tutorial, copying agreement, and other
-familiar `etc' files. The value of `data-directory' is a simple string.
+familiar 'etc' files. The value of 'data-directory' is a simple string.
The default should be set at build time, and the person installing
Emacs should place all the data files in this directory. The `help.el'
functions that look for docstrings and information files check this
variable. All Emacs Lisp packages should also be coded so that they
-refer to `data-directory' to find data files.
+refer to 'data-directory' to find data files.
*** The PURESIZE definition has been moved from config.h to its own
file, puresize.h. Since almost every file of C source in the
@@ -6514,7 +6521,7 @@ on puresize.h, this means that changing the value of PURESIZE causes
only those two files to be recompiled.
*** The makefile at the top of the Emacs source tree now supports a
-`dist' target, which creates a compressed tar file suitable for
+'dist' target, which creates a compressed tar file suitable for
distribution, using the contents of the source tree. Object files,
old file versions, executables, DOC files, and other
architecture-specific or easy-to-recreate files are not included in
diff --git a/etc/NEWS.20 b/etc/NEWS.20
index 2a9b0b2d259..332d6ded92a 100644
--- a/etc/NEWS.20
+++ b/etc/NEWS.20
@@ -55,11 +55,11 @@ Formerly the name had to be `.emacs'. If you use the name
If both `.emacs' and `.emacs.el' exist, the latter file
is the one that is used.
-** shell-command, and shell-command-on-region, now return
+** 'shell-command', and 'shell-command-on-region', now return
the exit code of the command (unless it is asynchronous).
Also, you can specify a place to put the error output,
separate from the command's regular output.
-Interactively, the variable shell-command-default-error-buffer
+Interactively, the variable 'shell-command-default-error-buffer'
says where to put error output; set it to a buffer name.
In calls from Lisp, an optional argument ERROR-BUFFER specifies
the buffer name.
@@ -69,8 +69,8 @@ output is inserted before point in that buffer, with \f\n to separate
it from the previous batch of error output. The error buffer is not
cleared, so error output from successive commands accumulates there.
-** Setting the default value of enable-multibyte-characters to nil in
-the .emacs file, either explicitly using setq-default, or via Custom,
+** Setting the default value of 'enable-multibyte-characters' to nil in
+the .emacs file, either explicitly using 'setq-default', or via Custom,
is now essentially equivalent to using --unibyte: all buffers
created during startup will be made unibyte after loading .emacs.
@@ -79,8 +79,8 @@ example, typing C-x C-f c*.c RET visits all the files whose names
match c*.c. To visit a file whose name contains * or ?, add the
quoting sequence /: to the beginning of the file name.
-** The M-x commands keep-lines, flush-lines and count-matches
-now have the same feature as occur and query-replace:
+** The M-x commands 'keep-lines', 'flush-lines' and 'count-matches'
+now have the same feature as 'occur' and 'query-replace':
if the pattern contains any upper case letters, then
they never ignore case.
@@ -96,10 +96,10 @@ If you subsequently save the buffer, Emacs converts the text back to
the same format that was used in the file before.
You can turn off end-of-line conversion by setting the variable
-`inhibit-eol-conversion' to non-nil, e.g. with Custom in the MULE group.
+'inhibit-eol-conversion' to non-nil, e.g. with Custom in the MULE group.
-** The character set property `prefered-coding-system' has been
-renamed to `preferred-coding-system', for the sake of correct spelling.
+** The character set property 'prefered-coding-system' has been
+renamed to 'preferred-coding-system', for the sake of correct spelling.
This is a fairly internal feature, so few programs should be affected.
** Mode-line display of end-of-line format is changed.
@@ -110,22 +110,22 @@ is displayed as "(DOS)" on Unix and GNU/Linux systems. The usual
end-of-line format is still displayed as a single character (colon for
Unix, backslash for DOS and Windows, and forward slash for the Mac).
-The values of the variables eol-mnemonic-unix, eol-mnemonic-dos,
-eol-mnemonic-mac, and eol-mnemonic-undecided, which are strings,
+The values of the variables 'eol-mnemonic-unix', 'eol-mnemonic-dos',
+'eol-mnemonic-mac', and 'eol-mnemonic-undecided', which are strings,
control what is displayed in the mode line for each end-of-line
format. You can now customize these variables.
-** In the previous version of Emacs, tar-mode didn't work well if a
+** In the previous version of Emacs, 'tar-mode' didn't work well if a
filename contained non-ASCII characters. Now this is fixed. Such a
filename is decoded by file-name-coding-system if the default value of
enable-multibyte-characters is non-nil.
-** The command temp-buffer-resize-mode toggles a minor mode
+** The command 'temp-buffer-resize-mode' toggles a minor mode
in which temporary buffers (such as help buffers) are given
windows just big enough to hold the whole contents.
** If you use completion.el, you must now run the function
-dynamic-completion-mode to enable it. Just loading the file
+'dynamic-completion-mode' to enable it. Just loading the file
doesn't have any effect.
** In Flyspell mode, the default is now to make just one Ispell process,
@@ -133,11 +133,11 @@ not one per buffer.
** If you use iswitchb but do not call (iswitchb-default-keybindings) to
use the default keybindings, you will need to add the following line:
- (add-hook 'minibuffer-setup-hook 'iswitchb-minibuffer-setup)
+ (add-hook 'minibuffer-setup-hook #'iswitchb-minibuffer-setup)
** Auto-show mode is no longer enabled just by loading auto-show.el.
-To control it, set `auto-show-mode' via Custom or use the
-`auto-show-mode' command.
+To control it, set 'auto-show-mode' via Custom or use the
+'auto-show-mode' command.
** Handling of X fonts' ascent/descent parameters has been changed to
avoid redisplay problems. As a consequence, compared with previous
@@ -183,7 +183,7 @@ current codepage when it starts.
** Mail changes
*** When mail is sent using compose-mail (C-x m), and if
-`mail-send-nonascii' is set to the new default value `mime',
+'mail-send-nonascii' is set to the new default value 'mime',
appropriate MIME headers are added. The headers are added only if
non-ASCII characters are present in the body of the mail, and no other
MIME headers are already present. For example, the following three
@@ -194,11 +194,11 @@ latin-1:
Content-type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
-*** The new variable default-sendmail-coding-system specifies the
+*** The new variable 'default-sendmail-coding-system' specifies the
default way to encode outgoing mail. This has higher priority than
-default-buffer-file-coding-system but has lower priority than
-sendmail-coding-system and the local value of
-buffer-file-coding-system.
+'default-buffer-file-coding-system' but has lower priority than
+'sendmail-coding-system' and the local value of
+'buffer-file-coding-system'.
You should not set this variable manually. Instead, set
sendmail-coding-system to specify a fixed encoding for all outgoing
@@ -248,11 +248,11 @@ brace. These used to be recognized as brace-list-entry's.
c-electric-brace also recognizes brace-entry-open braces
(brace-list-entry's can no longer be electrified).
-*** New command c-indent-line-or-region, not bound by default.
+*** New command 'c-indent-line-or-region', not bound by default.
*** `#' is only electric when typed in the indentation of a line.
-*** Parentheses are now electric (via the new command c-electric-paren)
+*** Parentheses are now electric (via the new command 'c-electric-paren')
for auto-reindenting lines when parens are typed.
*** In "gnu" style, inline-open offset is now set to zero.
@@ -273,10 +273,10 @@ Gnus manual for the full story.
before. All Message buffers are now also articles in the nndraft
group, which is created automatically.
-*** `gnus-alter-header-function' can now be used to alter header
+*** 'gnus-alter-header-function' can now be used to alter header
values.
-*** `gnus-summary-goto-article' now accept Message-ID's.
+*** 'gnus-summary-goto-article' now accept Message-ID's.
*** A new Message command for deleting text in the body of a message
outside the region: `C-c C-v'.
@@ -284,20 +284,20 @@ outside the region: `C-c C-v'.
*** You can now post to component group in nnvirtual groups with
`C-u C-c C-c'.
-*** `nntp-rlogin-program' -- new variable to ease customization.
+*** 'nntp-rlogin-program' -- new variable to ease customization.
-*** `C-u C-c C-c' in `gnus-article-edit-mode' will now inhibit
+*** `C-u C-c C-c' in 'gnus-article-edit-mode' will now inhibit
re-highlighting of the article buffer.
-*** New element in `gnus-boring-article-headers' -- `long-to'.
+*** New element in 'gnus-boring-article-headers' -- 'long-to'.
-*** `M-i' symbolic prefix command. See the section "Symbolic
+*** 'M-i' symbolic prefix command. See the section "Symbolic
Prefixes" in the Gnus manual for details.
-*** `L' and `I' in the summary buffer now take the symbolic prefix
-`a' to add the score rule to the "all.SCORE" file.
+*** 'L' and 'I' in the summary buffer now take the symbolic prefix
+'a' to add the score rule to the "all.SCORE" file.
-*** `gnus-simplify-subject-functions' variable to allow greater
+*** 'gnus-simplify-subject-functions' variable to allow greater
control over simplification.
*** `A T' -- new command for fetching the current thread.
@@ -305,21 +305,21 @@ control over simplification.
*** `/ T' -- new command for including the current thread in the
limit.
-*** `M-RET' is a new Message command for breaking cited text.
+*** 'M-RET' is a new Message command for breaking cited text.
-*** \\1-expressions are now valid in `nnmail-split-methods'.
+*** \\1-expressions are now valid in 'nnmail-split-methods'.
-*** The `custom-face-lookup' function has been removed.
+*** The 'custom-face-lookup' function has been removed.
If you used this function in your initialization files, you must
-rewrite them to use `face-spec-set' instead.
+rewrite them to use 'face-spec-set' instead.
*** Canceling now uses the current select method. Symbolic prefix
-`a' forces normal posting method.
+'a' forces normal posting method.
*** New command to translate M******** sm*rtq**t*s into proper text
-- `W d'.
-*** For easier debugging of nntp, you can set `nntp-record-commands'
+*** For easier debugging of nntp, you can set 'nntp-record-commands'
to a non-nil value.
*** nntp now uses ~/.authinfo, a .netrc-like file, for controlling
@@ -330,49 +330,49 @@ has been added.
*** A history of where mails have been split is available.
-*** A new article date command has been added -- `article-date-iso8601'.
+*** A new article date command has been added -- 'article-date-iso8601'.
*** Subjects can be simplified when threading by setting
-`gnus-score-thread-simplify'.
+'gnus-score-thread-simplify'.
*** A new function for citing in Message has been added --
-`message-cite-original-without-signature'.
+'message-cite-original-without-signature'.
-*** `article-strip-all-blank-lines' -- new article command.
+*** 'article-strip-all-blank-lines' -- new article command.
*** A new Message command to kill to the end of the article has
been added.
*** A minimum adaptive score can be specified by using the
-`gnus-adaptive-word-minimum' variable.
+'gnus-adaptive-word-minimum' variable.
*** The "lapsed date" article header can be kept continually
-updated by the `gnus-start-date-timer' command.
+updated by the 'gnus-start-date-timer' command.
*** Web listserv archives can be read with the nnlistserv backend.
*** Old dejanews archives can now be read by nnweb.
-*** `gnus-posting-styles' has been re-activated.
+*** 'gnus-posting-styles' has been re-activated.
** Changes to TeX and LaTeX mode
-*** The new variable `tex-start-options-string' can be used to give
+*** The new variable 'tex-start-options-string' can be used to give
options for the TeX run. The default value causes TeX to run in
nonstopmode. For an interactive TeX run set it to nil or "".
-*** The command `tex-feed-input' sends input to the Tex Shell. In a
+*** The command 'tex-feed-input' sends input to the Tex Shell. In a
TeX buffer it is bound to the keys C-RET, C-c RET, and C-c C-m (some
of these keys may not work on all systems). For instance, if you run
TeX interactively and if the TeX run stops because of an error, you
can continue it without leaving the TeX buffer by typing C-RET.
-*** The Tex Shell Buffer is now in `compilation-shell-minor-mode'.
+*** The Tex Shell Buffer is now in 'compilation-shell-minor-mode'.
All error-parsing commands of the Compilation major mode are available
but bound to keys that don't collide with the shell. Thus you can use
the Tex Shell for command line executions like a usual shell.
-*** The commands `tex-validate-region' and `tex-validate-buffer' check
+*** The commands 'tex-validate-region' and 'tex-validate-buffer' check
the matching of braces and $'s. The errors are listed in a *Occur*
buffer and you can use C-c C-c or mouse-2 to go to a particular
mismatch.
@@ -380,7 +380,7 @@ mismatch.
** Changes to RefTeX mode
*** The table of contents buffer can now also display labels and
-file boundaries in addition to sections. Use `l', `i', and `c' keys.
+file boundaries in addition to sections. Use 'l', 'i', and 'c' keys.
*** Labels derived from context (the section heading) are now
lowercase by default. To make the label legal in LaTeX, latin-1
@@ -388,25 +388,25 @@ characters will lose their accent. All Mule characters will be
removed from the label.
*** The automatic display of cross reference information can also use
-a window instead of the echo area. See variable `reftex-auto-view-crossref'.
+a window instead of the echo area. See variable 'reftex-auto-view-crossref'.
*** kpsewhich can be used by RefTeX to find TeX and BibTeX files. See the
-customization group `reftex-finding-files'.
+customization group 'reftex-finding-files'.
-*** The option `reftex-bibfile-ignore-list' has been renamed to
-`reftex-bibfile-ignore-regexps' and indeed can be fed with regular
+*** The option 'reftex-bibfile-ignore-list' has been renamed to
+'reftex-bibfile-ignore-regexps' and indeed can be fed with regular
expressions.
*** Multiple Selection buffers are now hidden buffers.
** New/deleted modes and packages
-*** The package snmp-mode.el provides major modes for editing SNMP and
-SNMPv2 MIBs. It has entries on `auto-mode-alist'.
+*** 'snmp-mode' provides major modes for editing SNMP and SNMPv2 MIBs.
+It has entries on 'auto-mode-alist'.
*** The package sql.el provides a major mode, M-x sql-mode, for
editing SQL files, and M-x sql-interactive-mode for interacting with
-SQL interpreters. It has an entry on `auto-mode-alist'.
+SQL interpreters. It has an entry on 'auto-mode-alist'.
*** ispell4.el has been deleted. It got in the way of ispell.el and
this was hard to fix reliably. It has long been obsolete -- use
@@ -431,7 +431,7 @@ controls whether an external program is invoked or output is written
directly to a printer port. Similarly, in the previous version of
Emacs, the value of ps-lpr-command did not affect PostScript printing
on MS-DOS unless ps-printer-name was set to something other than a
-string (eg. t or `pipe'), but now it controls whether an external
+string (eg. t or 'pipe'), but now it controls whether an external
program is used. (These changes were made so that configuration of
printing variables would be almost identical across all platforms.)
@@ -442,11 +442,11 @@ input, on those systems the data to be output is now written to a
temporary file whose name is passed as the last argument to the external
program.
-An exception is made for `print', a standard program on Windows NT,
-and `nprint', a standard program on Novell Netware. For both of these
+An exception is made for 'print', a standard program on Windows NT,
+and 'nprint', a standard program on Novell Netware. For both of these
programs, the command line is constructed in the appropriate syntax
automatically, using only the value of printer-name or ps-printer-name
-as appropriate--the value of the relevant `-switches' variable is
+as appropriate--the value of the relevant '-switches' variable is
ignored, as both programs have no useful switches.
** The value of the variable dos-printer (cf. dos-ps-printer), if it has
@@ -460,10 +460,10 @@ This includes Tetris and Snake.
* Lisp changes in Emacs 20.4
-** New functions line-beginning-position and line-end-position
+** New functions 'line-beginning-position' and 'line-end-position'
return the position of the beginning or end of the current line.
They both accept an optional argument, which has the same
-meaning as the argument to beginning-of-line or end-of-line.
+meaning as the argument to 'beginning-of-line' or 'end-of-line'.
** find-file and allied functions now have an optional argument
WILDCARD. If this is non-nil, they do wildcard processing,
@@ -478,54 +478,54 @@ It is an integer if the size fits in a Lisp integer, float otherwise.
the number fits in a Lisp integer) or a cons cell containing two
integers.
-** The new function directory-files-and-attributes returns a list of
+** The new function 'directory-files-and-attributes' returns a list of
files in a directory and their attributes. It accepts the same
-arguments as directory-files and has similar semantics, except that
+arguments as 'directory-files' and has similar semantics, except that
file names and attributes are returned.
-** The new function file-attributes-lessp is a helper function for
+** The new function 'file-attributes-lessp' is a helper function for
sorting the list generated by directory-files-and-attributes. It
accepts two arguments, each a list of a file name and its attributes.
-It compares the file names of each according to string-lessp and
+It compares the file names of each according to 'string-lessp' and
returns the result.
-** The new function file-expand-wildcards expands a wildcard-pattern
+** The new function 'file-expand-wildcards' expands a wildcard-pattern
to produce a list of existing files that match the pattern.
** New functions for base64 conversion:
-The function base64-encode-region converts a part of the buffer
-into the base64 code used in MIME. base64-decode-region
+The function 'base64-encode-region' converts a part of the buffer
+into the base64 code used in MIME. 'base64-decode-region'
performs the opposite conversion. Line-breaking is supported
optionally.
-Functions base64-encode-string and base64-decode-string do a similar
+Functions 'base64-encode-string' and 'base64-decode-string' do a similar
job on the text in a string. They return the value as a new string.
**
-The new function process-running-child-p
+The new function 'process-running-child-p'
will tell you if a subprocess has given control of its
terminal to its own child process.
-** interrupt-process and such functions have a new feature:
-when the second argument is `lambda', they send a signal
+** 'interrupt-process' and such functions have a new feature:
+when the second argument is 'lambda', they send a signal
to the running child of the subshell, if any, but if the shell
itself owns its terminal, no signal is sent.
-** There are new widget types `plist' and `alist' which can
+** There are new widget types 'plist' and 'alist' which can
be used for customizing variables whose values are plists or alists.
-** easymenu.el now understands `:key-sequence' and `:style button'.
+** easymenu.el now understands ':key-sequence' and `:style button'.
:included is an alias for :visible.
-easy-menu-add-item now understands the values returned by
-easy-menu-remove-item and easy-menu-item-present-p. This can be used
+'easy-menu-add-item' now understands the values returned by
+'easy-menu-remove-item' and 'easy-menu-item-present-p'. This can be used
to move or copy menu entries.
** Multibyte editing changes
-*** The definitions of sref and char-bytes are changed. Now, sref is
-an alias of aref and char-bytes always returns 1. This change is to
+*** The definitions of 'sref' and 'char-bytes' are changed. Now, 'sref' is
+an alias of 'aref' and 'char-bytes' always returns 1. This change is to
make some Emacs Lisp code which works on 20.2 and earlier also
work on the latest Emacs. Such code uses a combination of sref and
char-bytes in a loop typically as below:
@@ -546,50 +546,50 @@ deleting at the head or the end of the region may signal this error:
This is to avoid some bytes being combined together into a character
across the boundary.
-*** The functions find-charset-region and find-charset-string include
-`unknown' in the returned list in the following cases:
+*** The functions 'find-charset-region' and 'find-charset-string' include
+'unknown' in the returned list in the following cases:
o The current buffer or the target string is unibyte and
contains 8-bit characters.
o The current buffer or the target string is multibyte and
contains invalid characters.
-*** The functions decode-coding-region and encode-coding-region remove
+*** The functions 'decode-coding-region' and 'encode-coding-region' remove
text properties of the target region. Ideally, they should correctly
preserve text properties, but for the moment, it's hard. Removing
text properties is better than preserving them in a less-than-correct
way.
-*** prefer-coding-system sets EOL conversion of default coding systems.
+*** 'prefer-coding-system' sets EOL conversion of default coding systems.
If the argument to prefer-coding-system specifies a certain type of
end of line conversion, the default coding systems set by
prefer-coding-system will specify that conversion type for end of line.
-*** The new function thai-compose-string can be used to properly
+*** The new function 'thai-compose-string' can be used to properly
compose Thai characters in a string.
-** The primitive `define-prefix-command' now takes an optional third
+** The primitive 'define-prefix-command' now takes an optional third
argument NAME, which should be a string. It supplies the menu name
for the created keymap. Keymaps created in order to be displayed as
menus should always use the third argument.
-** The meanings of optional second arguments for read-char,
-read-event, and read-char-exclusive are flipped. Now the second
+** The meanings of optional second arguments for 'read-char',
+'read-event', and 'read-char-exclusive' are flipped. Now the second
arguments are INHERIT-INPUT-METHOD. These functions use the current
input method (if any) if and only if INHERIT-INPUT-METHOD is non-nil.
-** The new function clear-this-command-keys empties out the contents
+** The new function 'clear-this-command-keys' empties out the contents
of the vector that (this-command-keys) returns. This is useful in
programs that read passwords, to prevent the passwords from echoing
inadvertently as part of the next command in certain cases.
-** The new macro `with-temp-message' displays a temporary message in
-the echo area, while executing some Lisp code. Like `progn', it
+** The new macro 'with-temp-message' displays a temporary message in
+the echo area, while executing some Lisp code. Like 'progn', it
returns the value of the last form, but it also restores the previous
echo area contents.
(with-temp-message MESSAGE &rest BODY)
-** The function `require' now takes an optional third argument
+** The function 'require' now takes an optional third argument
NOERROR. If it is non-nil, then there is no error if the
requested feature cannot be loaded.
@@ -597,7 +597,7 @@ requested feature cannot be loaded.
foreground color, background color or stipple pattern
means to clear out that attribute.
-** The `outer-window-id' frame property of an X frame
+** The 'outer-window-id' frame property of an X frame
gives the window number of the outermost X window for the frame.
** Temporary buffers made with with-output-to-temp-buffer are now
@@ -605,14 +605,14 @@ read-only by default, and normally use the major mode Help mode
unless you put them in some other non-Fundamental mode before the
end of with-output-to-temp-buffer.
-** The new functions gap-position and gap-size return information on
+** The new functions 'gap-position' and 'gap-size' return information on
the gap of the current buffer.
-** The new functions position-bytes and byte-to-position provide a way
+** The new functions 'position-bytes' and 'byte-to-position' provide a way
to convert between character positions and byte positions in the
current buffer.
-** vc.el defines two new macros, `edit-vc-file' and `with-vc-file', to
+** vc.el defines two new macros, 'edit-vc-file' and 'with-vc-file', to
facilitate working with version-controlled files from Lisp programs.
These macros check out a given file automatically if needed, and check
it back in after any modifications have been made.
@@ -694,10 +694,10 @@ C-x RET x specifies a coding system for all subsequent cutting and
pasting operations.
** You can specify the printer to use for commands that do printing by
-setting the variable `printer-name'. Just what a printer name looks
+setting the variable 'printer-name'. Just what a printer name looks
like depends on your operating system. You can specify a different
printer for the PostScript printing commands by setting
-`ps-printer-name'.
+'ps-printer-name'.
** Emacs now supports on-the-fly spell checking by the means of a
minor mode. It is called M-x flyspell-mode. You don't have to remember
@@ -735,17 +735,17 @@ You can use the ENTER key to accept the current conversion.
If you type TAB to display a list of alternatives, you can select one
of the alternatives with Mouse-2.
-The meaning of the variable `input-method-verbose-flag' is changed so
-that you can set it to t, nil, `default', or `complex-only'.
+The meaning of the variable 'input-method-verbose-flag' is changed so
+that you can set it to t, nil, 'default', or 'complex-only'.
If the value is nil, extra guidance is never given.
If the value is t, extra guidance is always given.
- If the value is `complex-only', extra guidance is always given only
+ If the value is 'complex-only', extra guidance is always given only
when you are using complex input methods such as chinese-py.
- If the value is `default' (this is the default), extra guidance is
+ If the value is 'default' (this is the default), extra guidance is
given in the following case:
o When you are using a complex input method.
o When you are using a simple input method but not in the minibuffer.
@@ -755,7 +755,7 @@ input-method-verbose-flag to nil or to complex-only is a good choice,
and if you are using an input method you are not familiar with,
setting it to t is helpful.
-The old command select-input-method is now called set-input-method.
+The old command 'select-input-method' is now called 'set-input-method'.
In the language environment "Korean", you can use the following
keys:
@@ -787,7 +787,7 @@ Lisp variables in user-loaded libraries.
** C-x r t (string-rectangle) now deletes the existing rectangle
contents before inserting the specified string on each line.
-** There is a new command delete-whitespace-rectangle
+** There is a new command 'delete-whitespace-rectangle'
which deletes whitespace starting from a particular column
in all the lines on a rectangle. The column is specified
by the left edge of the rectangle.
@@ -815,7 +815,7 @@ confirmation before overwriting an existing file. When you call
the function from a Lisp program, a new optional argument CONFIRM
says whether to ask for confirmation in this case.
-** If you use find-file-literally and the file is already visited
+** If you use 'find-file-literally' and the file is already visited
non-literally, the command asks you whether to revisit the file
literally. If you say no, it signals an error.
@@ -824,22 +824,22 @@ now use the proper name for the mode hook: WHATEVER-mode-hook.
Formerly they used the name WHATEVER-mode-hooks, but that is
inconsistent with Emacs conventions.
-** shell-command-on-region (and shell-command) reports success or
+** 'shell-command-on-region' (and shell-command) reports success or
failure if the command produces no output.
-** Set focus-follows-mouse to nil if your window system or window
+** Set 'focus-follows-mouse' to nil if your window system or window
manager does not transfer focus to another window when you just move
the mouse.
-** mouse-menu-buffer-maxlen has been renamed to
-mouse-buffer-menu-maxlen to be consistent with the other related
+** 'mouse-menu-buffer-maxlen' has been renamed to
+'mouse-buffer-menu-maxlen' to be consistent with the other related
function and variable names.
-** The new variable auto-coding-alist specifies coding systems for
+** The new variable 'auto-coding-alist' specifies coding systems for
reading specific files. This has higher priority than
-file-coding-system-alist.
+'file-coding-system-alist'.
-** If you set the variable unibyte-display-via-language-environment to
+** If you set the variable 'unibyte-display-via-language-environment' to
t, then Emacs displays non-ASCII characters are displayed by
converting them to the equivalent multibyte characters according to
the current language environment. As a result, they are displayed
@@ -848,7 +848,7 @@ according to the current fontset.
** C-q's handling of codes in the range 0200 through 0377 is changed.
The codes in the range 0200 through 0237 are inserted as one byte of
-that code regardless of the values of nonascii-translation-table and
+that code regardless of the values of 'nonascii-translation-table' and
nonascii-insert-offset.
For the codes in the range 0240 through 0377, if
@@ -869,14 +869,14 @@ command keys.
** M-x apropos-command, with a prefix argument, no longer looks for
user option variables--instead it looks for noninteractive functions.
-Meanwhile, the command apropos-variable normally searches for
+Meanwhile, the command 'apropos-variable' normally searches for
user option variables; with a prefix argument, it looks at
all variables that have documentation.
** When you type a long line in the minibuffer, and the minibuffer
shows just one line, automatically scrolling works in a special way
that shows you overlap with the previous line of text. The variable
-minibuffer-scroll-overlap controls how many characters of overlap
+'minibuffer-scroll-overlap' controls how many characters of overlap
it should show; the default is 20.
Meanwhile, Resize Minibuffer mode is still available; in that mode,
@@ -904,19 +904,19 @@ the tag around point and puts that into the default grep command.
buffer positions from which M-. or other tag-finding commands were
invoked.
-** The new variable comment-padding specifies the number of spaces
-that `comment-region' will insert before the actual text of the comment.
+** The new variable 'comment-padding' specifies the number of spaces
+that 'comment-region' will insert before the actual text of the comment.
The default is 1.
** In Fortran mode the characters `.', `_' and `$' now have symbol
-syntax, not word syntax. Fortran mode now supports `imenu' and has
-new commands fortran-join-line (M-^) and fortran-narrow-to-subprogram
+syntax, not word syntax. Fortran mode now supports 'imenu' and has
+new commands 'fortran-join-line' (M-^) and 'fortran-narrow-to-subprogram'
(C-x n d). M-q can be used to fill a statement or comment block
sensibly.
-** GUD now supports jdb, the Java debugger, and pdb, the Python debugger.
+** GUD now supports 'jdb', the Java debugger, and 'pdb', the Python debugger.
-** If you set the variable add-log-keep-changes-together to a non-nil
+** If you set the variable 'add-log-keep-changes-together' to a non-nil
value, the command `C-x 4 a' will automatically notice when you make
two entries in one day for one file, and combine them.
@@ -931,13 +931,13 @@ every night.
the variable desktop-enable to t with Custom.
*** Minor modes are now restored. Which minor modes are restored
-and how modes are restored is controlled by `desktop-minor-mode-table'.
+and how modes are restored is controlled by 'desktop-minor-mode-table'.
** There is no need to do anything special, now, to enable Gnus to
read and post multi-lingual articles.
** Outline mode has now support for showing hidden outlines when
-doing an isearch. In order for this to happen search-invisible should
+doing an isearch. In order for this to happen 'search-invisible' should
be set to open (the default). If an isearch match is inside a hidden
outline the outline is made visible. If you continue pressing C-s and
the match moves outside the formerly invisible outline, the outline is
@@ -998,7 +998,7 @@ function for something else (10-20 lines of Lisp code).
*** The Dired function dired-do-toggle, which toggles marked and unmarked
files, is now bound to "t" instead of "T".
-*** dired-at-point has been added to ffap.el. It allows one to easily
+*** 'dired-at-point' has been added to ffap.el. It allows one to easily
run Dired on the directory name at point.
*** Dired has a new command: %g. It searches the contents of
@@ -1007,7 +1007,7 @@ for a specified regexp.
** VC Changes
-*** New option vc-ignore-vc-files lets you turn off version control
+*** New option 'vc-ignore-vc-files' lets you turn off version control
conveniently.
*** VC Dired has been completely rewritten. It is now much
@@ -1022,14 +1022,14 @@ currently locked (for CVS, all files not up-to-date are shown).
You can change the listing format by setting vc-dired-recurse to nil,
then it shows only the given directory, and you may also set
vc-dired-terse-display to nil, then it shows all files under version
-control plus the names of any subdirectories, so that you can type `i'
+control plus the names of any subdirectories, so that you can type 'i'
on such lines to insert them manually, as in ordinary Dired.
-All Dired commands operate normally in VC Dired, except for `v', which
+All Dired commands operate normally in VC Dired, except for 'v', which
is redefined as the version control prefix. That means you may type
-`v l', `v =' etc. to invoke `vc-print-log', `vc-diff' and the like on
+`v l', `v =' etc. to invoke 'vc-print-log', 'vc-diff' and the like on
the file named in the current Dired buffer line. `v v' invokes
-`vc-next-action' on this file, or on all files currently marked.
+'vc-next-action' on this file, or on all files currently marked.
The new command `v t' (vc-dired-toggle-terse-mode) allows you to
toggle between terse display (only locked files) and full display (all
@@ -1044,13 +1044,13 @@ command in the minibuffer, to fine-tune VC Dired's output.
file, and CVS detects conflicts, VC now offers to start an ediff
session to resolve them.
-Alternatively, you can use the new command `vc-resolve-conflicts' to
+Alternatively, you can use the new command 'vc-resolve-conflicts' to
resolve conflicts in a file at any time. It works in any buffer that
contains conflict markers as generated by rcsmerge (which is what CVS
uses as well).
*** You can now transfer changes between branches, using the new
-command vc-merge (C-x v m). It is implemented for RCS and CVS. When
+command 'vc-merge' (C-x v m). It is implemented for RCS and CVS. When
you invoke it in a buffer under version-control, you can specify
either an entire branch or a pair of versions, and the changes on that
branch or between the two versions are merged into the working file.
@@ -1059,16 +1059,16 @@ using ediff.
** Changes in Font Lock
-*** The face and variable previously known as font-lock-reference-face
-are now called font-lock-constant-face to better reflect their typical
+*** The face and variable previously known as 'font-lock-reference-face'
+are now called 'font-lock-constant-face' to better reflect their typical
use for highlighting constants and labels. (Its face properties are
-unchanged.) The variable font-lock-reference-face remains for now for
-compatibility reasons, but its value is font-lock-constant-face.
+unchanged.) The variable 'font-lock-reference-face' remains for now for
+compatibility reasons, but its value is 'font-lock-constant-face'.
** Frame name display changes
-*** The command set-frame-name lets you set the name of the current
-frame. You can use the new command select-frame-by-name to select and
+*** The command 'set-frame-name' lets you set the name of the current
+frame. You can use the new command 'select-frame-by-name' to select and
raise a frame; this is mostly useful on character-only terminals, or
when many frames are invisible or iconified.
@@ -1096,11 +1096,11 @@ C-c C-a if repeated twice consecutively now moves to the process mark,
which separates the pending input from the subprocess output and the
previously sent input.
-C-c M-r now runs comint-previous-matching-input-from-input;
+C-c M-r now runs 'comint-previous-matching-input-from-input';
it searches for a previous command, using the current pending input
as the search string.
-*** New option compilation-scroll-output can be set to scroll
+*** New option 'compilation-scroll-output' can be set to scroll
automatically in compilation-mode windows.
** C mode changes
@@ -1117,7 +1117,7 @@ style is still the default however.
*** "java" style now conforms to Sun's JDK coding style.
-*** There are new commands c-beginning-of-defun, c-end-of-defun which
+*** There are new commands 'c-beginning-of-defun', 'c-end-of-defun' which
are alternatives which you could bind to C-M-a and C-M-e if you prefer
them. They do not have key bindings by default.
@@ -1130,40 +1130,40 @@ namespace-open, namespace-close, and innamespace.
*** File local variable settings of c-file-style and c-file-offsets
makes the style variables local to that buffer only.
-*** New indentation functions c-lineup-close-paren,
-c-indent-one-line-block, c-lineup-dont-change.
+*** New indentation functions 'c-lineup-close-paren',
+'c-indent-one-line-block', 'c-lineup-dont-change'.
*** Improvements (hopefully!) to the way CC Mode is loaded. You
should now be able to do a (require 'cc-mode) to get the entire
package loaded properly for customization in your .emacs file. A new
-variable c-initialize-on-load controls this and is t by default.
+variable 'c-initialize-on-load' controls this and is t by default.
-** Changes to hippie-expand.
+** Changes to 'hippie-expand'.
-*** New customization variable `hippie-expand-dabbrev-skip-space'. If
+*** New customization variable 'hippie-expand-dabbrev-skip-space'. If
non-nil, trailing spaces may be included in the abbreviation to search for,
-which then gives the same behavior as the original `dabbrev-expand'.
+which then gives the same behavior as the original 'dabbrev-expand'.
-*** New customization variable `hippie-expand-dabbrev-as-symbol'. If
+*** New customization variable 'hippie-expand-dabbrev-as-symbol'. If
non-nil, characters of syntax '_' is considered part of the word when
expanding dynamically.
-*** New customization variable `hippie-expand-no-restriction'. If
+*** New customization variable 'hippie-expand-no-restriction'. If
non-nil, narrowed buffers are widened before they are searched.
-*** New customization variable `hippie-expand-only-buffers'. If
+*** New customization variable 'hippie-expand-only-buffers'. If
non-empty, buffers searched are restricted to the types specified in
this list. Useful for example when constructing new special-purpose
-expansion functions with `make-hippie-expand-function'.
+expansion functions with 'make-hippie-expand-function'.
*** Text properties of the expansion are no longer copied.
** Changes in BibTeX mode.
*** Any titleword matching a regexp in the new variable
-bibtex-autokey-titleword-ignore (case sensitive) is ignored during
+'bibtex-autokey-titleword-ignore' (case sensitive) is ignored during
automatic key generation. This replaces variable
-bibtex-autokey-titleword-first-ignore, which only checked for matches
+'bibtex-autokey-titleword-first-ignore', which only checked for matches
against the first word in the title.
*** Autokey generation now uses all words from the title, not just
@@ -1182,9 +1182,9 @@ bibtex-autokey-name-case-convert.
*** Support for character terminals is available: there is a new keymap
and the vcursor will appear as an arrow between buffer text. A
-variable `vcursor-interpret-input' allows input from the vcursor to be
+variable 'vcursor-interpret-input' allows input from the vcursor to be
entered exactly as if typed. Numerous functions, including
-`vcursor-compare-windows', have been rewritten to improve consistency
+'vcursor-compare-windows', have been rewritten to improve consistency
in the selection of windows and corresponding keymaps.
*** vcursor options can now be altered with M-x customize under the
@@ -1194,7 +1194,7 @@ Editing group once the package is loaded.
generally a bad side effect. Use M-x customize to set
vcursor-key-bindings to t to restore the old behavior.
-*** vcursor-auto-disable can be `copy', which turns off copying from the
+*** vcursor-auto-disable can be 'copy', which turns off copying from the
vcursor, but doesn't disable it, after any non-vcursor command.
** Ispell changes.
@@ -1219,7 +1219,7 @@ include:
RefTeX has been updated in order to make it more usable with very
large projects (like a several volume math book). The parser has been
re-written from scratch. To get maximum speed from RefTeX, check the
-section `Optimizations' in the manual.
+section 'Optimizations' in the manual.
*** New recursive parser.
@@ -1231,7 +1231,7 @@ recursive parser scans the individual files.
Reparsing of changed document parts can now be made faster by enabling
partial scans. To use this feature, read the documentation string of
-the variable `reftex-enable-partial-scans' and set the variable to t.
+the variable 'reftex-enable-partial-scans' and set the variable to t.
(setq reftex-enable-partial-scans t)
@@ -1250,13 +1250,13 @@ for large documents), you can reuse these buffers by setting
*** References to external documents.
-The LaTeX package `xr' allows to cross-reference labels in external
+The LaTeX package 'xr' allows to cross-reference labels in external
documents. RefTeX can provide information about the external
documents as well. To use this feature, set up the \externaldocument
-macros required by the `xr' package and rescan the document with
-RefTeX. The external labels can then be accessed with the `x' key in
-the selection buffer provided by `reftex-reference' (bound to `C-c )').
-The `x' key also works in the table of contents buffer.
+macros required by the 'xr' package and rescan the document with
+RefTeX. The external labels can then be accessed with the 'x' key in
+the selection buffer provided by 'reftex-reference' (bound to `C-c )').
+The 'x' key also works in the table of contents buffer.
*** Many more labeled LaTeX environments are recognized by default.
@@ -1269,13 +1269,13 @@ the enumeration of sections in the *toc* buffer accordingly.
*** Mouse support for selection and *toc* buffers
The mouse can now be used to select items in the selection and *toc*
-buffers. See also the new option `reftex-highlight-selection'.
+buffers. See also the new option 'reftex-highlight-selection'.
*** New keymaps for selection and table of contents modes.
The selection processes for labels and citation keys, and the table of
-contents buffer now have their own keymaps: `reftex-select-label-map',
-`reftex-select-bib-map', `reftex-toc-map'. The selection processes
+contents buffer now have their own keymaps: 'reftex-select-label-map',
+'reftex-select-bib-map', 'reftex-toc-map'. The selection processes
have a number of new keys predefined. In particular, TAB lets you
enter a label with completion. Check the on-the-fly help (press `?'
at the selection prompt) or read the Info documentation to find out
@@ -1283,18 +1283,18 @@ more.
*** Support for the varioref package
-The `v' key in the label selection buffer toggles \ref versus \vref.
+The 'v' key in the label selection buffer toggles \ref versus \vref.
*** New hooks
Three new hooks can be used to redefine the way labels, references,
and citations are created. These hooks are
-`reftex-format-label-function', `reftex-format-ref-function',
-`reftex-format-cite-function'.
+'reftex-format-label-function', 'reftex-format-ref-function',
+'reftex-format-cite-function'.
*** Citations outside LaTeX
-The command `reftex-citation' may also be used outside LaTeX (e.g. in
+The command 'reftex-citation' may also be used outside LaTeX (e.g. in
a mail buffer). See the Info documentation for details.
*** Short context is no longer fontified.
@@ -1305,7 +1305,7 @@ fontified, use
(setq reftex-refontify-context t)
-** file-cache-minibuffer-complete now accepts a prefix argument.
+** 'file-cache-minibuffer-complete' now accepts a prefix argument.
With a prefix argument, it does not try to do completion of
the file name within its directory; it only checks for other
directories that contain the same file name.
@@ -1339,50 +1339,50 @@ uses it for keeping notes about his postal Chess games, but it should
be helpful for other two-player games as well, as long as they have an
established system of notation similar to Chess.
-*** The new minor mode checkdoc-minor-mode provides Emacs Lisp
+*** The new minor mode 'checkdoc-minor-mode' provides Emacs Lisp
documentation string checking for style and spelling. The style
guidelines are found in the Emacs Lisp programming manual.
*** The net-utils package makes some common networking features
available in Emacs. Some of these functions are wrappers around
-system utilities (ping, nslookup, etc.); others are implementations of
-simple protocols (finger, whois) in Emacs Lisp. There are also
+system utilities ('ping', 'nslookup', etc.); others are implementations of
+simple protocols ('finger', 'whois') in Emacs Lisp. There are also
functions to make simple connections to TCP/IP ports for debugging and
the like.
-*** highlight-changes-mode is a minor mode that uses colors to
+*** 'highlight-changes-mode' is a minor mode that uses colors to
identify recently changed parts of the buffer text.
-*** The new package `midnight' lets you specify things to be done
+*** The new package 'midnight' lets you specify things to be done
within Emacs at midnight--by default, kill buffers that you have not
used in a considerable time. To use this feature, customize
-the user option `midnight-mode' to t.
+the user option 'midnight-mode' to t.
*** The file generic-x.el defines a number of simple major modes.
- apache-generic-mode: For Apache and NCSA httpd configuration files
- samba-generic-mode: Samba configuration files
- fvwm-generic-mode: For fvwm initialization files
- x-resource-generic-mode: For X resource files
- hosts-generic-mode: For hosts files (.rhosts, /etc/hosts, etc.)
- mailagent-rules-generic-mode: For mailagent .rules files
- javascript-generic-mode: For JavaScript files
- vrml-generic-mode: For VRML files
- java-manifest-generic-mode: For Java MANIFEST files
- java-properties-generic-mode: For Java property files
- mailrc-generic-mode: For .mailrc files
+ 'apache-generic-mode': For Apache and NCSA httpd configuration files
+ 'samba-generic-mode': Samba configuration files
+ 'fvwm-generic-mode': For fvwm initialization files
+ 'x-resource-generic-mode': For X resource files
+ 'hosts-generic-mode': For hosts files (.rhosts, /etc/hosts, etc.)
+ 'mailagent-rules-generic-mode': For mailagent .rules files
+ 'javascript-generic-mode': For JavaScript files
+ 'vrml-generic-mode': For VRML files
+ 'java-manifest-generic-mode': For Java MANIFEST files
+ 'java-properties-generic-mode': For Java property files
+ 'mailrc-generic-mode': For .mailrc files
Platform-specific modes:
- prototype-generic-mode: For Solaris/Sys V prototype files
- pkginfo-generic-mode: For Solaris/Sys V pkginfo files
- alias-generic-mode: For C shell alias files
- inf-generic-mode: For MS-Windows INF files
- ini-generic-mode: For MS-Windows INI files
- reg-generic-mode: For MS-Windows Registry files
- bat-generic-mode: For MS-Windows BAT scripts
- rc-generic-mode: For MS-Windows Resource files
- rul-generic-mode: For InstallShield scripts
+ 'prototype-generic-mode': For Solaris/Sys V prototype files
+ 'pkginfo-generic-mode': For Solaris/Sys V pkginfo files
+ 'alias-generic-mode': For C shell alias files
+ 'inf-generic-mode': For MS-Windows INF files
+ 'ini-generic-mode': For MS-Windows INI files
+ 'reg-generic-mode': For MS-Windows Registry files
+ 'bat-generic-mode': For MS-Windows BAT scripts
+ 'rc-generic-mode': For MS-Windows Resource files
+ 'rul-generic-mode': For InstallShield scripts
* Lisp changes in Emacs 20.3 since the Emacs Lisp Manual was published
@@ -1396,22 +1396,22 @@ Thus, each lisp file is read in a consistent way regardless of whether
you started Emacs with --unibyte, so that a Lisp program gives
consistent results regardless of how Emacs was started.
-** The new function assoc-default is useful for searching an alist,
+** The new function 'assoc-default' is useful for searching an alist,
and using a default value if the key is not found there. You can
specify a comparison predicate, so this function is useful for
searching comparing a string against an alist of regular expressions.
-** The functions unibyte-char-to-multibyte and
-multibyte-char-to-unibyte convert between unibyte and multibyte
+** The functions 'unibyte-char-to-multibyte' and
+'multibyte-char-to-unibyte' convert between unibyte and multibyte
character codes, in a way that is appropriate for the current language
environment.
-** The functions read-event, read-char and read-char-exclusive now
+** The functions 'read-event', 'read-char' and 'read-char-exclusive' now
take two optional arguments. PROMPT, if non-nil, specifies a prompt
string. SUPPRESS-INPUT-METHOD, if non-nil, says to disable the
current input method for reading this one event.
-** Two new variables print-escape-nonascii and print-escape-multibyte
+** Two new variables 'print-escape-nonascii' and 'print-escape-multibyte'
now control whether to output certain characters as
backslash-sequences. print-escape-nonascii applies to single-byte
non-ASCII characters; print-escape-multibyte applies to multibyte
@@ -1433,7 +1433,7 @@ considered obsolete. The function char-boundary-p has been deleted.
See below for additional changes relating to multibyte characters.
-** defcustom, defface and defgroup now accept the keyword `:version'.
+** 'defcustom', 'defface' and 'defgroup' now accept the keyword ':version'.
Use this to specify in which version of Emacs a certain variable's
default value changed. For example,
@@ -1446,9 +1446,9 @@ default value changed. For example,
:version "20.3")
If an entire new group is added or the variables in it have the
-default values changed, then just add a `:version' to that group. It
+default values changed, then just add a ':version' to that group. It
is recommended that new packages added to the distribution contain a
-`:version' in the top level group.
+':version' in the top level group.
This information is used to control the customize-changed-options command.
@@ -1489,25 +1489,25 @@ clear that this would be very useful; windows tend to come and go in a
very transitory fashion, so that trying to produce any specific effect
through a window-local binding would not be very robust.
-** `sregexq' and `sregex' are two new functions for constructing
+** 'sregexq' and 'sregex' are two new functions for constructing
"symbolic regular expressions." These are Lisp expressions that, when
evaluated, yield conventional string-based regexps. The symbolic form
makes it easier to construct, read, and maintain complex patterns.
See the documentation in sregex.el.
-** parse-partial-sexp's return value has an additional element which
+** 'parse-partial-sexp's return value has an additional element which
is used to pass information along if you pass it to another call to
parse-partial-sexp, starting its scan where the first call ended.
The contents of this field are not yet finalized.
-** eval-region now accepts a fourth optional argument READ-FUNCTION.
-If it is non-nil, that function is used instead of `read'.
+** 'eval-region' now accepts a fourth optional argument READ-FUNCTION.
+If it is non-nil, that function is used instead of 'read'.
-** unload-feature by default removes the feature's functions from
+** 'unload-feature' by default removes the feature's functions from
known hooks to avoid trouble, but a package providing FEATURE can
define a hook FEATURE-unload-hook to be run by unload-feature instead.
-** read-from-minibuffer no longer returns the argument DEFAULT-VALUE
+** 'read-from-minibuffer' no longer returns the argument DEFAULT-VALUE
when the user enters empty input. It now returns the null string, as
it did in Emacs 19. The default value is made available in the
history via M-n, but it is not applied here as a default.
@@ -1516,66 +1516,66 @@ The other, more specialized minibuffer-reading functions continue to
return the default value (not the null string) when the user enters
empty input.
-** The new variable read-buffer-function controls which routine to use
+** The new variable 'read-buffer-function' controls which routine to use
for selecting buffers. For example, if you set this variable to
-`iswitchb-read-buffer', iswitchb will be used to read buffer names.
+'iswitchb-read-buffer', iswitchb will be used to read buffer names.
Other functions can also be used if they accept the same arguments as
-`read-buffer' and return the selected buffer name as a string.
+'read-buffer' and return the selected buffer name as a string.
-** The new function read-passwd reads a password from the terminal,
+** The new function 'read-passwd' reads a password from the terminal,
echoing a period for each character typed. It takes three arguments:
a prompt string, a flag which says "read it twice to make sure", and a
default password to use if the user enters nothing.
-** The variable fill-nobreak-predicate gives major modes a way to
+** The variable 'fill-nobreak-predicate' gives major modes a way to
specify not to break a line at certain places. Its value is a
function which is called with no arguments, with point located at the
place where a break is being considered. If the function returns
non-nil, then the line won't be broken there.
-** window-end now takes an optional second argument, UPDATE.
+** 'window-end' now takes an optional second argument, UPDATE.
If this is non-nil, then the function always returns an accurate
up-to-date value for the buffer position corresponding to the
end of the window, even if this requires computation.
-** other-buffer now takes an optional argument FRAME
+** 'other-buffer' now takes an optional argument FRAME
which specifies which frame's buffer list to use.
If it is nil, that means use the selected frame's buffer list.
-** The new variable buffer-display-time, always local in every buffer,
+** The new variable 'buffer-display-time', always local in every buffer,
holds the value of (current-time) as of the last time that a window
was directed to display this buffer.
** It is now meaningful to compare two window-configuration objects
-with `equal'. Two window-configuration objects are equal if they
+with 'equal'. Two 'window-configuration' objects are equal if they
describe equivalent arrangements of windows, in the same frame--in
other words, if they would give the same results if passed to
-set-window-configuration.
+'set-window-configuration'.
-** compare-window-configurations is a new function that compares two
+** 'compare-window-configurations' is a new function that compares two
window configurations loosely. It ignores differences in saved buffer
positions and scrolling, and considers only the structure and sizes of
windows and the choice of buffers to display.
-** The variable minor-mode-overriding-map-alist allows major modes to
+** The variable 'minor-mode-overriding-map-alist' allows major modes to
override the key bindings of a minor mode. The elements of this alist
-look like the elements of minor-mode-map-alist: (VARIABLE . KEYMAP).
+look like the elements of 'minor-mode-map-alist': (VARIABLE . KEYMAP).
If the VARIABLE in an element of minor-mode-overriding-map-alist has a
non-nil value, the paired KEYMAP is active, and totally overrides the
map (if any) specified for the same variable in minor-mode-map-alist.
-minor-mode-overriding-map-alist is automatically local in all buffers,
+'minor-mode-overriding-map-alist' is automatically local in all buffers,
and it is meant to be set by major modes.
-** The function match-string-no-properties is like match-string
+** The function 'match-string-no-properties' is like 'match-string'
except that it discards all text properties from the result.
-** The function load-average now accepts an optional argument
+** The function 'load-average' now accepts an optional argument
USE-FLOATS. If it is non-nil, the load average values are returned as
floating point numbers, rather than as integers to be divided by 100.
-** The new variable temporary-file-directory specifies the directory
+** The new variable 'temporary-file-directory' specifies the directory
to use for creating temporary files. The default value is determined
in a reasonable way for your operating system; on GNU and Unix systems
it is based on the TMP and TMPDIR environment variables.
@@ -1586,7 +1586,7 @@ it is based on the TMP and TMPDIR environment variables.
keywords :visible and :filter. The existing keyword :keys is now
better supported.
-The variable `easy-menu-precalculate-equivalent-keybindings' controls
+The variable 'easy-menu-precalculate-equivalent-keybindings' controls
a new feature which calculates keyboard equivalents for the menu when
you define the menu. The default is t. If you rarely use menus, you
can set the variable to nil to disable this precalculation feature;
@@ -1597,7 +1597,7 @@ then the calculation is done only if you use the menu bar.
In a keymap, a key binding that has the format
(STRING . REAL-BINDING) or (STRING HELP-STRING . REAL-BINDING)
defines a menu item. Now a menu item definition may also be a list that
-starts with the symbol `menu-item'.
+starts with the symbol 'menu-item'.
The format is:
(menu-item ITEM-NAME) or
@@ -1617,7 +1617,7 @@ The supported properties include
:keys DESCRIPTION
DESCRIPTION is a string that describes an equivalent keyboard
binding for REAL-BINDING. DESCRIPTION is expanded with
- `substitute-command-keys' before it is used.
+ 'substitute-command-keys' before it is used.
:key-sequence KEY-SEQUENCE
KEY-SEQUENCE is a key-sequence for an equivalent
keyboard binding.
@@ -1637,7 +1637,7 @@ Eventually ordinary X-buttons may be supported.
** New event types
-*** The new event type `mouse-wheel' is generated by a wheel on a
+*** The new event type 'mouse-wheel' is generated by a wheel on a
mouse (such as the MS Intellimouse). The event contains a delta that
corresponds to the amount and direction that the wheel is rotated,
which is typically used to implement a scroll or zoom. The format is:
@@ -1653,7 +1653,7 @@ forward, away from the user.
As of now, this event type is generated only on MS Windows.
-*** The new event type `drag-n-drop' is generated when a group of
+*** The new event type 'drag-n-drop' is generated when a group of
files is selected in an application outside of Emacs, and then dragged
and dropped onto an Emacs frame. The event contains a list of
filenames that were dragged and dropped, which are then typically
@@ -1669,9 +1669,9 @@ As of now, this event type is generated only on MS Windows.
** Changes relating to multibyte characters.
-*** The variable enable-multibyte-characters is now read-only;
+*** The variable 'enable-multibyte-characters' is now read-only;
any attempt to set it directly signals an error. The only way
-to change this value in an existing buffer is with set-buffer-multibyte.
+to change this value in an existing buffer is with 'set-buffer-multibyte'.
*** In a string constant, `\ ' now stands for "nothing at all". You
can use it to terminate a hex escape which is followed by a character
@@ -1681,9 +1681,9 @@ that could otherwise be read as part of the hex escape.
in Emacs 19 and before.
The function chars-in-string has been deleted.
-The function concat-chars has been renamed to `string'.
+The function concat-chars has been renamed to 'string'.
-*** The function set-buffer-multibyte sets the flag in the current
+*** The function 'set-buffer-multibyte' sets the flag in the current
buffer that says whether the buffer uses multibyte representation or
unibyte representation. If the argument is nil, it selects unibyte
representation. Otherwise it selects multibyte representation.
@@ -1694,12 +1694,12 @@ viewed as characters; a sequence of two bytes which is treated as
one character when the buffer uses multibyte representation
will count as two characters using unibyte representation.
-This function sets enable-multibyte-characters to record which
+This function sets 'enable-multibyte-characters' to record which
representation is in use. It also adjusts various data in the buffer
(including its markers, overlays and text properties) so that they are
consistent with the new representation.
-*** string-make-multibyte takes a string and converts it to multibyte
+*** 'string-make-multibyte' takes a string and converts it to multibyte
representation. Most of the time, you don't need to care
about the representation, because Emacs converts when necessary;
however, it makes a difference when you compare strings.
@@ -1708,7 +1708,7 @@ The conversion of non-ASCII characters works by adding the value of
nonascii-insert-offset to each character, or by translating them
using the table nonascii-translation-table.
-*** string-make-unibyte takes a string and converts it to unibyte
+*** 'string-make-unibyte' takes a string and converts it to unibyte
representation. Most of the time, you don't need to care about the
representation, but it makes a difference when you compare strings.
@@ -1716,18 +1716,18 @@ The conversion from multibyte to unibyte representation
loses information; the only time Emacs performs it automatically
is when inserting a multibyte string into a unibyte buffer.
-*** string-as-multibyte takes a string, and returns another string
+*** 'string-as-multibyte' takes a string, and returns another string
which contains the same bytes, but treats them as multibyte.
-*** string-as-unibyte takes a string, and returns another string
+*** 'string-as-unibyte' takes a string, and returns another string
which contains the same bytes, but treats them as unibyte.
-*** The new function compare-strings lets you compare
+*** The new function 'compare-strings' lets you compare
portions of two strings. Unibyte strings are converted to multibyte,
so that a unibyte string can match a multibyte string.
You can specify whether to ignore case or not.
-*** assoc-ignore-case now uses compare-strings so that
+*** 'assoc-ignore-case' now uses compare-strings so that
it can treat unibyte and multibyte strings as equal.
*** Regular expression operations and buffer string searches now
@@ -1745,21 +1745,21 @@ expression [^\0-\177] works for it.
*** Structure of coding system changed.
All coding systems (including aliases and subsidiaries) are named
-by symbols; the symbol's `coding-system' property is a vector
+by symbols; the symbol's 'coding-system' property is a vector
which defines the coding system. Aliases share the same vector
as the principal name, so that altering the contents of this
vector affects the principal name and its aliases. You can define
your own alias name of a coding system by the function
-define-coding-system-alias.
+'define-coding-system-alias'.
The coding system definition includes a property list of its own. Use
-the new functions `coding-system-get' and `coding-system-put' to
-access such coding system properties as post-read-conversion,
-pre-write-conversion, character-translation-table-for-decode,
-character-translation-table-for-encode, mime-charset, and
-safe-charsets. For instance, (coding-system-get 'iso-latin-1
+the new functions 'coding-system-get' and 'coding-system-put' to
+access such coding system properties as 'post-read-conversion',
+'pre-write-conversion', 'character-translation-table-for-decode',
+'character-translation-table-for-encode', 'mime-charset', and
+'safe-charsets'. For instance, (coding-system-get 'iso-latin-1
'mime-charset) gives the corresponding MIME-charset parameter
-`iso-8859-1'.
+'iso-8859-1'.
Among the coding system properties listed above, safe-charsets is new.
The value of this property is a list of character sets which this
@@ -1771,54 +1771,54 @@ also be handled safely by systems other than Emacs as far as they
are capable of that coding system. Though, Emacs itself can encode
the other character sets and read it back correctly.
-*** The new function select-safe-coding-system can be used to find a
+*** The new function 'select-safe-coding-system' can be used to find a
proper coding system for encoding the specified region or string.
This function requires a user interaction.
-*** The new functions find-coding-systems-region and
-find-coding-systems-string are helper functions used by
-select-safe-coding-system. They return a list of all proper coding
+*** The new functions 'find-coding-systems-region' and
+'find-coding-systems-string' are helper functions used by
+'select-safe-coding-system'. They return a list of all proper coding
systems to encode a text in some region or string. If you don't want
a user interaction, use one of these functions instead of
-select-safe-coding-system.
+'select-safe-coding-system'.
*** The explicit encoding and decoding functions, such as
-decode-coding-region and encode-coding-string, now set
-last-coding-system-used to reflect the actual way encoding or decoding
+'decode-coding-region' and 'encode-coding-string', now set
+'last-coding-system-used' to reflect the actual way encoding or decoding
was done.
-*** The new function detect-coding-with-language-environment can be
+*** The new function 'detect-coding-with-language-environment' can be
used to detect a coding system of text according to priorities of
coding systems used by some specific language environment.
-*** The functions detect-coding-region and detect-coding-string always
+*** The functions 'detect-coding-region' and 'detect-coding-string' always
return a list if the arg HIGHEST is nil. Thus, if only ASCII
characters are found, they now return a list of single element
-`undecided' or its subsidiaries.
+'undecided' or its subsidiaries.
-*** The new functions coding-system-change-eol-conversion and
-coding-system-change-text-conversion can be used to get a different
+*** The new functions 'coding-system-change-eol-conversion' and
+'coding-system-change-text-conversion' can be used to get a different
coding system than what specified only in how end-of-line or text is
converted.
-*** The new function set-selection-coding-system can be used to set a
+*** The new function 'set-selection-coding-system' can be used to set a
coding system for communicating with other X clients.
-*** The function `map-char-table' now passes as argument only valid
+*** The function 'map-char-table' now passes as argument only valid
character codes, plus generic characters that stand for entire
character sets or entire subrows of a character set. In other words,
-each time `map-char-table' calls its FUNCTION argument, the key value
+each time 'map-char-table' calls its FUNCTION argument, the key value
either will be a valid individual character code, or will stand for a
range of characters.
-*** The new function `char-valid-p' can be used for checking whether a
+*** The new function 'char-valid-p' can be used for checking whether a
Lisp object is a valid character code or not.
-*** The new function `charset-after' returns a charset of a character
+*** The new function 'charset-after' returns a charset of a character
in the current buffer at position POS.
*** Input methods are now implemented using the variable
-input-method-function. If this is non-nil, its value should be a
+'input-method-function'. If this is non-nil, its value should be a
function; then, whenever Emacs reads an input event that is a printing
character with no modifier bits, it calls that function, passing the
event as an argument. Often this function will read more input, first
@@ -1834,10 +1834,10 @@ The input method function is not called when reading the second and
subsequent events of a key sequence.
*** You can customize any language environment by using
-set-language-environment-hook and exit-language-environment-hook.
+'set-language-environment-hook' and 'exit-language-environment-hook'.
-The hook `exit-language-environment-hook' should be used to undo
-customizations that you made with set-language-environment-hook. For
+The hook 'exit-language-environment-hook' should be used to undo
+customizations that you made with 'set-language-environment-hook'. For
instance, if you set up a special key binding for a specific language
environment by set-language-environment-hook, you should set up
exit-language-environment-hook to restore the normal key binding.
@@ -1859,9 +1859,9 @@ session or permanently. (Permanent settings are stored automatically
in your .emacs file.)
** Scroll bars are now on the left side of the window.
-You can change this with M-x customize-option scroll-bar-mode.
+You can change this with M-x customize-option 'scroll-bar-mode'.
-** The mode line no longer includes the string `Emacs'.
+** The mode line no longer includes the string 'Emacs'.
This makes more space in the mode line for other information.
** When you select a region with the mouse, it is highlighted
@@ -1873,7 +1873,7 @@ delete the character before point, as usual.
** In an incremental search the whole current match is highlighted
on terminals which support this. (You can disable this feature
-by setting search-highlight to nil.)
+by setting 'search-highlight' to nil.)
** In the minibuffer, in some cases, you can now use M-n to
insert the default value into the minibuffer as text. In effect,
@@ -1885,7 +1885,7 @@ past.)
** In Text mode, now only blank lines separate paragraphs.
This makes it possible to get the full benefit of Adaptive Fill mode
in Text mode, and other modes derived from it (such as Mail mode).
-TAB in Text mode now runs the command indent-relative; this
+TAB in Text mode now runs the command 'indent-relative'; this
makes a practical difference only when you use indented paragraphs.
As a result, the old Indented Text mode is now identical to Text mode,
@@ -1897,18 +1897,18 @@ use the new mode, Paragraph Indent Text mode.
** Scrolling changes
*** Scroll commands to scroll a whole screen now preserve the screen
-position of the cursor, if scroll-preserve-screen-position is non-nil.
+position of the cursor, if 'scroll-preserve-screen-position' is non-nil.
In this mode, if you scroll several screens back and forth, finishing
on the same screen where you started, the cursor goes back to the line
where it started.
-*** If you set scroll-conservatively to a small number, then when you
+*** If you set 'scroll-conservatively' to a small number, then when you
move point a short distance off the screen, Emacs will scroll the
screen just far enough to bring point back on screen, provided that
-does not exceed `scroll-conservatively' lines.
+does not exceed 'scroll-conservatively' lines.
-*** The new variable scroll-margin says how close point can come to the
+*** The new variable 'scroll-margin' says how close point can come to the
top or bottom of a window. It is a number of screen lines; if point
comes within that many lines of the top or bottom of the window, Emacs
recenters the window.
@@ -2005,7 +2005,7 @@ sequences already in the buffer, byte by byte. This is probably not
what you want.
If you want to edit a file of unibyte characters (Latin-1, for
-example), you can do it by specifying `no-conversion' as the coding
+example), you can do it by specifying 'no-conversion' as the coding
system when reading the file. This coding system also turns off
multibyte characters in that buffer.
@@ -2038,18 +2038,18 @@ characters).
Emacs does not use any fontset by default. Its default font is still
chosen as in previous versions. You can tell Emacs to use a fontset
-with the `-fn' option or the `Font' X resource.
+with the '-fn' option or the 'Font' X resource.
Emacs creates a standard fontset automatically according to the value
-of standard-fontset-spec. This fontset's short name is
-`fontset-standard'. Bold, italic, and bold-italic variants of the
+of 'standard-fontset-spec'. This fontset's short name is
+'fontset-standard'. Bold, italic, and bold-italic variants of the
standard fontset are created automatically.
-If you specify a default ASCII font with the `Font' resource or `-fn'
+If you specify a default ASCII font with the 'Font' resource or '-fn'
argument, a fontset is generated from it. This works by replacing the
FOUNDRY, FAMILY, ADD_STYLE, and AVERAGE_WIDTH fields of the font name
with `*' then using this to specify a fontset. This fontset's short
-name is `fontset-startup'.
+name is 'fontset-startup'.
Emacs checks resources of the form Fontset-N where N is 0, 1, 2...
The resource value should have this form:
@@ -2081,7 +2081,7 @@ Here is the substitution rule:
(This is to prevent use of auto-scaled fonts.)
The function which processes the fontset resource value to create the
-fontset is called create-fontset-from-fontset-spec. You can also call
+fontset is called 'create-fontset-from-fontset-spec'. You can also call
that function explicitly to create a fontset.
With the X resource Emacs.Font, you can specify a fontset name just
@@ -2127,7 +2127,7 @@ If the immediately following command does not use the coding system,
then C-x RET c ultimately has no effect.
For example, C-x RET c iso-8859-1 RET C-x C-f temp RET
-visits the file `temp' treating it as ISO Latin-1.
+visits the file 'temp' treating it as ISO Latin-1.
*** You can specify the coding system for a file using the -*-
construct. Include `coding: CODINGSYSTEM;' inside the -*-...-*-
@@ -2169,7 +2169,7 @@ in the corresponding buffer.
By default, process input and output are not translated at all.
-*** The variable file-name-coding-system specifies the coding system
+*** The variable 'file-name-coding-system' specifies the coding system
to use for encoding file names before operating on them.
It is also used for decoding file names obtained from the system.
@@ -2203,7 +2203,7 @@ the coding system used in the visited file. It normally follows the
first dash.
A dash indicates the default state of affairs: no code conversion
-(except CRLF => newline if appropriate). `=' means no conversion
+(except CRLF => newline if appropriate). '=' means no conversion
whatsoever. The ISO 8859 coding systems are represented by digits
1 through 9. Other coding systems are represented by letters:
@@ -2232,7 +2232,7 @@ two additional characters appear in between the dash and the file
coding system. These two characters describe the coding system for
keyboard input, and the coding system for terminal output.
-*** The new variable rmail-file-coding-system specifies the code
+*** The new variable 'rmail-file-coding-system' specifies the code
conversion to use for RMAIL files. The default value is nil.
When you read mail with Rmail, each message is decoded automatically
@@ -2240,7 +2240,7 @@ into Emacs' internal format. This has nothing to do with
rmail-file-coding-system. That variable controls reading and writing
Rmail files themselves.
-*** The new variable sendmail-coding-system specifies the code
+*** The new variable 'sendmail-coding-system' specifies the code
conversion for outgoing mail. The default value is nil.
Actually, there are three different ways of specifying the coding system
@@ -2259,7 +2259,7 @@ translations.
** An easy new way to visit a file with no code or format conversion
of any kind: Use M-x find-file-literally. There is also a command
-insert-file-literally which inserts a file into the current buffer
+'insert-file-literally' which inserts a file into the current buffer
without any conversion.
** C-q's handling of octal character codes is changed.
@@ -2277,7 +2277,7 @@ Precisely which Info files are used to look it up depends on the major
mode. For example, in C mode, the GNU libc manual is used.
** M-TAB in most programming language modes now runs the command
-complete-symbol. This command performs completion on the symbol name
+'complete-symbol'. This command performs completion on the symbol name
in the buffer before point.
With a numeric argument, it performs completion based on the set of
@@ -2310,19 +2310,19 @@ tell Emacs to go ahead anyway.
** If you wish to use Show Paren mode to display matching parentheses,
it is no longer sufficient to load paren.el. Instead you must call
-show-paren-mode.
+'show-paren-mode'.
** If you wish to use Delete Selection mode to replace a highlighted
selection when you insert new text, it is no longer sufficient to load
-delsel.el. Instead you must call the function delete-selection-mode.
+delsel.el. Instead you must call the function 'delete-selection-mode'.
** If you wish to use Partial Completion mode to complete partial words
within symbols or filenames, it is no longer sufficient to load
-complete.el. Instead you must call the function partial-completion-mode.
+complete.el. Instead you must call the function 'partial-completion-mode'.
** If you wish to use uniquify to rename buffers for you,
it is no longer sufficient to load uniquify.el. You must also
-set uniquify-buffer-name-style to one of the non-nil legitimate values.
+set 'uniquify-buffer-name-style' to one of the non-nil legitimate values.
** Changes in View mode.
@@ -2330,23 +2330,23 @@ set uniquify-buffer-name-style to one of the non-nil legitimate values.
Do H in view mode for a list of commands.
*** There are two new commands for entering View mode:
-view-file-other-frame and view-buffer-other-frame.
+'view-file-other-frame' and 'view-buffer-other-frame'.
*** Exiting View mode does a better job of restoring windows to their
previous state.
-*** New customization variable view-scroll-auto-exit. If non-nil,
+*** New customization variable 'view-scroll-auto-exit'. If non-nil,
scrolling past end of buffer makes view mode exit.
-*** New customization variable view-exits-all-viewing-windows. If
+*** New customization variable 'view-exits-all-viewing-windows'. If
non-nil, view-mode will at exit restore all windows viewing buffer,
not just the selected window.
-*** New customization variable view-read-only. If non-nil, visiting a
-read-only file automatically enters View mode, and toggle-read-only
+*** New customization variable 'view-read-only'. If non-nil, visiting a
+read-only file automatically enters View mode, and 'toggle-read-only'
turns View mode on or off.
-*** New customization variable view-remove-frame-by-deleting controls
+*** New customization variable 'view-remove-frame-by-deleting' controls
how to remove a not needed frame at view mode exit. If non-nil,
delete the frame, if nil make an icon of it.
@@ -2363,10 +2363,10 @@ blocks if a match is inside the block.
The block is hidden again if the search is continued and the next match
is outside the block. By customizing the variable
-isearch-hide-immediately you can choose to hide all the temporarily
+'isearch-hide-immediately' you can choose to hide all the temporarily
shown blocks only when exiting from incremental search.
-By customizing the variable hs-isearch-open you can choose what kind
+By customizing the variable 'hs-isearch-open' you can choose what kind
of blocks to temporarily show during isearch: comment blocks, code
blocks, all of them or none.
@@ -2384,7 +2384,7 @@ However, the mode will not be changed if
This applies to M-x set-visited-file-name as well.
-However, if you set change-major-mode-with-file-name to nil, then
+However, if you set 'change-major-mode-with-file-name' to nil, then
these commands do not change the major mode.
** M-x occur changes.
@@ -2440,30 +2440,30 @@ The expansion is also copied verbatim if the abbreviation itself has
mixed case. And using SPC M-/ to copy an additional word always
copies it verbatim except when the previous copied word is all caps.
-*** The values of `dabbrev-case-replace' and `dabbrev-case-fold-search'
+*** The values of 'dabbrev-case-replace' and 'dabbrev-case-fold-search'
are no longer Lisp expressions. They have simply three possible
values.
-`dabbrev-case-replace' has these three values: nil (don't preserve
-case), t (do), or `case-replace' (do like M-x query-replace).
-`dabbrev-case-fold-search' has these three values: nil (don't ignore
-case), t (do), or `case-fold-search' (do like search).
+'dabbrev-case-replace' has these three values: nil (don't preserve
+case), t (do), or 'case-replace' (do like M-x query-replace).
+'dabbrev-case-fold-search' has these three values: nil (don't ignore
+case), t (do), or 'case-fold-search' (do like search).
** Minibuffer history lists are truncated automatically now to a
-certain length. The variable history-length specifies how long they
+certain length. The variable 'history-length' specifies how long they
can be. The default value is 30.
** Changes in Mail mode.
-*** The key C-x m no longer runs the `mail' command directly.
-Instead, it runs the command `compose-mail', which invokes the mail
+*** The key C-x m no longer runs the 'mail' command directly.
+Instead, it runs the command 'compose-mail', which invokes the mail
composition mechanism you have selected with the variable
-`mail-user-agent'. The default choice of user agent is
-`sendmail-user-agent', which gives behavior compatible with the old
+'mail-user-agent'. The default choice of user agent is
+'sendmail-user-agent', which gives behavior compatible with the old
behavior.
-C-x 4 m now runs compose-mail-other-window, and C-x 5 m runs
-compose-mail-other-frame.
+C-x 4 m now runs 'compose-mail-other-window', and C-x 5 m runs
+'compose-mail-other-frame'.
*** While composing a reply to a mail message, from Rmail, you can use
the command C-c C-r to cite just the region from the message you are
@@ -2480,23 +2480,23 @@ need to expand mail aliases yourself before sending mail.
*** New features in the mail-complete command.
-**** The mail-complete command now inserts the user's full name,
-for local users or if that is known. The variable mail-complete-style
+**** The 'mail-complete' command now inserts the user's full name,
+for local users or if that is known. The variable 'mail-complete-style'
controls the style to use, and whether to do this at all.
-Its values are like those of mail-from-style.
+Its values are like those of 'mail-from-style'.
-**** The variable mail-passwd-command lets you specify a shell command
+**** The variable 'mail-passwd-command' lets you specify a shell command
to run to fetch a set of password-entries that add to the ones in
/etc/passwd.
-**** The variable mail-passwd-file now specifies a list of files to read
+**** The variable 'mail-passwd-file' now specifies a list of files to read
to get the list of user ids. By default, one file is used:
/etc/passwd.
** You can "quote" a file name to inhibit special significance of
special syntax, by adding `/:' to the beginning. Thus, if you have a
directory named `/foo:', you can prevent it from being treated as a
-reference to a remote host named `foo' by writing it as `/:/foo:'.
+reference to a remote host named 'foo' by writing it as `/:/foo:'.
Emacs uses this new construct automatically when necessary, such as
when you start it with a working directory whose name might otherwise
@@ -2560,7 +2560,7 @@ for output.
Gnus.
*** Scoring can now be performed with logical operators like
-`and', `or', `not', and parent redirection.
+'and', 'or', 'not', and parent redirection.
*** Article washing status can be displayed in the
article mode line.
@@ -2569,18 +2569,18 @@ article mode line.
*** Suppression of duplicate articles based on Message-ID.
-(setq gnus-suppress-duplicates t)
+ (setq gnus-suppress-duplicates t)
*** New variables for specifying what score and adapt files
are to be considered home score and adapt files. See
-`gnus-home-score-file' and `gnus-home-adapt-files'.
+'gnus-home-score-file' and 'gnus-home-adapt-files'.
*** Groups can inherit group parameters from parent topics.
*** Article editing has been revamped and is now usable.
*** Signatures can be recognized in more intelligent fashions.
-See `gnus-signature-separator' and `gnus-signature-limit'.
+See 'gnus-signature-separator' and 'gnus-signature-limit'.
*** Summary pick mode has been made to look more nn-like.
Line numbers are displayed and the `.' command can be
@@ -2597,7 +2597,7 @@ generating lines in buffers.
*** Several commands in the group buffer can be undone with
`C-M-_'.
-*** Scoring can be done on words using the new score type `w'.
+*** Scoring can be done on words using the new score type 'w'.
*** Adaptive scoring can be done on a Subject word-by-word basis:
@@ -2616,7 +2616,7 @@ the native server.
`M-x gnus-group-clear-data-on-native-groups'
*** A new command for reading collections of documents
-(nndoc with nnvirtual on top) has been added -- `C-M-d'.
+(nndoc with nnvirtual on top) has been added -- 'C-M-d'.
*** Process mark sets can be pushed and popped.
@@ -2651,14 +2651,14 @@ sorting functions, and each topic can be sorted independently.
*** More hooks and functions have been added to remove junk
from incoming mail before saving the mail.
- See `nnmail-prepare-incoming-header-hook'.
+ See 'nnmail-prepare-incoming-header-hook'.
*** The nnml mail backend now understands compressed article files.
*** To enable Gnus to read/post multi-lingual articles, you must execute
the following code, for instance, in your .emacs.
- (add-hook 'gnus-startup-hook 'gnus-mule-initialize)
+ (add-hook 'gnus-startup-hook #'gnus-mule-initialize)
Then, when you start Gnus, it will decode non-ASCII text automatically
and show appropriate characters. (Note: if you are using gnus-mime
@@ -2712,17 +2712,17 @@ share the same style variable settings; to make them buffer local, set
c-style-variables-are-local-p to t in your .emacs file. Note that you
must do this *before* CC Mode is loaded.
-*** The new variable c-indentation-style holds the C style name
+*** The new variable 'c-indentation-style' holds the C style name
of the current buffer.
-*** The variable c-block-comments-indent-p has been deleted, because
+*** The variable 'c-block-comments-indent-p' has been deleted, because
it is no longer necessary. C mode now handles all the supported styles
of block comments, with no need to say which one you will use.
*** There is a new indentation style "python", which specifies the C
style that the Python developers like.
-*** There is a new c-cleanup-list option: brace-elseif-brace.
+*** There is a new 'c-cleanup-list' option: brace-elseif-brace.
This says to put ...} else if (...) {... on one line,
just as brace-else-brace says to put ...} else {... on one line.
@@ -2744,17 +2744,17 @@ other developers. Such files are made read-only by CVS. To get a
writable copy, type C-x C-q in a buffer visiting such a file. VC then
calls "cvs edit", which notifies the other developers of it.
-*** vc-version-diff (C-u C-x v =) now suggests reasonable defaults for
+*** 'vc-version-diff' (C-u C-x v =) now suggests reasonable defaults for
version numbers, based on the current state of the file.
** Calendar changes.
-*** A new function, list-holidays, allows you list holidays or
+*** A new function, 'list-holidays', allows you list holidays or
subclasses of holidays for ranges of years. Related menu items allow
you do this for the year of the selected date, or the
following/previous years.
-*** There is now support for the Baha'i calendar system. Use `pb' in
+*** There is now support for the Baha'i calendar system. Use 'pb' in
the *Calendar* buffer to display the current Baha'i date. The Baha'i
calendar, or "Badi calendar" is a system of 19 months with 19 days
each, and 4 intercalary days (5 during a Gregorian leap year). The
@@ -2771,17 +2771,17 @@ layout.
Some printer systems print a header page and force the first page to
be printed on the back of the header page when using duplex. If your
printer system has this behavior, set variable
-`ps-banner-page-when-duplexing' to t.
+'ps-banner-page-when-duplexing' to t.
-If variable `ps-banner-page-when-duplexing' is non-nil, it prints a
+If variable 'ps-banner-page-when-duplexing' is non-nil, it prints a
blank page as the very first printed page. So, it behaves as if the
very first character of buffer (or region) were a form feed ^L (\014).
-The variable `ps-spool-config' specifies who is responsible for
+The variable 'ps-spool-config' specifies who is responsible for
setting duplex mode and page size. Valid values are:
- lpr-switches duplex and page size are configured by `ps-lpr-switches'.
- Don't forget to set `ps-lpr-switches' to select duplex
+ lpr-switches duplex and page size are configured by 'ps-lpr-switches'.
+ Don't forget to set 'ps-lpr-switches' to select duplex
printing for your printer.
setpagedevice duplex and page size are configured by ps-print using the
@@ -2790,15 +2790,15 @@ setting duplex mode and page size. Valid values are:
nil duplex and page size are configured by ps-print *not* using
the setpagedevice PostScript operator.
-The variable `ps-spool-tumble' specifies how the page images on
+The variable 'ps-spool-tumble' specifies how the page images on
opposite sides of a sheet are oriented with respect to each other. If
-`ps-spool-tumble' is nil, ps-print produces output suitable for
-bindings on the left or right. If `ps-spool-tumble' is non-nil,
+'ps-spool-tumble' is nil, ps-print produces output suitable for
+bindings on the left or right. If 'ps-spool-tumble' is non-nil,
ps-print produces output suitable for bindings at the top or bottom.
-This variable takes effect only if `ps-spool-duplex' is non-nil.
+This variable takes effect only if 'ps-spool-duplex' is non-nil.
The default value is nil.
-The variable `ps-header-frame-alist' specifies a header frame
+The variable 'ps-header-frame-alist' specifies a header frame
properties alist. Valid frame properties are:
fore-color Specify the foreground frame color.
@@ -2824,25 +2824,25 @@ properties alist. Valid frame properties are:
Any other property is ignored.
Don't change this alist directly; instead use Custom, or the
-`ps-value', `ps-get', `ps-put' and `ps-del' functions (see there for
+'ps-value', 'ps-get', 'ps-put' and 'ps-del' functions (see there for
documentation).
Ps-print can also print footers. The footer variables are:
-`ps-print-footer', `ps-footer-offset', `ps-print-footer-frame',
-`ps-footer-font-family', `ps-footer-font-size', `ps-footer-line-pad',
-`ps-footer-lines', `ps-left-footer', `ps-right-footer' and
-`ps-footer-frame-alist'. These variables are similar to those
+'ps-print-footer', 'ps-footer-offset', 'ps-print-footer-frame',
+'ps-footer-font-family', 'ps-footer-font-size', 'ps-footer-line-pad',
+'ps-footer-lines', 'ps-left-footer', 'ps-right-footer' and
+'ps-footer-frame-alist'. These variables are similar to those
controlling headers.
*** Color management (subgroup)
-If `ps-print-color-p' is non-nil, the buffer's text will be printed in
+If 'ps-print-color-p' is non-nil, the buffer's text will be printed in
color.
*** Face Management (subgroup)
If you need to print without worrying about face background colors,
-set the variable `ps-use-face-background' which specifies if face
+set the variable 'ps-use-face-background' which specifies if face
background should be used. Valid values are:
t always use face background color.
@@ -2851,47 +2851,47 @@ background should be used. Valid values are:
*** N-up printing (subgroup)
-The variable `ps-n-up-printing' specifies the number of pages per
+The variable 'ps-n-up-printing' specifies the number of pages per
sheet of paper.
-The variable `ps-n-up-margin' specifies the margin in points (pt)
+The variable 'ps-n-up-margin' specifies the margin in points (pt)
between the sheet border and the n-up printing.
-If variable `ps-n-up-border-p' is non-nil, a border is drawn around
+If variable 'ps-n-up-border-p' is non-nil, a border is drawn around
each page.
-The variable `ps-n-up-filling' specifies how the page matrix is filled
+The variable 'ps-n-up-filling' specifies how the page matrix is filled
on each sheet of paper. Following are the valid values for
-`ps-n-up-filling' with a filling example using a 3x4 page matrix:
+'ps-n-up-filling' with a filling example using a 3x4 page matrix:
- `left-top' 1 2 3 4 `left-bottom' 9 10 11 12
+ 'left-top' 1 2 3 4 'left-bottom' 9 10 11 12
5 6 7 8 5 6 7 8
9 10 11 12 1 2 3 4
- `right-top' 4 3 2 1 `right-bottom' 12 11 10 9
+ 'right-top' 4 3 2 1 'right-bottom' 12 11 10 9
8 7 6 5 8 7 6 5
12 11 10 9 4 3 2 1
- `top-left' 1 4 7 10 `bottom-left' 3 6 9 12
+ 'top-left' 1 4 7 10 'bottom-left' 3 6 9 12
2 5 8 11 2 5 8 11
3 6 9 12 1 4 7 10
- `top-right' 10 7 4 1 `bottom-right' 12 9 6 3
+ 'top-right' 10 7 4 1 'bottom-right' 12 9 6 3
11 8 5 2 11 8 5 2
12 9 6 3 10 7 4 1
-Any other value is treated as `left-top'.
+Any other value is treated as 'left-top'.
*** Zebra stripes (subgroup)
-The variable `ps-zebra-color' controls the zebra stripes grayscale or
+The variable 'ps-zebra-color' controls the zebra stripes grayscale or
RGB color.
-The variable `ps-zebra-stripe-follow' specifies how zebra stripes
+The variable 'ps-zebra-stripe-follow' specifies how zebra stripes
continue on next page. Visually, valid values are (the character `+'
to the right of each column indicates that a line is printed):
- `nil' `follow' `full' `full-follow'
+ 'nil' 'follow' 'full' 'full-follow'
Current Page -------- ----------- --------- ----------------
1 XXXXX + 1 XXXXXXXX + 1 XXXXXX + 1 XXXXXXXXXXXXX +
2 XXXXX + 2 XXXXXXXX + 2 XXXXXX + 2 XXXXXXXXXXXXX +
@@ -2919,86 +2919,86 @@ to the right of each column indicates that a line is printed):
22 + 22 +
-------- ----------- --------- ----------------
-Any other value is treated as `nil'.
+Any other value is treated as 'nil'.
*** Printer management (subgroup)
-The variable `ps-printer-name-option' determines the option used by
+The variable 'ps-printer-name-option' determines the option used by
some utilities to indicate the printer name; it's used only when
-`ps-printer-name' is a non-empty string. If you're using the lpr
-utility to print, for example, `ps-printer-name-option' should be set
+'ps-printer-name' is a non-empty string. If you're using the lpr
+utility to print, for example, 'ps-printer-name-option' should be set
to "-P".
-The variable `ps-manual-feed' indicates if the printer requires manual
+The variable 'ps-manual-feed' indicates if the printer requires manual
paper feeding. If it's nil, automatic feeding takes place. If it's
non-nil, manual feeding takes place.
-The variable `ps-end-with-control-d' specifies whether C-d (\x04)
+The variable 'ps-end-with-control-d' specifies whether C-d (\x04)
should be inserted at end of the generated PostScript. Non-nil means
do so.
*** Page settings (subgroup)
-If variable `ps-warn-paper-type' is nil, it's *not* treated as an
+If variable 'ps-warn-paper-type' is nil, it's *not* treated as an
error if the PostScript printer doesn't have a paper with the size
-indicated by `ps-paper-type'; the default paper size will be used
-instead. If `ps-warn-paper-type' is non-nil, an error is signaled if
+indicated by 'ps-paper-type'; the default paper size will be used
+instead. If 'ps-warn-paper-type' is non-nil, an error is signaled if
the PostScript printer doesn't support a paper with the size indicated
-by `ps-paper-type'. This is used when `ps-spool-config' is set to
-`setpagedevice'.
+by 'ps-paper-type'. This is used when 'ps-spool-config' is set to
+'setpagedevice'.
-The variable `ps-print-upside-down' determines the orientation for
-printing pages: nil means `normal' printing, non-nil means
-`upside-down' printing (that is, the page is rotated by 180 degrees).
+The variable 'ps-print-upside-down' determines the orientation for
+printing pages: nil means 'normal' printing, non-nil means
+'upside-down' printing (that is, the page is rotated by 180 degrees).
-The variable `ps-selected-pages' specifies which pages to print. If
+The variable 'ps-selected-pages' specifies which pages to print. If
it's nil, all pages are printed. If it's a list, list elements may be
integers specifying a single page to print, or cons cells (FROM . TO)
specifying to print from page FROM to TO. Invalid list elements, that
is integers smaller than one, or elements whose FROM is greater than
its TO, are ignored.
-The variable `ps-even-or-odd-pages' specifies how to print even/odd
+The variable 'ps-even-or-odd-pages' specifies how to print even/odd
pages. Valid values are:
nil print all pages.
- `even-page' print only even pages.
+ 'even-page' print only even pages.
- `odd-page' print only odd pages.
+ 'odd-page' print only odd pages.
- `even-sheet' print only even sheets.
- That is, if `ps-n-up-printing' is 1, it behaves like
- `even-page', but for values greater than 1, it'll
+ 'even-sheet' print only even sheets.
+ That is, if 'ps-n-up-printing' is 1, it behaves like
+ 'even-page', but for values greater than 1, it'll
print only the even sheet of paper.
- `odd-sheet' print only odd sheets.
- That is, if `ps-n-up-printing' is 1, it behaves like
- `odd-page'; but for values greater than 1, it'll print
+ 'odd-sheet' print only odd sheets.
+ That is, if 'ps-n-up-printing' is 1, it behaves like
+ 'odd-page'; but for values greater than 1, it'll print
only the odd sheet of paper.
Any other value is treated as nil.
-If you set `ps-selected-pages' (see there for documentation), pages
-are filtered by `ps-selected-pages', and then by
-`ps-even-or-odd-pages'. For example, if we have:
+If you set 'ps-selected-pages' (see there for documentation), pages
+are filtered by 'ps-selected-pages', and then by
+'ps-even-or-odd-pages'. For example, if we have:
(setq ps-selected-pages '(1 4 (6 . 10) (12 . 16) 20))
-and we combine this with `ps-even-or-odd-pages' and
-`ps-n-up-printing', we get:
+and we combine this with 'ps-even-or-odd-pages' and
+'ps-n-up-printing', we get:
-`ps-n-up-printing' = 1:
- `ps-even-or-odd-pages' PAGES PRINTED
+'ps-n-up-printing' = 1:
+ 'ps-even-or-odd-pages' PAGES PRINTED
nil 1, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 20
even-page 4, 6, 8, 10, 12, 14, 16, 20
odd-page 1, 7, 9, 13, 15
even-sheet 4, 6, 8, 10, 12, 14, 16, 20
odd-sheet 1, 7, 9, 13, 15
-`ps-n-up-printing' = 2:
- `ps-even-or-odd-pages' PAGES PRINTED
+'ps-n-up-printing' = 2:
+ 'ps-even-or-odd-pages' PAGES PRINTED
nil 1/4, 6/7, 8/9, 10/12, 13/14, 15/16, 20
even-page 4/6, 8/10, 12/14, 16/20
odd-page 1/7, 9/13, 15
@@ -3007,23 +3007,23 @@ and we combine this with `ps-even-or-odd-pages' and
*** Miscellany (subgroup)
-The variable `ps-error-handler-message' specifies where error handler
+The variable 'ps-error-handler-message' specifies where error handler
messages should be sent.
It is also possible to add a user-defined PostScript prologue code in
front of all generated prologue code by setting the variable
-`ps-user-defined-prologue'.
+'ps-user-defined-prologue'.
-The variable `ps-line-number-font' specifies the font for line numbers.
+The variable 'ps-line-number-font' specifies the font for line numbers.
-The variable `ps-line-number-font-size' specifies the font size in
+The variable 'ps-line-number-font-size' specifies the font size in
points for line numbers.
-The variable `ps-line-number-color' specifies the color for line
-numbers. See `ps-zebra-color' for documentation.
+The variable 'ps-line-number-color' specifies the color for line
+numbers. See 'ps-zebra-color' for documentation.
-The variable `ps-line-number-step' specifies the interval in which
-line numbers are printed. For example, if `ps-line-number-step' is set
+The variable 'ps-line-number-step' specifies the interval in which
+line numbers are printed. For example, if 'ps-line-number-step' is set
to 2, the printing will look like:
1 one line
@@ -3040,14 +3040,14 @@ integer an integer specifying the interval in which line numbers are
printed. If it's smaller than or equal to zero, 1
is used.
-`zebra' specifies that only the line number of the first line in a
+'zebra' specifies that only the line number of the first line in a
zebra stripe is to be printed.
-Any other value is treated as `zebra'.
+Any other value is treated as 'zebra'.
-The variable `ps-line-number-start' specifies the starting point in
-the interval given by `ps-line-number-step'. For example, if
-`ps-line-number-step' is set to 3, and `ps-line-number-start' is set to
+The variable 'ps-line-number-start' specifies the starting point in
+the interval given by 'ps-line-number-step'. For example, if
+'ps-line-number-step' is set to 3, and 'ps-line-number-start' is set to
3, the output will look like:
one line
@@ -3062,20 +3062,20 @@ the interval given by `ps-line-number-step'. For example, if
one line
...
-The variable `ps-postscript-code-directory' specifies the directory
+The variable 'ps-postscript-code-directory' specifies the directory
where the PostScript prologue file used by ps-print is found.
-The variable `ps-line-spacing' determines the line spacing in points,
+The variable 'ps-line-spacing' determines the line spacing in points,
for ordinary text, when generating PostScript (similar to
-`ps-font-size').
+'ps-font-size').
-The variable `ps-paragraph-spacing' determines the paragraph spacing,
+The variable 'ps-paragraph-spacing' determines the paragraph spacing,
in points, for ordinary text, when generating PostScript (similar to
-`ps-font-size').
+'ps-font-size').
-The variable `ps-paragraph-regexp' specifies the paragraph delimiter.
+The variable 'ps-paragraph-regexp' specifies the paragraph delimiter.
-The variable `ps-begin-cut-regexp' and `ps-end-cut-regexp' specify the
+The variable 'ps-begin-cut-regexp' and 'ps-end-cut-regexp' specify the
start and end of a region to cut out when printing.
** hideshow changes.
@@ -3083,33 +3083,33 @@ start and end of a region to cut out when printing.
*** now supports hiding of blocks of single line comments (like // for
C++, ; for lisp).
-*** Support for java-mode added.
+*** Support for 'java-mode' added.
-*** When doing `hs-hide-all' it is now possible to also hide the comments
-in the file if `hs-hide-comments-when-hiding-all' is set.
+*** When doing 'hs-hide-all' it is now possible to also hide the comments
+in the file if 'hs-hide-comments-when-hiding-all' is set.
-*** The new function `hs-hide-initial-comment' hides the comments at
+*** The new function 'hs-hide-initial-comment' hides the comments at
the beginning of the files. Finally those huge RCS logs don't stay in your
-way! This is run by default when entering the `hs-minor-mode'.
+way! This is run by default when entering the 'hs-minor-mode'.
-*** Now uses overlays instead of `selective-display', so is more
+*** Now uses overlays instead of 'selective-display', so is more
robust and a lot faster.
*** A block beginning can span multiple lines.
-*** The new variable `hs-show-hidden-short-form' if t, directs hideshow
+*** The new variable 'hs-show-hidden-short-form' if t, directs hideshow
to show only the beginning of a block when it is hidden. See the
documentation for more details.
** Changes in Enriched mode.
-*** When you visit a file in enriched-mode, Emacs will make sure it is
+*** When you visit a file in 'enriched-mode', Emacs will make sure it is
filled to the current fill-column. This behavior is now independent
of the size of the window. When you save the file, the fill-column in
use is stored as well, so that the whole buffer need not be refilled
the next time unless the fill-column is different.
-*** use-hard-newlines is now a minor mode. When it is enabled, Emacs
+*** 'use-hard-newlines' is now a minor mode. When it is enabled, Emacs
distinguishes between hard and soft newlines, and treats hard newlines
as paragraph boundaries. Otherwise all newlines inserted are marked
as soft, and paragraph boundaries are determined solely from the text.
@@ -3118,8 +3118,8 @@ as soft, and paragraph boundaries are determined solely from the text.
*** Custom support
-The variables font-lock-face-attributes, font-lock-display-type and
-font-lock-background-mode are now obsolete; the recommended way to specify
+The variables 'font-lock-face-attributes', 'font-lock-display-type' and
+'font-lock-background-mode' are now obsolete; the recommended way to specify
the faces to use for Font Lock mode is with M-x customize-group on the new
custom group font-lock-faces. If you set font-lock-face-attributes in your
~/.emacs file, Font Lock mode will respect its value. However, you should
@@ -3145,9 +3145,9 @@ support Font Lock mode, via the command global-font-lock-mode.
*** Configurable support
Support for C, C++, Objective-C and Java can be more easily configured for
-additional types and classes via the new variables c-font-lock-extra-types,
-c++-font-lock-extra-types, objc-font-lock-extra-types and, you guessed it,
-java-font-lock-extra-types. These value of each of these variables should be a
+additional types and classes via the new variables 'c-font-lock-extra-types',
+'c++-font-lock-extra-types', 'objc-font-lock-extra-types' and, you guessed it,
+'java-font-lock-extra-types'. The value of each of these variables should be a
list of regexps matching the extra type names. For example, the default value
of c-font-lock-extra-types is ("\\sw+_t") which means fontification follows the
convention that C type names end in _t. This results in slower fontification.
@@ -3158,38 +3158,38 @@ it easier to make specific and common changes for the fontification of types.
*** Adding highlighting patterns to existing support
-You can use the new function font-lock-add-keywords to add your own
+You can use the new function 'font-lock-add-keywords' to add your own
highlighting patterns, such as for project-local or user-specific constructs,
for any mode.
-For example, to highlight `FIXME:' words in C comments, put:
+For example, to highlight 'FIXME:' words in C comments, put:
- (font-lock-add-keywords 'c-mode '(("\\<FIXME:" 0 font-lock-warning-face t)))
+ (font-lock-add-keywords 'c-mode '(("\\<FIXME:" 0 font-lock-warning-face t)))
in your ~/.emacs.
*** New faces
-Font Lock now defines two new faces, font-lock-builtin-face and
-font-lock-warning-face. These are intended to highlight builtin keywords,
+Font Lock now defines two new faces, 'font-lock-builtin-face' and
+'font-lock-warning-face'. These are intended to highlight builtin keywords,
distinct from a language's normal keywords, and objects that should be brought
to user attention, respectively. Various modes now use these new faces.
*** Changes to fast-lock support mode
The fast-lock package, one of the two Font Lock support modes, can now process
-cache files silently. You can use the new variable fast-lock-verbose, in the
-same way as font-lock-verbose, to control this feature.
+cache files silently. You can use the new variable 'fast-lock-verbose', in the
+same way as 'font-lock-verbose', to control this feature.
*** Changes to lazy-lock support mode
The lazy-lock package, one of the two Font Lock support modes, can now fontify
according to the true syntactic context relative to other lines. You can use
-the new variable lazy-lock-defer-contextually to control this feature. If
+the new variable 'lazy-lock-defer-contextually' to control this feature. If
non-nil, changes to the buffer will cause subsequent lines in the buffer to be
-refontified after lazy-lock-defer-time seconds of idle time. If nil, then only
-the modified lines will be refontified; this is the same as the previous Lazy
-Lock mode behavior and the behavior of Font Lock mode.
+refontified after 'lazy-lock-defer-time' seconds of idle time. If nil, then
+only the modified lines will be refontified; this is the same as the previous
+Lazy Lock mode behavior and the behavior of Font Lock mode.
This feature is useful in modes where strings or comments can span lines.
For example, if a string or comment terminating character is deleted, then if
@@ -3200,10 +3200,10 @@ the command M-o M-o (font-lock-fontify-block) to refontify some lines.
As a consequence of this new feature, two other variables have changed:
-Variable `lazy-lock-defer-driven' is renamed `lazy-lock-defer-on-scrolling'.
-Variable `lazy-lock-defer-time' can now only be a time, i.e., a number.
+Variable 'lazy-lock-defer-driven' is renamed 'lazy-lock-defer-on-scrolling'.
+Variable 'lazy-lock-defer-time' can now only be a time, i.e., a number.
Buffer modes for which on-the-fly deferral applies can be specified via the
-new variable `lazy-lock-defer-on-the-fly'.
+new variable 'lazy-lock-defer-on-the-fly'.
If you set these variables in your ~/.emacs, then you may have to change those
settings.
@@ -3217,18 +3217,18 @@ you try to switch to its body file, Ada mode now generates procedure
stubs.
*** There are two new commands:
- - `ada-make-local' : invokes gnatmake on the current buffer
- - `ada-check-syntax' : check syntax of current buffer.
+ - 'ada-make-local' : invokes gnatmake on the current buffer
+ - 'ada-check-syntax' : check syntax of current buffer.
-The user options `ada-compiler-make', `ada-make-options',
-`ada-language-version', `ada-compiler-syntax-check', and
-`ada-compile-options' are used within these commands.
+The user options 'ada-compiler-make', 'ada-make-options',
+'ada-language-version', 'ada-compiler-syntax-check', and
+'ada-compile-options' are used within these commands.
*** Ada mode can now work with Outline minor mode. The outline level
is calculated from the indenting, not from syntactic constructs.
Outlining does not work if your code is not correctly indented.
-*** The new function `ada-gnat-style' converts the buffer to the style of
+*** The new function 'ada-gnat-style' converts the buffer to the style of
formatting used in GNAT. It places two blanks after a comment start,
places one blank between a word end and an opening '(', and puts one
space between a comma and the beginning of a word.
@@ -3237,13 +3237,13 @@ space between a comma and the beginning of a word.
*** Scheme mode indentation now uses many of the facilities of Lisp
mode; therefore, the variables to customize it are the variables used
-for Lisp mode which have names starting with `lisp-'. The variables
-with names starting with `scheme-' which used to do this no longer
+for Lisp mode which have names starting with 'lisp-'. The variables
+with names starting with 'scheme-' which used to do this no longer
have any effect.
If you want to use different indentation for Scheme and Lisp, this is
still possible, but now you must do it by adding a hook to
-scheme-mode-hook, which could work by setting the `lisp-' indentation
+scheme-mode-hook, which could work by setting the 'lisp-' indentation
variables as buffer-local variables.
*** DSSSL mode is a variant of Scheme mode, for editing DSSSL scripts.
@@ -3269,11 +3269,11 @@ option takes precedence.
constantly shows the parameter list for function being called at point
(in Emacs Lisp and Lisp Interaction modes only).
-** C-x n d now runs the new command narrow-to-defun,
+** C-x n d now runs the new command 'narrow-to-defun',
which narrows the accessible parts of the buffer to just
the current defun.
-** Emacs now handles the `--' argument in the standard way; all
+** Emacs now handles the '--' argument in the standard way; all
following arguments are treated as ordinary file names.
** On MSDOS and Windows, the bookmark file is now called _emacs.bmk,
@@ -3293,16 +3293,16 @@ be useful for Emacs to revert the file without querying you whenever
you visit the file afresh with C-x C-f.
You can request this behavior for certain files by setting the
-variable revert-without-query to a list of regular expressions. If a
+variable 'revert-without-query' to a list of regular expressions. If a
file's name matches any of these regular expressions, find-file and
revert-buffer revert the buffer without asking for permission--but
only if you have not edited the buffer text yourself.
-** set-default-font has been renamed to set-frame-font
+** set-default-font has been renamed to 'set-frame-font'
since it applies only to the current frame.
-** In TeX mode, you can use the variable tex-main-file to specify the
-file for tex-file to run TeX on. (By default, tex-main-file is nil,
+** In TeX mode, you can use the variable 'tex-main-file' to specify the
+file for 'tex-file' to run TeX on. (By default, tex-main-file is nil,
and tex-file runs TeX on the current visited file.)
This is useful when you are editing a document that consists of
@@ -3319,22 +3319,22 @@ different environments (equation, figure, ...) and has full support for
multifile documents. To use it, select a buffer with a LaTeX document and
turn the mode on with M-x reftex-mode. Here are the main user commands:
-C-c ( reftex-label
+C-c ( 'reftex-label'
Creates a label semi-automatically. RefTeX is context sensitive and
knows which kind of label is needed.
-C-c ) reftex-reference
+C-c ) 'reftex-reference'
Offers in a menu all labels in the document, along with context of the
label definition. The selected label is referenced as \ref{LABEL}.
-C-c [ reftex-citation
+C-c [ 'reftex-citation'
Prompts for a regular expression and displays a list of matching BibTeX
database entries. The selected entry is cited with a \cite{KEY} macro.
-C-c & reftex-view-crossref
+C-c & 'reftex-view-crossref'
Views the cross reference of a \ref or \cite command near point.
-C-c = reftex-toc
+C-c = 'reftex-toc'
Shows a table of contents of the (multifile) document. From there you
can quickly jump to every section.
@@ -3364,13 +3364,13 @@ appropriate functions.
*** New interactive functions for repositioning and marking of
entries. They are bound by default to C-M-l and C-M-h.
-*** New hook bibtex-clean-entry-hook. It is called after entry has
+*** New hook 'bibtex-clean-entry-hook'. It is called after entry has
been cleaned.
-*** New variable bibtex-field-delimiters, which replaces variables
+*** New variable 'bibtex-field-delimiters', which replaces variables
bibtex-field-{left|right}-delimiter.
-*** New variable bibtex-entry-delimiters to determine how entries
+*** New variable 'bibtex-entry-delimiters' to determine how entries
shall be delimited.
*** Allow preinitialization of fields. See documentation of
@@ -3379,9 +3379,9 @@ bibtex-include-OPTkey for details.
*** Book and InBook entries require either an author or an editor
field. This is now supported by bibtex.el. Alternative fields are
-prefixed with `ALT'.
+prefixed with 'ALT'.
-*** New variable bibtex-entry-format, which replaces variable
+*** New variable 'bibtex-entry-format', which replaces variable
bibtex-clean-entry-zap-empty-opts and allows specification of many
formatting options performed on cleaning an entry (see variable
documentation).
@@ -3390,43 +3390,43 @@ documentation).
documentation of bibtex-generate-autokey for details. Transcriptions
for foreign languages other than German are now handled, too.
-*** New boolean user option bibtex-comma-after-last-field to decide if
+*** New boolean user option 'bibtex-comma-after-last-field' to decide if
comma should be inserted at end of last field.
-*** New boolean user option bibtex-align-at-equal-sign to determine if
+*** New boolean user option 'bibtex-align-at-equal-sign' to determine if
alignment should be made at left side of field contents or at equal
signs. New user options to control entry layout (e.g. indentation).
-*** New function bibtex-fill-entry to realign entries.
+*** New function 'bibtex-fill-entry' to realign entries.
-*** New function bibtex-reformat to reformat region or buffer.
+*** New function 'bibtex-reformat' to reformat region or buffer.
-*** New function bibtex-convert-alien to convert a BibTeX database
+*** New function 'bibtex-convert-alien' to convert a BibTeX database
from alien sources.
-*** New function bibtex-complete-key (similar to bibtex-complete-string)
+*** New function 'bibtex-complete-key' (similar to bibtex-complete-string)
to complete prefix to a key defined in buffer. Mainly useful in
crossref entries.
-*** New function bibtex-count-entries to count entries in buffer or
+*** New function 'bibtex-count-entries' to count entries in buffer or
region.
*** Added support for imenu.
-*** The function `bibtex-validate' now checks current region instead
+*** The function 'bibtex-validate' now checks current region instead
of buffer if mark is active. Now it shows all errors of buffer in a
`compilation mode' buffer. You can use the normal commands (e.g.
-`next-error') for compilation modes to jump to errors.
+'next-error') for compilation modes to jump to errors.
-*** New variable `bibtex-string-file-path' to determine where the files
-from `bibtex-string-files' are searched.
+*** New variable 'bibtex-string-file-path' to determine where the files
+from 'bibtex-string-files' are searched.
** Iso Accents mode now supports Latin-3 as an alternative.
-** The command next-error now opens blocks hidden by hideshow.
+** The command 'next-error' now opens blocks hidden by hideshow.
-** The function using-unix-filesystems has been replaced by the
-functions add-untranslated-filesystem and remove-untranslated-filesystem.
+** The function 'using-unix-filesystems' has been replaced by the
+functions 'add-untranslated-filesystem' and 'remove-untranslated-filesystem'.
Each of these functions takes the name of a drive letter or directory
as an argument.
@@ -3441,11 +3441,11 @@ Lynx in a separate xterm (browse-url-lynx-xterm) or in an Emacs window
non-remote-controlled browsers (browse-url-generic) and associated
customization variables.
-*** New commands `browse-url-of-region' and `browse-url'.
+*** New commands 'browse-url-of-region' and 'browse-url'.
*** URLs marked up with <URL:...> (RFC1738) work if broken across
lines. Browsing methods can be associated with URL regexps
-(e.g. mailto: URLs) via `browse-url-browser-function'.
+(e.g. mailto: URLs) via 'browse-url-browser-function'.
** Changes in Ediff
@@ -3512,7 +3512,7 @@ paragraph name.
an interval is \{M,N\}, and it means to match the preceding expression
at least M times and as many as N times.
-** The format for specifying a custom format for time-stamp to insert
+** The format for specifying a custom format for 'time-stamp' to insert
in files has changed slightly.
With the new enhancements to the functionality of format-time-string,
@@ -3528,7 +3528,7 @@ reasons.
In the old time-stamp-format, all numeric fields defaulted to their
natural width. (With format-time-string, each format has a
fixed-width default.) In this version, you can specify the colon
-(`:') modifier to a numeric conversion to mean "give me the historical
+(':') modifier to a numeric conversion to mean "give me the historical
time-stamp-format width default." Do not use colon if you are
specifying an explicit width, as in "%02d".
@@ -3546,11 +3546,11 @@ details.
** There are some additional major modes:
-dcl-mode, for editing VMS DCL files.
-m4-mode, for editing files of m4 input.
-meta-mode, for editing MetaFont and MetaPost source files.
+'dcl-mode', for editing VMS DCL files.
+'m4-mode', for editing files of m4 input.
+'meta-mode', for editing MetaFont and MetaPost source files.
-** In Shell mode, the command shell-copy-environment-variable lets you
+** In Shell mode, the command 'shell-copy-environment-variable' lets you
copy the value of a specified environment variable from the subshell
into Emacs.
@@ -3567,8 +3567,8 @@ be used for adding some indecent words to your email.
in shell buffers.
*** The new library elint.el provides for linting of Emacs Lisp code.
-See the documentation for `elint-initialize', `elint-current-buffer'
-and `elint-defun'.
+See the documentation for 'elint-initialize', 'elint-current-buffer'
+and 'elint-defun'.
*** M-x expand-add-abbrevs defines a special kind of abbrev which is
meant for programming constructs. These abbrevs expand like ordinary
@@ -3594,7 +3594,7 @@ switch-buffer, but it reads the argument in a more helpful way.
*** M-x landmark implements a neural network for landmark learning.
-*** M-x locate provides a convenient interface to the `locate' program.
+*** M-x locate provides a convenient interface to the 'locate' program.
*** M4 mode is a new mode for editing files of m4 input.
@@ -3656,7 +3656,7 @@ these servers.
You can move the virtual cursor with special commands
while the real cursor does not move.
-*** webjump.el is a "hot list" package which you can set up
+*** 'webjump' is a "hot list" package which you can set up
for visiting your favorite web sites.
*** M-x winner-mode is a minor mode which saves window configurations,
@@ -3709,41 +3709,41 @@ don't want to praise a non-free Microsoft system, so we don't call it
*** A symbol whose name starts with a colon now automatically
evaluates to itself. Therefore such a symbol can be used as a constant.
-*** The defined purpose of `defconst' has been changed. It should now
+*** The defined purpose of 'defconst' has been changed. It should now
be used only for values that should not be changed whether by a program
or by the user.
The actual behavior of defconst has not been changed.
-*** There are new macros `when' and `unless'
+*** There are new macros 'when' and 'unless'
(when CONDITION BODY...) is short for (if CONDITION (progn BODY...))
(unless CONDITION BODY...) is short for (if CONDITION nil BODY...)
-*** Emacs now defines functions caar, cadr, cdar and cddr with their
+*** Emacs now defines functions 'caar', 'cadr', 'cdar' and 'cddr' with their
usual Lisp meanings. For example, caar returns the car of the car of
its argument.
-*** equal, when comparing strings, now ignores their text properties.
+*** 'equal', when comparing strings, now ignores their text properties.
-*** The new function `functionp' tests whether an object is a function.
+*** The new function 'functionp' tests whether an object is a function.
-*** arrayp now returns t for char-tables and bool-vectors.
+*** 'arrayp' now returns t for char-tables and bool-vectors.
*** Certain primitives which use characters (as integers) now get an
error if the integer is not a valid character code. These primitives
-include insert-char, char-to-string, and the %c construct in the
-`format' function.
+include 'insert-char', 'char-to-string', and the %c construct in the
+'format' function.
-*** The `require' function now insists on adding a suffix, either .el
+*** The 'require' function now insists on adding a suffix, either .el
or .elc, to the file name. Thus, (require 'foo) will not use a file
whose name is just foo. It insists on foo.el or foo.elc.
-*** The `autoload' function, when the file name does not contain
+*** The 'autoload' function, when the file name does not contain
either a directory name or the suffix .el or .elc, insists on
adding one of these suffixes.
-*** string-to-number now takes an optional second argument BASE
+*** 'string-to-number' now takes an optional second argument BASE
which specifies the base to use when converting an integer.
If BASE is omitted, base 10 is used.
@@ -3753,9 +3753,9 @@ because that would be much more work and does not seem useful.
*** substring now handles vectors as well as strings.
*** The Common Lisp function eql is no longer defined normally.
-You must load the `cl' library to define it.
+You must load the 'cl' library to define it.
-*** The new macro `with-current-buffer' lets you evaluate an expression
+*** The new macro 'with-current-buffer' lets you evaluate an expression
conveniently with a different current buffer. It looks like this:
(with-current-buffer BUFFER BODY-FORMS...)
@@ -3763,35 +3763,35 @@ conveniently with a different current buffer. It looks like this:
BUFFER is the expression that says which buffer to use.
BODY-FORMS say what to do in that buffer.
-*** The new primitive `save-current-buffer' saves and restores the
-choice of current buffer, like `save-excursion', but without saving or
-restoring the value of point or the mark. `with-current-buffer'
-works using `save-current-buffer'.
+*** The new primitive 'save-current-buffer' saves and restores the
+choice of current buffer, like 'save-excursion', but without saving or
+restoring the value of point or the mark. 'with-current-buffer'
+works using 'save-current-buffer'.
-*** The new macro `with-temp-file' lets you do some work in a new buffer and
-write the output to a specified file. Like `progn', it returns the value
+*** The new macro 'with-temp-file' lets you do some work in a new buffer and
+write the output to a specified file. Like 'progn', it returns the value
of the last form.
-*** The new macro `with-temp-buffer' lets you do some work in a new buffer,
-which is discarded after use. Like `progn', it returns the value of the
+*** The new macro 'with-temp-buffer' lets you do some work in a new buffer,
+which is discarded after use. Like 'progn', it returns the value of the
last form. If you wish to return the buffer contents, use (buffer-string)
as the last form.
-*** The new function split-string takes a string, splits it at certain
+*** The new function 'split-string' takes a string, splits it at certain
characters, and returns a list of the substrings in between the
matches.
For example, (split-string "foo bar lose" " +") returns ("foo" "bar" "lose").
-*** The new macro with-output-to-string executes some Lisp expressions
+*** The new macro 'with-output-to-string' executes some Lisp expressions
with standard-output set up so that all output feeds into a string.
Then it returns that string.
-For example, if the current buffer name is `foo',
+For example, if the current buffer name is 'foo',
-(with-output-to-string
- (princ "The buffer is ")
- (princ (buffer-name)))
+ (with-output-to-string
+ (princ "The buffer is ")
+ (princ (buffer-name)))
returns "The buffer is foo".
@@ -3808,7 +3808,7 @@ a buffer or string can be two or more bytes (as many as four).
Buffers and strings are still made up of unibyte elements;
character positions and string indices are always measured in bytes.
Therefore, moving forward one character can increase the buffer
-position by 2, 3 or 4. The function forward-char moves by whole
+position by 2, 3 or 4. The function 'forward-char' moves by whole
characters, and therefore is no longer equivalent to
(lambda (n) (goto-char (+ (point) n))).
@@ -3823,9 +3823,9 @@ through 159 (octal 0200 through 0237). These values are called
range 160 through 255 (octal 0240 through 0377). The first byte, the
leading code, determines how many bytes long the sequence is.
-*** The function forward-char moves over characters, and therefore
+*** The function 'forward-char' moves over characters, and therefore
(forward-char 1) may increase point by more than 1 if it moves over a
-multibyte character. Likewise, delete-char always deletes a
+multibyte character. Likewise, 'delete-char' always deletes a
character, which may be more than one buffer position.
This means that some Lisp programs, which assume that a character is
@@ -3854,7 +3854,7 @@ When the value is non-nil, it says what kind of character follows POS:
*** The function char-bytes returns how many bytes the character CHAR uses.
*** Strings can contain multibyte characters. The function
-`length' returns the string length counting bytes, which may be
+'length' returns the string length counting bytes, which may be
more than the number of characters.
You can include a multibyte character in a string constant by writing
@@ -3864,27 +3864,27 @@ is not a valid hex digit terminates this construct. If you want to
follow it with a character that is a hex digit, write backslash and
newline in between; that will terminate the hex escape.
-*** The function concat-chars takes arguments which are characters
+*** The function 'concat-chars' takes arguments which are characters
and returns a string containing those characters.
-*** The function sref access a multibyte character in a string.
+*** The function 'sref' access a multibyte character in a string.
(sref STRING INDX) returns the character in STRING at INDEX. INDEX
counts from zero. If INDEX is at a position in the middle of a
character, sref signals an error.
-*** The function chars-in-string returns the number of characters
+*** The function 'chars-in-string' returns the number of characters
in a string. This is less than the length of the string, if the
string contains multibyte characters (the length counts bytes).
-*** The function chars-in-region returns the number of characters
+*** The function 'chars-in-region' returns the number of characters
in a region from BEG to END. This is less than (- END BEG) if the
region contains multibyte characters (the length counts bytes).
-*** The function string-to-list converts a string to a list of
-the characters in it. string-to-vector converts a string
+*** The function 'string-to-list' converts a string to a list of
+the characters in it. 'string-to-vector' converts a string
to a vector of the characters in it.
-*** The function store-substring alters part of the contents
+*** The function 'store-substring' alters part of the contents
of a string. You call it as follows:
(store-substring STRING IDX OBJ)
@@ -3895,18 +3895,18 @@ This function really does alter the contents of STRING.
Since it is impossible to change the length of an existing string,
it is an error if OBJ doesn't fit within STRING's actual length.
-*** char-width returns the width (in columns) of the character CHAR,
+*** 'char-width' returns the width (in columns) of the character CHAR,
if it were displayed in the current buffer and the selected window.
-*** string-width returns the width (in columns) of the text in STRING,
+*** 'string-width' returns the width (in columns) of the text in STRING,
if it were displayed in the current buffer and the selected window.
-*** truncate-string-to-width shortens a string, if necessary,
+*** 'truncate-string-to-width' shortens a string, if necessary,
to fit within a certain number of columns. (Of course, it does
not alter the string that you give it; it returns a new string
which contains all or just part of the existing string.)
-(truncate-string-to-width STR END-COLUMN &optional START-COLUMN PADDING)
+ (truncate-string-to-width STR END-COLUMN &optional START-COLUMN PADDING)
This returns the part of STR up to column END-COLUMN.
@@ -3926,7 +3926,7 @@ PADDING is added one or more times at the beginning of the result
string, so that its columns line up as if it really did start at
column START-COLUMN.
-*** When the functions in the list after-change-functions are called,
+*** When the functions in the list 'after-change-functions' are called,
the third argument is the number of bytes in the pre-change text, not
necessarily the number of characters. It is, in effect, the
difference in buffer position between the beginning and the end of the
@@ -3936,42 +3936,42 @@ changed text, before the change.
sets, each of which has a name which is a symbol. In general there is
one character set for each script, not for each language.
-**** The function charsetp tests whether an object is a character set name.
+**** The function 'charsetp' tests whether an object is a character set name.
-**** The variable charset-list holds a list of character set names.
+**** The variable 'charset-list' holds a list of character set names.
-**** char-charset, given a character code, returns the name of the character
+**** 'char-charset', given a character code, returns the name of the character
set that the character belongs to. (The value is a symbol.)
-**** split-char, given a character code, returns a list containing the
+**** 'split-char', given a character code, returns a list containing the
name of the character set, followed by one or two byte-values
which identify the character within that character set.
-**** make-char, given a character set name and one or two subsequent
+**** 'make-char', given a character set name and one or two subsequent
byte-values, constructs a character code. This is roughly the
opposite of split-char.
-**** find-charset-region returns a list of the character sets
+**** 'find-charset-region' returns a list of the character sets
of all the characters between BEG and END.
-**** find-charset-string returns a list of the character sets
+**** 'find-charset-string' returns a list of the character sets
of all the characters in a string.
*** Here are the Lisp facilities for working with coding systems
and specifying coding systems.
-**** The function coding-system-list returns a list of all coding
+**** The function 'coding-system-list' returns a list of all coding
system names (symbols). With optional argument t, it returns a list
of all distinct base coding systems, not including variants.
(Variant coding systems are those like latin-1-dos, latin-1-unix
and latin-1-mac which specify the end-of-line conversion as well
as what to do about code conversion.)
-**** coding-system-p tests a symbol to see if it is a coding system
+**** 'coding-system-p' tests a symbol to see if it is a coding system
name. It returns t if so, nil if not.
-**** file-coding-system-alist specifies which coding systems to use
-for certain file names. It works like network-coding-system-alist,
+**** 'file-coding-system-alist' specifies which coding systems to use
+for certain file names. It works like 'network-coding-system-alist',
except that the PATTERN is matched against the file name.
Each element has the format (PATTERN . VAL), where PATTERN determines
@@ -3988,7 +3988,7 @@ specifies the coding system for encoding.
If VAL is a function symbol, the function must return a coding system
or a cons cell containing two coding systems, which is used as above.
-**** The variable network-coding-system-alist specifies
+**** The variable 'network-coding-system-alist' specifies
the coding system to use for network sockets.
Each element has the format (PATTERN . VAL), where PATTERN determines
@@ -4011,13 +4011,13 @@ for certain subprocess. It works like network-coding-system-alist,
except that the PATTERN is matched against the program name used to
start the subprocess.
-**** The variable default-process-coding-system specifies the coding
+**** The variable 'default-process-coding-system' specifies the coding
systems to use for subprocess (and net connection) input and output,
when nothing else specifies what to do. The value is a cons cell
(OUTPUT-CODING . INPUT-CODING). OUTPUT-CODING applies to output
to the subprocess, and INPUT-CODING applies to input from it.
-**** The variable coding-system-for-write, if non-nil, specifies the
+**** The variable 'coding-system-for-write', if non-nil, specifies the
coding system to use for writing a file, or for output to a synchronous
subprocess.
@@ -4026,17 +4026,17 @@ but in a different way: the value of coding-system-for-write when you
start the subprocess or connection affects that subprocess or
connection permanently or until overridden.
-The variable coding-system-for-write takes precedence over
-file-coding-system-alist, process-coding-system-alist and
-network-coding-system-alist, and all other methods of specifying a
+The variable 'coding-system-for-write' takes precedence over
+'file-coding-system-alist', 'process-coding-system-alist' and
+'network-coding-system-alist', and all other methods of specifying a
coding system for output. But most of the time this variable is nil.
It exists so that Lisp programs can bind it to a specific coding
system for one operation at a time.
-**** coding-system-for-read applies similarly to input from
+**** 'coding-system-for-read' applies similarly to input from
files, subprocesses or network connections.
-**** The function process-coding-system tells you what
+**** The function 'process-coding-system' tells you what
coding systems(s) an existing subprocess is using.
The value is a cons cell,
(DECODING-CODING-SYSTEM . ENCODING-CODING-SYSTEM)
@@ -4044,12 +4044,12 @@ where DECODING-CODING-SYSTEM is used for decoding output from
the subprocess, and ENCODING-CODING-SYSTEM is used for encoding
input to the subprocess.
-**** The function set-process-coding-system can be used to
+**** The function 'set-process-coding-system' can be used to
change the coding systems in use for an existing subprocess.
** Emacs has a new facility to help users manage the many
customization options. To make a Lisp program work with this facility,
-you need to use the new macros defgroup and defcustom.
+you need to use the new macros 'defgroup' and 'defcustom'.
You use defcustom instead of defvar, for defining a user option
variable. The difference is that you specify two additional pieces of
@@ -4069,7 +4069,7 @@ you would now write this:
:type 'boolean
:group foo)
-The type `boolean' means that this variable has only
+The type 'boolean' means that this variable has only
two meaningful states: nil and non-nil. Other type values
describe other possibilities; see the manual for Custom
for a description of them.
@@ -4082,8 +4082,8 @@ should belong to. You define a new group like this:
:group 'processes)
The "group" argument in defgroup specifies the parent group. The root
-group is called `emacs'; it should not contain any variables itself,
-but only other groups. The immediate subgroups of `emacs' correspond
+group is called 'emacs'; it should not contain any variables itself,
+but only other groups. The immediate subgroups of 'emacs' correspond
to the keywords used by C-h p. Under these subgroups come
second-level subgroups that belong to individual packages.
@@ -4093,7 +4093,7 @@ have a hierarchy of its own groups. The sole or root group of a
package should be a subgroup of one or more of the "keyword"
first-level subgroups.
-** New `widget' library for inserting UI components in buffers.
+** New 'widget' library for inserting UI components in buffers.
This library, used by the new custom library, is documented in a
separate manual that accompanies Emacs.
@@ -4104,16 +4104,16 @@ The easy-mmode package provides macros and functions that make
developing minor modes easier. Roughly, the programmer has to code
only the functionality of the minor mode. All the rest--toggles,
predicate, and documentation--can be done in one call to the macro
-`easy-mmode-define-minor-mode' (see the documentation). See also
-`easy-mmode-define-keymap'.
+'easy-mmode-define-minor-mode' (see the documentation). See also
+'easy-mmode-define-keymap'.
** Text property changes
-*** The `intangible' property now works on overlays as well as on a
+*** The 'intangible' property now works on overlays as well as on a
text property.
-*** The new functions next-char-property-change and
-previous-char-property-change scan through the buffer looking for a
+*** The new functions 'next-char-property-change' and
+'previous-char-property-change' scan through the buffer looking for a
place where either a text property or an overlay might change. The
functions take two arguments, POSITION and LIMIT. POSITION is the
starting position for the scan. LIMIT says where to stop the scan.
@@ -4123,7 +4123,7 @@ LIMIT is nil, scan goes to the beginning or end of the accessible part
of the buffer. If no property change is found, the value is the
position of the beginning or end of the buffer.
-*** In the `local-map' text property or overlay property, the property
+*** In the 'local-map' text property or overlay property, the property
value can now be a symbol whose function definition is a keymap. This
is an alternative to using the keymap itself.
@@ -4146,47 +4146,47 @@ t when it should hide it.
Modes that use overlays to hide portions of a buffer should set the
invisible property of the overlay to the mode's name (or another symbol)
-and modify the `buffer-invisibility-spec' to include that symbol.
-Use `add-to-invisibility-spec' and `remove-from-invisibility-spec' to
-manipulate the `buffer-invisibility-spec'.
+and modify the 'buffer-invisibility-spec' to include that symbol.
+Use 'add-to-invisibility-spec' and 'remove-from-invisibility-spec' to
+manipulate the 'buffer-invisibility-spec'.
Here is an example of how to do this:
- ;; If we want to display an ellipsis:
- (add-to-invisibility-spec '(my-symbol . t))
- ;; If you don't want ellipsis:
- (add-to-invisibility-spec 'my-symbol)
+ ;; If we want to display an ellipsis:
+ (add-to-invisibility-spec '(my-symbol . t))
+ ;; If you don't want ellipsis:
+ (add-to-invisibility-spec 'my-symbol)
- ...
- (overlay-put (make-overlay beginning end) 'invisible 'my-symbol)
+ ...
+ (overlay-put (make-overlay beginning end) 'invisible 'my-symbol)
- ...
- ;; When done with the overlays:
- (remove-from-invisibility-spec '(my-symbol . t))
- ;; Or respectively:
- (remove-from-invisibility-spec 'my-symbol)
+ ...
+ ;; When done with the overlays:
+ (remove-from-invisibility-spec '(my-symbol . t))
+ ;; Or respectively:
+ (remove-from-invisibility-spec 'my-symbol)
** Changes in syntax parsing.
*** The syntax-directed buffer-scan functions (such as
-`parse-partial-sexp', `forward-word' and similar functions) can now
+'parse-partial-sexp', 'forward-word' and similar functions) can now
obey syntax information specified by text properties, if the variable
-`parse-sexp-lookup-properties' is non-nil.
+'parse-sexp-lookup-properties' is non-nil.
-If the value of `parse-sexp-lookup-properties' is nil, the behavior
+If the value of 'parse-sexp-lookup-properties' is nil, the behavior
is as before: the syntax-table of the current buffer is always
used to determine the syntax of the character at the position.
-When `parse-sexp-lookup-properties' is non-nil, the syntax of a
+When 'parse-sexp-lookup-properties' is non-nil, the syntax of a
character in the buffer is calculated thus:
- a) if the `syntax-table' text-property of that character
+ a) if the 'syntax-table' text-property of that character
is a cons, this cons becomes the syntax-type;
- Valid values of `syntax-table' text-property are: nil, a valid
+ Valid values of 'syntax-table' text-property are: nil, a valid
syntax-table, and a valid syntax-table element, i.e.,
a cons cell of the form (SYNTAX-CODE . MATCHING-CHAR).
- b) if the character's `syntax-table' text-property
+ b) if the character's 'syntax-table' text-property
is a syntax table, this syntax table is used
(instead of the syntax-table of the current buffer) to
determine the syntax type of the character.
@@ -4195,7 +4195,7 @@ character in the buffer is calculated thus:
of the current buffer.
*** The meaning of \s in regular expressions is also affected by the
-value of `parse-sexp-lookup-properties'. The details are the same as
+value of 'parse-sexp-lookup-properties'. The details are the same as
for the syntax-directed buffer-scan functions.
*** There are two new syntax-codes, `!' and `|' (numeric values 14
@@ -4204,41 +4204,41 @@ only by another character with the same code (unless quoted). A
character with a code `|' starts a string which is ended only by
another character with the same code (unless quoted).
-These codes are mainly meant for use as values of the `syntax-table'
+These codes are mainly meant for use as values of the 'syntax-table'
text property.
-*** The function `parse-partial-sexp' has new semantics for the sixth
-arg COMMENTSTOP. If it is `syntax-table', parse stops after the start
+*** The function 'parse-partial-sexp' has new semantics for the sixth
+arg COMMENTSTOP. If it is 'syntax-table', parse stops after the start
of a comment or a string, or after end of a comment or a string.
-*** The state-list which the return value from `parse-partial-sexp'
+*** The state-list which the return value from 'parse-partial-sexp'
(and can also be used as an argument) now has an optional ninth
element: the character address of the start of last comment or string;
nil if none. The fourth and eighth elements have special values if the
string/comment is started by a "!" or "|" syntax-code.
-*** Since new features of `parse-partial-sexp' allow a complete
-syntactic parsing, `font-lock' no longer supports
-`font-lock-comment-start-regexp'.
+*** Since new features of 'parse-partial-sexp' allow a complete
+syntactic parsing, 'font-lock' no longer supports
+'font-lock-comment-start-regexp'.
** Changes in face features
*** The face functions are now unconditionally defined in Emacs, even
if it does not support displaying on a device that supports faces.
-*** The function face-documentation returns the documentation string
+*** The function 'face-documentation' returns the documentation string
of a face (or nil if it doesn't have one).
-*** The function face-bold-p returns t if a face should be bold.
-set-face-bold-p sets that flag.
+*** The function 'face-bold-p' returns t if a face should be bold.
+'set-face-bold-p' sets that flag.
-*** The function face-italic-p returns t if a face should be italic.
-set-face-italic-p sets that flag.
+*** The function 'face-italic-p' returns t if a face should be italic.
+'set-face-italic-p' sets that flag.
*** You can now specify foreground and background colors for text
by adding elements of the form (foreground-color . COLOR-NAME)
and (background-color . COLOR-NAME) to the list of faces in
-the `face' property (either the character's text property or an
+the 'face' property (either the character's text property or an
overlay property).
This means that you no longer need to create named faces to use
@@ -4249,21 +4249,21 @@ arbitrary colors in a Lisp package.
*** File-access primitive functions no longer discard an extra redundant
directory name from the beginning of the file name. In other words,
they no longer do anything special with // or /~. That conversion
-is now done only in substitute-in-file-name.
+is now done only in 'substitute-in-file-name'.
This makes it possible for a Lisp program to open a file whose name
begins with ~.
-*** If copy-file is unable to set the date of the output file,
-it now signals an error with the condition file-date-error.
+*** If 'copy-file' is unable to set the date of the output file,
+it now signals an error with the condition 'file-date-error'.
-*** The inode number returned by file-attributes may be an integer (if
+*** The inode number returned by 'file-attributes' may be an integer (if
the number fits in a Lisp integer) or a list of integers.
-*** insert-file-contents can now read from a special file,
+*** 'insert-file-contents' can now read from a special file,
as long as the arguments VISIT and REPLACE are nil.
-*** The RAWFILE arg to find-file-noselect, if non-nil, now suppresses
+*** The RAWFILE arg to 'find-file-noselect', if non-nil, now suppresses
character code conversion as well as other things.
Meanwhile, this feature does work with remote file names
@@ -4282,21 +4282,21 @@ any `//' or `/~' sequence. Now it passes them straight through.
substitute-in-file-name continues to treat those sequences specially,
in the same way as before.
-*** The variable `format-alist' is more general now.
+*** The variable 'format-alist' is more general now.
The FROM-FN and TO-FN in a format definition can now be strings
which specify shell commands to use as filters to perform conversion.
-*** The new function access-file tries to open a file, and signals an
+*** The new function 'access-file' tries to open a file, and signals an
error if that fails. If the open succeeds, access-file does nothing
else, and returns nil.
-*** The function insert-directory now signals an error if the specified
+*** The function 'insert-directory' now signals an error if the specified
directory cannot be listed.
** Changes in minibuffer input
-*** The functions read-buffer, read-variable, read-command, read-string
-read-file-name, read-from-minibuffer and completing-read now take an
+*** The functions 'read-buffer', 'read-variable', 'read-command', 'read-string'
+'read-file-name', 'read-from-minibuffer' and 'completing-read' now take an
additional argument which specifies the default value. If this
argument is non-nil, it should be a string; that string is used in two
ways:
@@ -4304,8 +4304,8 @@ ways:
It is returned if the user enters empty input.
It is available through the history command M-n.
-*** The functions read-string, read-from-minibuffer,
-read-no-blanks-input and completing-read now take an additional
+*** The functions 'read-string', 'read-from-minibuffer',
+'read-no-blanks-input' and 'completing-read' now take an additional
argument INHERIT-INPUT-METHOD. If this is non-nil, then the
minibuffer inherits the current input method and the setting of
enable-multibyte-characters from the previously current buffer.
@@ -4315,34 +4315,34 @@ argument in this way.
*** All minibuffer input functions discard text properties
from the text you enter in the minibuffer, unless the variable
-minibuffer-allow-text-properties is non-nil.
+'minibuffer-allow-text-properties' is non-nil.
** Echo area features
*** Clearing the echo area now runs the normal hook
-echo-area-clear-hook. Note that the echo area can be used while the
+'echo-area-clear-hook'. Note that the echo area can be used while the
minibuffer is active; in that case, the minibuffer is still active
after the echo area is cleared.
-*** The function current-message returns the message currently displayed
+*** The function 'current-message' returns the message currently displayed
in the echo area, or nil if there is none.
** Keyboard input features
-*** tty-erase-char is a new variable that reports which character was
+*** 'tty-erase-char' is a new variable that reports which character was
set up as the terminal's erase character when time Emacs was started.
-*** num-nonmacro-input-events is the total number of input events
+*** 'num-nonmacro-input-events' is the total number of input events
received so far from the terminal. It does not count those generated
by keyboard macros.
** Frame-related changes
-*** make-frame runs the normal hook before-make-frame-hook just before
+*** 'make-frame' runs the normal hook 'before-make-frame-hook' just before
creating a frame, and just after creating a frame it runs the abnormal
-hook after-make-frame-functions with the new frame as arg.
+hook 'after-make-frame-functions' with the new frame as arg.
-*** The new hook window-configuration-change-hook is now run every time
+*** The new hook 'window-configuration-change-hook' is now run every time
the window configuration has changed. The frame whose configuration
has changed is the selected frame when the hook is run.
@@ -4351,20 +4351,20 @@ selected buffers, in its buffer-list frame parameter, so that the
value of other-buffer is now based on the buffers recently displayed
in the selected frame.
-*** The value of the frame parameter vertical-scroll-bars
-is now `left', `right' or nil. A non-nil value specifies
+*** The value of the frame parameter 'vertical-scroll-bars'
+is now 'left', 'right' or nil. A non-nil value specifies
which side of the window to put the scroll bars on.
** X Windows features
*** You can examine X resources for other applications by binding
-x-resource-class around a call to x-get-resource. The usual value of
-x-resource-class is "Emacs", which is the correct value for Emacs.
+'x-resource-class' around a call to 'x-get-resource'. The usual value of
+'x-resource-class' is "Emacs", which is the correct value for Emacs.
*** In menus, checkboxes and radio buttons now actually work.
The menu displays the current status of the box or button.
-*** The function x-list-fonts now takes an optional fourth argument
+*** The function 'x-list-fonts' now takes an optional fourth argument
MAXIMUM which sets a limit on how many matching fonts to return.
A smaller value of MAXIMUM makes the function faster.
@@ -4374,24 +4374,24 @@ it is good to supply 1 for this argument.
** Subprocess features
*** A reminder: it is no longer necessary for subprocess filter
-functions and sentinels to do save-match-data, because Emacs does this
+functions and sentinels to do 'save-match-data', because Emacs does this
automatically.
-*** The new function shell-command-to-string executes a shell command
+*** The new function 'shell-command-to-string' executes a shell command
and returns the output from the command as a string.
-*** The new function process-contact returns t for a child process,
+*** The new function 'process-contact' returns t for a child process,
and (HOSTNAME SERVICE) for a net connection.
** An error in running pre-command-hook or post-command-hook
does clear the variable to nil. The documentation was wrong before.
-** In define-key-after, if AFTER is t, the new binding now always goes
+** In 'define-key-after', if AFTER is t, the new binding now always goes
at the end of the keymap. If the keymap is a menu, this means it
goes after the other menu items.
** If you have a program that makes several changes in the same area
-of the buffer, you can use the macro combine-after-change-calls
+of the buffer, you can use the macro 'combine-after-change-calls'
around that Lisp code to make it faster when after-change hooks
are in use.
@@ -4402,14 +4402,14 @@ Don't alter the variables after-change-functions and
after-change-function within the body of a combine-after-change-calls
form.
-** If you define an abbrev (with define-abbrev) whose EXPANSION
+** If you define an abbrev (with 'define-abbrev') whose EXPANSION
is not a string, then the abbrev does not expand in the usual sense,
but its hook is still run.
** Normally, the Lisp debugger is not used (even if you have enabled it)
for errors that are handled by condition-case.
-If you set debug-on-signal to a non-nil value, then the debugger is called
+If you set 'debug-on-signal' to a non-nil value, then the debugger is called
regardless of whether there is a handler for the condition. This is
useful for debugging problems that happen inside of a condition-case.
@@ -4418,58 +4418,58 @@ are normal and ought to be handled, perhaps in timers or process
filters, will instead invoke the debugger. So don't say you weren't
warned.
-** The new variable ring-bell-function lets you specify your own
+** The new variable 'ring-bell-function' lets you specify your own
way for Emacs to "ring the bell".
-** If run-at-time's TIME argument is t, the action is repeated at
+** If 'run-at-time's TIME argument is t, the action is repeated at
integral multiples of REPEAT from the epoch; this is useful for
functions like display-time.
-** You can use the function locate-library to find the precise file
+** You can use the function 'locate-library' to find the precise file
name of a Lisp library. This isn't new, but wasn't documented before.
** Commands for entering view mode have new optional arguments that
can be used from Lisp. Low-level entrance to and exit from view mode
-is done by functions view-mode-enter and view-mode-exit.
+is done by functions 'view-mode-enter' and 'view-mode-exit'.
-** batch-byte-compile-file now makes Emacs return a nonzero status code
+** 'batch-byte-compile-file' now makes Emacs return a nonzero status code
if there is an error in compilation.
-** pop-to-buffer, switch-to-buffer-other-window and
-switch-to-buffer-other-frame now accept an additional optional
-argument NORECORD, much like switch-to-buffer. If it is non-nil,
+** 'pop-to-buffer', 'switch-to-buffer-other-window' and
+'switch-to-buffer-other-frame' now accept an additional optional
+argument NORECORD, much like 'switch-to-buffer'. If it is non-nil,
they don't put the buffer at the front of the buffer list.
** If your .emacs file leaves the *scratch* buffer non-empty,
Emacs does not display the startup message, so as to avoid changing
the *scratch* buffer.
-** The new function regexp-opt returns an efficient regexp to match a string.
+** The new function 'regexp-opt' returns an efficient regexp to match a string.
The arguments are STRINGS and (optionally) PAREN. This function can be used
where regexp matching or searching is intensively used and speed is important,
e.g., in Font Lock mode.
-** The variable buffer-display-count is local to each buffer,
+** The variable 'buffer-display-count' is local to each buffer,
and is incremented each time the buffer is displayed in a window.
It starts at 0 when the buffer is created.
-** The new function compose-mail starts composing a mail message
+** The new function 'compose-mail' starts composing a mail message
using the user's chosen mail composition agent (specified with the
variable mail-user-agent). It has variants compose-mail-other-window
and compose-mail-other-frame.
-** The `user-full-name' function now takes an optional parameter which
+** The 'user-full-name' function now takes an optional parameter which
can either be a number (the UID) or a string (the login name). The
full name of the specified user will be returned.
** Lisp packages that load files of customizations, or any other sort
-of user profile, should obey the variable init-file-user in deciding
+of user profile, should obey the variable 'init-file-user' in deciding
where to find it. They should load the profile of the user name found
in that variable. If init-file-user is nil, meaning that the -q
option was used, then Lisp packages should not load the customization
files at all.
-** format-time-string now allows you to specify the field width
+** 'format-time-string' now allows you to specify the field width
and type of padding. This works as in printf: you write the field
width as digits in the middle of a %-construct. If you start
the field width with 0, it means to pad with zeros.
@@ -4479,7 +4479,7 @@ minute; %03S means to pad this with zeros to 3 positions, %_3S to pad
with spaces to 3 positions. Plain %3S pads with zeros, because that
is how %S normally pads to two positions.
-** thing-at-point now supports a new kind of "thing": url.
+** 'thing-at-point' now supports a new kind of "thing": url.
** imenu.el changes.
diff --git a/etc/NEWS.21 b/etc/NEWS.21
index 52d2eb6c523..6c25a763785 100644
--- a/etc/NEWS.21
+++ b/etc/NEWS.21
@@ -31,17 +31,17 @@ in UTF-8 locales).
** Translation tables are available between equivalent characters in
different Emacs charsets -- for instance `e with acute' coming from the
-Latin-1 and Latin-2 charsets. User options `unify-8859-on-encoding-mode'
-and `unify-8859-on-decoding-mode' respectively turn on translation
-between ISO 8859 character sets (`unification') on encoding
+Latin-1 and Latin-2 charsets. User options 'unify-8859-on-encoding-mode'
+and 'unify-8859-on-decoding-mode' respectively turn on translation
+between ISO 8859 character sets ('unification') on encoding
(e.g. writing a file) and decoding (e.g. reading a file). Note that
-`unify-8859-on-encoding-mode' is useful and safe, but
-`unify-8859-on-decoding-mode' can cause text to change when you read
+'unify-8859-on-encoding-mode' is useful and safe, but
+'unify-8859-on-decoding-mode' can cause text to change when you read
it and write it out again without edits, so it is not generally advisable.
-By default `unify-8859-on-encoding-mode' is turned on.
+By default 'unify-8859-on-encoding-mode' is turned on.
** In Emacs running on the X window system, the default value of
-`selection-coding-system' is now `compound-text-with-extensions'.
+'selection-coding-system' is now 'compound-text-with-extensions'.
If you want the old behavior, set selection-coding-system to
compound-text, which may be significantly more efficient. Using
@@ -66,19 +66,19 @@ X applications can use `extended segments' to encode characters in
compound text that belong to character sets which are not part of the
list of approved standard encodings for X, e.g. Big5. To paste
selections with such characters into Emacs, use the new coding system
-compound-text-with-extensions as the value of selection-coding-system.
+'compound-text-with-extensions' as the value of 'selection-coding-system'.
-** The default values of `tooltip-delay' and `tooltip-hide-delay'
+** The default values of 'tooltip-delay' and 'tooltip-hide-delay'
were changed.
** On terminals whose erase-char is ^H (Backspace), Emacs
-now uses normal-erase-is-backspace-mode.
+now uses 'normal-erase-is-backspace-mode'.
** When the *scratch* buffer is recreated, its mode is set from
-initial-major-mode, which normally is lisp-interaction-mode,
-instead of using default-major-mode.
+'initial-major-mode', which normally is 'lisp-interaction-mode',
+instead of using 'default-major-mode'.
-** The new option `Info-scroll-prefer-subnodes' causes Info to behave
+** The new option 'Info-scroll-prefer-subnodes' causes Info to behave
like the stand-alone Info reader (from the GNU Texinfo package) as far
as motion between nodes and their subnodes is concerned. If it is t
(the default), Emacs behaves as before when you type SPC in a menu: it
@@ -92,11 +92,11 @@ NEWS.
* Lisp Changes in Emacs 21.2
-** The meanings of scroll-up-aggressively and scroll-down-aggressively
+** The meanings of 'scroll-up-aggressively' and 'scroll-down-aggressively'
have been interchanged, so that the former now controls scrolling up,
and the latter now controls scrolling down.
-** The variable `compilation-parse-errors-filename-function' can
+** The variable 'compilation-parse-errors-filename-function' can
be used to transform filenames found in compilation output.
@@ -112,7 +112,7 @@ charsets in this release.
** Support for LynxOS has been added.
** There are new configure options associated with the support for
-images and toolkit scrollbars. Use the --help option in `configure'
+images and toolkit scrollbars. Use the --help option in 'configure'
to list them.
** You can build a 64-bit Emacs for SPARC/Solaris systems which
@@ -121,13 +121,13 @@ maximum buffer size. See etc/MACHINES for instructions. Changes to
build on other 64-bit systems should be straightforward modulo any
necessary changes to unexec.
-** There is a new configure option `--disable-largefile' to omit
+** There is a new configure option '--disable-largefile' to omit
Unix-98-style support for large files if that is available.
-** There is a new configure option `--without-xim' that instructs
+** There is a new configure option '--without-xim' that instructs
Emacs to not use X Input Methods (XIM), if these are available.
-** `movemail' defaults to supporting POP. You can turn this off using
+** 'movemail' defaults to supporting POP. You can turn this off using
the --without-pop configure option, should that be necessary.
** This version can be built for the Macintosh, but does not implement
@@ -169,10 +169,10 @@ Faces with a weight greater than normal are displayed extra-bright, if
the terminal supports it. Faces with a weight less than normal and
italic faces are displayed dimmed, if the terminal supports it.
Underlined faces are displayed underlined if possible. Other face
-attributes such as `overline', `strike-through', and `box' are ignored
+attributes such as 'overline', 'strike-through', and 'box' are ignored
on terminals.
-The command-line options `-fg COLOR', `-bg COLOR', and `-rv' are now
+The command-line options `-fg COLOR', `-bg COLOR', and '-rv' are now
supported on character terminals.
Emacs automatically remaps all X-style color specifications to one of
@@ -187,7 +187,7 @@ a TTY or when Emacs is invoked with the -nw option.
Emacs supports playing sound files on GNU/Linux and FreeBSD (Voxware
driver and native BSD driver, a.k.a. Luigi's driver). Currently
supported file formats are RIFF-WAVE (*.wav) and Sun Audio (*.au).
-You must configure Emacs with the option `--with-sound=yes' to enable
+You must configure Emacs with the option '--with-sound=yes' to enable
sound support.
** Emacs now resizes mini-windows if appropriate.
@@ -197,7 +197,7 @@ longer than one line, Emacs can resize the minibuffer window unless it
is on a frame of its own. You can control resizing and the maximum
minibuffer window size by setting the following variables:
-- User option: max-mini-window-height
+- User option: 'max-mini-window-height'
Maximum height for resizing mini-windows. If a float, it specifies a
fraction of the mini-window frame's height. If an integer, it
@@ -205,14 +205,14 @@ specifies a number of lines.
Default is 0.25.
-- User option: resize-mini-windows
+- User option: 'resize-mini-windows'
How to resize mini-windows. If nil, don't resize. If t, always
-resize to fit the size of the text. If `grow-only', let mini-windows
+resize to fit the size of the text. If 'grow-only', let mini-windows
grow only, until they become empty, at which point they are shrunk
again.
-Default is `grow-only'.
+Default is 'grow-only'.
** LessTif support.
@@ -222,7 +222,7 @@ Emacs now runs with the LessTif toolkit (see
** LessTif/Motif file selection dialog.
When Emacs is configured to use LessTif or Motif, reading a file name
-from a menu will pop up a file selection dialog if `use-dialog-box' is
+from a menu will pop up a file selection dialog if 'use-dialog-box' is
non-nil.
** File selection dialog on MS-Windows is supported.
@@ -237,12 +237,12 @@ Emacs now uses toolkit scroll bars if available. When configured for
LessTif/Motif, it will use that toolkit's scroll bar. Otherwise, when
configured for Lucid and Athena widgets, it will use the Xaw3d scroll
bar if Xaw3d is available. You can turn off the use of toolkit scroll
-bars by specifying `--with-toolkit-scroll-bars=no' when configuring
+bars by specifying '--with-toolkit-scroll-bars=no' when configuring
Emacs.
When you encounter problems with the Xaw3d scroll bar, watch out how
Xaw3d is compiled on your system. If the Makefile generated from
-Xaw3d's Imakefile contains a `-DNARROWPROTO' compiler option, and your
+Xaw3d's Imakefile contains a '-DNARROWPROTO' compiler option, and your
Emacs system configuration file `s/your-system.h' does not contain a
define for NARROWPROTO, you might consider adding it. Take
`s/freebsd.h' as an example.
@@ -254,8 +254,8 @@ different systems). You will find files `*.cf' there. If your
system's cf-file contains a line like `#define NeedWidePrototypes NO',
add a `#define NARROWPROTO' to your Emacs system configuration file.
-The reason for this is that one Xaw3d function uses `double' or
-`float' function parameters depending on the setting of NARROWPROTO.
+The reason for this is that one Xaw3d function uses 'double' or
+'float' function parameters depending on the setting of NARROWPROTO.
This is not a problem when Imakefiles are used because each system's
imake configuration file contains the necessary information. Since
Emacs doesn't use imake, this has do be done manually.
@@ -275,22 +275,22 @@ for specific modes (with copyright assignments).
** Tooltips.
Tooltips are small X windows displaying a help string at the current
-mouse position. The Lisp package `tooltip' implements them. You can
-turn them off via the user option `tooltip-mode'.
+mouse position. The Lisp package 'tooltip' implements them. You can
+turn them off via the user option 'tooltip-mode'.
Tooltips also provides support for GUD debugging. If activated,
variable values can be displayed in tooltips by pointing at them with
the mouse in source buffers. You can customize various aspects of the
-tooltip display in the group `tooltip'.
+tooltip display in the group 'tooltip'.
** Automatic Hscrolling
Horizontal scrolling now happens automatically if
-`automatic-hscrolling' is set (the default). This setting can be
+'automatic-hscrolling' is set (the default). This setting can be
customized.
-If a window is scrolled horizontally with set-window-hscroll, or
-scroll-left/scroll-right (C-x <, C-x >), this serves as a lower bound
+If a window is scrolled horizontally with 'set-window-hscroll', or
+'scroll-left'/'scroll-right' (C-x <, C-x >), this serves as a lower bound
for automatic horizontal scrolling. Automatic scrolling will scroll
the text more to the left if necessary, but won't scroll the text more
to the right than the column set with set-window-hscroll etc.
@@ -298,25 +298,25 @@ to the right than the column set with set-window-hscroll etc.
** When using a windowing terminal, each Emacs window now has a cursor
of its own. By default, when a window is selected, the cursor is
solid; otherwise, it is hollow. The user-option
-`cursor-in-non-selected-windows' controls how to display the
+'cursor-in-non-selected-windows' controls how to display the
cursor in non-selected windows. If nil, no cursor is shown, if
non-nil a hollow box cursor is shown.
** Fringes to the left and right of windows are used to display
truncation marks, continuation marks, overlay arrows and alike. The
foreground, background, and stipple of these areas can be changed by
-customizing face `fringe'.
+customizing face 'fringe'.
** The mode line under X is now drawn with shadows by default.
-You can change its appearance by modifying the face `mode-line'.
+You can change its appearance by modifying the face 'mode-line'.
In particular, setting the `:box' attribute to nil turns off the 3D
appearance of the mode line. (The 3D appearance makes the mode line
occupy more space, and thus might cause the first or the last line of
the window to be partially obscured.)
-The variable `mode-line-inverse-video', which was used in older
+The variable 'mode-line-inverse-video', which was used in older
versions of emacs to make the mode-line stand out, is now deprecated.
-However, setting it to nil will cause the `mode-line' face to be
+However, setting it to nil will cause the 'mode-line' face to be
ignored, and mode-lines to be drawn using the default text face.
** Mouse-sensitive mode line.
@@ -344,20 +344,20 @@ Currently, the following actions have been defined:
** Hourglass pointer
Emacs can optionally display an hourglass pointer under X. You can
-turn the display on or off by customizing group `cursor'.
+turn the display on or off by customizing group 'cursor'.
** Blinking cursor
M-x blink-cursor-mode toggles a blinking cursor under X and on
-terminals having terminal capabilities `vi', `vs', and `ve'. Blinking
+terminals having terminal capabilities 'vi', 'vs', and 've'. Blinking
and related parameters like frequency and delay can be customized in
-the group `cursor'.
+the group 'cursor'.
-** New font-lock support mode `jit-lock-mode'.
+** New font-lock support mode 'jit-lock-mode'.
-This support mode is roughly equivalent to `lazy-lock' but is
+This support mode is roughly equivalent to 'lazy-lock' but is
generally faster. It supports stealth and deferred fontification.
-See the documentation of the function `jit-lock-mode' for more
+See the documentation of the function 'jit-lock-mode' for more
details.
Font-lock uses jit-lock-mode as default support mode, so you don't
@@ -365,7 +365,7 @@ have to do anything to activate it.
** The default binding of the Delete key has changed.
-The new user-option `normal-erase-is-backspace' can be set to
+The new user-option 'normal-erase-is-backspace' can be set to
determine the effect of the Delete and Backspace function keys.
On window systems, the default value of this option is chosen
@@ -380,14 +380,14 @@ set to nil, and these keys delete backward.
If not running under a window system, setting this option accomplishes
a similar effect by mapping C-h, which is usually generated by the
Backspace key, to DEL, and by mapping DEL to C-d via
-`keyboard-translate'. The former functionality of C-h is available on
+'keyboard-translate'. The former functionality of C-h is available on
the F1 key. You should probably not use this setting on a text-only
terminal if you don't have both Backspace, Delete and F1 keys.
-Programmatically, you can call function normal-erase-is-backspace-mode
+Programmatically, you can call function 'normal-erase-is-backspace-mode'
to toggle the behavior of the Delete and Backspace keys.
-** The default for user-option `next-line-add-newlines' has been
+** The default for user-option 'next-line-add-newlines' has been
changed to nil, i.e. C-n will no longer add newlines at the end of a
buffer by default.
@@ -396,14 +396,14 @@ current line, respectively. C-<home> and C-<end> move to the
beginning and end of the buffer.
** Emacs now checks for recursive loads of Lisp files. If the
-recursion depth exceeds `recursive-load-depth-limit', an error is
+recursion depth exceeds 'recursive-load-depth-limit', an error is
signaled.
** When an error is signaled during the loading of the user's init
file, Emacs now pops up the *Messages* buffer.
** Emacs now refuses to load compiled Lisp files which weren't
-compiled with Emacs. Set `load-dangerous-libraries' to t to change
+compiled with Emacs. Set 'load-dangerous-libraries' to t to change
this behavior.
The reason for this change is an incompatible change in XEmacs's byte
@@ -425,24 +425,24 @@ using that menu.
** Highlighting of trailing whitespace.
-When `show-trailing-whitespace' is non-nil, Emacs displays trailing
-whitespace in the face `trailing-whitespace'. Trailing whitespace is
+When 'show-trailing-whitespace' is non-nil, Emacs displays trailing
+whitespace in the face 'trailing-whitespace'. Trailing whitespace is
defined as spaces or tabs at the end of a line. To avoid busy
highlighting when entering new text, trailing whitespace is not
displayed if point is at the end of the line containing the
whitespace.
-** C-x 5 1 runs the new command delete-other-frames which deletes
+** C-x 5 1 runs the new command 'delete-other-frames' which deletes
all frames except the selected one.
-** The new user-option `confirm-kill-emacs' can be customized to
+** The new user-option 'confirm-kill-emacs' can be customized to
let Emacs ask for confirmation before exiting.
** The header line in an Info buffer is now displayed as an emacs
header-line (which is like a mode-line, but at the top of the window),
so that it remains visible even when the buffer has been scrolled.
This behavior may be disabled by customizing the option
-`Info-use-header-line'.
+'Info-use-header-line'.
** Polish, Czech, German, and French translations of Emacs' reference card
have been added. They are named `pl-refcard.tex', `cs-refcard.tex',
@@ -459,66 +459,66 @@ displayed it pops up a menu containing the items which would be on the
menu bar. If the menu bar is displayed, it pops up the major mode
menu or the Edit menu if there is no major mode menu.
-** Variable `load-path' is no longer customizable through Customize.
+** Variable 'load-path' is no longer customizable through Customize.
-You can no longer use `M-x customize-variable' to customize `load-path'
+You can no longer use `M-x customize-variable' to customize 'load-path'
because it now contains a version-dependent component. You can still
-use `add-to-list' and `setq' to customize this variable in your
+use 'add-to-list' and 'setq' to customize this variable in your
`~/.emacs' init file or to modify it from any Lisp program in general.
** C-u C-x = provides detailed information about the character at
point in a pop-up window.
** Emacs can now support 'wheeled' mice (such as the MS IntelliMouse)
-under XFree86. To enable this, use the `mouse-wheel-mode' command, or
-customize the variable `mouse-wheel-mode'.
+under XFree86. To enable this, use the 'mouse-wheel-mode' command, or
+customize the variable 'mouse-wheel-mode'.
-The variables `mouse-wheel-follow-mouse' and `mouse-wheel-scroll-amount'
+The variables 'mouse-wheel-follow-mouse' and 'mouse-wheel-scroll-amount'
determine where and by how much buffers are scrolled.
** Emacs' auto-save list files are now by default stored in a
sub-directory `.emacs.d/auto-save-list/' of the user's home directory.
(On MS-DOS, this subdirectory's name is `_emacs.d/auto-save.list/'.)
-You can customize `auto-save-list-file-prefix' to change this location.
+You can customize 'auto-save-list-file-prefix' to change this location.
-** The function `getenv' is now callable interactively.
+** The function 'getenv' is now callable interactively.
-** The new user-option `even-window-heights' can be set to nil
-to prevent `display-buffer' from evening out window heights.
+** The new user-option 'even-window-heights' can be set to nil
+to prevent 'display-buffer' from evening out window heights.
** The new command M-x delete-trailing-whitespace RET will delete the
trailing whitespace within the current restriction. You can also add
-this function to `write-file-hooks' or `local-write-file-hooks'.
+this function to 'write-file-hooks' or 'local-write-file-hooks'.
** When visiting a file with M-x find-file-literally, no newlines will
-be added to the end of the buffer even if `require-final-newline' is
+be added to the end of the buffer even if 'require-final-newline' is
non-nil.
-** The new user-option `find-file-suppress-same-file-warnings' can be
+** The new user-option 'find-file-suppress-same-file-warnings' can be
set to suppress warnings ``X and Y are the same file'' when visiting a
file that is already visited under a different name.
-** The new user-option `electric-help-shrink-window' can be set to
+** The new user-option 'electric-help-shrink-window' can be set to
nil to prevent adjusting the help window size to the buffer size.
** New command M-x describe-character-set reads a character set name
and displays information about that.
-** The new variable `auto-mode-interpreter-regexp' contains a regular
+** The new variable 'auto-mode-interpreter-regexp' contains a regular
expression matching interpreters, for file mode determination.
This regular expression is matched against the first line of a file to
-determine the file's mode in `set-auto-mode' when Emacs can't deduce a
+determine the file's mode in 'set-auto-mode' when Emacs can't deduce a
mode from the file's name. If it matches, the file is assumed to be
interpreted by the interpreter matched by the second group of the
regular expression. The mode is then determined as the mode
-associated with that interpreter in `interpreter-mode-alist'.
+associated with that interpreter in 'interpreter-mode-alist'.
-** New function executable-make-buffer-file-executable-if-script-p is
-suitable as an after-save-hook as an alternative to `executable-chmod'.
+** New function 'executable-make-buffer-file-executable-if-script-p' is
+suitable as an 'after-save-hook' as an alternative to 'executable-chmod'.
** The most preferred coding-system is now used to save a buffer if
-buffer-file-coding-system is `undecided' and it is safe for the buffer
+buffer-file-coding-system is 'undecided' and it is safe for the buffer
contents. (The most preferred is set by set-language-environment or
by M-x prefer-coding-system.) Thus if you visit an ASCII file and
insert a non-ASCII character from your current language environment,
@@ -526,22 +526,22 @@ the file will be saved silently with the appropriate coding.
Previously you would be prompted for a safe coding system.
** The many obsolete language `setup-...-environment' commands have
-been removed -- use `set-language-environment'.
+been removed -- use 'set-language-environment'.
-** The new Custom option `keyboard-coding-system' specifies a coding
+** The new Custom option 'keyboard-coding-system' specifies a coding
system for keyboard input.
-** New variable `inhibit-iso-escape-detection' determines if Emacs'
+** New variable 'inhibit-iso-escape-detection' determines if Emacs'
coding system detection algorithm should pay attention to ISO2022's
escape sequences. If this variable is non-nil, the algorithm ignores
such escape sequences. The default value is nil, and it is
recommended not to change it except for the special case that you
always want to read any escape code verbatim. If you just want to
read a specific file without decoding escape codes, use C-x RET c
-(`universal-coding-system-argument'). For instance, C-x RET c latin-1
+('universal-coding-system-argument'). For instance, C-x RET c latin-1
RET C-x C-f filename RET.
-** Variable `default-korean-keyboard' is initialized properly from the
+** Variable 'default-korean-keyboard' is initialized properly from the
environment variable `HANGUL_KEYBOARD_TYPE'.
** New command M-x list-charset-chars reads a character set name and
@@ -554,15 +554,15 @@ coding systems such as cpXXX and cyrillic-koi8.
and preferred and locale coding systems systematically from the
LC_ALL, LC_CTYPE, and LANG environment variables during startup.
-** New language environments `Polish', `Latin-8' and `Latin-9'.
+** New language environments 'Polish', 'Latin-8' and 'Latin-9'.
Latin-8 and Latin-9 correspond respectively to the ISO character sets
8859-14 (Celtic) and 8859-15 (updated Latin-1, with the Euro sign).
GNU Intlfonts doesn't support these yet but recent X releases have
8859-15. See etc/INSTALL for information on obtaining extra fonts.
There are new Leim input methods for Latin-8 and Latin-9 prefix (only)
-and Polish `slash'.
+and Polish 'slash'.
-** New language environments `Dutch' and `Spanish'.
+** New language environments 'Dutch' and 'Spanish'.
These new environments mainly select appropriate translations
of the tutorial.
@@ -570,22 +570,22 @@ of the tutorial.
function keys are changed as follows. This is to conform to "Emacs
Lisp Coding Convention".
- new command old-binding
- --- ------- -----------
- f3 ethio-fidel-to-sera-buffer f5
- S-f3 ethio-fidel-to-sera-region f5
- C-f3 ethio-fidel-to-sera-mail-or-marker f5
+ new command old-binding
+ --- ------- -----------
+ f3 'ethio-fidel-to-sera-buffer' f5
+ S-f3 'ethio-fidel-to-sera-region' f5
+ C-f3 'ethio-fidel-to-sera-mail-or-marker' f5
- f4 ethio-sera-to-fidel-buffer unchanged
- S-f4 ethio-sera-to-fidel-region unchanged
- C-f4 ethio-sera-to-fidel-mail-or-marker unchanged
+ f4 'ethio-sera-to-fidel-buffer' unchanged
+ S-f4 'ethio-sera-to-fidel-region' unchanged
+ C-f4 'ethio-sera-to-fidel-mail-or-marker' unchanged
- S-f5 ethio-toggle-punctuation f3
- S-f6 ethio-modify-vowel f6
- S-f7 ethio-replace-space f7
- S-f8 ethio-input-special-character f8
- S-f9 ethio-replace-space unchanged
- C-f9 ethio-toggle-space f2
+ S-f5 'ethio-toggle-punctuation' f3
+ S-f6 'ethio-modify-vowel' f6
+ S-f7 'ethio-replace-space' f7
+ S-f8 'ethio-input-special-character' f8
+ S-f9 'ethio-replace-space' unchanged
+ C-f9 'ethio-toggle-space' f2
** There are new Leim input methods.
New input methods "turkish-postfix", "turkish-alt-postfix",
@@ -602,49 +602,49 @@ typing them inserts "q" and "Q" respectively. Rules for translating
8859 character sets but can display Latin-1, you can display
more-or-less mnemonic sequences of ASCII/Latin-1 characters instead of
empty boxes (under a window system) or question marks (not under a
-window system). Customize the option `latin1-display' to turn this
+window system). Customize the option 'latin1-display' to turn this
on.
-** M-; now calls comment-dwim which tries to do something clever based
-on the context. M-x kill-comment is now an alias to comment-kill,
+** M-; now calls 'comment-dwim' which tries to do something clever based
+on the context. M-x kill-comment is now an alias to 'comment-kill',
defined in newcomment.el. You can choose different styles of region
-commenting with the variable `comment-style'.
+commenting with the variable 'comment-style'.
-** New user options `display-time-mail-face' and
-`display-time-use-mail-icon' control the appearance of mode-line mail
+** New user options 'display-time-mail-face' and
+'display-time-use-mail-icon' control the appearance of mode-line mail
indicator used by the display-time package. On a suitable display the
indicator can be an icon and is mouse-sensitive.
** On window-systems, additional space can be put between text lines
on the display using several methods
-- By setting frame parameter `line-spacing' to PIXELS. PIXELS must be
+- By setting frame parameter 'line-spacing' to PIXELS. PIXELS must be
a positive integer, and specifies that PIXELS number of pixels should
be put below text lines on the affected frame or frames.
-- By setting X resource `lineSpacing', class `LineSpacing'. This is
+- By setting X resource 'lineSpacing', class 'LineSpacing'. This is
equivalent to specifying the frame parameter.
-- By specifying `--line-spacing=N' or `-lsp N' on the command line.
+- By specifying '--line-spacing=N' or `-lsp N' on the command line.
-- By setting buffer-local variable `line-spacing'. The meaning is
+- By setting buffer-local variable 'line-spacing'. The meaning is
the same, but applies to the a particular buffer only.
-** The new command `clone-indirect-buffer' can be used to create
+** The new command 'clone-indirect-buffer' can be used to create
an indirect buffer that is a twin copy of the current buffer. The
-command `clone-indirect-buffer-other-window', bound to C-x 4 c,
+command 'clone-indirect-buffer-other-window', bound to C-x 4 c,
does the same but displays the indirect buffer in another window.
-** New user options `backup-directory-alist' and
-`make-backup-file-name-function' control the placement of backups,
+** New user options 'backup-directory-alist' and
+'make-backup-file-name-function' control the placement of backups,
typically in a single directory or in an invisible sub-directory.
-** New commands iso-iso2sgml and iso-sgml2iso convert between Latin-1
+** New commands 'iso-iso2sgml' and 'iso-sgml2iso' convert between Latin-1
characters and the corresponding SGML (HTML) entities.
** New X resources recognized
-*** The X resource `synchronous', class `Synchronous', specifies
+*** The X resource 'synchronous', class 'Synchronous', specifies
whether Emacs should run in synchronous mode. Synchronous mode
is useful for debugging X problems.
@@ -652,9 +652,9 @@ Example:
emacs.synchronous: true
-*** The X resource `visualClass, class `VisualClass', specifies the
+*** The X resource `visualClass, class 'VisualClass', specifies the
visual Emacs should use. The resource's value should be a string of
-the form `CLASS-DEPTH', where CLASS is the name of the visual class,
+the form 'CLASS-DEPTH', where CLASS is the name of the visual class,
and DEPTH is the requested color depth as a decimal number. Valid
visual class names are
@@ -666,22 +666,22 @@ visual class names are
StaticGray
Visual class names specified as X resource are case-insensitive, i.e.
-`pseudocolor', `Pseudocolor' and `PseudoColor' all have the same
+'pseudocolor', 'Pseudocolor' and 'PseudoColor' all have the same
meaning.
-The program `xdpyinfo' can be used to list the visual classes
+The program 'xdpyinfo' can be used to list the visual classes
supported on your display, and which depths they have. If
-`visualClass' is not specified, Emacs uses the display's default
+'visualClass' is not specified, Emacs uses the display's default
visual.
Example:
emacs.visualClass: TrueColor-8
-*** The X resource `privateColormap', class `PrivateColormap',
+*** The X resource 'privateColormap', class 'PrivateColormap',
specifies that Emacs should use a private colormap if it is using the
default visual, and that visual is of class PseudoColor. Recognized
-resource values are `true' or `on'.
+resource values are 'true' or 'on'.
Example:
@@ -689,26 +689,26 @@ Example:
** Faces and frame parameters.
-There are four new faces `scroll-bar', `border', `cursor' and `mouse'.
-Setting the frame parameters `scroll-bar-foreground' and
-`scroll-bar-background' sets foreground and background color of face
-`scroll-bar' and vice versa. Setting frame parameter `border-color'
-sets the background color of face `border' and vice versa. Likewise
-for frame parameters `cursor-color' and face `cursor', and frame
-parameter `mouse-color' and face `mouse'.
+There are four new faces 'scroll-bar', 'border', 'cursor' and 'mouse'.
+Setting the frame parameters 'scroll-bar-foreground' and
+'scroll-bar-background' sets foreground and background color of face
+'scroll-bar' and vice versa. Setting frame parameter 'border-color'
+sets the background color of face 'border' and vice versa. Likewise
+for frame parameters 'cursor-color' and face 'cursor', and frame
+parameter 'mouse-color' and face 'mouse'.
-Changing frame parameter `font' sets font-related attributes of the
-`default' face and vice versa. Setting frame parameters
-`foreground-color' or `background-color' sets the colors of the
-`default' face and vice versa.
+Changing frame parameter 'font' sets font-related attributes of the
+'default' face and vice versa. Setting frame parameters
+'foreground-color' or 'background-color' sets the colors of the
+'default' face and vice versa.
-** New face `menu'.
+** New face 'menu'.
-The face `menu' can be used to change colors and font of Emacs' menus.
+The face 'menu' can be used to change colors and font of Emacs' menus.
-** New frame parameter `screen-gamma' for gamma correction.
+** New frame parameter 'screen-gamma' for gamma correction.
-The new frame parameter `screen-gamma' specifies gamma-correction for
+The new frame parameter 'screen-gamma' specifies gamma-correction for
colors. Its value may be nil, the default, in which case no gamma
correction occurs, or a number > 0, usually a float, that specifies
the screen gamma of a frame's display.
@@ -717,8 +717,8 @@ PC monitors usually have a screen gamma of 2.2. smaller values result
in darker colors. You might want to try a screen gamma of 1.5 for LCD
color displays. The viewing gamma Emacs uses is 0.4545. (1/2.2).
-The X resource name of this parameter is `screenGamma', class
-`ScreenGamma'.
+The X resource name of this parameter is 'screenGamma', class
+'ScreenGamma'.
** Tabs and variable-width text.
@@ -743,24 +743,24 @@ LessTif and Motif.
As an example: if a block cursor is over a tab character, it will be
drawn as wide as that tab on the display. To do this, set
-`x-stretch-cursor' to a non-nil value.
+'x-stretch-cursor' to a non-nil value.
** Empty display lines at the end of a buffer may be marked with a
bitmap (this is similar to the tilde displayed by vi and Less).
This behavior is activated by setting the buffer-local variable
-`indicate-empty-lines' to a non-nil value. The default value of this
-variable is found in `default-indicate-empty-lines'.
+'indicate-empty-lines' to a non-nil value. The default value of this
+variable is found in 'default-indicate-empty-lines'.
** There is a new "aggressive" scrolling method.
When scrolling up because point is above the window start, if the
-value of the buffer-local variable `scroll-up-aggressively' is a
+value of the buffer-local variable 'scroll-up-aggressively' is a
number, Emacs chooses a new window start so that point ends up that
fraction of the window's height from the top of the window.
When scrolling down because point is below the window end, if the
-value of the buffer-local variable `scroll-down-aggressively' is a
+value of the buffer-local variable 'scroll-down-aggressively' is a
number, Emacs chooses a new window start so that point ends up that
fraction of the window's height from the bottom of the window.
@@ -769,14 +769,14 @@ M-x clone-buffer, C-u m <entry> RET or C-u g <entry> RET.
M-x clone-buffer can also be used on *Help* and several other special
buffers.
-** The command `Info-search' now uses a search history.
+** The command 'Info-search' now uses a search history.
** Listing buffers with M-x list-buffers (C-x C-b) now shows
abbreviated file names. Abbreviations can be customized by changing
-`directory-abbrev-alist'.
+'directory-abbrev-alist'.
-** A new variable, backup-by-copying-when-privileged-mismatch, gives
-the highest file uid for which backup-by-copying-when-mismatch will be
+** A new variable, 'backup-by-copying-when-privileged-mismatch', gives
+the highest file uid for which 'backup-by-copying-when-mismatch' will be
forced on. The assumption is that uids less than or equal to this
value are special uids (root, bin, daemon, etc.--not real system
users) and that files owned by these users should not change ownership,
@@ -790,25 +790,25 @@ notably at the end of lines.
All these functions have been rewritten to avoid inserting unwanted
spaces, and an optional prefix now allows them to behave the old way.
-** The function `replace-rectangle' is an alias for `string-rectangle'.
+** The function 'replace-rectangle' is an alias for 'string-rectangle'.
-** The new command M-x string-insert-rectangle is like `string-rectangle',
+** The new command M-x string-insert-rectangle is like 'string-rectangle',
but inserts text instead of replacing it.
** The new command M-x query-replace-regexp-eval acts like
query-replace-regexp, but takes a Lisp expression which is evaluated
after each match to get the replacement text.
-** M-x query-replace recognizes a new command `e' (or `E') that lets
+** M-x query-replace recognizes a new command 'e' (or 'E') that lets
you edit the replacement string.
-** The new command mail-abbrev-complete-alias, bound to `M-TAB'
-(if you load the library `mailabbrev'), lets you complete mail aliases
-in the text, analogous to lisp-complete-symbol.
+** The new command 'mail-abbrev-complete-alias', bound to 'M-TAB'
+(if you load the library 'mailabbrev'), lets you complete mail aliases
+in the text, analogous to 'lisp-complete-symbol'.
-** The variable `echo-keystrokes' may now have a floating point value.
+** The variable 'echo-keystrokes' may now have a floating point value.
-** If your init file is compiled (.emacs.elc), `user-init-file' is set
+** If your init file is compiled (.emacs.elc), 'user-init-file' is set
to the source name (.emacs.el), if that exists, after loading it.
** The help string specified for a menu-item whose definition contains
@@ -817,10 +817,10 @@ MS-DOS, either in the echo area or with tooltips. Many standard menus
displayed by Emacs now have help strings.
--
-** New user option `read-mail-command' specifies a command to use to
+** New user option 'read-mail-command' specifies a command to use to
read mail from the menu etc.
-** The environment variable `EMACSLOCKDIR' is no longer used on MS-Windows.
+** The environment variable 'EMACSLOCKDIR' is no longer used on MS-Windows.
This environment variable was used when creating lock files. Emacs on
MS-Windows does not use this variable anymore. This change was made
before Emacs 21.1, but wasn't documented until now.
@@ -828,7 +828,7 @@ before Emacs 21.1, but wasn't documented until now.
** Highlighting of mouse-sensitive regions is now supported in the
MS-DOS version of Emacs.
-** The new command `msdos-set-mouse-buttons' forces the MS-DOS version
+** The new command 'msdos-set-mouse-buttons' forces the MS-DOS version
of Emacs to behave as if the mouse had a specified number of buttons.
This comes handy with mice that don't report their number of buttons
correctly. One example is the wheeled mice, which report 3 buttons,
@@ -838,22 +838,22 @@ of Emacs.
** Customize changes
*** Customize now supports comments about customized items. Use the
-`State' menu to add comments, or give a prefix argument to
+'State' menu to add comments, or give a prefix argument to
M-x customize-set-variable or M-x customize-set-value. Note that
customization comments will cause the customizations to fail in
earlier versions of Emacs.
-*** The new option `custom-buffer-done-function' says whether to kill
+*** The new option 'custom-buffer-done-function' says whether to kill
Custom buffers when you've done with them or just bury them (the
default).
-*** If Emacs was invoked with the `-q' or `--no-init-file' options, it
+*** If Emacs was invoked with the '-q' or '--no-init-file' options, it
does not allow you to save customizations in your `~/.emacs' init
file. This is because saving customizations from such a session would
wipe out all the other customizations you might have on your init
file.
-** If Emacs was invoked with the `-q' or `--no-init-file' options, it
+** If Emacs was invoked with the '-q' or '--no-init-file' options, it
does not save disabled and enabled commands for future sessions, to
avoid overwriting existing customizations of this kind that are
already in your init file.
@@ -862,12 +862,12 @@ already in your init file.
*** The commands to evaluate Lisp expressions, such as C-M-x in Lisp
modes, C-j in Lisp Interaction mode, and M-:, now bind the variables
-print-level, print-length, and debug-on-error based on the new
-customizable variables eval-expression-print-level,
-eval-expression-print-length, and eval-expression-debug-on-error.
+'print-level', 'print-length', and 'debug-on-error' based on the new
+customizable variables 'eval-expression-print-level',
+'eval-expression-print-length', and 'eval-expression-debug-on-error'.
The default values for the first two of these variables are 12 and 4
-respectively, which means that `eval-expression' now prints at most
+respectively, which means that 'eval-expression' now prints at most
the first 12 members of a list and at most 4 nesting levels deep (if
the list is longer or deeper than that, an ellipsis `...' is
printed).
@@ -878,7 +878,7 @@ printed representation and an unabbreviated one.
The default value of eval-expression-debug-on-error is t, so any error
during evaluation produces a backtrace.
-*** The function `eval-defun' (C-M-x) now loads Edebug and instruments
+*** The function 'eval-defun' (C-M-x) now loads Edebug and instruments
code when called with a prefix argument.
** CC mode changes.
@@ -1069,10 +1069,10 @@ the empty string (which it commonly does). A patch for that is
available from the CC Mode web site (http://www.python.org/emacs/
cc-mode/).
-**** The variables `c-hanging-comment-starter-p' and
-`c-hanging-comment-ender-p', which controlled how comment starters and
+**** The variables 'c-hanging-comment-starter-p' and
+'c-hanging-comment-ender-p', which controlled how comment starters and
enders were filled, are not used anymore. The new version of the
-function `c-fill-paragraph' keeps the comment starters and enders as
+function 'c-fill-paragraph' keeps the comment starters and enders as
they were before the filling.
**** It's now possible to selectively turn off auto filling.
@@ -1080,8 +1080,8 @@ The variable c-ignore-auto-fill is used to ignore auto fill mode in
specific contexts, e.g. in preprocessor directives and in string
literals.
-**** New context sensitive line break function c-context-line-break.
-It works like newline-and-indent in normal code, and adapts the line
+**** New context sensitive line break function 'c-context-line-break'.
+It works like 'newline-and-indent' in normal code, and adapts the line
prefix according to the comment style when used inside comments. If
you're normally using newline-and-indent, you might want to switch to
this function.
@@ -1114,7 +1114,7 @@ prefix. This is intended for the type of large block comments that
contain documentation with its own formatting. In these you normally
don't want CC Mode to change the indentation.
-*** The `c' syntactic symbol is now relative to the comment start
+*** The 'c' syntactic symbol is now relative to the comment start
instead of the previous line, to make integers usable as lineup
arguments.
@@ -1130,33 +1130,33 @@ Provan).
** Dired changes
-*** New variable `dired-recursive-deletes' determines if the delete
+*** New variable 'dired-recursive-deletes' determines if the delete
command will delete non-empty directories recursively. The default
is, delete only empty directories.
-*** New variable `dired-recursive-copies' determines if the copy
+*** New variable 'dired-recursive-copies' determines if the copy
command will copy directories recursively. The default is, do not
copy directories recursively.
-*** In command `dired-do-shell-command' (usually bound to `!') a `?'
+*** In command 'dired-do-shell-command' (usually bound to `!') a `?'
in the shell command has a special meaning similar to `*', but with
the difference that the command will be run on each file individually.
-*** The new command `dired-find-alternate-file' (usually bound to `a')
+*** The new command 'dired-find-alternate-file' (usually bound to 'a')
replaces the Dired buffer with the buffer for an alternate file or
directory.
-*** The new command `dired-show-file-type' (usually bound to `y') shows
+*** The new command 'dired-show-file-type' (usually bound to 'y') shows
a message in the echo area describing what type of file the point is on.
-This command invokes the external program `file' do its work, and so
+This command invokes the external program 'file' do its work, and so
will only work on systems with that program, and will be only as
accurate or inaccurate as it is.
-*** Dired now properly handles undo changes of adding/removing `-R'
+*** Dired now properly handles undo changes of adding/removing '-R'
from ls switches.
*** Dired commands that prompt for a destination file now allow the use
-of the `M-n' command in the minibuffer to insert the source filename,
+of the 'M-n' command in the minibuffer to insert the source filename,
which the user can then edit. This only works if there is a single
source file, not when operating on multiple marked files.
@@ -1171,16 +1171,16 @@ many details. In particular, all procmail fetching variables are gone.
If you used procmail like in
-(setq nnmail-use-procmail t)
-(setq nnmail-spool-file 'procmail)
-(setq nnmail-procmail-directory "~/mail/incoming/")
-(setq nnmail-procmail-suffix "\\.in")
+ (setq nnmail-use-procmail t)
+ (setq nnmail-spool-file 'procmail)
+ (setq nnmail-procmail-directory "~/mail/incoming/")
+ (setq nnmail-procmail-suffix "\\.in")
this now has changed to
-(setq mail-sources
- '((directory :path "~/mail/incoming/"
- :suffix ".in")))
+ (setq mail-sources
+ '((directory :path "~/mail/incoming/"
+ :suffix ".in")))
More information is available in the info doc at Select Methods ->
Getting Mail -> Mail Sources
@@ -1208,8 +1208,8 @@ called to position point.
*** The user can now decide which extra headers should be included in
summary buffers and NOV files.
-*** `gnus-article-display-hook' has been removed. Instead, a number
-of variables starting with `gnus-treat-' have been added.
+*** 'gnus-article-display-hook' has been removed. Instead, a number
+of variables starting with 'gnus-treat-' have been added.
*** The Gnus posting styles have been redone again and now work in a
subtly different manner.
@@ -1242,15 +1242,15 @@ macros
** Changes in Outline mode.
There is now support for Imenu to index headings. A new command
-`outline-headers-as-kill' copies the visible headings in the region to
+'outline-headers-as-kill' copies the visible headings in the region to
the kill ring, e.g. to produce a table of contents.
** Changes to Emacs Server
-*** The new option `server-kill-new-buffers' specifies what to do
+*** The new option 'server-kill-new-buffers' specifies what to do
with buffers when done with them. If non-nil, the default, buffers
are killed, unless they were already present before visiting them with
-Emacs Server. If nil, `server-temp-file-regexp' specifies which
+Emacs Server. If nil, 'server-temp-file-regexp' specifies which
buffers to kill, as before.
Please note that only buffers are killed that still have a client,
@@ -1263,7 +1263,7 @@ of the form +LINE:COLUMN in addition to +LINE.
** Changes to Show Paren mode.
*** Overlays used by Show Paren mode now use a priority property.
-The new user option show-paren-priority specifies the priority to
+The new user option 'show-paren-priority' specifies the priority to
use. Default is 1000.
** New command M-x check-parens can be used to find unbalanced paren
@@ -1275,31 +1275,31 @@ groups and strings in buffers in Lisp mode (or other modes).
A block is now recognized by its start and end regexps (both strings),
and an integer specifying which sub-expression in the start regexp
-serves as the place where a `forward-sexp'-like function can operate.
-See the documentation of variable `hs-special-modes-alist'.
+serves as the place where a 'forward-sexp'-like function can operate.
+See the documentation of variable 'hs-special-modes-alist'.
*** During incremental search, if Hideshow minor mode is active,
-hidden blocks are temporarily shown. The variable `hs-headline' can
+hidden blocks are temporarily shown. The variable 'hs-headline' can
be used in the mode line format to show the line at the beginning of
the open block.
-*** User option `hs-hide-all-non-comment-function' specifies a
+*** User option 'hs-hide-all-non-comment-function' specifies a
function to be called at each top-level block beginning, instead of
the normal block-hiding function.
-*** The command `hs-show-region' has been removed.
+*** The command 'hs-show-region' has been removed.
*** The key bindings have changed to fit the Emacs conventions,
roughly imitating those of Outline minor mode. Notably, the prefix
for all bindings is now `C-c @'. For details, see the documentation
-for `hs-minor-mode'.
+for 'hs-minor-mode'.
-*** The variable `hs-show-hidden-short-form' has been removed, and
+*** The variable 'hs-show-hidden-short-form' has been removed, and
hideshow.el now always behaves as if this variable were set to t.
** Changes to Change Log mode and Add-Log functions
-*** If you invoke `add-change-log-entry' from a backup file, it makes
+*** If you invoke 'add-change-log-entry' from a backup file, it makes
an entry appropriate for the file's parent. This is useful for making
log entries by comparing a version with deleted functions.
@@ -1310,38 +1310,38 @@ current buffer.
in a log file.
*** Change Log mode now adds a file's version number to change log
-entries if user-option `change-log-version-info-enabled' is non-nil.
+entries if user-option 'change-log-version-info-enabled' is non-nil.
Unless the file is under version control the search for a file's
version number is performed based on regular expressions from
-`change-log-version-number-regexp-list' which can be customized.
+'change-log-version-number-regexp-list' which can be customized.
Version numbers are only found in the first 10 percent of a file.
*** Change Log mode now defines its own faces for font-lock highlighting.
** Changes to cmuscheme
-*** The user-option `scheme-program-name' has been renamed
-`cmuscheme-program-name' due to conflicts with xscheme.el.
+*** The user-option 'scheme-program-name' has been renamed
+'cmuscheme-program-name' due to conflicts with xscheme.el.
** Changes in Font Lock
-*** The new function `font-lock-remove-keywords' can be used to remove
+*** The new function 'font-lock-remove-keywords' can be used to remove
font-lock keywords from the current buffer or from a specific major mode.
*** Multi-line patterns are now supported. Modes using this, should
-set font-lock-multiline to t in their font-lock-defaults.
+set 'font-lock-multiline' to t in their 'font-lock-defaults'.
-*** `font-lock-syntactic-face-function' allows major-modes to choose
+*** 'font-lock-syntactic-face-function' allows major-modes to choose
the face used for each string/comment.
-*** A new standard face `font-lock-doc-face'.
+*** A new standard face 'font-lock-doc-face'.
Meant for Lisp docstrings, Javadoc comments and other "documentation in code".
** Changes to Shell mode
-*** The `shell' command now accepts an optional argument to specify the buffer
+*** The 'shell' command now accepts an optional argument to specify the buffer
to use, which defaults to "*shell*". When used interactively, a
-non-default buffer may be specified by giving the `shell' command a
+non-default buffer may be specified by giving the 'shell' command a
prefix argument (causing it to prompt for the buffer name).
** Comint (subshell) changes
@@ -1353,17 +1353,17 @@ include shell-mode, gdb-mode, scheme-interaction-mode, etc.
Comint now removes CRs from CR LF sequences, and treats single CRs and
BSs in the output in a way similar to a terminal (by deleting to the
beginning of the line, or deleting the previous character,
-respectively). This is achieved by adding `comint-carriage-motion' to
-the `comint-output-filter-functions' hook by default.
+respectively). This is achieved by adding 'comint-carriage-motion' to
+the 'comint-output-filter-functions' hook by default.
-*** By default, comint no longer uses the variable `comint-prompt-regexp'
+*** By default, comint no longer uses the variable 'comint-prompt-regexp'
to distinguish prompts from user-input. Instead, it notices which
parts of the text were output by the process, and which entered by the
-user, and attaches `field' properties to allow emacs commands to use
+user, and attaches 'field' properties to allow emacs commands to use
this information. Common movement commands, notably beginning-of-line,
respect field boundaries in a fairly natural manner. To disable this
feature, and use the old behavior, customize the user option
-`comint-use-prompt-regexp-instead-of-fields'.
+'comint-use-prompt-regexp-instead-of-fields'.
*** Comint now includes new features to send commands to running processes
and redirect the output to a designated buffer or buffers.
@@ -1378,77 +1378,77 @@ the buffer whose process should be used from the mini-buffer.
*** Packages based on comint now highlight user input and program prompts,
and support choosing previous input with mouse-2. To control these features,
-see the user-options `comint-highlight-input' and `comint-highlight-prompt'.
+see the user-options 'comint-highlight-input' and 'comint-highlight-prompt'.
-*** The new command `comint-write-output' (usually bound to `C-c C-s')
+*** The new command 'comint-write-output' (usually bound to `C-c C-s')
saves the output from the most recent command to a file. With a prefix
argument, it appends to the file.
-*** The command `comint-kill-output' has been renamed `comint-delete-output'
+*** The command 'comint-kill-output' has been renamed 'comint-delete-output'
(usually bound to `C-c C-o'); the old name is aliased to it for
compatibility.
-*** The new function `comint-add-to-input-history' adds commands to the input
+*** The new function 'comint-add-to-input-history' adds commands to the input
ring (history).
-*** The new variable `comint-input-history-ignore' is a regexp for
+*** The new variable 'comint-input-history-ignore' is a regexp for
identifying history lines that should be ignored, like tcsh time-stamp
strings, starting with a `#'. The default value of this variable is "^#".
** Changes to Rmail mode
-*** The new user-option rmail-user-mail-address-regexp can be
+*** The new user-option 'rmail-user-mail-address-regexp' can be
set to fine tune the identification of the correspondent when
receiving new mail. If it matches the address of the sender, the
recipient is taken as correspondent of a mail. If nil, the default,
-`user-login-name' and `user-mail-address' are used to exclude yourself
+'user-login-name' and 'user-mail-address' are used to exclude yourself
as correspondent.
Usually you don't have to set this variable, except if you collect
mails sent by you under different user names. Then it should be a
regexp matching your mail addresses.
-*** The new user-option rmail-confirm-expunge controls whether and how
+*** The new user-option 'rmail-confirm-expunge' controls whether and how
to ask for confirmation before expunging deleted messages from an
Rmail file. You can choose between no confirmation, confirmation
with y-or-n-p, or confirmation with yes-or-no-p. Default is to ask
for confirmation with yes-or-no-p.
-*** RET is now bound in the Rmail summary to rmail-summary-goto-msg,
-like `j'.
+*** RET is now bound in the Rmail summary to 'rmail-summary-goto-msg',
+like 'j'.
-*** There is a new user option `rmail-digest-end-regexps' that
+*** There is a new user option 'rmail-digest-end-regexps' that
specifies the regular expressions to detect the line that ends a
digest message.
-*** The new user option `rmail-automatic-folder-directives' specifies
+*** The new user option 'rmail-automatic-folder-directives' specifies
in which folder to put messages automatically.
-*** The new function `rmail-redecode-body' allows to fix a message
+*** The new function 'rmail-redecode-body' allows to fix a message
with non-ASCII characters if Emacs happens to decode it incorrectly
due to missing or malformed "charset=" header.
-** The new user-option `mail-envelope-from' can be used to specify
+** The new user-option 'mail-envelope-from' can be used to specify
an envelope-from address different from user-mail-address.
-** The variable mail-specify-envelope-from controls whether to
+** The variable 'mail-specify-envelope-from' controls whether to
use the -f option when sending mail.
-** The Rmail command `o' (`rmail-output-to-rmail-file') now writes the
-current message in the internal `emacs-mule' encoding, rather than in
-the encoding taken from the variable `buffer-file-coding-system'.
+** The Rmail command 'o' ('rmail-output-to-rmail-file') now writes the
+current message in the internal 'emacs-mule' encoding, rather than in
+the encoding taken from the variable 'buffer-file-coding-system'.
This allows to save messages whose characters cannot be safely encoded
by the buffer's coding system, and makes sure the message will be
displayed correctly when you later visit the target Rmail file.
If you want your Rmail files be encoded in a specific coding system
-other than `emacs-mule', you can customize the variable
-`rmail-file-coding-system' to set its value to that coding system.
+other than 'emacs-mule', you can customize the variable
+'rmail-file-coding-system' to set its value to that coding system.
** Changes to TeX mode
-*** The default mode has been changed from `plain-tex-mode' to
-`latex-mode'.
+*** The default mode has been changed from 'plain-tex-mode' to
+'latex-mode'.
*** latex-mode now has a simple indentation algorithm.
@@ -1466,13 +1466,13 @@ other than `emacs-mule', you can customize the variable
can be edited from that buffer.
*** Label and citation key selection now allow to select several
- items and reference them together (use `m' to mark items, `a' or
- `A' to use all marked entries).
+ items and reference them together (use 'm' to mark items, 'a' or
+ 'A' to use all marked entries).
*** reftex.el has been split into a number of smaller files to reduce
memory use when only a part of RefTeX is being used.
-*** a new command `reftex-view-crossref-from-bibtex' (bound to `C-c &'
+*** a new command 'reftex-view-crossref-from-bibtex' (bound to `C-c &'
in BibTeX-mode) can be called in a BibTeX database buffer in order
to show locations in LaTeX documents where a particular entry has
been cited.
@@ -1502,7 +1502,7 @@ file names.
** Ispell changes
-*** The command `ispell' now spell-checks a region if
+*** The command 'ispell' now spell-checks a region if
transient-mark-mode is on, and the mark is active. Otherwise it
spell-checks the current buffer.
@@ -1525,20 +1525,20 @@ end of the buffer.
*** Spell checking now works in the MS-DOS version of Emacs.
-*** The variable `ispell-format-word' has been renamed to
-`ispell-format-word-function'. The old name is still available as
+*** The variable 'ispell-format-word' has been renamed to
+'ispell-format-word-function'. The old name is still available as
alias.
** Makefile mode changes
-*** The mode now uses the abbrev table `makefile-mode-abbrev-table'.
+*** The mode now uses the abbrev table 'makefile-mode-abbrev-table'.
*** Conditionals and include statements are now highlighted when
Fontlock mode is active.
** Isearch changes
-*** Isearch now puts a call to `isearch-resume' in the command history,
+*** Isearch now puts a call to 'isearch-resume' in the command history,
so that searches can be resumed.
*** In Isearch mode, C-M-s and C-M-r are now bound like C-s and C-r,
@@ -1551,11 +1551,11 @@ selection into the search string rather than giving an error.
*** There is a new lazy highlighting feature in incremental search.
Lazy highlighting is switched on/off by customizing variable
-`isearch-lazy-highlight'. When active, all matches for the current
+'isearch-lazy-highlight'. When active, all matches for the current
search string are highlighted. The current match is highlighted as
-before using face `isearch' or `region'. All other matches are
-highlighted using face `isearch-lazy-highlight-face' which defaults to
-`secondary-selection'.
+before using face 'isearch' or 'region'. All other matches are
+highlighted using face 'isearch-lazy-highlight-face' which defaults to
+'secondary-selection'.
The extra highlighting makes it easier to anticipate where the cursor
will end up each time you press C-s or C-r to repeat a pending search.
@@ -1563,7 +1563,7 @@ Highlighting of these additional matches happens in a deferred fashion
using "idle timers," so the cycles needed do not rob isearch of its
usual snappy response.
-If `isearch-lazy-highlight-cleanup' is set to t, highlights for
+If 'isearch-lazy-highlight-cleanup' is set to t, highlights for
matches are automatically cleared when you end the search. If it is
set to nil, you can remove the highlights manually with `M-x
isearch-lazy-highlight-cleanup'.
@@ -1575,7 +1575,7 @@ easier to plug-in arbitrary version control backends. (See Lisp
Changes for details on the new structure.) As a result, the mechanism
to enable and disable support for particular version systems has
changed: everything is now controlled by the new variable
-`vc-handled-backends'. Its value is a list of symbols that identify
+'vc-handled-backends'. Its value is a list of symbols that identify
version systems; the default is '(RCS CVS SCCS). When finding a file,
each of the backends in that list is tried in order to see whether the
file is registered in that backend.
@@ -1585,29 +1585,29 @@ backends to see if any of them considers itself "responsible" for the
directory of the file (e.g. because a corresponding subdirectory for
master files exists). If none of the backends is responsible, then
the first backend in the list that could register the file is chosen.
-As a consequence, the variable `vc-default-back-end' is now obsolete.
+As a consequence, the variable 'vc-default-back-end' is now obsolete.
-The old variable `vc-master-templates' is also obsolete, although VC
+The old variable 'vc-master-templates' is also obsolete, although VC
still supports it for backward compatibility. To define templates for
RCS or SCCS, you should rather use the new variables
vc-{rcs,sccs}-master-templates. (There is no such feature under CVS
where it doesn't make sense.)
-The variables `vc-ignore-vc-files' and `vc-handle-cvs' are also
-obsolete now, you must set `vc-handled-backends' to nil or exclude
-`CVS' from the list, respectively, to achieve their effect now.
+The variables 'vc-ignore-vc-files' and 'vc-handle-cvs' are also
+obsolete now, you must set 'vc-handled-backends' to nil or exclude
+'CVS' from the list, respectively, to achieve their effect now.
*** General Changes
-The variable `vc-checkout-carefully' is obsolete: the corresponding
+The variable 'vc-checkout-carefully' is obsolete: the corresponding
checks are always done now.
VC Dired buffers are now kept up-to-date during all version control
operations.
-`vc-diff' output is now displayed in `diff-mode'.
-`vc-print-log' uses `log-view-mode'.
-`vc-log-mode' (used for *VC-Log*) has been replaced by `log-edit-mode'.
+'vc-diff' output is now displayed in 'diff-mode'.
+'vc-print-log' uses 'log-view-mode'.
+'vc-log-mode' (used for *VC-Log*) has been replaced by 'log-edit-mode'.
The command C-x v m (vc-merge) now accepts an empty argument as the
first revision number. This means that any recent changes on the
@@ -1627,9 +1627,9 @@ commit your changes back to CVS, or pick up changes from CVS into your
local RCS archives.
To make this work, the ``more local'' backend (RCS in our example)
-should come first in `vc-handled-backends', and the ``more remote''
+should come first in 'vc-handled-backends', and the ``more remote''
backend (CVS) should come later. (The default value of
-`vc-handled-backends' already has it that way.)
+'vc-handled-backends' already has it that way.)
You can then commit changes to another backend (say, RCS), by typing
C-u C-x v v RCS RET (i.e. vc-next-action now accepts a backend name as
@@ -1649,15 +1649,15 @@ buffer is initialized to contain the entire RCS change log of the file.
*** Changes for CVS
-There is a new user option, `vc-cvs-stay-local'. If it is `t' (the
+There is a new user option, 'vc-cvs-stay-local'. If it is 't' (the
default), then VC avoids network queries for files registered in
remote repositories. The state of such files is then only determined
-by heuristics and past information. `vc-cvs-stay-local' can also be a
+by heuristics and past information. 'vc-cvs-stay-local' can also be a
regexp to match against repository hostnames; only files from hosts
that match it are treated locally. If the variable is nil, then VC
queries the repository just as often as it does for local files.
-If `vc-cvs-stay-local' is on, then VC also makes local backups of
+If 'vc-cvs-stay-local' is on, then VC also makes local backups of
repository versions. This means that ordinary diffs (C-x v =) and
revert operations (C-x v u) can be done completely locally, without
any repository interactions at all. The name of a local version
@@ -1670,15 +1670,15 @@ automatically after commit. (This feature doesn't work on MS-DOS,
since DOS disallows more than a single dot in the trunk of a file
name.)
-If `vc-cvs-stay-local' is on, and there have been changes in the
+If 'vc-cvs-stay-local' is on, and there have been changes in the
repository, VC notifies you about it when you actually try to commit.
If you want to check for updates from the repository without trying to
commit, you can either use C-x v m RET to perform an update on the
current file, or you can use C-x v r RET to get an update for an
entire directory tree.
-The new user option `vc-cvs-use-edit' indicates whether VC should call
-"cvs edit" to make files writable; it defaults to `t'. (This option
+The new user option 'vc-cvs-use-edit' indicates whether VC should call
+"cvs edit" to make files writable; it defaults to 't'. (This option
is only meaningful if the CVSREAD variable is set, or if files are
"watched" by other developers.)
@@ -1697,7 +1697,7 @@ a version system named SYS, you write a library named vc-sys.el, which
provides a number of functions vc-sys-... (see commentary at the top
of vc.el for a detailed list of them). To make VC use that library,
you need to put it somewhere into Emacs' load path and add the symbol
-`SYS' to the list `vc-handled-backends'.
+'SYS' to the list 'vc-handled-backends'.
** The customizable EDT emulation package now supports the EDT
SUBS command and EDT scroll margins. It also works with more
@@ -1706,7 +1706,7 @@ See etc/edt-user.doc for more information.
** New modes and packages
-*** The new global minor mode `minibuffer-electric-default-mode'
+*** The new global minor mode 'minibuffer-electric-default-mode'
automatically hides the `(default ...)' part of minibuffer prompts when
the default is not applicable.
@@ -1716,7 +1716,7 @@ shapes are made up with the ascii characters |, -, / and \.
Features are:
-- Intersecting: When a `|' intersects with a `-', a `+' is
+- Intersecting: When a `|' intersects with a '-', a `+' is
drawn, like this: | \ /
--+-- X
| / \
@@ -1792,8 +1792,8 @@ of interactively entered regexps. For example,
M-x highlight-regexp RET clearly RET RET
-will highlight all occurrences of `clearly' using a yellow background
-face. New occurrences of `clearly' will be highlighted as they are
+will highlight all occurrences of 'clearly' using a yellow background
+face. New occurrences of 'clearly' will be highlighted as they are
typed. `M-x unhighlight-regexp RET' will remove the highlighting.
Any existing face can be used for highlighting and a set of
appropriate faces is provided. The regexps can be written into the
@@ -1813,7 +1813,7 @@ parser. It doesn't parse the DTDs however.
*** The comment operations are now provided by the newcomment.el
package which allows different styles of comment-region and should
be more robust while offering the same functionality.
-`comment-region' now doesn't always comment a-line-at-a-time, but only
+'comment-region' now doesn't always comment a-line-at-a-time, but only
comments the region, breaking the line at point if necessary.
*** The Ebrowse package implements a C++ class browser and tags
@@ -1823,17 +1823,17 @@ separate Texinfo file.
*** The PCL-CVS package available by either running M-x cvs-examine or
by visiting a CVS administrative directory (with a prefix argument)
provides an alternative interface to VC-dired for CVS. It comes with
-`log-view-mode' to view RCS and SCCS logs and `log-edit-mode' used to
+'log-view-mode' to view RCS and SCCS logs and 'log-edit-mode' used to
enter check-in log messages.
-*** The new package called `woman' allows to browse Unix man pages
+*** The new package called 'woman' allows to browse Unix man pages
without invoking external programs.
The command `M-x woman' formats manual pages entirely in Emacs Lisp
and then displays them, like `M-x manual-entry' does. Unlike
-`manual-entry', `woman' does not invoke any external programs, so it
-is useful on systems such as MS-DOS/MS-Windows where the `man' and
-Groff or `troff' commands are not readily available.
+'manual-entry', 'woman' does not invoke any external programs, so it
+is useful on systems such as MS-DOS/MS-Windows where the 'man' and
+Groff or 'troff' commands are not readily available.
The command `M-x woman-find-file' asks for the file name of a man
page, then formats and displays it like `M-x woman' does.
@@ -1853,11 +1853,11 @@ matching parens to make them stand out. On such a setup you will
probably also want to use the sub-expression mode when the regexp
contains such to get feedback about their respective limits.
-*** glasses-mode is a minor mode that makes
+*** 'glasses-mode' is a minor mode that makes
unreadableIdentifiersLikeThis readable. It works as glasses, without
actually modifying content of a buffer.
-*** The package ebnf2ps translates an EBNF to a syntactic chart in
+*** The package 'ebnf2ps' translates an EBNF to a syntactic chart in
PostScript.
Currently accepts ad-hoc EBNF, ISO EBNF and Bison/Yacc.
@@ -1895,51 +1895,51 @@ determine where the columns should be split. In C and C++, for
example, it will align variable names in declaration lists, or the
equal signs of assignments.
-*** `paragraph-indent-minor-mode' is a new minor mode supporting
-paragraphs in the same style as `paragraph-indent-text-mode'.
+*** 'paragraph-indent-minor-mode' is a new minor mode supporting
+paragraphs in the same style as 'paragraph-indent-text-mode'.
*** bs.el is a new package for buffer selection similar to
-list-buffers or electric-buffer-list. Use M-x bs-show to display a
-buffer menu with this package. See the Custom group `bs'.
+'list-buffers' or 'electric-buffer-list'. Use M-x bs-show to display a
+buffer menu with this package. See the Custom group 'bs'.
*** find-lisp.el is a package emulating the Unix find command in Lisp.
-*** calculator.el is a small calculator package that is intended to
+*** 'calculator' is a small calculator package that is intended to
replace desktop calculators such as xcalc and calc.exe. Actually, it
is not too small - it has more features than most desktop calculators,
and can be customized easily to get many more functions. It should
-not be confused with "calc" which is a much bigger mathematical tool
+not be confused with 'calc' which is a much bigger mathematical tool
which answers different needs.
-*** The minor modes cwarn-mode and global-cwarn-mode highlights
+*** The minor modes 'cwarn-mode' and 'global-cwarn-mode' highlights
suspicious C and C++ constructions. Currently, assignments inside
-expressions, semicolon following `if', `for' and `while' (except, of
+expressions, semicolon following 'if', 'for' and 'while' (except, of
course, after a `do .. while' statement), and C++ functions with
reference parameters are recognized. The modes require font-lock mode
to be enabled.
-*** smerge-mode.el provides `smerge-mode', a simple minor-mode for files
+*** smerge-mode.el provides 'smerge-mode', a simple minor-mode for files
containing diff3-style conflict markers, such as generated by RCS.
-*** 5x5.el is a simple puzzle game.
+*** '5x5' is a simple puzzle game.
-*** hl-line.el provides `hl-line-mode', a minor mode to highlight the
+*** hl-line.el provides 'hl-line-mode', a minor mode to highlight the
current line in the current buffer. It also provides
-`global-hl-line-mode' to provide the same behavior in all buffers.
+'global-hl-line-mode' to provide the same behavior in all buffers.
*** ansi-color.el translates ANSI terminal escapes into text-properties.
-Please note: if `ansi-color-for-comint-mode' and
-`global-font-lock-mode' are non-nil, loading ansi-color.el will
-disable font-lock and add `ansi-color-apply' to
-`comint-preoutput-filter-functions' for all shell-mode buffers. This
+Please note: if 'ansi-color-for-comint-mode' and
+'global-font-lock-mode' are non-nil, loading ansi-color.el will
+disable font-lock and add 'ansi-color-apply' to
+'comint-preoutput-filter-functions' for all shell-mode buffers. This
displays the output of "ls --color=yes" using the correct foreground
and background colors.
*** delphi.el provides a major mode for editing the Delphi (Object
Pascal) language.
-*** quickurl.el provides a simple method of inserting a URL based on
+*** 'quickurl' provides a simple method of inserting a URL based on
the text at point.
*** sql.el provides an interface to SQL data bases.
@@ -1985,22 +1985,22 @@ It results:
delim-col has the following options:
- delimit-columns-str-before Specify a string to be inserted
+ 'delimit-columns-str-before' Specify a string to be inserted
before all columns.
- delimit-columns-str-separator Specify a string to be inserted
+ 'delimit-columns-str-separator' Specify a string to be inserted
between each column.
- delimit-columns-str-after Specify a string to be inserted
+ 'delimit-columns-str-after' Specify a string to be inserted
after all columns.
- delimit-columns-separator Specify a regexp which separates
+ 'delimit-columns-separator' Specify a regexp which separates
each column.
delim-col has the following commands:
- delimit-columns-region Prettify all columns in a text region.
- delimit-columns-rectangle Prettify all columns in a text rectangle.
+ 'delimit-columns-region' Prettify all columns in a text region.
+ 'delimit-columns-rectangle' Prettify all columns in a text rectangle.
*** Recentf mode maintains a menu for visiting files that were
operated on recently. User option recentf-menu-filter specifies a
@@ -2011,17 +2011,17 @@ recent file list can be displayed:
- sorted by file paths, file names, ascending or descending.
- showing paths relative to the current default-directory
-The `recentf-filter-changer' menu filter function allows to
+The 'recentf-filter-changer' menu filter function allows to
dynamically change the menu appearance.
-*** elide-head.el provides a mechanism for eliding boilerplate header
+*** 'elide-head' provides a mechanism for eliding boilerplate header
text.
-*** footnote.el provides `footnote-mode', a minor mode supporting use
+*** footnote.el provides 'footnote-mode', a minor mode supporting use
of footnotes. It is intended for use with Message mode, but isn't
specific to Message mode.
-*** diff-mode.el provides `diff-mode', a major mode for
+*** diff-mode.el provides 'diff-mode', a major mode for
viewing/editing context diffs (patches). It is selected for files
with extension `.diff', `.diffs', `.patch' and `.rej'.
@@ -2037,29 +2037,29 @@ for Autoconf, selected automatically.
*** crm.el provides a facility to read multiple strings from the
minibuffer with completion.
-*** todo-mode.el provides management of TODO lists and integration
+*** 'todo-mode' provides management of TODO lists and integration
with the diary features.
*** autoarg.el provides a feature reported from Twenex Emacs whereby
numeric keys supply prefix args rather than self inserting.
-*** The function `turn-off-auto-fill' unconditionally turns off Auto
+*** The function 'turn-off-auto-fill' unconditionally turns off Auto
Fill mode.
-*** pcomplete.el is a library that provides programmable completion
+*** 'pcomplete' is a library that provides programmable completion
facilities for Emacs, similar to what zsh and tcsh offer. The main
difference is that completion functions are written in Lisp, meaning
they can be profiled, debugged, etc.
-*** antlr-mode is a new major mode for editing ANTLR grammar files.
+*** 'antlr-mode' is a new major mode for editing ANTLR grammar files.
It is automatically turned on for files whose names have the extension
`.g'.
** Changes in sort.el
-The function sort-numeric-fields interprets numbers starting with `0'
-as octal and numbers starting with `0x' or `0X' as hexadecimal. The
-new user-option sort-numeric-base can be used to specify a default
+The function 'sort-numeric-fields' interprets numbers starting with '0'
+as octal and numbers starting with '0x' or '0X' as hexadecimal. The
+new user-option 'sort-numeric-base' can be used to specify a default
numeric base.
** Changes to Ange-ftp
@@ -2068,42 +2068,43 @@ numeric base.
names cleanly. It is appended to the host name, separated by a hash
sign, e.g. `/foo@bar.org#666:mumble'. (This syntax comes from EFS.)
-*** If the new user-option `ange-ftp-try-passive-mode' is set, passive
+*** If the new user-option 'ange-ftp-try-passive-mode' is set, passive
ftp mode will be used if the ftp client supports that.
*** Ange-ftp handles the output of the w32-style clients which
output ^M at the end of lines.
** The recommended way of using Iswitchb is via the new global minor
-mode `iswitchb-mode'.
+mode 'iswitchb-mode'.
** Just loading the msb package doesn't switch on Msb mode anymore.
-If you have `(require 'msb)' in your .emacs, please replace it with
-`(msb-mode 1)'.
+If you have `(require 'msb)' in your .emacs, please replace it with:
+
+ (msb-mode 1)
** Changes in Flyspell mode
-*** Flyspell mode has various new options. See the `flyspell' Custom
+*** Flyspell mode has various new options. See the 'flyspell' Custom
group.
-*** The variable `flyspell-generic-check-word-p' has been renamed
-to `flyspell-generic-check-word-predicate'. The old name is still
+*** The variable 'flyspell-generic-check-word-p' has been renamed
+to 'flyspell-generic-check-word-predicate'. The old name is still
available as alias.
-** The user option `backward-delete-char-untabify-method' controls the
-behavior of `backward-delete-char-untabify'. The following values
+** The user option 'backward-delete-char-untabify-method' controls the
+behavior of 'backward-delete-char-untabify'. The following values
are recognized:
-`untabify' -- turn a tab to many spaces, then delete one space;
-`hungry' -- delete all whitespace, both tabs and spaces;
-`all' -- delete all whitespace, including tabs, spaces and newlines;
+'untabify' -- turn a tab to many spaces, then delete one space;
+'hungry' -- delete all whitespace, both tabs and spaces;
+'all' -- delete all whitespace, including tabs, spaces and newlines;
nil -- just delete one character.
-Default value is `untabify'.
+Default value is 'untabify'.
[This change was made in Emacs 20.3 but not mentioned then.]
-** In Cperl mode `cperl-invalid-face' should now be a normal face
+** In Cperl mode 'cperl-invalid-face' should now be a normal face
symbol, not double-quoted.
** Some packages are declared obsolete, to be removed in a future
@@ -2112,21 +2113,21 @@ profile, rnews, rnewspost, and sc. Their implementations have been
moved to lisp/obsolete.
** auto-compression mode is no longer enabled just by loading jka-compr.el.
-To control it, set `auto-compression-mode' via Custom or use the
-`auto-compression-mode' command.
+To control it, set 'auto-compression-mode' via Custom or use the
+'auto-compression-mode' command.
-** `browse-url-gnome-moz' is a new option for
-`browse-url-browser-function', invoking Mozilla in GNOME, and
-`browse-url-kde' can be chosen for invoking the KDE browser.
+** 'browse-url-gnome-moz' is a new option for
+'browse-url-browser-function', invoking Mozilla in GNOME, and
+'browse-url-kde' can be chosen for invoking the KDE browser.
-** The user-option `browse-url-new-window-p' has been renamed to
-`browse-url-new-window-flag'.
+** The user-option 'browse-url-new-window-p' has been renamed to
+'browse-url-new-window-flag'.
-** The functions `keep-lines', `flush-lines' and `how-many' now
+** The functions 'keep-lines', 'flush-lines' and 'how-many' now
operate on the active region in Transient Mark mode.
-** `gnus-user-agent' is a new possibility for `mail-user-agent'. It
-is like `message-user-agent', but with all the Gnus paraphernalia.
+** 'gnus-user-agent' is a new possibility for 'mail-user-agent'. It
+is like 'message-user-agent', but with all the Gnus paraphernalia.
** The Strokes package has been updated. If your Emacs has XPM
support, you can use it for pictographic editing. In Strokes mode,
@@ -2135,7 +2136,7 @@ buffer. You can encode or decode a strokes buffer with new commands
M-x strokes-encode-buffer and M-x strokes-decode-buffer. There is a
new command M-x strokes-list-strokes.
-** Hexl contains a new command `hexl-insert-hex-string' which inserts
+** Hexl contains a new command 'hexl-insert-hex-string' which inserts
a string of hexadecimal numbers read from the mini-buffer.
** Hexl mode allows to insert non-ASCII characters.
@@ -2166,8 +2167,8 @@ declarations when given the --declarations option.
"operator+", without spaces between the keyword and the operator.
*** You shouldn't generally need any more the -C or -c++ option: etags
-automatically switches to C++ parsing when it meets the `class' or
-`template' keywords.
+automatically switches to C++ parsing when it meets the 'class' or
+'template' keywords.
*** Etags now is able to delve at arbitrary deeps into nested structures in
C-like languages. Previously, it was limited to one or two brace levels.
@@ -2175,7 +2176,7 @@ C-like languages. Previously, it was limited to one or two brace levels.
*** New language Ada: tags are functions, procedures, packages, tasks, and
types.
-*** In Fortran, `procedure' is not tagged.
+*** In Fortran, 'procedure' is not tagged.
*** In Java, tags are created for "interface".
@@ -2194,12 +2195,12 @@ for PSWrap.
** Changes in etags.el
-*** The new user-option tags-case-fold-search can be used to make
+*** The new user-option 'tags-case-fold-search' can be used to make
tags operations case-sensitive or case-insensitive. The default
-is to use the same setting as case-fold-search.
+is to use the same setting as 'case-fold-search'.
*** You can display additional output with M-x tags-apropos by setting
-the new variable tags-apropos-additional-actions.
+the new variable 'tags-apropos-additional-actions'.
If non-nil, the variable's value should be a list of triples (TITLE
FUNCTION TO-SEARCH). For each triple, M-x tags-apropos processes
@@ -2237,15 +2238,15 @@ auto-compression-mode is active. You can tag (with Etags) and search
in buffers where no match is found. In buffers where a match is
found, the original value of point is pushed on the marker ring.
-** Fortran mode has a new command `fortran-strip-sequence-nos' to
+** Fortran mode has a new command 'fortran-strip-sequence-nos' to
remove text past column 72. The syntax class of `\' in Fortran is now
appropriate for C-style escape sequences in strings.
-** SGML mode's default `sgml-validate-command' is now `nsgmls'.
+** SGML mode's default 'sgml-validate-command' is now 'nsgmls'.
-** A new command `view-emacs-problems' (C-h P) displays the PROBLEMS file.
+** A new command 'view-emacs-problems' (C-h P) displays the PROBLEMS file.
-** The Dabbrev package has a new user-option `dabbrev-ignored-regexps'
+** The Dabbrev package has a new user-option 'dabbrev-ignored-regexps'
containing a list of regular expressions. Buffers matching a regular
expression from that list, are not checked.
@@ -2256,20 +2257,20 @@ the buffer, just like for the local files.
** The buffer menu (C-x C-b) no longer lists the *Buffer List* buffer.
-** When invoked with a prefix argument, the command `list-abbrevs' now
+** When invoked with a prefix argument, the command 'list-abbrevs' now
displays local abbrevs, only.
** Refill minor mode provides preliminary support for keeping
paragraphs filled as you modify them.
-** The variable `double-click-fuzz' specifies how much the mouse
+** The variable 'double-click-fuzz' specifies how much the mouse
may be moved between clicks that are recognized as a pair. Its value
is measured in pixels.
-** The new global minor mode `auto-image-file-mode' allows image files
+** The new global minor mode 'auto-image-file-mode' allows image files
to be visited as images.
-** Two new user-options `grep-command' and `grep-find-command'
+** Two new user-options 'grep-command' and 'grep-find-command'
were added to compile.el.
** Withdrawn packages
@@ -2288,13 +2289,13 @@ There are a few Lisp changes which are not backwards-compatible and
may require changes to existing code. Here is a list for reference.
See the sections below for details.
-** Since `format' preserves text properties, the idiom
+** Since 'format' preserves text properties, the idiom
`(format "%s" foo)' no longer works to copy and remove properties.
-Use `copy-sequence' to copy the string, then use `set-text-properties'
+Use 'copy-sequence' to copy the string, then use 'set-text-properties'
to remove the properties of the copy.
-** Since the `keymap' text property now has significance, some code
-which uses both `local-map' and `keymap' properties (for portability)
+** Since the 'keymap' text property now has significance, some code
+which uses both 'local-map' and 'keymap' properties (for portability)
may, for instance, give rise to duplicate menus when the keymaps from
these properties are active.
@@ -2302,36 +2303,36 @@ these properties are active.
ranges may affect some code.
** A non-nil value for the LOCAL arg of add-hook makes the hook
-buffer-local even if `make-local-hook' hasn't been called, which might
+buffer-local even if 'make-local-hook' hasn't been called, which might
make a difference to some code.
** The new treatment of the minibuffer prompt might affect code which
operates on the minibuffer.
-** The new character sets `eight-bit-control' and `eight-bit-graphic'
-cause `no-conversion' and `emacs-mule-unix' coding systems to produce
+** The new character sets 'eight-bit-control' and 'eight-bit-graphic'
+cause 'no-conversion' and 'emacs-mule-unix' coding systems to produce
different results when reading files with non-ASCII characters
(previously, both coding systems would produce the same results).
-Specifically, `no-conversion' interprets each 8-bit byte as a separate
-character. This makes `no-conversion' inappropriate for reading
+Specifically, 'no-conversion' interprets each 8-bit byte as a separate
+character. This makes 'no-conversion' inappropriate for reading
multibyte text, e.g. buffers written to disk in their internal MULE
encoding (auto-saving does that, for example). If a Lisp program
-reads such files with `no-conversion', each byte of the multibyte
+reads such files with 'no-conversion', each byte of the multibyte
sequence, including the MULE leading codes such as \201, is treated as
a separate character, which prevents them from being interpreted in
the buffer as multibyte characters.
Therefore, Lisp programs that read files which contain the internal
-MULE encoding should use `emacs-mule-unix'. `no-conversion' is only
+MULE encoding should use 'emacs-mule-unix'. 'no-conversion' is only
appropriate for reading truly binary files.
-** Code that relies on the obsolete `before-change-function' and
-`after-change-function' to detect buffer changes will now fail. Use
-`before-change-functions' and `after-change-functions' instead.
+** Code that relies on the obsolete 'before-change-function' and
+'after-change-function' to detect buffer changes will now fail. Use
+'before-change-functions' and 'after-change-functions' instead.
-** Code that uses `concat' with integer args now gets an error, as
-long promised. So does any code that uses derivatives of `concat',
-such as `mapconcat'.
+** Code that uses 'concat' with integer args now gets an error, as
+long promised. So does any code that uses derivatives of 'concat',
+such as 'mapconcat'.
** The function base64-decode-string now always returns a unibyte
string.
@@ -2345,9 +2346,9 @@ the emacs-mule encoding. Also, files stored in the emacs-mule
encoding using Emacs 20 with additional private charsets defined will
probably not be read correctly by Emacs 21.
-** The variable `directory-sep-char' is slated for removal.
+** The variable 'directory-sep-char' is slated for removal.
Not really a change (yet), but a projected one that you should be
-aware of: The variable `directory-sep-char' is deprecated, and should
+aware of: The variable 'directory-sep-char' is deprecated, and should
not be used. It was always ignored on GNU/Linux and Unix systems and
on MS-DOS, but the MS-Windows port tried to support it by adapting the
behavior of certain primitives to the value of this variable. It
@@ -2360,12 +2361,12 @@ will not have any effect when support for this variable is removed.
* Lisp changes made after edition 2.6 of the Emacs Lisp Manual,
(Display-related features are described in a page of their own below.)
-** Function assq-delete-all replaces function assoc-delete-all.
+** Function 'assq-delete-all' replaces function 'assoc-delete-all'.
-** The new function animate-string, from lisp/play/animate.el
+** The new function 'animate-string', from lisp/play/animate.el
allows the animated display of strings.
-** The new function `interactive-form' can be used to obtain the
+** The new function 'interactive-form' can be used to obtain the
interactive form of a function.
** The keyword :set-after in defcustom allows to specify dependencies
@@ -2374,36 +2375,36 @@ between custom options. Example:
(defcustom default-input-method nil
"*Default input method for multilingual text (a string).
This is the input method activated automatically by the command
- `toggle-input-method' (\\[toggle-input-method])."
+ 'toggle-input-method' (\\[toggle-input-method])."
:group 'mule
:type '(choice (const nil) string)
:set-after '(current-language-environment))
-This specifies that default-input-method should be set after
-current-language-environment even if default-input-method appears
-first in a custom-set-variables statement.
+This specifies that 'default-input-method' should be set after
+'current-language-environment' even if default-input-method appears
+first in a 'custom-set-variables' statement.
-** The new hook `kbd-macro-termination-hook' is run at the end of
-function execute-kbd-macro. Functions on this hook are called with no
+** The new hook 'kbd-macro-termination-hook' is run at the end of
+function 'execute-kbd-macro'. Functions on this hook are called with no
args. The hook is run independent of how the macro was terminated
(signal or normal termination).
-** Functions `butlast' and `nbutlast' for removing trailing elements
+** Functions 'butlast' and 'nbutlast' for removing trailing elements
from a list are now available without requiring the CL package.
-** The new user-option `even-window-heights' can be set to nil
-to prevent `display-buffer' from evening out window heights.
+** The new user-option 'even-window-heights' can be set to nil
+to prevent 'display-buffer' from evening out window heights.
-** The user-option `face-font-registry-alternatives' specifies
+** The user-option 'face-font-registry-alternatives' specifies
alternative font registry names to try when looking for a font.
-** Function `md5' calculates the MD5 "message digest"/"checksum".
+** Function 'md5' calculates the MD5 "message digest"/"checksum".
-** Function `delete-frame' runs `delete-frame-hook' before actually
+** Function 'delete-frame' runs 'delete-frame-hook' before actually
deleting the frame. The hook is called with one arg, the frame
being deleted.
-** `add-hook' now makes the hook local if called with a non-nil LOCAL arg.
+** 'add-hook' now makes the hook local if called with a non-nil LOCAL arg.
** The treatment of non-ASCII characters in search ranges has changed.
If a range in a regular expression or the arg of
@@ -2412,11 +2413,11 @@ with a multibyte character C2, the range is divided into two: one is
C..?\377, the other is C1..C2, where C1 is the first character of C2's
charset.
-** The new function `display-message-or-buffer' displays a message in
+** The new function 'display-message-or-buffer' displays a message in
the echo area or pops up a buffer, depending on the length of the
message.
-** The new macro `with-auto-compression-mode' allows evaluating an
+** The new macro 'with-auto-compression-mode' allows evaluating an
expression with auto-compression-mode enabled.
** In image specifications, `:heuristic-mask' has been replaced
@@ -2435,49 +2436,49 @@ is running in batch mode. For example,
will read a Lisp expression from standard input and print the result
to standard output.
-** The argument of `down-list', `backward-up-list', `up-list',
-`kill-sexp', `backward-kill-sexp' and `mark-sexp' is now optional.
+** The argument of 'down-list', 'backward-up-list', 'up-list',
+'kill-sexp', 'backward-kill-sexp' and 'mark-sexp' is now optional.
-** If `display-buffer-reuse-frames' is set, function `display-buffer'
+** If 'display-buffer-reuse-frames' is set, function 'display-buffer'
will raise frames displaying a buffer, instead of creating a new
frame or window.
** Two new functions for removing elements from lists/sequences
were added
-- Function: remove ELT SEQ
+- Function: 'remove' ELT SEQ
Return a copy of SEQ with all occurrences of ELT removed. SEQ must be
-a list, vector, or string. The comparison is done with `equal'.
+a list, vector, or string. The comparison is done with 'equal'.
-- Function: remq ELT LIST
+- Function: 'remq' ELT LIST
Return a copy of LIST with all occurrences of ELT removed. The
-comparison is done with `eq'.
+comparison is done with 'eq'.
-** The function `delete' now also works with vectors and strings.
+** The function 'delete' now also works with vectors and strings.
-** The meaning of the `:weakness WEAK' argument of make-hash-table
-has been changed: WEAK can now have new values `key-or-value' and
-`key-and-value', in addition to `nil', `key', `value', and `t'.
+** The meaning of the `:weakness WEAK' argument of 'make-hash-table'
+has been changed: WEAK can now have new values 'key-or-value' and
+'key-and-value', in addition to 'nil', 'key', 'value', and 't'.
-** Function `aset' stores any multibyte character in any string
+** Function 'aset' stores any multibyte character in any string
without signaling "Attempt to change char length of a string". It may
convert a unibyte string to multibyte if necessary.
-** The value of the `help-echo' text property is called as a function
+** The value of the 'help-echo' text property is called as a function
or evaluated, if it is not a string already, to obtain a help string.
-** Function `make-obsolete' now has an optional arg to say when the
+** Function 'make-obsolete' now has an optional arg to say when the
function was declared obsolete.
-** Function `plist-member' is renamed from `widget-plist-member' (which is
+** Function 'plist-member' is renamed from 'widget-plist-member' (which is
retained as an alias).
** Easy-menu's :filter now takes the unconverted form of the menu and
the result is automatically converted to Emacs' form.
-** The new function `window-list' has been defined
+** The new function 'window-list' has been defined
- Function: window-list &optional FRAME WINDOW MINIBUF
@@ -2488,13 +2489,13 @@ even if it isn't active. MINIBUF nil or omitted means include the
minibuffer window only if it's active. MINIBUF neither nil nor t
means never include the minibuffer window.
-** There's a new function `get-window-with-predicate' defined as follows
+** There's a new function 'get-window-with-predicate' defined as follows
- Function: get-window-with-predicate PREDICATE &optional MINIBUF ALL-FRAMES DEFAULT
Return a window satisfying PREDICATE.
-This function cycles through all visible windows using `walk-windows',
+This function cycles through all visible windows using 'walk-windows',
calling PREDICATE on each one. PREDICATE is called with a window as
argument. The first window for which PREDICATE returns a non-nil
value is returned. If no window satisfies PREDICATE, DEFAULT is
@@ -2509,61 +2510,61 @@ Several frames may share a single minibuffer; if the minibuffer
counts, all windows on all frames that share that minibuffer count
too. Therefore, if you are using a separate minibuffer frame
and the minibuffer is active and MINIBUF says it counts,
-`walk-windows' includes the windows in the frame from which you
+'walk-windows' includes the windows in the frame from which you
entered the minibuffer, as well as the minibuffer window.
ALL-FRAMES is the optional third argument.
ALL-FRAMES nil or omitted means cycle within the frames as specified above.
-ALL-FRAMES = `visible' means include windows on all visible frames.
+ALL-FRAMES = 'visible' means include windows on all visible frames.
ALL-FRAMES = 0 means include windows on all visible and iconified frames.
ALL-FRAMES = t means include windows on all frames including invisible frames.
If ALL-FRAMES is a frame, it means include windows on that frame.
Anything else means restrict to the selected frame.
-** The function `single-key-description' now encloses function key and
+** The function 'single-key-description' now encloses function key and
event names in angle brackets. When called with a second optional
argument non-nil, angle brackets won't be printed.
-** If the variable `message-truncate-lines' is bound to t around a
-call to `message', the echo area will not be resized to display that
+** If the variable 'message-truncate-lines' is bound to t around a
+call to 'message', the echo area will not be resized to display that
message; it will be truncated instead, as it was done in 20.x.
Default value is nil.
-** The user option `line-number-display-limit' can now be set to nil,
+** The user option 'line-number-display-limit' can now be set to nil,
meaning no limit.
-** The new user option `line-number-display-limit-width' controls
+** The new user option 'line-number-display-limit-width' controls
the maximum width of lines in a buffer for which Emacs displays line
numbers in the mode line. The default is 200.
-** `select-safe-coding-system' now also checks the most preferred
-coding-system if buffer-file-coding-system is `undecided' and
+** 'select-safe-coding-system' now also checks the most preferred
+coding-system if buffer-file-coding-system is 'undecided' and
DEFAULT-CODING-SYSTEM is not specified,
-** The function `subr-arity' provides information about the argument
+** The function 'subr-arity' provides information about the argument
list of a primitive.
-** `where-is-internal' now also accepts a list of keymaps.
+** 'where-is-internal' now also accepts a list of keymaps.
-** The text property `keymap' specifies a key map which overrides the
-buffer's local map and the map specified by the `local-map' property.
-This is probably what most current uses of `local-map' want, rather
+** The text property 'keymap' specifies a key map which overrides the
+buffer's local map and the map specified by the 'local-map' property.
+This is probably what most current uses of 'local-map' want, rather
than replacing the local map.
-** The obsolete variables `before-change-function' and
-`after-change-function' are no longer acted upon and have been
-removed. Use `before-change-functions' and `after-change-functions'
+** The obsolete variables 'before-change-function' and
+'after-change-function' are no longer acted upon and have been
+removed. Use 'before-change-functions' and 'after-change-functions'
instead.
-** The function `apropos-mode' runs the hook `apropos-mode-hook'.
+** The function 'apropos-mode' runs the hook 'apropos-mode-hook'.
-** `concat' no longer accepts individual integer arguments,
+** 'concat' no longer accepts individual integer arguments,
as promised long ago.
-** The new function `float-time' returns the current time as a float.
+** The new function 'float-time' returns the current time as a float.
-** The new variable auto-coding-regexp-alist specifies coding systems
-for reading specific files, analogous to auto-coding-alist, but
+** The new variable 'auto-coding-regexp-alist' specifies coding systems
+for reading specific files, analogous to 'auto-coding-alist', but
patterns are checked against file contents instead of file names.
@@ -2572,11 +2573,11 @@ patterns are checked against file contents instead of file names.
** The new package rx.el provides an alternative sexp notation for
regular expressions.
-- Function: rx-to-string SEXP
+- Function: 'rx-to-string' SEXP
Translate SEXP into a regular expression in string notation.
-- Macro: rx SEXP
+- Macro: 'rx' SEXP
Translate SEXP into a regular expression in string notation.
@@ -2589,56 +2590,56 @@ STRING
CHAR
matches character CHAR literally.
-`not-newline'
+'not-newline'
matches any character except a newline.
.
-`anything'
+'anything'
matches any character
`(any SET)'
matches any character in SET. SET may be a character or string.
- Ranges of characters can be specified as `A-Z' in strings.
+ Ranges of characters can be specified as 'A-Z' in strings.
'(in SET)'
- like `any'.
+ like 'any'.
`(not (any SET))'
matches any character not in SET
-`line-start'
+'line-start'
matches the empty string, but only at the beginning of a line
in the text being matched
-`line-end'
- is similar to `line-start' but matches only at the end of a line
+'line-end'
+ is similar to 'line-start' but matches only at the end of a line
-`string-start'
+'string-start'
matches the empty string, but only at the beginning of the
string being matched against.
-`string-end'
+'string-end'
matches the empty string, but only at the end of the
string being matched against.
-`buffer-start'
+'buffer-start'
matches the empty string, but only at the beginning of the
buffer being matched against.
-`buffer-end'
+'buffer-end'
matches the empty string, but only at the end of the
buffer being matched against.
-`point'
+'point'
matches the empty string, but only at point.
-`word-start'
+'word-start'
matches the empty string, but only at the beginning or end of a
word.
-`word-end'
+'word-end'
matches the empty string, but only at the end of a word.
-`word-boundary'
+'word-boundary'
matches the empty string, but only at the beginning or end of a
word.
@@ -2646,73 +2647,73 @@ CHAR
matches the empty string, but not at the beginning or end of a
word.
-`digit'
+'digit'
matches 0 through 9.
-`control'
+'control'
matches ASCII control characters.
-`hex-digit'
+'hex-digit'
matches 0 through 9, a through f and A through F.
-`blank'
+'blank'
matches space and tab only.
-`graphic'
+'graphic'
matches graphic characters--everything except ASCII control chars,
space, and DEL.
-`printing'
+'printing'
matches printing characters--everything except ASCII control chars
and DEL.
-`alphanumeric'
+'alphanumeric'
matches letters and digits. (But at present, for multibyte characters,
it matches anything that has word syntax.)
-`letter'
+'letter'
matches letters. (But at present, for multibyte characters,
it matches anything that has word syntax.)
-`ascii'
+'ascii'
matches ASCII (unibyte) characters.
-`nonascii'
+'nonascii'
matches non-ASCII (multibyte) characters.
-`lower'
+'lower'
matches anything lower-case.
-`upper'
+'upper'
matches anything upper-case.
-`punctuation'
+'punctuation'
matches punctuation. (But at present, for multibyte characters,
it matches anything that has non-word syntax.)
-`space'
+'space'
matches anything that has whitespace syntax.
-`word'
+'word'
matches anything that has word syntax.
`(syntax SYNTAX)'
matches a character with syntax SYNTAX. SYNTAX must be one
of the following symbols.
- `whitespace' (\\s- in string notation)
- `punctuation' (\\s.)
- `word' (\\sw)
- `symbol' (\\s_)
- `open-parenthesis' (\\s()
- `close-parenthesis' (\\s))
- `expression-prefix' (\\s')
- `string-quote' (\\s\")
- `paired-delimiter' (\\s$)
- `escape' (\\s\\)
- `character-quote' (\\s/)
- `comment-start' (\\s<)
- `comment-end' (\\s>)
+ 'whitespace' (\\s- in string notation)
+ 'punctuation' (\\s.)
+ 'word' (\\sw)
+ 'symbol' (\\s_)
+ 'open-parenthesis' (\\s()
+ 'close-parenthesis' (\\s))
+ 'expression-prefix' (\\s')
+ 'string-quote' (\\s\")
+ 'paired-delimiter' (\\s$)
+ 'escape' (\\s\\)
+ 'character-quote' (\\s/)
+ 'comment-start' (\\s<)
+ 'comment-end' (\\s>)
`(not (syntax SYNTAX))'
matches a character that has not syntax SYNTAX.
@@ -2721,44 +2722,44 @@ CHAR
matches a character with category CATEGORY. CATEGORY must be
either a character to use for C, or one of the following symbols.
- `consonant' (\\c0 in string notation)
- `base-vowel' (\\c1)
- `upper-diacritical-mark' (\\c2)
- `lower-diacritical-mark' (\\c3)
- `tone-mark' (\\c4)
- `symbol' (\\c5)
- `digit' (\\c6)
- `vowel-modifying-diacritical-mark' (\\c7)
- `vowel-sign' (\\c8)
- `semivowel-lower' (\\c9)
- `not-at-end-of-line' (\\c<)
- `not-at-beginning-of-line' (\\c>)
- `alpha-numeric-two-byte' (\\cA)
- `chinse-two-byte' (\\cC)
- `greek-two-byte' (\\cG)
- `japanese-hiragana-two-byte' (\\cH)
- `indian-two-byte' (\\cI)
- `japanese-katakana-two-byte' (\\cK)
- `korean-hangul-two-byte' (\\cN)
- `cyrillic-two-byte' (\\cY)
- `ascii' (\\ca)
- `arabic' (\\cb)
- `chinese' (\\cc)
- `ethiopic' (\\ce)
- `greek' (\\cg)
- `korean' (\\ch)
- `indian' (\\ci)
- `japanese' (\\cj)
- `japanese-katakana' (\\ck)
- `latin' (\\cl)
- `lao' (\\co)
- `tibetan' (\\cq)
- `japanese-roman' (\\cr)
- `thai' (\\ct)
- `vietnamese' (\\cv)
- `hebrew' (\\cw)
- `cyrillic' (\\cy)
- `can-break' (\\c|)
+ 'consonant' (\\c0 in string notation)
+ 'base-vowel' (\\c1)
+ 'upper-diacritical-mark' (\\c2)
+ 'lower-diacritical-mark' (\\c3)
+ 'tone-mark' (\\c4)
+ 'symbol' (\\c5)
+ 'digit' (\\c6)
+ 'vowel-modifying-diacritical-mark' (\\c7)
+ 'vowel-sign' (\\c8)
+ 'semivowel-lower' (\\c9)
+ 'not-at-end-of-line' (\\c<)
+ 'not-at-beginning-of-line' (\\c>)
+ 'alpha-numeric-two-byte' (\\cA)
+ 'chinse-two-byte' (\\cC)
+ 'greek-two-byte' (\\cG)
+ 'japanese-hiragana-two-byte' (\\cH)
+ 'indian-two-byte' (\\cI)
+ 'japanese-katakana-two-byte' (\\cK)
+ 'korean-hangul-two-byte' (\\cN)
+ 'cyrillic-two-byte' (\\cY)
+ 'ascii' (\\ca)
+ 'arabic' (\\cb)
+ 'chinese' (\\cc)
+ 'ethiopic' (\\ce)
+ 'greek' (\\cg)
+ 'korean' (\\ch)
+ 'indian' (\\ci)
+ 'japanese' (\\cj)
+ 'japanese-katakana' (\\ck)
+ 'latin' (\\cl)
+ 'lao' (\\co)
+ 'tibetan' (\\cq)
+ 'japanese-roman' (\\cr)
+ 'thai' (\\ct)
+ 'vietnamese' (\\cv)
+ 'hebrew' (\\cw)
+ 'cyrillic' (\\cy)
+ 'can-break' (\\c|)
`(not (category CATEGORY))'
matches a character that has not category CATEGORY.
@@ -2767,15 +2768,15 @@ CHAR
matches what SEXP1 matches, followed by what SEXP2 matches, etc.
`(submatch SEXP1 SEXP2 ...)'
- like `and', but makes the match accessible with `match-end',
- `match-beginning', and `match-string'.
+ like 'and', but makes the match accessible with 'match-end',
+ 'match-beginning', and 'match-string'.
`(group SEXP1 SEXP2 ...)'
- another name for `submatch'.
+ another name for 'submatch'.
`(or SEXP1 SEXP2 ...)'
matches anything that matches SEXP1 or SEXP2, etc. If all
- args are strings, use `regexp-opt' to optimize the resulting
+ args are strings, use 'regexp-opt' to optimize the resulting
regular expression.
`(minimal-match SEXP)'
@@ -2791,37 +2792,37 @@ CHAR
matches zero or more occurrences of what SEXP matches.
`(0+ SEXP)'
- like `zero-or-more'.
+ like 'zero-or-more'.
`(* SEXP)'
- like `zero-or-more', but always produces a greedy regexp.
+ like 'zero-or-more', but always produces a greedy regexp.
`(*? SEXP)'
- like `zero-or-more', but always produces a non-greedy regexp.
+ like 'zero-or-more', but always produces a non-greedy regexp.
`(one-or-more SEXP)'
matches one or more occurrences of A.
`(1+ SEXP)'
- like `one-or-more'.
+ like 'one-or-more'.
`(+ SEXP)'
- like `one-or-more', but always produces a greedy regexp.
+ like 'one-or-more', but always produces a greedy regexp.
`(+? SEXP)'
- like `one-or-more', but always produces a non-greedy regexp.
+ like 'one-or-more', but always produces a non-greedy regexp.
`(zero-or-one SEXP)'
matches zero or one occurrences of A.
`(optional SEXP)'
- like `zero-or-one'.
+ like 'zero-or-one'.
`(? SEXP)'
- like `zero-or-one', but always produces a greedy regexp.
+ like 'zero-or-one', but always produces a greedy regexp.
`(?? SEXP)'
- like `zero-or-one', but always produces a non-greedy regexp.
+ like 'zero-or-one', but always produces a non-greedy regexp.
`(repeat N SEXP)'
matches N occurrences of what SEXP matches.
@@ -2831,26 +2832,26 @@ CHAR
`(eval FORM)'
evaluate FORM and insert result. If result is a string,
- `regexp-quote' it.
+ 'regexp-quote' it.
`(regexp REGEXP)'
include REGEXP in string notation in the result.
-*** The features `md5' and `overlay' are now provided by default.
+*** The features 'md5' and 'overlay' are now provided by default.
-*** The special form `save-restriction' now works correctly even if the
+*** The special form 'save-restriction' now works correctly even if the
buffer is widened inside the save-restriction and changes made outside
the original restriction. Previously, doing this would cause the saved
restriction to be restored incorrectly.
-*** The functions `find-charset-region' and `find-charset-string' include
-`eight-bit-control' and/or `eight-bit-graphic' in the returned list
-when they find 8-bit characters. Previously, they included `ascii' in a
-multibyte buffer and `unknown' in a unibyte buffer.
+*** The functions 'find-charset-region' and 'find-charset-string' include
+'eight-bit-control' and/or 'eight-bit-graphic' in the returned list
+when they find 8-bit characters. Previously, they included 'ascii' in a
+multibyte buffer and 'unknown' in a unibyte buffer.
-*** The functions `set-buffer-multibyte', `string-as-multibyte' and
-`string-as-unibyte' change the byte sequence of a buffer or a string
-if it contains a character from the `eight-bit-control' character set.
+*** The functions 'set-buffer-multibyte', 'string-as-multibyte' and
+'string-as-unibyte' change the byte sequence of a buffer or a string
+if it contains a character from the 'eight-bit-control' character set.
*** The handling of multibyte sequences in a multibyte buffer is
changed. Previously, a byte sequence matching the pattern
@@ -2867,7 +2868,7 @@ A fontset can now be specified for each independent character, for
a group of characters or for a character set rather than just for a
character set as previously.
-*** The arguments of the function `set-fontset-font' are changed.
+*** The arguments of the function 'set-fontset-font' are changed.
They are NAME, CHARACTER, FONTNAME, and optional FRAME. The function
modifies fontset NAME to use FONTNAME for CHARACTER.
@@ -2883,11 +2884,11 @@ name of a font and REGISTRY is a registry name of a font.
registries of character sets are set in the default fontset
"fontset-default".
-*** The function `create-fontset-from-fontset-spec' ignores the second
+*** The function 'create-fontset-from-fontset-spec' ignores the second
argument STYLE-VARIANT. It never creates style-variant fontsets.
** The method of composing characters is changed. Now character
-composition is done by a special text property `composition' in
+composition is done by a special text property 'composition' in
buffers and strings.
*** Charset composition is deleted. Emacs never creates a `composite
@@ -2901,32 +2902,32 @@ also been deleted.
*** Three more glyph reference points are added. They can be used to
specify a composition rule. See the documentation of the variable
-`reference-point-alist' for more detail.
+'reference-point-alist' for more detail.
-*** The function `compose-region' takes new arguments COMPONENTS and
+*** The function 'compose-region' takes new arguments COMPONENTS and
MODIFICATION-FUNC. With COMPONENTS, you can specify not only a
composition rule but also characters to be composed. Such characters
may differ between buffer and string text.
-*** The function `compose-string' takes new arguments START, END,
+*** The function 'compose-string' takes new arguments START, END,
COMPONENTS, and MODIFICATION-FUNC.
-*** The function `compose-string' puts text property `composition'
+*** The function 'compose-string' puts text property 'composition'
directly on the argument STRING instead of returning a new string.
-Likewise, the function `decompose-string' just removes text property
-`composition' from STRING.
+Likewise, the function 'decompose-string' just removes text property
+'composition' from STRING.
-*** The new function `find-composition' returns information about
+*** The new function 'find-composition' returns information about
a composition at a specified position in a buffer or a string.
-*** The function `decompose-composite-char' is now labeled as
+*** The function 'decompose-composite-char' is now labeled as
obsolete.
-** The new coding system `mac-roman' is primarily intended for use on
+** The new coding system 'mac-roman' is primarily intended for use on
the Macintosh but may be used generally for Macintosh-encoded text.
-** The new character sets `mule-unicode-0100-24ff',
-`mule-unicode-2500-33ff', and `mule-unicode-e000-ffff' have been
+** The new character sets 'mule-unicode-0100-24ff',
+'mule-unicode-2500-33ff', and 'mule-unicode-e000-ffff' have been
introduced for Unicode characters in the range U+0100..U+24FF,
U+2500..U+33FF, U+E000..U+FFFF respectively.
@@ -2937,18 +2938,18 @@ different characters, as far as Emacs is concerned. For example, text
which includes Unicode characters from the Latin-2 locale cannot be
encoded by Emacs with ISO 8859-2 coding system.
-** The new coding system `mule-utf-8' has been added.
+** The new coding system 'mule-utf-8' has been added.
It provides limited support for decoding/encoding UTF-8 text. For
details, please see the documentation string of this coding system.
-** The new character sets `japanese-jisx0213-1' and
-`japanese-jisx0213-2' have been introduced for the new Japanese
+** The new character sets 'japanese-jisx0213-1' and
+'japanese-jisx0213-2' have been introduced for the new Japanese
standard JIS X 0213 Plane 1 and Plane 2.
-** The new character sets `latin-iso8859-14' and `latin-iso8859-15'
+** The new character sets 'latin-iso8859-14' and 'latin-iso8859-15'
have been introduced.
-** The new character sets `eight-bit-control' and `eight-bit-graphic'
+** The new character sets 'eight-bit-control' and 'eight-bit-graphic'
have been introduced for 8-bit characters in the ranges 0x80..0x9F and
0xA0..0xFF respectively. Note that the multibyte representation of
eight-bit-control is never exposed; this leads to an exception in the
@@ -2958,24 +2959,24 @@ eight-bit-graphic characters in a multibyte buffer, the search string
must be multibyte, otherwise such characters will be converted to
their multibyte equivalent.
-** If the APPEND argument of `write-region' is an integer, it seeks to
+** If the APPEND argument of 'write-region' is an integer, it seeks to
that offset in the file before writing.
-** The function `add-minor-mode' has been added for convenience and
+** The function 'add-minor-mode' has been added for convenience and
compatibility with XEmacs (and is used internally by define-minor-mode).
-** The function `shell-command' now sets the default directory of the
+** The function 'shell-command' now sets the default directory of the
`*Shell Command Output*' buffer to the default directory of the buffer
from which the command was issued.
-** The functions `query-replace', `query-replace-regexp',
-`query-replace-regexp-eval' `map-query-replace-regexp',
-`replace-string', `replace-regexp', and `perform-replace' take two
+** The functions 'query-replace', 'query-replace-regexp',
+'query-replace-regexp-eval' 'map-query-replace-regexp',
+'replace-string', 'replace-regexp', and 'perform-replace' take two
additional optional arguments START and END that specify the region to
operate on.
-** The new function `count-screen-lines' is a more flexible alternative
-to `window-buffer-height'.
+** The new function 'count-screen-lines' is a more flexible alternative
+to 'window-buffer-height'.
- Function: count-screen-lines &optional BEG END COUNT-FINAL-NEWLINE WINDOW
@@ -2983,7 +2984,7 @@ Return the number of screen lines in the region between BEG and END.
The number of screen lines may be different from the number of actual
lines, due to line breaking, display table, etc.
-Optional arguments BEG and END default to `point-min' and `point-max'
+Optional arguments BEG and END default to 'point-min' and 'point-max'
respectively.
If region ends with a newline, ignore it unless optional third argument
@@ -2993,45 +2994,45 @@ The optional fourth argument WINDOW specifies the window used for
obtaining parameters such as width, horizontal scrolling, and so
on. The default is to use the selected window's parameters.
-Like `vertical-motion', `count-screen-lines' always uses the current
+Like 'vertical-motion', 'count-screen-lines' always uses the current
buffer, regardless of which buffer is displayed in WINDOW. This makes
-possible to use `count-screen-lines' in any buffer, whether or not it
+possible to use 'count-screen-lines' in any buffer, whether or not it
is currently displayed in some window.
-** The new function `mapc' is like `mapcar' but doesn't collect the
+** The new function 'mapc' is like 'mapcar' but doesn't collect the
argument function's results.
-** The functions base64-decode-region and base64-decode-string now
+** The functions 'base64-decode-region' and 'base64-decode-string' now
signal an error instead of returning nil if decoding fails. Also,
-`base64-decode-string' now always returns a unibyte string (in Emacs
+'base64-decode-string' now always returns a unibyte string (in Emacs
20, it returned a multibyte string when the result was a valid multibyte
sequence).
-** The function sendmail-user-agent-compose now recognizes a `body'
+** The function 'sendmail-user-agent-compose' now recognizes a 'body'
header in the list of headers passed to it.
-** The new function member-ignore-case works like `member', but
+** The new function 'member-ignore-case' works like 'member', but
ignores differences in case and text representation.
-** The buffer-local variable cursor-type can be used to specify the
+** The buffer-local variable 'cursor-type' can be used to specify the
cursor to use in windows displaying a buffer. Values are interpreted
as follows:
t use the cursor specified for the frame (default)
nil don't display a cursor
- `bar' display a bar cursor with default width
+ 'bar' display a bar cursor with default width
(bar . WIDTH) display a bar cursor with width WIDTH
others display a box cursor.
-** The variable open-paren-in-column-0-is-defun-start controls whether
+** The variable 'open-paren-in-column-0-is-defun-start' controls whether
an open parenthesis in column 0 is considered to be the start of a
defun. If set, the default, it is considered a defun start. If not
set, an open parenthesis in column 0 has no special meaning.
-** The new function `string-to-syntax' can be used to translate syntax
-specifications in string form as accepted by `modify-syntax-entry' to
-the cons-cell form that is used for the values of the `syntax-table'
-text property, and in `font-lock-syntactic-keywords'.
+** The new function 'string-to-syntax' can be used to translate syntax
+specifications in string form as accepted by 'modify-syntax-entry' to
+the cons-cell form that is used for the values of the 'syntax-table'
+text property, and in 'font-lock-syntactic-keywords'.
Example:
@@ -3066,22 +3067,22 @@ INTEGER optionally contains a sign.
#25rah
=> 267
-** The function `documentation-property' now evaluates the value of
+** The function 'documentation-property' now evaluates the value of
the given property to obtain a string if it doesn't refer to etc/DOC
and isn't a string.
-** If called for a symbol, the function `documentation' now looks for
-a `function-documentation' property of that symbol. If it has a non-nil
+** If called for a symbol, the function 'documentation' now looks for
+a 'function-documentation' property of that symbol. If it has a non-nil
value, the documentation is taken from that value. If the value is
not a string, it is evaluated to obtain a string.
-** The last argument of `define-key-after' defaults to t for convenience.
+** The last argument of 'define-key-after' defaults to t for convenience.
-** The new function `replace-regexp-in-string' replaces all matches
+** The new function 'replace-regexp-in-string' replaces all matches
for a regexp in a string.
-** `mouse-position' now runs the abnormal hook
-`mouse-position-function'.
+** 'mouse-position' now runs the abnormal hook
+'mouse-position-function'.
** The function string-to-number now returns a float for numbers
that don't fit into a Lisp integer.
@@ -3089,37 +3090,37 @@ that don't fit into a Lisp integer.
** The variable keyword-symbols-constants-flag has been removed.
Keywords are now always considered constants.
-** The new function `delete-and-extract-region' deletes text and
+** The new function 'delete-and-extract-region' deletes text and
returns it.
-** The function `clear-this-command-keys' now also clears the vector
-returned by function `recent-keys'.
+** The function 'clear-this-command-keys' now also clears the vector
+returned by function 'recent-keys'.
-** Variables `beginning-of-defun-function' and `end-of-defun-function'
+** Variables 'beginning-of-defun-function' and 'end-of-defun-function'
can be used to define handlers for the functions that find defuns.
Major modes can define these locally instead of rebinding C-M-a
etc. if the normal conventions for defuns are not appropriate for the
mode.
** easy-mmode-define-minor-mode now takes an additional BODY argument
-and is renamed `define-minor-mode'.
+and is renamed 'define-minor-mode'.
** If an abbrev has a hook function which is a symbol, and that symbol
-has a non-nil `no-self-insert' property, the return value of the hook
+has a non-nil 'no-self-insert' property, the return value of the hook
function specifies whether an expansion has been done or not. If it
-returns nil, abbrev-expand also returns nil, meaning "no expansion has
+returns nil, 'abbrev-expand' also returns nil, meaning "no expansion has
been performed."
When abbrev expansion is done by typing a self-inserting character,
-and the abbrev has a hook with the `no-self-insert' property, and the
+and the abbrev has a hook with the 'no-self-insert' property, and the
hook function returns non-nil meaning expansion has been done,
then the self-inserting character is not inserted.
-** The function `intern-soft' now accepts a symbol as first argument.
+** The function 'intern-soft' now accepts a symbol as first argument.
In this case, that exact symbol is looked up in the specified obarray,
and the function's value is nil if it is not found.
-** The new macro `with-syntax-table' can be used to evaluate forms
+** The new macro 'with-syntax-table' can be used to evaluate forms
with the syntax table of the current buffer temporarily set to a
specified table.
@@ -3134,44 +3135,44 @@ what BODY returns.
Perl's shy-groups \(?:...\) and non-greedy *? +? and ?? operators.
Also back-references like \2 are now considered as an error if the
corresponding subgroup does not exist (or is not closed yet).
-Previously it would have been silently turned into `2' (ignoring the `\').
+Previously it would have been silently turned into '2' (ignoring the `\').
-** The optional argument BUFFER of function file-local-copy has been
+** The optional argument BUFFER of function 'file-local-copy' has been
removed since it wasn't used by anything.
-** The file name argument of function `file-locked-p' is now required
+** The file name argument of function 'file-locked-p' is now required
instead of being optional.
-** The new built-in error `text-read-only' is signaled when trying to
+** The new built-in error 'text-read-only' is signaled when trying to
modify read-only text.
** New functions and variables for locales.
-The new variable `locale-coding-system' specifies how to encode and
+The new variable 'locale-coding-system' specifies how to encode and
decode strings passed to low-level message functions like strerror and
time functions like strftime. The new variables
-`system-messages-locale' and `system-time-locale' give the system
+'system-messages-locale' and 'system-time-locale' give the system
locales to be used when invoking these two types of functions.
-The new function `set-locale-environment' sets the language
+The new function 'set-locale-environment' sets the language
environment, preferred coding system, and locale coding system from
the system locale as specified by the LC_ALL, LC_CTYPE, and LANG
environment variables. Normally, it is invoked during startup and need
not be invoked thereafter. It uses the new variables
-`locale-language-names', `locale-charset-language-names', and
-`locale-preferred-coding-systems' to make its decisions.
+'locale-language-names', 'locale-charset-language-names', and
+'locale-preferred-coding-systems' to make its decisions.
** syntax tables now understand nested comments.
-To declare a comment syntax as allowing nesting, just add an `n'
+To declare a comment syntax as allowing nesting, just add an 'n'
modifier to either of the characters of the comment end and the comment
start sequences.
-** The function `pixmap-spec-p' has been renamed `bitmap-spec-p'
-because `bitmap' is more in line with the usual X terminology.
+** The function 'pixmap-spec-p' has been renamed 'bitmap-spec-p'
+because 'bitmap' is more in line with the usual X terminology.
-** New function `propertize'
+** New function 'propertize'
-The new function `propertize' can be used to conveniently construct
+The new function 'propertize' can be used to conveniently construct
strings with text properties.
- Function: propertize STRING &rest PROPERTIES
@@ -3183,7 +3184,7 @@ specified value of that property. Example:
(propertize "foo" 'face 'bold 'read-only t)
-** push and pop macros.
+** 'push' and 'pop' macros.
Simple versions of the push and pop macros of Common Lisp
are now defined in Emacs Lisp. These macros allow only symbols
@@ -3193,7 +3194,7 @@ as the place that holds the list to be changed.
(pop LISTNAME) return first elt of LISTNAME, and remove it
(thus altering the value of LISTNAME).
-** New dolist and dotimes macros.
+** New 'dolist' and 'dotimes' macros.
Simple versions of the dolist and dotimes macros of Common Lisp
are now defined in Emacs Lisp.
@@ -3248,9 +3249,9 @@ are optional. The following arguments are defined:
:test TEST
-TEST must be a symbol specifying how to compare keys. Default is `eql'.
-Predefined are `eq', `eql' and `equal'. If TEST is not predefined,
-it must have been defined with `define-hash-table-test'.
+TEST must be a symbol specifying how to compare keys. Default is 'eql'.
+Predefined are 'eq', 'eql' and 'equal'. If TEST is not predefined,
+it must have been defined with 'define-hash-table-test'.
:size SIZE
@@ -3273,82 +3274,82 @@ hash table. It is resized when the ratio of (number of entries) /
:weakness WEAK
-WEAK must be either nil, one of the symbols `key, `value',
-`key-or-value', `key-and-value', or t, meaning the same as
-`key-and-value'. Entries are removed from weak tables during garbage
+WEAK must be either nil, one of the symbols `key, 'value',
+'key-or-value', 'key-and-value', or t, meaning the same as
+'key-and-value'. Entries are removed from weak tables during garbage
collection if their key and/or value are not referenced elsewhere
outside of the hash table. Default are non-weak hash tables.
-- Function: makehash &optional TEST
+- Function: 'makehash' &optional TEST
Similar to make-hash-table, but only TEST can be specified.
-- Function: hash-table-p TABLE
+- Function: 'hash-table-p' TABLE
Returns non-nil if TABLE is a hash table object.
-- Function: copy-hash-table TABLE
+- Function: 'copy-hash-table' TABLE
Returns a copy of TABLE. Only the table itself is copied, keys and
values are shared.
-- Function: hash-table-count TABLE
+- Function: 'hash-table-count' TABLE
Returns the number of entries in TABLE.
-- Function: hash-table-rehash-size TABLE
+- Function: 'hash-table-rehash-size' TABLE
Returns the rehash size of TABLE.
-- Function: hash-table-rehash-threshold TABLE
+- Function: 'hash-table-rehash-threshold' TABLE
Returns the rehash threshold of TABLE.
-- Function: hash-table-rehash-size TABLE
+- Function: 'hash-table-rehash-size' TABLE
Returns the size of TABLE.
-- Function: hash-table-test TABLE
+- Function: 'hash-table-test' TABLE
Returns the test TABLE uses to compare keys.
-- Function: hash-table-weakness TABLE
+- Function: 'hash-table-weakness' TABLE
Returns the weakness specified for TABLE.
-- Function: clrhash TABLE
+- Function: 'clrhash' TABLE
Clear TABLE.
-- Function: gethash KEY TABLE &optional DEFAULT
+- Function: 'gethash' KEY TABLE &optional DEFAULT
Look up KEY in TABLE and return its associated VALUE or DEFAULT if
not found.
-- Function: puthash KEY VALUE TABLE
+- Function: 'puthash' KEY VALUE TABLE
Associate KEY with VALUE in TABLE. If KEY is already associated with
another value, replace the old value with VALUE.
-- Function: remhash KEY TABLE
+- Function: 'remhash' KEY TABLE
Remove KEY from TABLE if it is there.
-- Function: maphash FUNCTION TABLE
+- Function: 'maphash' FUNCTION TABLE
Call FUNCTION for all elements in TABLE. FUNCTION must take two
arguments KEY and VALUE.
-- Function: sxhash OBJ
+- Function: 'sxhash' OBJ
Return a hash code for Lisp object OBJ.
-- Function: define-hash-table-test NAME TEST-FN HASH-FN
+- Function: 'define-hash-table-test' NAME TEST-FN HASH-FN
Define a new hash table test named NAME. If NAME is specified as
-a test in `make-hash-table', the table created will use TEST-FN for
+a test in 'make-hash-table', the table created will use TEST-FN for
comparing keys, and HASH-FN to compute hash codes for keys. Test
-and hash function are stored as symbol property `hash-table-test'
+and hash function are stored as symbol property 'hash-table-test'
of NAME with a value of (TEST-FN HASH-FN).
TEST-FN must take two arguments and return non-nil if they are the same.
@@ -3379,10 +3380,10 @@ a cons cell which is its own cdr.
** The Lisp printer handles circular structure.
-If you bind print-circle to a non-nil value, the Lisp printer outputs
+If you bind 'print-circle' to a non-nil value, the Lisp printer outputs
#N= and #N# constructs to represent circular and shared structure.
-** If the second argument to `move-to-column' is anything but nil or
+** If the second argument to 'move-to-column' is anything but nil or
t, that means replace a tab with spaces if necessary to reach the
specified column, but do not add spaces at the end of the line if it
is too short to reach that column.
@@ -3393,50 +3394,50 @@ after each match to get the replacement text. FUNCTION is called with
two arguments: DATA, and the number of replacements already made.
If the FROM-STRING contains any upper-case letters,
-perform-replace also turns off `case-fold-search' temporarily
+perform-replace also turns off 'case-fold-search' temporarily
and inserts the replacement text without altering case in it.
-** The function buffer-size now accepts an optional argument
+** The function 'buffer-size' now accepts an optional argument
to specify which buffer to return the size of.
** The calendar motion commands now run the normal hook
-calendar-move-hook after moving point.
+'calendar-move-hook' after moving point.
-** The new variable small-temporary-file-directory specifies a
+** The new variable 'small-temporary-file-directory' specifies a
directory to use for creating temporary files that are likely to be
small. (Certain Emacs features use this directory.) If
small-temporary-file-directory is nil, they use
-temporary-file-directory instead.
+'temporary-file-directory' instead.
-** The variable `inhibit-modification-hooks', if non-nil, inhibits all
+** The variable 'inhibit-modification-hooks', if non-nil, inhibits all
the hooks that track changes in the buffer. This affects
-`before-change-functions' and `after-change-functions', as well as
+'before-change-functions' and 'after-change-functions', as well as
hooks attached to text properties and overlay properties.
-** assq-delete-all is a new function that deletes all the
-elements of an alist which have a car `eq' to a particular value.
+** 'assq-delete-all' is a new function that deletes all the
+elements of an alist which have a car 'eq' to a particular value.
-** make-temp-file provides a more reliable way to create a temporary file.
+** 'make-temp-file' provides a more reliable way to create a temporary file.
-make-temp-file is used like make-temp-name, except that it actually
+'make-temp-file' is used like 'make-temp-name', except that it actually
creates the file before it returns. This prevents a timing error,
ensuring that no other job can use the same name for a temporary file.
-** New exclusive-open feature in `write-region'
+** New exclusive-open feature in 'write-region'
The optional seventh arg is now called MUSTBENEW. If non-nil, it insists
on a check for an existing file with the same name. If MUSTBENEW
-is `excl', that means to get an error if the file already exists;
-never overwrite. If MUSTBENEW is neither nil nor `excl', that means
+is 'excl', that means to get an error if the file already exists;
+never overwrite. If MUSTBENEW is neither nil nor 'excl', that means
ask for confirmation before overwriting, but do go ahead and
overwrite the file if the user gives confirmation.
-If the MUSTBENEW argument in `write-region' is `excl',
-that means to use a special feature in the `open' system call
+If the MUSTBENEW argument in 'write-region' is 'excl',
+that means to use a special feature in the 'open' system call
to get an error if the file exists at that time.
-The error reported is `file-already-exists'.
+The error reported is 'file-already-exists'.
-** Function `format' now handles text properties.
+** Function 'format' now handles text properties.
Text properties of the format string are applied to the result string.
If the result string is longer than the format string, text properties
@@ -3446,7 +3447,7 @@ result string.
Text properties from string arguments are applied to the result
string where arguments appear in the result string.
-Example:
+Example, using 'put-text-property':
(let ((s1 "hello, %s")
(s2 "world"))
@@ -3454,11 +3455,11 @@ Example:
(put-text-property 0 (length s2) 'face 'italic s2)
(format s1 s2))
-results in a bold-face string with an italic `world' at the end.
+results in a bold-face string with an italic 'world' at the end.
** Messages can now be displayed with text properties.
-Text properties are handled as described above for function `format'.
+Text properties are handled as described above for function 'format'.
The following example displays a bold-face message with an italic
argument in it.
@@ -3474,13 +3475,13 @@ Emacs supports playing sound files on GNU/Linux and the free BSDs
(Voxware driver and native BSD driver, aka as Luigi's driver).
Currently supported file formats are RIFF-WAVE (*.wav) and Sun Audio
-(*.au). You must configure Emacs with the option `--with-sound=yes'
+(*.au). You must configure Emacs with the option '--with-sound=yes'
to enable sound support.
-Sound files can be played by calling (play-sound SOUND). SOUND is a
+Sound files can be played by calling 'play-sound'. The argument is a
list of the form `(sound PROPERTY...)'. The function is only defined
when sound support is present for the system on which Emacs runs. The
-functions runs `play-sound-functions' with one argument which is the
+functions runs 'play-sound-functions' with one argument which is the
sound to play, before playing the sound.
The following sound properties are supported:
@@ -3488,7 +3489,7 @@ The following sound properties are supported:
- `:file FILE'
FILE is a file name. If FILE isn't an absolute name, it will be
-searched relative to `data-directory'.
+searched relative to 'data-directory'.
- `:data DATA'
@@ -3508,37 +3509,38 @@ sound. The default device is system-dependent.
Other properties are ignored.
An alternative interface is called as
-(play-sound-file FILE &optional VOLUME DEVICE).
-** `multimedia' is a new Finder keyword and Custom group.
+ (play-sound-file FILE &optional VOLUME DEVICE)
+
+** 'multimedia' is a new Finder keyword and Custom group.
-** keywordp is a new predicate to test efficiently for an object being
+** 'keywordp' is a new predicate to test efficiently for an object being
a keyword symbol.
** Changes to garbage collection
-*** The function garbage-collect now additionally returns the number
+*** The function 'garbage-collect' now additionally returns the number
of live and free strings.
-*** There is a new variable `strings-consed' holding the number of
+*** There is a new variable 'strings-consed' holding the number of
strings that have been consed so far.
* Lisp-level Display features added after release 2.6 of the Emacs
Lisp Manual
-** The user-option `resize-mini-windows' controls how Emacs resizes
+** The user-option 'resize-mini-windows' controls how Emacs resizes
mini-windows.
-** The function `pos-visible-in-window-p' now has a third optional
+** The function 'pos-visible-in-window-p' now has a third optional
argument, PARTIALLY. If a character is only partially visible, nil is
returned, unless PARTIALLY is non-nil.
-** On window systems, `glyph-table' is no longer used.
+** On window systems, 'glyph-table' is no longer used.
-** Help strings in menu items are now used to provide `help-echo' text.
+** Help strings in menu items are now used to provide 'help-echo' text.
-** The function `image-size' can be used to determine the size of an
+** The function 'image-size' can be used to determine the size of an
image.
- Function: image-size SPEC &optional PIXELS FRAME
@@ -3551,7 +3553,7 @@ character units (fractions of the width/height of the frame's default
font). FRAME is the frame on which the image will be displayed.
FRAME nil or omitted means use the selected frame.
-** The function `image-mask-p' can be used to determine if an image
+** The function 'image-mask-p' can be used to determine if an image
has a mask bitmap.
- Function: image-mask-p SPEC &optional FRAME
@@ -3560,10 +3562,10 @@ Return t if image SPEC has a mask bitmap.
FRAME is the frame on which the image will be displayed. FRAME nil
or omitted means use the selected frame.
-** The function `find-image' can be used to find a usable image
+** The function 'find-image' can be used to find a usable image
satisfying one of a list of specifications.
-** The STRING argument of `put-image' and `insert-image' is now
+** The STRING argument of 'put-image' and 'insert-image' is now
optional.
** Image specifications may contain the property `:ascent center' (see
@@ -3601,13 +3603,13 @@ Each face can specify the following display attributes:
1. Font family or fontset alias name.
2. Relative proportionate width, aka character set width or set
- width (swidth), e.g. `semi-compressed'.
+ width (swidth), e.g. 'semi-compressed'.
3. Font height in 1/10pt
- 4. Font weight, e.g. `bold'.
+ 4. Font weight, e.g. 'bold'.
- 5. Font slant, e.g. `italic'.
+ 5. Font slant, e.g. 'italic'.
6. Foreground color.
@@ -3631,30 +3633,30 @@ Faces are frame-local by nature because Emacs allows to define the
same named face (face names are symbols) differently for different
frames. Each frame has an alist of face definitions for all named
faces. The value of a named face in such an alist is a Lisp vector
-with the symbol `face' in slot 0, and a slot for each of the face
+with the symbol 'face' in slot 0, and a slot for each of the face
attributes mentioned above.
-There is also a global face alist `face-new-frame-defaults'. Face
+There is also a global face alist 'face-new-frame-defaults'. Face
definitions from this list are used to initialize faces of newly
created frames.
A face doesn't have to specify all attributes. Those not specified
have a nil value. Faces specifying all attributes are called
-`fully-specified'.
+'fully-specified'.
*** Face merging.
The display style of a given character in the text is determined by
combining several faces. This process is called `face merging'. Any
aspect of the display style that isn't specified by overlays or text
-properties is taken from the `default' face. Since it is made sure
+properties is taken from the 'default' face. Since it is made sure
that the default face is always fully-specified, face merging always
results in a fully-specified face.
*** Face realization.
After all face attributes for a character have been determined by
-merging faces of that character, that face is `realized'. The
+merging faces of that character, that face is 'realized'. The
realization process maps face attributes to what is physically
available on the system where Emacs runs. The result is a `realized
face' in form of an internal structure which is stored in the face
@@ -3672,20 +3674,20 @@ the new font selection stage is better than what can be done with
statically defined font name patterns in fontsets.
In unibyte text, Emacs' charsets aren't applicable; function
-`char-charset' reports ASCII for all characters, including those >
+'char-charset' reports ASCII for all characters, including those >
0x7f. The X registry and encoding of fonts to use is determined from
-the variable `face-default-registry' in this case. The variable is
+the variable 'face-default-registry' in this case. The variable is
initialized at Emacs startup time from the font the user specified for
Emacs.
Currently all unibyte text, i.e. all buffers with
-`enable-multibyte-characters' nil are displayed with fonts of the same
-registry and encoding `face-default-registry'. This is consistent
+'enable-multibyte-characters' nil are displayed with fonts of the same
+registry and encoding 'face-default-registry'. This is consistent
with the fact that languages can also be set globally, only.
**** Clearing face caches.
-The Lisp function `clear-face-cache' can be called to clear face caches
+The Lisp function 'clear-face-cache' can be called to clear face caches
on all frames. If called with a non-nil argument, it will also unload
unused fonts.
@@ -3698,7 +3700,7 @@ for faces specifying a fontset, or a font family name.
If the face specifies a fontset name, that fontset determines a
pattern for fonts of the given charset. If the face specifies a font
family, a font pattern is constructed. Charset symbols have a
-property `x-charset-registry' for that purpose that maps a charset to
+property 'x-charset-registry' for that purpose that maps a charset to
an XLFD registry and encoding in the font pattern constructed.
Available fonts on the system on which Emacs runs are then matched
@@ -3709,24 +3711,24 @@ Font selection can be influenced by the user.
The user can specify the relative importance he gives the face
attributes width, height, weight, and slant by setting
-face-font-selection-order (faces.el) to a list of face attribute
+'face-font-selection-order' (faces.el) to a list of face attribute
names. The default is (:width :height :weight :slant), and means
that font selection first tries to find a good match for the font
width specified by a face, then---within fonts with that width---tries
to find a best match for the specified font height, etc.
-Setting `face-font-family-alternatives' allows the user to specify
+Setting 'face-font-family-alternatives' allows the user to specify
alternative font families to try if a family specified by a face
doesn't exist.
-Setting `face-font-registry-alternatives' allows the user to specify
+Setting 'face-font-registry-alternatives' allows the user to specify
all alternative font registry names to try for a face specifying a
registry.
Please note that the interpretations of the above two variables are
slightly different.
-Setting face-ignored-fonts allows the user to ignore specific fonts.
+Setting 'face-ignored-fonts' allows the user to ignore specific fonts.
**** Scalable fonts
@@ -3736,7 +3738,7 @@ since the use of too many or too big scalable fonts may crash XFree86
servers.
To enable scalable font use, set the variable
-`scalable-fonts-allowed'. A value of nil, the default, means never use
+'scalable-fonts-allowed'. A value of nil, the default, means never use
scalable fonts. A value of t means any scalable font may be used.
Otherwise, the value must be a list of regular expressions. A
scalable font may then be used if it matches a regular expression from
@@ -3744,11 +3746,11 @@ that list. Example:
(setq scalable-fonts-allowed '("muleindian-2$"))
-allows the use of scalable fonts with registry `muleindian-2'.
+allows the use of scalable fonts with registry 'muleindian-2'.
*** Functions and variables related to font selection.
-- Function: x-family-fonts &optional FAMILY FRAME
+- Function: 'x-family-fonts' &optional FAMILY FRAME
Return a list of available fonts of family FAMILY on FRAME. If FAMILY
is omitted or nil, list all families. Otherwise, FAMILY must be a
@@ -3765,14 +3767,14 @@ REGISTRY-AND-ENCODING is a string giving the registry and encoding of
the font. The result list is sorted according to the current setting
of the face font sort order.
-- Function: x-font-family-list
+- Function: 'x-font-family-list'
Return a list of available font families on FRAME. If FRAME is
omitted or nil, use the selected frame. Value is a list of conses
(FAMILY . FIXED-P) where FAMILY is a font family, and FIXED-P is
non-nil if fonts of that family are fixed-pitch.
-- Variable: font-list-limit
+- Variable: 'font-list-limit'
Limit for font matching. If an integer > 0, font matching functions
won't load more than that number of fonts when searching for a
@@ -3782,26 +3784,26 @@ matching font. The default is currently 100.
For the most part, the new face implementation is interface-compatible
with the old one. Old face attribute related functions are now
-implemented in terms of the new functions `set-face-attribute' and
-`face-attribute'.
+implemented in terms of the new functions 'set-face-attribute' and
+'face-attribute'.
Face attributes are identified by their names which are keyword
-symbols. All attributes can be set to `unspecified'.
+symbols. All attributes can be set to 'unspecified'.
The following attributes are recognized:
`:family'
-VALUE must be a string specifying the font family, e.g. ``courier'',
+VALUE must be a string specifying the font family, e.g. "courier",
or a fontset alias name. If a font family is specified, wild-cards `*'
and `?' are allowed.
`:width'
VALUE specifies the relative proportionate width of the font to use.
-It must be one of the symbols `ultra-condensed', `extra-condensed',
-`condensed', `semi-condensed', `normal', `semi-expanded', `expanded',
-`extra-expanded', or `ultra-expanded'.
+It must be one of the symbols 'ultra-condensed', 'extra-condensed',
+'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded',
+'extra-expanded', or 'ultra-expanded'.
`:height'
@@ -3813,14 +3815,14 @@ height (from the underlying face), and should return the new height.
`:weight'
VALUE specifies the weight of the font to use. It must be one of the
-symbols `ultra-bold', `extra-bold', `bold', `semi-bold', `normal',
-`semi-light', `light', `extra-light', `ultra-light'.
+symbols 'ultra-bold', 'extra-bold', 'bold', 'semi-bold', 'normal',
+'semi-light', 'light', 'extra-light', 'ultra-light'.
`:slant'
VALUE specifies the slant of the font to use. It must be one of the
-symbols `italic', `oblique', `normal', `reverse-italic', or
-`reverse-oblique'.
+symbols 'italic', 'oblique', 'normal', 'reverse-italic', or
+'reverse-oblique'.
`:foreground', `:background'
@@ -3861,8 +3863,8 @@ specified below. WIDTH specifies the width of the lines to draw; it
defaults to 1. COLOR is the name of the color to draw in, default is
the foreground color of the face for simple boxes, and the background
color of the face for 3D boxes. STYLE specifies whether a 3D box
-should be draw. If STYLE is `released-button', draw a box looking
-like a released 3D button. If STYLE is `pressed-button' draw a box
+should be draw. If STYLE is 'released-button', draw a box looking
+like a released 3D button. If STYLE is 'pressed-button' draw a box
that appears like a pressed button. If STYLE is nil, the default if
the property list doesn't contain a style specification, draw a 2D
box.
@@ -3875,7 +3877,7 @@ inverse video. VALUE must be one of t or nil.
`:stipple'
If VALUE is a string, it must be the name of a file of pixmap data.
-The directories listed in the `x-bitmap-file-path' variable are
+The directories listed in the 'x-bitmap-file-path' variable are
searched. Alternatively, VALUE may be a list of the form (WIDTH
HEIGHT DATA) where WIDTH and HEIGHT are the size in pixels, and DATA
is a string containing the raw bits of the bitmap. VALUE nil means
@@ -3893,10 +3895,10 @@ versions of Emacs.
For compatibility with Emacs 20, keywords `:bold' and `:italic' can
be used to specify that a bold or italic font should be used. VALUE
-must be t or nil in that case. A value of `unspecified' is not allowed."
+must be t or nil in that case. A value of 'unspecified' is not allowed."
-Please see also the documentation of `set-face-attribute' and
-`defface'.
+Please see also the documentation of 'set-face-attribute' and
+'defface'.
`:inherit'
@@ -3931,9 +3933,9 @@ from X resources:
:italic attributeItalic . Face.AttributeItalic
:font attributeFont Face.AttributeFont
-*** Text property `face'.
+*** Text property 'face'.
-The value of the `face' text property can now be a single face
+The value of the 'face' text property can now be a single face
specification or a list of such specifications. Each face
specification can be
@@ -3941,7 +3943,7 @@ specification can be
2. A property list of the form (KEYWORD VALUE ...) where each
KEYWORD is a face attribute name, and VALUE is an appropriate value
- for that attribute. Please see the doc string of `set-face-attribute'
+ for that attribute. Please see the doc string of 'set-face-attribute'
for face attribute names.
3. Conses of the form (FOREGROUND-COLOR . COLOR) or
@@ -3950,68 +3952,68 @@ specification can be
** Support functions for colors on text-only terminals.
-The function `tty-color-define' can be used to define colors for use
+The function 'tty-color-define' can be used to define colors for use
on TTY and MSDOS frames. It maps a color name to a color number on
the terminal. Emacs defines a couple of common color mappings by
default. You can get defined colors with a call to
-`defined-colors'. The function `tty-color-clear' can be
+'defined-colors'. The function 'tty-color-clear' can be
used to clear the mapping table.
** Unified support for colors independent of frame type.
-The new functions `defined-colors', `color-defined-p', `color-values',
-and `display-color-p' work for any type of frame. On frames whose
+The new functions 'defined-colors', 'color-defined-p', 'color-values',
+and 'display-color-p' work for any type of frame. On frames whose
type is neither x nor w32, these functions transparently map X-style
color specifications to the closest colors supported by the frame
display. Lisp programs should use these new functions instead of the
-old `x-defined-colors', `x-color-defined-p', `x-color-values', and
-`x-display-color-p'. (The old function names are still available for
+old 'x-defined-colors', 'x-color-defined-p', 'x-color-values', and
+'x-display-color-p'. (The old function names are still available for
compatibility; they are now aliases of the new names.) Lisp programs
should no more look at the value of the variable window-system to
modify their color-related behavior.
-The primitives `color-gray-p' and `color-supported-p' also work for
+The primitives 'color-gray-p' and 'color-supported-p' also work for
any frame type.
** Platform-independent functions to describe display capabilities.
-The new functions `display-mouse-p', `display-popup-menus-p',
-`display-graphic-p', `display-selections-p', `display-screens',
-`display-pixel-width', `display-pixel-height', `display-mm-width',
-`display-mm-height', `display-backing-store', `display-save-under',
-`display-planes', `display-color-cells', `display-visual-class', and
-`display-grayscale-p' describe the basic capabilities of a particular
+The new functions 'display-mouse-p', 'display-popup-menus-p',
+'display-graphic-p', 'display-selections-p', 'display-screens',
+'display-pixel-width', 'display-pixel-height', 'display-mm-width',
+'display-mm-height', 'display-backing-store', 'display-save-under',
+'display-planes', 'display-color-cells', 'display-visual-class', and
+'display-grayscale-p' describe the basic capabilities of a particular
display. Lisp programs should call these functions instead of testing
-the value of the variables `window-system' or `system-type', or calling
-platform-specific functions such as `x-display-pixel-width'.
+the value of the variables 'window-system' or 'system-type', or calling
+platform-specific functions such as 'x-display-pixel-width'.
-The new function `display-images-p' returns non-nil if a particular
+The new function 'display-images-p' returns non-nil if a particular
display can display image files.
** The minibuffer prompt is now actually inserted in the minibuffer.
This makes it possible to scroll through the prompt, if you want to.
To disallow this completely (like previous versions of emacs), customize
-the variable `minibuffer-prompt-properties', and turn on the
-`Inviolable' option.
+the variable 'minibuffer-prompt-properties', and turn on the
+'Inviolable' option.
-The function `minibuffer-prompt-end' returns the current position of the
+The function 'minibuffer-prompt-end' returns the current position of the
end of the minibuffer prompt, if the minibuffer is current.
Otherwise, it returns `(point-min)'.
-** New `field' abstraction in buffers.
+** New 'field' abstraction in buffers.
-There is now code to support an abstraction called `fields' in emacs
-buffers. A field is a contiguous region of text with the same `field'
+There is now code to support an abstraction called 'fields' in emacs
+buffers. A field is a contiguous region of text with the same 'field'
property (which can be a text property or an overlay).
-Many emacs functions, such as forward-word, forward-sentence,
-forward-paragraph, beginning-of-line, etc., stop moving when they come
+Many Emacs functions, such as 'forward-word', 'forward-sentence',
+'forward-paragraph', 'beginning-of-line', etc., stop moving when they come
to the boundary between fields; beginning-of-line and end-of-line will
not let the point move past the field boundary, but other movement
commands continue into the next field if repeated. Stopping at field
boundaries can be suppressed programmatically by binding
-`inhibit-field-text-motion' to a non-nil value around calls to these
+'inhibit-field-text-motion' to a non-nil value around calls to these
functions.
Now that the minibuffer prompt is inserted into the minibuffer, it is in
@@ -4020,22 +4022,22 @@ editing commands treat the user's text separately from the prompt.
The following functions are defined for operating on fields:
-- Function: constrain-to-field NEW-POS OLD-POS &optional ESCAPE-FROM-EDGE ONLY-IN-LINE INHIBIT-CAPTURE-PROPERTY
+- Function: 'constrain-to-field' NEW-POS OLD-POS &optional ESCAPE-FROM-EDGE ONLY-IN-LINE INHIBIT-CAPTURE-PROPERTY
Return the position closest to NEW-POS that is in the same field as OLD-POS.
-A field is a region of text with the same `field' property.
+A field is a region of text with the same 'field' property.
If NEW-POS is nil, then the current point is used instead, and set to the
constrained position if that is different.
If OLD-POS is at the boundary of two fields, then the allowable
positions for NEW-POS depends on the value of the optional argument
ESCAPE-FROM-EDGE: If ESCAPE-FROM-EDGE is nil, then NEW-POS is
-constrained to the field that has the same `field' char-property
+constrained to the field that has the same 'field' char-property
as any new characters inserted at OLD-POS, whereas if ESCAPE-FROM-EDGE
is non-nil, NEW-POS is constrained to the union of the two adjacent
fields. Additionally, if two fields are separated by another field with
-the special value `boundary', then any point within this special field is
+the special value 'boundary', then any point within this special field is
also considered to be `on the boundary'.
If the optional argument ONLY-IN-LINE is non-nil and constraining
@@ -4047,47 +4049,47 @@ only in the case where they can still move to the right line.
If the optional argument INHIBIT-CAPTURE-PROPERTY is non-nil, and OLD-POS has
a non-nil property of that name, then any field boundaries are ignored.
-Field boundaries are not noticed if `inhibit-field-text-motion' is non-nil.
+Field boundaries are not noticed if 'inhibit-field-text-motion' is non-nil.
-- Function: delete-field &optional POS
+- Function: 'delete-field' &optional POS
Delete the field surrounding POS.
-A field is a region of text with the same `field' property.
+A field is a region of text with the same 'field' property.
If POS is nil, the value of point is used for POS.
-- Function: field-beginning &optional POS ESCAPE-FROM-EDGE
+- Function: 'field-beginning' &optional POS ESCAPE-FROM-EDGE
Return the beginning of the field surrounding POS.
-A field is a region of text with the same `field' property.
+A field is a region of text with the same 'field' property.
If POS is nil, the value of point is used for POS.
If ESCAPE-FROM-EDGE is non-nil and POS is at the beginning of its
field, then the beginning of the *previous* field is returned.
-- Function: field-end &optional POS ESCAPE-FROM-EDGE
+- Function: 'field-end' &optional POS ESCAPE-FROM-EDGE
Return the end of the field surrounding POS.
-A field is a region of text with the same `field' property.
+A field is a region of text with the same 'field' property.
If POS is nil, the value of point is used for POS.
If ESCAPE-FROM-EDGE is non-nil and POS is at the end of its field,
then the end of the *following* field is returned.
-- Function: field-string &optional POS
+- Function: 'field-string' &optional POS
Return the contents of the field surrounding POS as a string.
-A field is a region of text with the same `field' property.
+A field is a region of text with the same 'field' property.
If POS is nil, the value of point is used for POS.
-- Function: field-string-no-properties &optional POS
+- Function: 'field-string-no-properties' &optional POS
Return the contents of the field around POS, without text-properties.
-A field is a region of text with the same `field' property.
+A field is a region of text with the same 'field' property.
If POS is nil, the value of point is used for POS.
** Image support.
Emacs can now display images. Images are inserted into text by giving
-strings or buffer text a `display' text property containing one of
-(AREA IMAGE) or IMAGE. The display of the `display' property value
+strings or buffer text a 'display' text property containing one of
+(AREA IMAGE) or IMAGE. The display of the 'display' property value
replaces the display of the characters having that property.
If the property value has the form (AREA IMAGE), AREA must be one of
@@ -4103,21 +4105,21 @@ IMAGE is an image specification.
Image specifications are lists of the form `(image PROPS)' where PROPS
is a property list whose keys are keyword symbols. Each
specifications must contain a property `:type TYPE' with TYPE being a
-symbol specifying the image type, e.g. `xbm'. Properties not
+symbol specifying the image type, e.g. 'xbm'. Properties not
described below are ignored.
The following is a list of properties all image types share.
`:ascent ASCENT'
-ASCENT must be a number in the range 0..100, or the symbol `center'.
+ASCENT must be a number in the range 0..100, or the symbol 'center'.
If it is a number, it specifies the percentage of the image's height
to use for its ascent.
If not specified, ASCENT defaults to the value 50 which means that the
image will be centered with the base line of the row it appears in.
-If ASCENT is `center' the image is vertically centered around a
+If ASCENT is 'center' the image is vertically centered around a
centerline which is the vertical center of text drawn at the position
of the image, in the manner specified by the text properties and
overlays that apply to the image.
@@ -4137,7 +4139,7 @@ around an image.
Apply an image algorithm to the image before displaying it.
-ALGO `laplace' or `emboss' means apply a Laplace or ``emboss''
+ALGO 'laplace' or 'emboss' means apply a Laplace or ``emboss''
edge-detection algorithm to the image.
ALGO `(edge-detection :matrix MATRIX :color-adjust ADJUST)' means
@@ -4171,12 +4173,12 @@ Emboss edge-detection uses a matrix of
-1 0 1
0 1 -2)
-ALGO `disabled' means transform the image so that it looks
+ALGO 'disabled' means transform the image so that it looks
``disabled''.
`:mask MASK'
-If MASK is `heuristic' or `(heuristic BG)', build a clipping mask for
+If MASK is 'heuristic' or `(heuristic BG)', build a clipping mask for
the image, so that the background of a frame is visible behind the
image. If BG is not specified, or if BG is t, determine the
background color of the image by looking at the 4 corners of the
@@ -4192,20 +4194,20 @@ in some formats include a mask which can be removed by specifying
`:file FILE'
Load image from FILE. If FILE is not absolute after expanding it,
-search for the image in `data-directory'. Some image types support
+search for the image in 'data-directory'. Some image types support
building images from data. When this is done, no `:file' property
may be present in the image specification.
`:data DATA'
Get image data from DATA. (As of this writing, this is not yet
-supported for image type `postscript'). Either :file or :data may be
+supported for image type 'postscript'). Either :file or :data may be
present in an image specification, but not both. All image types
support strings as DATA, some types allow additional types of DATA.
*** Supported image types
-**** XBM, image type `xbm'.
+**** XBM, image type 'xbm'.
XBM images don't require an external library. Additional image
properties supported are:
@@ -4248,12 +4250,12 @@ DATA must be either
height may be specified in this case because these are defined
in the file.
-**** XPM, image type `xpm'
+**** XPM, image type 'xpm'
-XPM images require the external library `libXpm', package
+XPM images require the external library 'libXpm', package
`xpm-3.4k.tar.gz', version 3.4k or later. Make sure the library is
found when Emacs is configured by supplying appropriate paths via
-`--x-includes' and `--x-libraries'.
+'--x-includes' and '--x-libraries'.
Additional image properties supported are:
@@ -4269,7 +4271,7 @@ add a `:data' property instead of a `:file' property.
The XPM library uses libz in its implementation so that it is able
to display compressed images.
-**** PBM, image type `pbm'
+**** PBM, image type 'pbm'
PBM images don't require an external library. Color, gray-scale and
mono images are supported. Additional image properties supported for
@@ -4285,21 +4287,21 @@ meaning to use the default. Default is the frame's foreground color.
BG must be a string specifying the image background color, or nil
meaning to use the default. Default is the frame's background color.
-**** JPEG, image type `jpeg'
+**** JPEG, image type 'jpeg'
-Support for JPEG images requires the external library `libjpeg',
+Support for JPEG images requires the external library 'libjpeg',
package `jpegsrc.v6a.tar.gz', or later. There are no additional image
properties defined.
-**** TIFF, image type `tiff'
+**** TIFF, image type 'tiff'
-Support for TIFF images requires the external library `libtiff',
+Support for TIFF images requires the external library 'libtiff',
package `tiff-v3.4-tar.gz', or later. There are no additional image
properties defined.
-**** GIF, image type `gif'
+**** GIF, image type 'gif'
-Support for GIF images requires the external library `libungif', package
+Support for GIF images requires the external library 'libungif', package
`libungif-4.1.0', or later.
Additional image properties supported are:
@@ -4315,28 +4317,27 @@ For example, the following function displays a multi-image GIF file
at point-min in the current buffer, switching between sub-images
every 0.1 seconds.
-(defun show-anim (file max)
- "Display multi-image GIF file FILE which contains MAX subimages."
- (display-anim (current-buffer) file 0 max t))
+ (defun show-anim (file max)
+ "Display multi-image GIF file FILE which contains MAX subimages."
+ (display-anim (current-buffer) file 0 max t))
-(defun display-anim (buffer file idx max first-time)
- (when (= idx max)
- (setq idx 0))
- (let ((img (create-image file nil nil :index idx)))
- (save-excursion
- (set-buffer buffer)
- (goto-char (point-min))
- (unless first-time (delete-char 1))
- (insert-image img "x"))
- (run-with-timer 0.1 nil 'display-anim buffer file (1+ idx) max nil)))
+ (defun display-anim (buffer file idx max first-time)
+ (when (= idx max)
+ (setq idx 0))
+ (let ((img (create-image file nil nil :index idx)))
+ (with-current-buffer buffer
+ (goto-char (point-min))
+ (unless first-time (delete-char 1))
+ (insert-image img "x"))
+ (run-with-timer 0.1 nil 'display-anim buffer file (1+ idx) max nil)))
-**** PNG, image type `png'
+**** PNG, image type 'png'
-Support for PNG images requires the external library `libpng',
+Support for PNG images requires the external library 'libpng',
package `libpng-1.0.2.tar.gz', or later. There are no additional image
properties defined.
-**** Ghostscript, image type `postscript'.
+**** Ghostscript, image type 'postscript'.
Additional image properties supported are:
@@ -4353,7 +4354,7 @@ must be an integer. This is a required property.
`:bounding-box BOX'
BOX must be a list or vector of 4 integers giving the bounding box of
-the PS image, analogous to the `BoundingBox' comment found in PS
+the PS image, analogous to the 'BoundingBox' comment found in PS
files. This is an required property.
Part of the Ghostscript interface is implemented in Lisp. See
@@ -4361,22 +4362,22 @@ lisp/gs.el.
*** Lisp interface.
-The variable `image-types' contains a list of those image types
+The variable 'image-types' contains a list of those image types
which are supported in the current configuration.
Images are stored in an image cache and removed from the cache when
-they haven't been displayed for `image-cache-eviction-delay seconds.
-The function `clear-image-cache' can be used to clear the image cache
-manually. Images in the cache are compared with `equal', i.e. all
-images with `equal' specifications share the same image.
+they haven't been displayed for 'image-cache-eviction-delay' seconds.
+The function 'clear-image-cache' can be used to clear the image cache
+manually. Images in the cache are compared with 'equal', i.e. all
+images with 'equal' specifications share the same image.
*** Simplified image API, image.el
The new Lisp package image.el contains functions that simplify image
-creation and putting images into text. The function `create-image'
-can be used to create images. The macro `defimage' can be used to
+creation and putting images into text. The function 'create-image'
+can be used to create images. The macro 'defimage' can be used to
define an image based on available image types. The functions
-`put-image' and `insert-image' can be used to insert an image into a
+'put-image' and 'insert-image' can be used to insert an image into a
buffer.
** Display margins.
@@ -4385,16 +4386,16 @@ Windows can now have margins which are used for special text
and images.
To give a window margins, either set the buffer-local variables
-`left-margin-width' and `right-margin-width', or call
-`set-window-margins'. The function `window-margins' can be used to
-obtain the current settings. To make `left-margin-width' and
-`right-margin-width' take effect, you must set them before displaying
-the buffer in a window, or use `set-window-buffer' to force an update
+'left-margin-width' and 'right-margin-width', or call
+'set-window-margins'. The function 'window-margins' can be used to
+obtain the current settings. To make 'left-margin-width' and
+'right-margin-width' take effect, you must set them before displaying
+the buffer in a window, or use 'set-window-buffer' to force an update
of the display margins.
-You can put text in margins by giving it a `display' text property
+You can put text in margins by giving it a 'display' text property
containing a pair of the form `(LOCATION . VALUE)', where LOCATION is
-one of `left-margin' or `right-margin' or nil. VALUE can be either a
+one of 'left-margin' or 'right-margin' or nil. VALUE can be either a
string, an image specification or a stretch specification (see later
in this file).
@@ -4402,24 +4403,24 @@ in this file).
Emacs displays short help messages in the echo area, when the mouse
moves over a tool-bar item or a piece of text that has a text property
-`help-echo'. This feature also applies to strings in the mode line
-that have a `help-echo' property.
+'help-echo'. This feature also applies to strings in the mode line
+that have a 'help-echo' property.
-If the value of the `help-echo' property is a function, that function
+If the value of the 'help-echo' property is a function, that function
is called with three arguments WINDOW, OBJECT and POSITION. WINDOW is
the window in which the help was found.
If OBJECT is a buffer, POS is the position in the buffer where the
-`help-echo' text property was found.
+'help-echo' text property was found.
-If OBJECT is an overlay, that overlay has a `help-echo' property, and
+If OBJECT is an overlay, that overlay has a 'help-echo' property, and
POS is the position in the overlay's buffer under the mouse.
If OBJECT is a string (an overlay string or a string displayed with
-the `display' property), POS is the position in that string under the
+the 'display' property), POS is the position in that string under the
mouse.
-If the value of the `help-echo' property is neither a function nor a
+If the value of the 'help-echo' property is neither a function nor a
string, it is evaluated to obtain a help string.
For tool-bar and menu-bar items, their key definition is used to
@@ -4428,7 +4429,7 @@ property `:help FORM', FORM is evaluated to determine the help string.
For tool-bar items without a help form, the caption of the item is
used as help string.
-The hook `show-help-function' can be set to a function that displays
+The hook 'show-help-function' can be set to a function that displays
the help string differently. For example, enabling a tooltip window
causes the help display to appear there instead of in the echo area.
@@ -4437,9 +4438,9 @@ causes the help display to appear there instead of in the echo area.
The display of text in windows can be scrolled smoothly in pixels.
This is useful, for example, for making parts of large images visible.
-The function `window-vscroll' returns the current value of vertical
+The function 'window-vscroll' returns the current value of vertical
scrolling, a non-negative fraction of the canonical character height.
-The function `set-window-vscroll' can be used to set the vertical
+The function 'set-window-vscroll' can be used to set the vertical
scrolling value. Here is an example of how these function might be
used.
@@ -4454,32 +4455,32 @@ used.
(set-window-vscroll (selected-window)
(- (window-vscroll) 0.5)))))
-** New hook `fontification-functions'.
+** New hook 'fontification-functions'.
-Functions from `fontification-functions' are called from redisplay
+Functions from 'fontification-functions' are called from redisplay
when it encounters a region of text that is not yet fontified. This
variable automatically becomes buffer-local when set. Each function
is called with one argument, POS.
At least one of the hook functions should fontify one or more
characters starting at POS in the current buffer. It should mark them
-as fontified by giving them a non-nil value of the `fontified' text
+as fontified by giving them a non-nil value of the 'fontified' text
property. It may be reasonable for these functions to check for the
-`fontified' property and not put it back on, but they do not have to.
+'fontified' property and not put it back on, but they do not have to.
** Tool bar support.
Emacs supports a tool bar at the top of a frame under X. The frame
-parameter `tool-bar-lines' (X resource "toolBar", class "ToolBar")
+parameter 'tool-bar-lines' (X resource "toolBar", class "ToolBar")
controls how may lines to reserve for the tool bar. A zero value
suppresses the tool bar. If the value is non-zero and
-`auto-resize-tool-bars' is non-nil the tool bar's size will be changed
+'auto-resize-tool-bars' is non-nil the tool bar's size will be changed
automatically so that all tool bar items are visible.
*** Tool bar item definitions
-Tool bar items are defined using `define-key' with a prefix-key
-`tool-bar'. For example `(define-key global-map [tool-bar item1] ITEM)'
+Tool bar items are defined using 'define-key' with a prefix-key
+'tool-bar'. For example `(define-key global-map [tool-bar item1] ITEM)'
where ITEM is a list `(menu-item CAPTION BINDING PROPS...)'.
CAPTION is the caption of the item, If it's not a string, it is
@@ -4533,31 +4534,31 @@ algorithm is used on that image to draw the image in disabled state.
Gives a help string to display for the tool bar item. This help
is displayed when the mouse is moved over the item.
-The function `toolbar-add-item' is a convenience function for adding
-toolbar items generally, and `tool-bar-add-item-from-menu' can be used
+The function 'toolbar-add-item' is a convenience function for adding
+toolbar items generally, and 'tool-bar-add-item-from-menu' can be used
to define a toolbar item with a binding copied from an item on the
menu bar.
The default bindings use a menu-item :filter to derive the tool-bar
-dynamically from variable `tool-bar-map' which may be set
+dynamically from variable 'tool-bar-map' which may be set
buffer-locally to override the global map.
*** Tool-bar-related variables.
-If `auto-resize-tool-bar' is non-nil, the tool bar will automatically
+If 'auto-resize-tool-bar' is non-nil, the tool bar will automatically
resize to show all defined tool bar items. It will never grow larger
than 1/4 of the frame's size.
-If `auto-raise-tool-bar-buttons' is non-nil, tool bar buttons will be
+If 'auto-raise-tool-bar-buttons' is non-nil, tool bar buttons will be
raised when the mouse moves over them.
You can add extra space between tool bar items by setting
-`tool-bar-button-margin' to a positive integer specifying a number of
+'tool-bar-button-margin' to a positive integer specifying a number of
pixels, or a pair of integers (X . Y) specifying horizontal and
vertical margins . Default is 1.
You can change the shadow thickness of tool bar buttons by setting
-`tool-bar-button-relief' to an integer. Default is 3.
+'tool-bar-button-relief' to an integer. Default is 3.
*** Tool-bar clicks with modifiers.
@@ -4572,7 +4573,7 @@ is the original tool bar item definition, then
(define-key global-map [tool-bar S-shell] 'some-command)
-makes a binding to run `some-command' for a shifted click on the same
+makes a binding to run 'some-command' for a shifted click on the same
item.
** Mode line changes.
@@ -4580,20 +4581,20 @@ item.
*** Mouse-sensitive mode line.
The mode line can be made mouse-sensitive by displaying strings there
-that have a `local-map' text property. There are three ways to display
-a string with a `local-map' property in the mode line.
+that have a 'local-map' text property. There are three ways to display
+a string with a 'local-map' property in the mode line.
1. The mode line spec contains a variable whose string value has
-a `local-map' text property.
+a 'local-map' text property.
2. The mode line spec contains a format specifier (e.g. `%12b'), and
-that format specifier has a `local-map' property.
+that format specifier has a 'local-map' property.
3. The mode line spec contains a list containing `:eval FORM'. FORM
is evaluated. If the result is a string, and that string has a
-`local-map' property.
+'local-map' property.
-The same mechanism is used to determine the `face' and `help-echo'
+The same mechanism is used to determine the 'face' and 'help-echo'
properties of strings in the mode line. See `bindings.el' for an
example.
@@ -4606,28 +4607,28 @@ variable mode-line-format to nil.
*** A headerline can now be displayed at the top of a window.
This mode line's contents are controlled by the new variable
-`header-line-format' and `default-header-line-format' which are
-completely analogous to `mode-line-format' and
-`default-mode-line-format'. A value of nil means don't display a top
+'header-line-format' and 'default-header-line-format' which are
+completely analogous to 'mode-line-format' and
+'default-mode-line-format'. A value of nil means don't display a top
line.
The appearance of top mode lines is controlled by the face
-`header-line'.
+'header-line'.
-The function `coordinates-in-window-p' returns `header-line' for a
+The function 'coordinates-in-window-p' returns 'header-line' for a
position in the header-line.
-** Text property `display'
+** Text property 'display'
-The `display' text property is used to insert images into text,
+The 'display' text property is used to insert images into text,
replace text with other text, display text in marginal area, and it is
also used to control other aspects of how text displays. The value of
-the `display' property should be a display specification, as described
+the 'display' property should be a display specification, as described
below, or a list or vector containing display specifications.
*** Replacing text, displaying text in marginal areas
-To replace the text having the `display' property with some other
+To replace the text having the 'display' property with some other
text, use a display specification of the form `(LOCATION STRING)'.
If LOCATION is `(margin left-margin)', STRING is displayed in the left
@@ -4651,7 +4652,7 @@ PROPS)', where PROPS is a property list which can contain the
properties described below.
The display of the fractional space replaces the display of the
-characters having the `display' property.
+characters having the 'display' property.
- :width WIDTH
@@ -4662,7 +4663,7 @@ character width. WIDTH can be an integer or floating point number.
Specifies that the width of the stretch should be computed from the
first character in a group of consecutive characters that have the
-same `display' property. The computation is done by multiplying the
+same 'display' property. The computation is done by multiplying the
width of that character by FACTOR.
- :align-to HPOS
@@ -4680,7 +4681,7 @@ normal line height.
- :relative-height FACTOR
The height of the space is computed as the product of the height
-of the text having the `display' property and FACTOR.
+of the text having the 'display' property and FACTOR.
- :ascent ASCENT
@@ -4696,7 +4697,7 @@ You should not use both `:height' and `:relative-height' together.
A display specification for an image has the form `(LOCATION
. IMAGE)', where IMAGE is an image specification. The image replaces,
in the display, the characters having this display specification in
-their `display' text property. If LOCATION is `(margin left-margin)',
+their 'display' text property. If LOCATION is `(margin left-margin)',
the image will be displayed in the left marginal area, if it is
`(margin right-margin)' it will be displayed in the right marginal
area, and if LOCATION is `(margin nil)' the image will be displayed in
@@ -4728,7 +4729,7 @@ If HEIGHT is a symbol, it is called as a function with the current
height as argument. The function should return the new height to use.
Otherwise, HEIGHT is evaluated to get the new height, with the symbol
-`height' bound to the current specified font height.
+'height' bound to the current specified font height.
- (raise FACTOR)
@@ -4736,16 +4737,16 @@ FACTOR must be a number, specifying a multiple of the current
font's height. If it is positive, that means to display the characters
raised. If it is negative, that means to display them lower down. The
amount of raising or lowering is computed without taking account of the
-`height' subproperty.
+'height' subproperty.
*** Conditional display properties
All display specifications can be conditionalized. If a specification
has the form `(when CONDITION . SPEC)', the specification SPEC applies
only when CONDITION yields a non-nil value when evaluated. During the
-evaluation, `object' is bound to the string or buffer having the
-conditional display property; `position' and `buffer-position' are
-bound to the position within `object' and the buffer position where
+evaluation, 'object' is bound to the string or buffer having the
+conditional display property; 'position' and 'buffer-position' are
+bound to the position within 'object' and the buffer position where
the display property was found, respectively. Both positions can be
different when object is a string.
@@ -4759,57 +4760,57 @@ item names consisting of dashes only (including zero dashes) are
treated like before. In addition, the following item names are used
to specify other menu separator types.
-- `--no-line' or `--space', or `--:space', or `--:noLine'
+- '--no-line' or '--space', or `--:space', or `--:noLine'
No separator lines are drawn, but a small space is inserted where the
separator occurs.
-- `--single-line' or `--:singleLine'
+- '--single-line' or `--:singleLine'
A single line in the menu's foreground color.
-- `--double-line' or `--:doubleLine'
+- '--double-line' or `--:doubleLine'
A double line in the menu's foreground color.
-- `--single-dashed-line' or `--:singleDashedLine'
+- '--single-dashed-line' or `--:singleDashedLine'
A single dashed line in the menu's foreground color.
-- `--double-dashed-line' or `--:doubleDashedLine'
+- '--double-dashed-line' or `--:doubleDashedLine'
A double dashed line in the menu's foreground color.
-- `--shadow-etched-in' or `--:shadowEtchedIn'
+- '--shadow-etched-in' or `--:shadowEtchedIn'
A single line with 3D sunken appearance. This is the form
displayed for item names consisting of dashes only.
-- `--shadow-etched-out' or `--:shadowEtchedOut'
+- '--shadow-etched-out' or `--:shadowEtchedOut'
A single line with 3D raised appearance.
-- `--shadow-etched-in-dash' or `--:shadowEtchedInDash'
+- '--shadow-etched-in-dash' or `--:shadowEtchedInDash'
A single dashed line with 3D sunken appearance.
-- `--shadow-etched-out-dash' or `--:shadowEtchedOutDash'
+- '--shadow-etched-out-dash' or `--:shadowEtchedOutDash'
A single dashed line with 3D raise appearance.
-- `--shadow-double-etched-in' or `--:shadowDoubleEtchedIn'
+- '--shadow-double-etched-in' or `--:shadowDoubleEtchedIn'
Two lines with 3D sunken appearance.
-- `--shadow-double-etched-out' or `--:shadowDoubleEtchedOut'
+- '--shadow-double-etched-out' or `--:shadowDoubleEtchedOut'
Two lines with 3D raised appearance.
-- `--shadow-double-etched-in-dash' or `--:shadowDoubleEtchedInDash'
+- '--shadow-double-etched-in-dash' or `--:shadowDoubleEtchedInDash'
Two dashed lines with 3D sunken appearance.
-- `--shadow-double-etched-out-dash' or `--:shadowDoubleEtchedOutDash'
+- '--shadow-double-etched-out-dash' or `--:shadowDoubleEtchedOutDash'
Two dashed lines with 3D raised appearance.
@@ -4818,22 +4819,22 @@ the corresponding single-line separators.
** New frame parameters for scroll bar colors.
-The new frame parameters `scroll-bar-foreground' and
-`scroll-bar-background' can be used to change scroll bar colors.
+The new frame parameters 'scroll-bar-foreground' and
+'scroll-bar-background' can be used to change scroll bar colors.
Their value must be either a color name, a string, or nil to specify
that scroll bars should use a default color. For toolkit scroll bars,
default colors are toolkit specific. For non-toolkit scroll bars, the
default background is the background color of the frame, and the
default foreground is black.
-The X resource name of these parameters are `scrollBarForeground'
-(class ScrollBarForeground) and `scrollBarBackground' (class
-`ScrollBarBackground').
+The X resource name of these parameters are 'scrollBarForeground'
+(class ScrollBarForeground) and 'scrollBarBackground' (class
+'ScrollBarBackground').
Setting these parameters overrides toolkit specific X resource
settings for scroll bar colors.
-** You can set `redisplay-dont-pause' to a non-nil value to prevent
+** You can set 'redisplay-dont-pause' to a non-nil value to prevent
display updates from being interrupted when input is pending.
** Changing a window's width may now change its window start if it
@@ -4842,15 +4843,15 @@ on the window's new width, starting from the start of the continued
line as the start of the screen line with the minimum distance from
the original window start.
-** The variable `hscroll-step' and the functions
-`hscroll-point-visible' and `hscroll-window-column' have been removed
+** The variable 'hscroll-step' and the functions
+'hscroll-point-visible' and 'hscroll-window-column' have been removed
now that proper horizontal scrolling is implemented.
** Windows can now be made fixed-width and/or fixed-height.
A window is fixed-size if its buffer has a buffer-local variable
-`window-size-fixed' whose value is not nil. A value of `height' makes
-windows fixed-height, a value of `width' makes them fixed-width, any
+'window-size-fixed' whose value is not nil. A value of 'height' makes
+windows fixed-height, a value of 'width' makes them fixed-width, any
other non-nil value makes them both fixed-width and fixed-height.
The following code makes all windows displaying the current buffer
@@ -4861,7 +4862,7 @@ fixed-width and fixed-height.
A call to enlarge-window on a window gives an error if that window is
fixed-width and it is tried to change the window's width, or if the
window is fixed-height, and it is tried to change its height. To
-change the size of a fixed-size window, bind `window-size-fixed'
+change the size of a fixed-size window, bind 'window-size-fixed'
temporarily to nil, for example
(let ((window-size-fixed nil))
@@ -4872,7 +4873,7 @@ or a fixed-width window horizontally results in an error.
** The cursor-type frame parameter is now supported on MS-DOS
terminals. When Emacs starts, it by default changes the cursor shape
-to a solid box, as it does on Unix. The `cursor-type' frame parameter
+to a solid box, as it does on Unix. The 'cursor-type' frame parameter
overrides this as it does on Unix, except that the bar cursor is
horizontal rather than vertical (since the MS-DOS display doesn't
support a vertical-bar cursor).
diff --git a/etc/NEWS.22 b/etc/NEWS.22
index be3167dace0..926b9f489ed 100644
--- a/etc/NEWS.22
+++ b/etc/NEWS.22
@@ -11,7 +11,7 @@ This file is about changes in Emacs version 22.
See files NEWS.21, NEWS.20, NEWS.19, NEWS.18, and NEWS.1-17 for changes
in older Emacs versions.
-You can narrow news to a specific version by calling `view-emacs-news'
+You can narrow news to a specific version by calling 'view-emacs-news'
with a prefix argument or by typing C-u C-h C-n.
* About external Lisp packages
@@ -28,7 +28,7 @@ version is used. You can use M-x list-load-path-shadows to find such
older packages.
Some specific packages that are known to cause problems are given
-below. Emacs tries to warn you about these through `bad-packages-alist'.
+below. Emacs tries to warn you about these through 'bad-packages-alist'.
** Semantic (used by CEDET, ECB, JDEE): upgrade to latest version.
@@ -97,14 +97,14 @@ nextstep, ux4800, uxpds, and uxpv
* Changes in Emacs 22.2
-** `describe-project' is renamed to `describe-gnu-project'.
+** 'describe-project' is renamed to 'describe-gnu-project'.
-** `view-todo' is renamed to `view-emacs-todo'.
+** 'view-todo' is renamed to 'view-emacs-todo'.
-** `find-name-dired' now uses -iname rather than -name
+** 'find-name-dired' now uses -iname rather than -name
for case-insensitive filesystems. The default behavior is determined
-by the value of `read-file-name-completion-ignore-case'; if you don't
-like that, customize the value of the new option `find-name-arg'.
+by the value of 'read-file-name-completion-ignore-case'; if you don't
+like that, customize the value of the new option 'find-name-arg'.
** In Image mode, whenever the displayed image is wider and/or higher
than the window, the usual keys for moving the cursor cause the image
@@ -130,14 +130,14 @@ Windows installations. Users of software which modifies the behavior of
Windows to cause focus to follow the mouse will now need to explicitly set
this variable.
-** `bad-packages-alist' will warn about external packages that are known
+** 'bad-packages-alist' will warn about external packages that are known
to cause problems in this version of Emacs.
-** The values of `dired-recursive-deletes' and `dired-recursive-copies'
-have been changed to `top'. This means that the user is asked once,
+** The values of 'dired-recursive-deletes' and 'dired-recursive-copies'
+have been changed to 'top'. This means that the user is asked once,
before deleting/copying the indicated directory recursively.
-** `browse-url-emacs' loads a URL into an Emacs buffer. Handy for *.el URLs.
+** 'browse-url-emacs' loads a URL into an Emacs buffer. Handy for *.el URLs.
** The command gdba has been removed as gdb works now for those cases where it
was needed. In text command mode, if you have problems before execution has
@@ -146,21 +146,21 @@ started, use M-x gud-gdb.
** desktop.el now detects conflicting uses of the desktop file.
When loading the desktop, desktop.el can now detect that the file is already
in use. The default behavior is to ask the user what to do, but you can
-customize it with the new option `desktop-load-locked-desktop'. When saving,
+customize it with the new option 'desktop-load-locked-desktop'. When saving,
desktop.el warns about attempts to overwrite a desktop file if it determines
that the desktop being saved is not an update of the one on disk.
** Compilation mode now correctly respects the value of
-`compilation-scroll-output' between invocations. Previously, output
+'compilation-scroll-output' between invocations. Previously, output
was mistakenly scrolled on compiles after the first. Customize
-`compilation-scroll-output' if you want to retain the scrolling.
+'compilation-scroll-output' if you want to retain the scrolling.
-** `font-lock-comment-face' no longer differs from the default on
+** 'font-lock-comment-face' no longer differs from the default on
displays with fewer than 16 colors and dark background (e.g. older
xterms and the Linux console). On such displays, only the comment
delimiters will appear to be fontified (in the new face
-`font-lock-comment-delimiter-face'). To restore the old appearance,
-customize `font-lock-comment-face'. Another alternative is to use a
+'font-lock-comment-delimiter-face'). To restore the old appearance,
+customize 'font-lock-comment-face'. Another alternative is to use a
newer terminal emulator that supports more colors (256 is now common).
For example, for xterm compatible emulators that support 256 colors,
you can run emacs like this:
@@ -171,13 +171,13 @@ the case anymore).
* New Modes and Packages in Emacs 22.2
-** bibtex-style-mode helps you write BibTeX's *.bst files.
+** 'bibtex-style-mode' helps you write BibTeX's *.bst files.
-** The new package css-mode.el provides a major mode for editing CSS files.
+** The new package 'css-mode' provides a major mode for editing CSS files.
-** The new package vera-mode.el provides a major mode for editing Vera files.
+** The new package 'vera-mode' provides a major mode for editing Vera files.
-** The new package verilog-mode.el provides a major mode for editing Verilog files.
+** The new package 'verilog-mode' provides a major mode for editing Verilog files.
** The new package socks.el implements the SOCKS v5 protocol.
@@ -198,48 +198,48 @@ This can be used to add menu entries for backend specific functions.
* Incompatible Lisp Changes in Emacs 22.2
-** shell.el no longer defines the aliases `dirtrack-toggle' and
-`dirtrack-mode' for `shell-dirtrack-mode'. These names were removed
+** shell.el no longer defines the aliases 'dirtrack-toggle' and
+'dirtrack-mode' for 'shell-dirtrack-mode'. These names were removed
because they clash with commands provided by dirtrack.el. Use
-`shell-dirtrack-mode' instead.
+'shell-dirtrack-mode' instead.
* Lisp Changes in Emacs 22.2.
** Frame-local variables are deprecated and are slated for removal.
-They can easily be emulated. Rather than calling `make-variable-frame-local'
+They can easily be emulated. Rather than calling 'make-variable-frame-local'
and accessing the variable value directly, explicitly check for a
-frame-parameter, and if there is one, use its value in preference to
+'frame-parameter', and if there is one, use its value in preference to
that of the variable. Note that buffer-local values should take
-precedence over frame-local ones, so you may wish to check `local-variable-p'
+precedence over frame-local ones, so you may wish to check 'local-variable-p'
first.
-** The function invisible-p returns non-nil if the character
+** The function 'invisible-p' returns non-nil if the character
after a specified position is invisible.
-** inhibit-modification-hooks is bound to t while running modification hooks.
+** 'inhibit-modification-hooks' is bound to t while running modification hooks.
As a happy consequence, after-change-functions and before-change-functions
are not bound to nil any more while running an (after|before)-change-function.
-** New function `window-full-width-p' returns t if a window is as wide
+** New function 'window-full-width-p' returns t if a window is as wide
as its frame.
-** The new function `image-refresh' refreshes all images associated
+** The new function 'image-refresh' refreshes all images associated
with a given image specification.
-** The new function `combine-and-quote-strings' concatenates a list of strings
+** The new function 'combine-and-quote-strings' concatenates a list of strings
using a specified separator. If a string contains double quotes, they
are escaped in the output.
-** The new function `split-string-and-unquote' performs the inverse operation to
-`combine-and-quote-strings', i.e. splits a single string into a list
-of strings, undoing any quoting added by `combine-and-quote-strings'.
+** The new function 'split-string-and-unquote' performs the inverse operation to
+'combine-and-quote-strings', i.e. splits a single string into a list
+of strings, undoing any quoting added by 'combine-and-quote-strings'.
(For some separator/string combinations, the original strings cannot
be recovered.)
* Installation Changes in Emacs 22.1
-** You can build Emacs with Gtk+ widgets by specifying `--with-x-toolkit=gtk'
+** You can build Emacs with Gtk+ widgets by specifying '--with-x-toolkit=gtk'
when you run configure. This requires Gtk+ 2.4 or newer. This port
provides a way to display multilingual text in menus (with some caveats).
@@ -266,7 +266,7 @@ Emacs with Leim.
See the files mac/README and mac/INSTALL for build instructions.
** Mac OS 9 port now uses the Carbon API by default. You can also
-create a non-Carbon build by specifying `NonCarbon' as a target. See
+create a non-Carbon build by specifying 'NonCarbon' as a target. See
the files mac/README and mac/INSTALL for build instructions.
** Support for a Cygwin build of Emacs was added.
@@ -282,38 +282,38 @@ the files mac/README and mac/INSTALL for build instructions.
** New translations of the Emacs Tutorial are available in the
following languages: Brazilian Portuguese, Bulgarian, Chinese (both
with simplified and traditional characters), French, Russian, and
-Italian. Type `C-u C-h t' to choose one of them in case your language
+Italian. Type 'C-u C-h t' to choose one of them in case your language
setup doesn't automatically select the right one.
** New translations of the Emacs reference card are available in the
Brazilian Portuguese and Russian. The corresponding PostScript files
are also included.
-** A French translation of the `Emacs Survival Guide' is available.
+** A French translation of the 'Emacs Survival Guide' is available.
-** Emacs now supports new configure options `--program-prefix',
-`--program-suffix' and `--program-transform-name' that affect the names of
+** Emacs now supports new configure options '--program-prefix',
+'--program-suffix' and '--program-transform-name' that affect the names of
installed programs.
** By default, Emacs now uses a setgid helper program to update game
scores. The directory ${localstatedir}/games/emacs is the normal
place for game scores to be stored. You can control this with the
-configure option `--with-game-dir'. The specific user that Emacs uses
-to own the game scores is controlled by `--with-game-user'. If access
+configure option '--with-game-dir'. The specific user that Emacs uses
+to own the game scores is controlled by '--with-game-user'. If access
to a game user is not available, then scores will be stored separately
in each user's home directory.
** Emacs now includes support for loading image libraries on demand.
(Currently this feature is only used on MS Windows.) You can configure
the supported image types and their associated dynamic libraries by
-setting the variable `image-library-alist'.
+setting the variable 'image-library-alist'.
** Emacs can now be built without sound support.
-** Emacs Lisp source files are compressed by default if `gzip' is available.
+** Emacs Lisp source files are compressed by default if 'gzip' is available.
** All images used in Emacs have been consolidated in etc/images and subdirs.
-See also the changes to `find-image', documented below.
+See also the changes to 'find-image', documented below.
** Emacs comes with a new set of icons.
These icons are displayed on the taskbar and/or titlebar when Emacs
@@ -323,9 +323,9 @@ Emacs by changing these files directly. On X, the icon is compiled
into the Emacs executable; see gnu.h in the source tree. On MS
Windows, see nt/icons/emacs.ico.)
-** The `emacsserver' program has been removed, replaced with Lisp code.
+** The 'emacsserver' program has been removed, replaced with Lisp code.
-** The `yow' program has been removed.
+** The 'yow' program has been removed.
Use the corresponding Emacs feature instead.
** The Emacs terminal emulation in term.el uses a different terminfo name.
@@ -352,18 +352,18 @@ If the init file ~/.emacs does not exist, Emacs will try
** Emacs can now be invoked in full-screen mode on a windowed display.
When Emacs is invoked on a window system, the new command-line options
-`--fullwidth', `--fullheight', and `--fullscreen' produce a frame
+'--fullwidth', '--fullheight', and '--fullscreen' produce a frame
whose width, height, or both width and height take up the entire
screen size. (For now, this does not work with some window managers.)
** Emacs now displays a splash screen by default even if command-line
arguments were given. The new command-line option --no-splash
disables the splash screen; see also the variable
-`inhibit-splash-screen' (which is also aliased as
-`inhibit-startup-message').
+'inhibit-splash-screen' (which is also aliased as
+'inhibit-startup-message').
-** New user option `inhibit-startup-buffer-menu'.
-When loading many files, for instance with `emacs *', Emacs normally
+** New user option 'inhibit-startup-buffer-menu'.
+When loading many files, for instance with 'emacs *', Emacs normally
displays a buffer menu. This option turns the buffer menu off.
** New command line option -nbc or --no-blinking-cursor disables
@@ -379,14 +379,14 @@ can start with this line:
now reads arguments for the function interactively if it is
an interactively callable function.
-** The option --directory DIR now modifies `load-path' immediately.
-Directories are added to the front of `load-path' in the order they
+** The option --directory DIR now modifies 'load-path' immediately.
+Directories are added to the front of 'load-path' in the order they
appear on the command line. For example, with this command line:
emacs -batch -L .. -L /tmp --eval "(require 'foo)"
-Emacs looks for library `foo' in the parent directory, then in /tmp, then
-in the other directories in `load-path'. (-L is short for --directory.)
+Emacs looks for library 'foo' in the parent directory, then in /tmp, then
+in the other directories in 'load-path'. (-L is short for --directory.)
** When you specify a frame size with --geometry, the size applies to
all frames you create. A position specified with --geometry only
@@ -408,7 +408,7 @@ Emacs will now startup as if invoked with the --no-window-system option.
automatically at startup, if it exists. When Emacs offers to save
modified buffers, it saves the abbrevs too if they have changed. It
can do this either silently or asking for confirmation first,
-according to the value of `save-abbrevs'.
+according to the value of 'save-abbrevs'.
** New command line option -Q or --quick.
This is like using -q --no-site-file, but in addition it also disables
@@ -423,8 +423,8 @@ The command-line options --icon-type, -i have been replaced with
options --no-bitmap-icon, -nbi to turn the bitmap icon off.
** If the environment variable EMAIL is defined, Emacs now uses its value
-to compute the default value of `user-mail-address', in preference to
-concatenation of `user-login-name' with the name of your host machine.
+to compute the default value of 'user-mail-address', in preference to
+concatenation of 'user-login-name' with the name of your host machine.
* Incompatible Editing Changes in Emacs 22.1
@@ -434,7 +434,7 @@ concatenation of `user-login-name' with the name of your host machine.
See below for more details.
** When the undo information of the current command gets really large
-(beyond the value of `undo-outer-limit'), Emacs discards it and warns
+(beyond the value of 'undo-outer-limit'), Emacs discards it and warns
you about it.
** When Emacs prompts for file names, SPC no longer completes the file name.
@@ -460,9 +460,9 @@ it remains unchanged.
See below under "incremental search changes".
** M-g is now a prefix key.
-M-g g and M-g M-g run goto-line.
-M-g n and M-g M-n run next-error (like C-x `).
-M-g p and M-g M-p run previous-error.
+M-g g and M-g M-g run 'goto-line'.
+M-g n and M-g M-n run 'next-error' (like C-x `).
+M-g p and M-g M-p run 'previous-error'.
** C-u M-g M-g switches to the most recent previous buffer,
and goes to the specified line in that buffer.
@@ -483,23 +483,23 @@ directory with Dired.
You can get the old behavior by typing C-x C-f M-n RET, which fetches
the actual file name into the minibuffer.
-** In Dired's ! command (dired-do-shell-command), `*' and `?' now
+** In Dired's ! command (dired-do-shell-command), '*' and '?' now
control substitution of the file names only when they are surrounded
by whitespace. This means you can now use them as shell wildcards
-too. If you want to use just plain `*' as a wildcard, type `*""'; the
+too. If you want to use just plain '*' as a wildcard, type '*""'; the
doublequotes make no difference in the shell, but they prevent
-special treatment in `dired-do-shell-command'.
+special treatment in 'dired-do-shell-command'.
** The info-search bindings on C-h C-f, C-h C-k and C-h C-i
have been moved to C-h F, C-h K and C-h S.
-** `apply-macro-to-region-lines' now operates on all lines that begin
+** 'apply-macro-to-region-lines' now operates on all lines that begin
in the region, rather than on all complete lines in the region.
-** line-move-ignore-invisible now defaults to t.
+** 'line-move-ignore-invisible' now defaults to t.
** Adaptive filling misfeature removed.
-It no longer treats `NNN.' or `(NNN)' as a prefix.
+It no longer treats 'NNN.' or '(NNN)' as a prefix.
** The old bindings C-M-delete and C-M-backspace have been deleted,
since there are situations where one or the other will shut down
@@ -507,10 +507,10 @@ the operating system or your X server.
** The register compatibility key bindings (deprecated since Emacs 19)
have been removed:
- C-x / point-to-register (Use: C-x r SPC)
- C-x j jump-to-register (Use: C-x r j)
- C-x x copy-to-register (Use: C-x r s)
- C-x g insert-register (Use: C-x r i)
+ C-x / 'point-to-register' (Use: C-x r SPC)
+ C-x j 'jump-to-register' (Use: C-x r j)
+ C-x x 'copy-to-register' (Use: C-x r s)
+ C-x g 'insert-register' (Use: C-x r i)
* Editing Changes in Emacs 22.1
@@ -525,14 +525,14 @@ killing buffers will get out of this state. If killing buffers does
not make !MEM FULL! disappear, you should save your work and start
a new Emacs.
-** `undo-only' does an undo which does not redo any previous undo.
+** 'undo-only' does an undo which does not redo any previous undo.
** Yanking text now discards certain text properties that can
be inconvenient when you did not expect them. The variable
-`yank-excluded-properties' specifies which ones. Insertion
+'yank-excluded-properties' specifies which ones. Insertion
of register contents and rectangles also discards these properties.
-** New command `kill-whole-line' kills an entire line at once.
+** New command 'kill-whole-line' kills an entire line at once.
By default, it is bound to C-S-<backspace>.
** M-SPC (just-one-space) when given a numeric argument N
@@ -547,20 +547,20 @@ cycle for each frame, using the frame-local buffer list.
but does not switch to that frame. It's the multi-frame
analogue of C-x 4 C-o.
-** `special-display-buffer-names' and `special-display-regexps' now
-understand two new boolean pseudo-frame-parameters `same-frame' and
-`same-window'.
+** 'special-display-buffer-names' and 'special-display-regexps' now
+understand two new boolean pseudo-frame-parameters 'same-frame' and
+'same-window'.
** New commands to operate on pairs of open and close characters:
-`insert-pair', `delete-pair', `raise-sexp'.
+'insert-pair', 'delete-pair', 'raise-sexp'.
** M-x setenv now expands environment variable references.
-Substrings of the form `$foo' and `${foo}' in the specified new value
-now refer to the value of environment variable foo. To include a `$'
-in the value, use `$$'.
+Substrings of the form '$foo' and '${foo}' in the specified new value
+now refer to the value of environment variable foo. To include a '$'
+in the value, use '$$'.
-** The default values of paragraph-start and indent-line-function have
+** The default values of 'paragraph-start' and 'indent-line-function' have
been changed to reflect those used in Text mode rather than those used
in Paragraph-Indent Text mode.
@@ -573,7 +573,7 @@ from the locale.
C-h e displays the *Messages* buffer.
-C-h d runs apropos-documentation.
+C-h d runs 'apropos-documentation'.
C-h r visits the Emacs Manual in Info.
@@ -607,56 +607,56 @@ When more than one word is specified, at least two of those words must
be present for an item to match. Regular expression matching is still
available.
-*** The new option `apropos-sort-by-scores' causes the matching items
+*** The new option 'apropos-sort-by-scores' causes the matching items
to be sorted according to their score. The score for an item is a
number calculated to indicate how well the item matches the words or
regular expression that you entered to the apropos command. The best
match is listed first, and the calculated score is shown for each
matching item.
-*** Help commands `describe-function' and `describe-key' now show function
+*** Help commands 'describe-function' and 'describe-key' now show function
arguments in lowercase italics on displays that support it. To change the
-default, customize face `help-argument-name' or redefine the function
-`help-default-arg-highlight'.
+default, customize face 'help-argument-name' or redefine the function
+'help-default-arg-highlight'.
*** C-h v and C-h f commands now include a hyperlink to the C source for
variables and functions defined in C (if the C source is available).
*** Help mode now only makes hyperlinks for faces when the face name is
-preceded or followed by the word `face'. It no longer makes
+preceded or followed by the word 'face'. It no longer makes
hyperlinks for variables without variable documentation, unless
-preceded by one of the words `variable' or `option'. It now makes
+preceded by one of the words 'variable' or 'option'. It now makes
hyperlinks to Info anchors (or nodes) if the anchor (or node) name is
-enclosed in single quotes and preceded by `info anchor' or `Info
-anchor' (in addition to earlier `info node' and `Info node'). In
+enclosed in single quotes and preceded by 'info anchor' or 'Info
+anchor' (in addition to earlier 'info node' and 'Info node'). In
addition, it now makes hyperlinks to URLs as well if the URL is
-enclosed in single quotes and preceded by `URL'.
+enclosed in single quotes and preceded by 'URL'.
-*** The new command `describe-char' (C-u C-x =) pops up a buffer with
+*** The new command 'describe-char' (C-u C-x =) pops up a buffer with
description various information about a character, including its
encodings and syntax, its text properties, how to input, overlays, and
widgets at point. You can get more information about some of them, by
clicking on mouse-sensitive areas or moving there and pressing RET.
-*** The command `list-text-properties-at' has been deleted because
+*** The command 'list-text-properties-at' has been deleted because
C-u C-x = gives the same information and more.
-*** New command `display-local-help' displays any local help at point
-in the echo area. It is bound to `C-h .'. It normally displays the
+*** New command 'display-local-help' displays any local help at point
+in the echo area. It is bound to 'C-h .'. It normally displays the
same string that would be displayed on mouse-over using the
-`help-echo' property, but, in certain cases, it can display a more
+'help-echo' property, but, in certain cases, it can display a more
keyboard oriented alternative.
-*** New user option `help-at-pt-display-when-idle' allows you to
-automatically show the help provided by `display-local-help' on
+*** New user option 'help-at-pt-display-when-idle' allows you to
+automatically show the help provided by 'display-local-help' on
point-over, after suitable idle time. The amount of idle time is
-determined by the user option `help-at-pt-timer-delay' and defaults
+determined by the user option 'help-at-pt-timer-delay' and defaults
to one second. This feature is turned off by default.
** Mark command changes:
*** A prefix argument is no longer required to repeat a jump to a
-previous mark if you set `set-mark-command-repeat-pop' to t. I.e. C-u
+previous mark if you set 'set-mark-command-repeat-pop' to t. I.e. C-u
C-SPC C-SPC C-SPC ... cycles through the mark ring. Use C-u C-u C-SPC
to set the mark immediately after a jump.
@@ -666,7 +666,7 @@ If you type C-M-SPC (mark-sexp), M-@ (mark-word), M-h
(mark-paragraph), or C-M-h (mark-defun) repeatedly, the marked region
extends each time, so you can mark the next two sexps with M-C-SPC
M-C-SPC, for example. This feature also works for
-mark-end-of-sentence, if you bind that to a key. It also extends the
+'mark-end-of-sentence', if you bind that to a key. It also extends the
region when the mark is active in Transient Mark mode, regardless of
the last command. To start a new region with one of marking commands
in Transient Mark mode, you can deactivate the active region with C-g,
@@ -689,8 +689,8 @@ deactivate the mark. That typically happens when you type a command
that alters the buffer, but you can also deactivate the mark by typing
C-g.
-*** Movement commands `beginning-of-buffer', `end-of-buffer',
-`beginning-of-defun', `end-of-defun' do not set the mark if the mark
+*** Movement commands 'beginning-of-buffer', 'end-of-buffer',
+'beginning-of-defun', 'end-of-defun' do not set the mark if the mark
is already active in Transient Mark mode.
*** M-h (mark-paragraph) now accepts a prefix arg.
@@ -701,52 +701,52 @@ paragraphs.
** Incremental Search changes:
-*** M-% typed in isearch mode invokes `query-replace' or
-`query-replace-regexp' (depending on search mode) with the current
+*** M-% typed in isearch mode invokes 'query-replace' or
+'query-replace-regexp' (depending on search mode) with the current
search string used as the string to replace.
*** C-w in incremental search now grabs either a character or a word,
making the decision in a heuristic way. This new job is done by the
-command `isearch-yank-word-or-char'. To restore the old behavior,
-bind C-w to `isearch-yank-word' in `isearch-mode-map'.
+command 'isearch-yank-word-or-char'. To restore the old behavior,
+bind C-w to 'isearch-yank-word' in 'isearch-mode-map'.
*** C-y in incremental search now grabs the next line if point is already
at the end of a line.
*** C-M-w deletes and C-M-y grabs a character in isearch mode.
-Another method to grab a character is to enter the minibuffer by `M-e'
-and to type `C-f' at the end of the search string in the minibuffer.
+Another method to grab a character is to enter the minibuffer by 'M-e'
+and to type 'C-f' at the end of the search string in the minibuffer.
*** Vertical scrolling is now possible within incremental search.
To enable this feature, customize the new user option
-`isearch-allow-scroll'. User written commands which satisfy stringent
+'isearch-allow-scroll'. User written commands which satisfy stringent
constraints can be marked as "scrolling commands". See the Emacs manual
for details.
-*** Isearch no longer adds `isearch-resume' commands to the command
+*** Isearch no longer adds 'isearch-resume' commands to the command
history by default. To enable this feature, customize the new
-user option `isearch-resume-in-command-history'.
+user option 'isearch-resume-in-command-history'.
** Replace command changes:
-*** When used interactively, the commands `query-replace-regexp' and
-`replace-regexp' allow \,expr to be used in a replacement string,
+*** When used interactively, the commands 'query-replace-regexp' and
+'replace-regexp' allow \,expr to be used in a replacement string,
where expr is an arbitrary Lisp expression evaluated at replacement
-time. `\#' in a replacement string now refers to the count of
+time. '\#' in a replacement string now refers to the count of
replacements already made by the replacement command. All regular
-expression replacement commands now allow `\?' in the replacement
+expression replacement commands now allow '\?' in the replacement
string to specify a position where the replacement string can be
-edited for each replacement. `query-replace-regexp-eval' is now
+edited for each replacement. 'query-replace-regexp-eval' is now
deprecated since it offers no additional functionality.
*** query-replace uses isearch lazy highlighting when the new user option
-`query-replace-lazy-highlight' is non-nil.
+'query-replace-lazy-highlight' is non-nil.
*** The current match in query-replace is highlighted in new face
-`query-replace' which by default inherits from isearch face.
+'query-replace' which by default inherits from isearch face.
-*** New user option `query-replace-skip-read-only': when non-nil,
-`query-replace' and related functions simply ignore
+*** New user option 'query-replace-skip-read-only': when non-nil,
+'query-replace' and related functions simply ignore
a match if part of it has a read-only property.
** Local variables lists:
@@ -755,31 +755,31 @@ a match if part of it has a read-only property.
are not known to be safe, Emacs shows a prompt asking whether to apply
the local variables list as a whole. In earlier versions, a prompt
was only issued for variables explicitly marked as risky (for the
-definition of risky variables, see `risky-local-variable-p').
+definition of risky variables, see 'risky-local-variable-p').
At the prompt, you can choose to save the contents of this local
-variables list to `safe-local-variable-values'. This new customizable
+variables list to 'safe-local-variable-values'. This new customizable
option is a list of variable-value pairs that are known to be safe.
Variables can also be marked as safe with the existing
-`safe-local-variable' property (see `safe-local-variable-p').
+'safe-local-variable' property (see 'safe-local-variable-p').
However, risky variables will not be added to
-`safe-local-variable-values' in this way.
+'safe-local-variable-values' in this way.
-*** The variable `enable-local-variables' controls how local variable
+*** The variable 'enable-local-variables' controls how local variable
lists are handled. t, the default, specifies the standard querying
behavior. :safe means use only safe values, and ignore the rest.
:all means set all variables, whether or not they are safe.
nil means ignore them all. Anything else means always query.
-*** The variable `safe-local-eval-forms' specifies a list of forms that
-are ok to evaluate when they appear in an `eval' local variables
+*** The variable 'safe-local-eval-forms' specifies a list of forms that
+are ok to evaluate when they appear in an 'eval' local variables
specification. Normally Emacs asks for confirmation before evaluating
such a form, but if the form appears in this list, no confirmation is
needed.
-*** If a function has a non-nil `safe-local-eval-function' property,
+*** If a function has a non-nil 'safe-local-eval-function' property,
that means it is ok to evaluate some calls to that function when it
-appears in an `eval' local variables specification. If the property
+appears in an 'eval' local variables specification. If the property
is t, then any form calling that function with constant arguments is
ok. If the property is a function or list of functions, they are called
with the form as argument, and if any returns t, the form is ok to call.
@@ -797,9 +797,9 @@ properties--any specified text properties are discarded.
** File operation changes:
-*** Unquoted `$' in file names do not signal an error any more when
+*** Unquoted '$' in file names do not signal an error any more when
the corresponding environment variable does not exist.
-Instead, the `$ENVVAR' text is left as is, so that `$$' quoting
+Instead, the '$ENVVAR' text is left as is, so that '$$' quoting
is only rarely needed.
*** C-x C-f RET, typing nothing in the minibuffer, is no longer a special case.
@@ -808,12 +808,12 @@ Since the default input is the current directory, this has the effect
of specifying the current directory. Normally that means to visit the
directory with Dired.
-*** C-x s (save-some-buffers) now offers an option `d' to diff a buffer
+*** C-x s (save-some-buffers) now offers an option 'd' to diff a buffer
against its file, so you can see what changes you would be saving.
*** Auto Compression mode is now enabled by default.
-*** If the user visits a file larger than `large-file-warning-threshold',
+*** If the user visits a file larger than 'large-file-warning-threshold',
Emacs asks for confirmation.
*** The commands copy-file, rename-file, make-symbolic-link and
@@ -825,10 +825,10 @@ commands cp, mv, and ln follow.) Thus, M-x copy-file RET ~/foo RET
*** require-final-newline now has two new possible values:
-`visit' means add a newline (as an undoable change) if it's needed
+'visit' means add a newline (as an undoable change) if it's needed
when visiting the file.
-`visit-save' means add a newline (as an undoable change) if it's
+'visit-save' means add a newline (as an undoable change) if it's
needed when visiting the file, and also add a newline if it's needed
when saving the file.
@@ -844,23 +844,23 @@ read-only, the Emacs buffer is now read-only too. Type C-x C-q if you
want to make the buffer writable. (As root, you can in fact alter the
file.)
-*** find-file-read-only visits multiple files in read-only mode,
+*** 'find-file-read-only' visits multiple files in read-only mode,
when the file name contains wildcard characters.
-*** find-alternate-file replaces the current file with multiple files,
+*** 'find-alternate-file' replaces the current file with multiple files,
when the file name contains wildcard characters. It now asks if you
wish save your changes and not just offer to kill the buffer.
-*** When used interactively, `format-write-file' now asks for confirmation
+*** When used interactively, 'format-write-file' now asks for confirmation
before overwriting an existing file, unless a prefix argument is
-supplied. This behavior is analogous to `write-file'.
+supplied. This behavior is analogous to 'write-file'.
-*** The variable `auto-save-file-name-transforms' now has a third element that
-controls whether or not the function `make-auto-save-file-name' will
+*** The variable 'auto-save-file-name-transforms' now has a third element that
+controls whether or not the function 'make-auto-save-file-name' will
attempt to construct a unique auto-save name (e.g. for remote files).
-*** The new option `write-region-inhibit-fsync' disables calls to fsync
-in `write-region'. This can be useful on laptops to avoid spinning up
+*** The new option 'write-region-inhibit-fsync' disables calls to fsync
+in 'write-region'. This can be useful on laptops to avoid spinning up
the hard drive upon each file save. Enabling this variable may result
in data loss, use with care.
@@ -873,50 +873,50 @@ it remains unchanged.
*** The new file-name-shadow-mode is turned ON by default, so that when
entering a file name, any prefix which Emacs will ignore is dimmed.
-*** There's a new face `minibuffer-prompt'.
+*** There's a new face 'minibuffer-prompt'.
Emacs adds this face to the list of text properties stored in the
-variable `minibuffer-prompt-properties', which is used to display the
+variable 'minibuffer-prompt-properties', which is used to display the
prompt string.
-*** Enhanced visual feedback in `*Completions*' buffer.
+*** Enhanced visual feedback in '*Completions*' buffer.
Completions lists use faces to highlight what all completions
have in common and where they begin to differ.
The common prefix shared by all possible completions uses the face
-`completions-common-part', while the first character that isn't the
-same uses the face `completions-first-difference'. By default,
-`completions-common-part' inherits from `default', and
-`completions-first-difference' inherits from `bold'. The idea of
-`completions-common-part' is that you can use it to make the common
+'completions-common-part', while the first character that isn't the
+same uses the face 'completions-first-difference'. By default,
+'completions-common-part' inherits from 'default', and
+'completions-first-difference' inherits from 'bold'. The idea of
+'completions-common-part' is that you can use it to make the common
parts less visible than normal, so that the rest of the differing
parts is, by contrast, slightly highlighted.
Above fontification is always done when listing completions is
triggered at minibuffer. If you want to fontify completions whose
listing is triggered at the other normal buffer, you have to pass
-the common prefix of completions to `display-completion-list' as
+the common prefix of completions to 'display-completion-list' as
its second argument.
*** File-name completion can now ignore specified directories.
-If an element of the list in `completion-ignored-extensions' ends in a
-slash `/', it indicates a subdirectory that should be ignored when
-completing file names. Elements of `completion-ignored-extensions'
+If an element of the list in 'completion-ignored-extensions' ends in a
+slash '/', it indicates a subdirectory that should be ignored when
+completing file names. Elements of 'completion-ignored-extensions'
which do not end in a slash are never considered when a completion
candidate is a directory.
-*** New user option `history-delete-duplicates'.
+*** New user option 'history-delete-duplicates'.
If set to t when adding a new history element, all previous identical
elements are deleted from the history list.
** Redisplay changes:
-*** The new face `mode-line-inactive' is used to display the mode line
-of non-selected windows. The `mode-line' face is now used to display
+*** The new face 'mode-line-inactive' is used to display the mode line
+of non-selected windows. The 'mode-line' face is now used to display
the mode line of the currently selected window.
-The new variable `mode-line-in-non-selected-windows' controls whether
-the `mode-line-inactive' face is used.
+The new variable 'mode-line-in-non-selected-windows' controls whether
+the 'mode-line-inactive' face is used.
*** The mode line position information now comes before the major mode.
When the file is maintained under version control, that information
@@ -924,7 +924,7 @@ appears between the position information and the major mode.
*** You can now customize the use of window fringes. To control this
for all frames, use M-x fringe-mode or the Show/Hide submenu of the
-top-level Options menu, or customize the `fringe-mode' variable. To
+top-level Options menu, or customize the 'fringe-mode' variable. To
control this for a specific frame, use the command M-x
set-fringe-style.
@@ -933,10 +933,10 @@ addition, up and down arrow bitmaps in the fringe indicate which ways
the window can be scrolled.
This behavior is activated by setting the buffer-local variable
-`indicate-buffer-boundaries' to a non-nil value. The default value of
-this variable is found in `default-indicate-buffer-boundaries'.
+'indicate-buffer-boundaries' to a non-nil value. The default value of
+this variable is found in 'default-indicate-buffer-boundaries'.
-If value is `left' or `right', both angle and arrow bitmaps are
+If value is 'left' or 'right', both angle and arrow bitmaps are
displayed in the left or right fringe, resp.
The value can also be an alist which specifies the presence and
@@ -967,26 +967,26 @@ or when the frame is resized.
displayed between the margins and the buffer's text area, rather than
outside those margins.
-*** New face `escape-glyph' highlights control characters and escape glyphs.
+*** New face 'escape-glyph' highlights control characters and escape glyphs.
*** Non-breaking space and hyphens are now displayed with a special
-face, either nobreak-space or escape-glyph. You can turn this off or
-specify a different mode by setting the variable `nobreak-char-display'.
+face, either 'nobreak-space' or 'escape-glyph'. You can turn this off or
+specify a different mode by setting the variable 'nobreak-char-display'.
*** The parameters of automatic hscrolling can now be customized.
-The variable `hscroll-margin' determines how many columns away from
+The variable 'hscroll-margin' determines how many columns away from
the window edge point is allowed to get before automatic hscrolling
will horizontally scroll the window. The default value is 5.
-The variable `hscroll-step' determines how many columns automatic
+The variable 'hscroll-step' determines how many columns automatic
hscrolling scrolls the window when point gets too close to the
window edge. If its value is zero, the default, Emacs scrolls the
window so as to center point. If its value is an integer, it says how
many columns to scroll. If the value is a floating-point number, it
gives the fraction of the window's width to scroll the window.
-The variable `automatic-hscrolling' was renamed to
-`auto-hscroll-mode'. The old name is still available as an alias.
+The variable 'automatic-hscrolling' was renamed to
+'auto-hscroll-mode'. The old name is still available as an alias.
*** Moving or scrolling through images (and other lines) taller than
the window now works sensibly, by automatically adjusting the window's
@@ -996,7 +996,7 @@ vscroll property.
To avoid preempting redisplay on fast computers, networks, and displays,
the arrival of new input is now performed at regular intervals during
-redisplay. The new variable `redisplay-preemption-period' specifies
+redisplay. The new variable 'redisplay-preemption-period' specifies
the period; the default is to check for input every 0.1 seconds.
*** The %c and %l constructs are now ignored in frame-title-format.
@@ -1004,34 +1004,34 @@ Due to technical limitations in how Emacs interacts with windowing
systems, these constructs often failed to render properly, and could
even cause Emacs to crash.
-*** If value of `auto-resize-tool-bars' is `grow-only', the tool bar
+*** If value of 'auto-resize-tool-bars' is 'grow-only', the tool bar
will expand as needed, but not contract automatically. To contract
the tool bar, you must type C-l.
-*** New customize option `overline-margin' controls the space between
+*** New customize option 'overline-margin' controls the space between
overline and text.
-*** New variable `x-underline-at-descent-line' controls the relative
+*** New variable 'x-underline-at-descent-line' controls the relative
position of the underline. When set, it overrides the
-`x-use-underline-position-properties' variables.
+'x-use-underline-position-properties' variables.
** New faces:
-*** `mode-line-highlight' is the standard face indicating mouse sensitive
-elements on mode-line (and header-line) like `highlight' face on text
+*** 'mode-line-highlight' is the standard face indicating mouse sensitive
+elements on mode-line (and header-line) like 'highlight' face on text
areas.
-*** `mode-line-buffer-id' is the standard face for buffer identification
+*** 'mode-line-buffer-id' is the standard face for buffer identification
parts of the mode line.
-*** `shadow' face defines the appearance of the "shadowed" text, i.e.
+*** 'shadow' face defines the appearance of the "shadowed" text, i.e.
the text which should be less noticeable than the surrounding text.
This can be achieved by using shades of gray in contrast with either
black or white default foreground color. This generic shadow face
allows customization of the appearance of shadowed text in one place,
so package-specific faces can inherit from it.
-*** `vertical-border' face is used for the vertical divider between windows.
+*** 'vertical-border' face is used for the vertical divider between windows.
** Font-Lock (syntax highlighting) changes:
@@ -1039,20 +1039,20 @@ so package-specific faces can inherit from it.
fontification, even those such as Occur, Info, and comint-derived
modes that do their own fontification in a special way.
-The variable `Info-fontify' is no longer applicable; to disable
-fontification in Info, remove `turn-on-font-lock' from
-`Info-mode-hook'.
+The variable 'Info-fontify' is no longer applicable; to disable
+fontification in Info, remove 'turn-on-font-lock' from
+'Info-mode-hook'.
-*** New standard font-lock face `font-lock-comment-delimiter-face'.
+*** New standard font-lock face 'font-lock-comment-delimiter-face'.
This is used for the characters that indicate the start of a comment,
-e.g. `;' in Lisp mode.
+e.g. ';' in Lisp mode.
-*** New standard font-lock face `font-lock-preprocessor-face'.
+*** New standard font-lock face 'font-lock-preprocessor-face'.
*** Easy to overlook single character negation can now be font-locked.
-You can use the new variable `font-lock-negation-char-face' and the face of
-the same name to customize this. Currently the cc-modes, sh-script-mode,
-cperl-mode and make-mode support this.
+You can use the new variable 'font-lock-negation-char-face' and the face of
+the same name to customize this. Currently the cc-modes, 'sh-script-mode',
+'cperl-mode' and 'make-mode' support this.
*** Font-Lock mode: in major modes such as Lisp mode, where some Emacs
features assume that an open-paren in column 0 is always outside of
@@ -1065,39 +1065,39 @@ the open-paren is not in column 0.
M-o M-o requests refontification.
*** The default settings for JIT stealth lock parameters are changed.
-The default value for the user option jit-lock-stealth-time is now nil
-instead of 3. This setting of jit-lock-stealth-time disables stealth
+The default value for the user option 'jit-lock-stealth-time' is now nil
+instead of 3. This setting of 'jit-lock-stealth-time' disables stealth
fontification: on today's machines, it may be a bug in font lock
patterns if fontification otherwise noticeably degrades interactivity.
If you find movement in infrequently visited buffers sluggish (and the
major mode maintainer has no better idea), customizing
-jit-lock-stealth-time to a non-nil value will let Emacs fontify
+'jit-lock-stealth-time' to a non-nil value will let Emacs fontify
buffers in the background when it considers the system to be idle.
-jit-lock-stealth-nice is now 0.5 instead of 0.125 which is supposed to
+'jit-lock-stealth-nice' is now 0.5 instead of 0.125 which is supposed to
cause less load than the old defaults.
-*** jit-lock can now be delayed with `jit-lock-defer-time'.
+*** jit-lock can now be delayed with 'jit-lock-defer-time'.
If this variable is non-nil, its value should be the amount of Emacs
idle time in seconds to wait before starting fontification. For
-example, if you set `jit-lock-defer-time' to 0.25, fontification will
+example, if you set 'jit-lock-defer-time' to 0.25, fontification will
only happen after 0.25s of idle time.
*** contextual refontification is now separate from stealth fontification.
-jit-lock-defer-contextually is renamed jit-lock-contextually and
-jit-lock-context-time determines the delay after which contextual
+'jit-lock-defer-contextually' is renamed 'jit-lock-contextually' and
+'jit-lock-context-time' determines the delay after which contextual
refontification takes place.
*** lazy-lock is considered obsolete.
-The `lazy-lock' package is superseded by `jit-lock' and is considered
-obsolete. `jit-lock' is activated by default; if you wish to continue
-using `lazy-lock', activate it in your ~/.emacs like this:
+The 'lazy-lock' package is superseded by 'jit-lock' and is considered
+obsolete. 'jit-lock' is activated by default; if you wish to continue
+using 'lazy-lock', activate it in your ~/.emacs like this:
(setq font-lock-support-mode 'lazy-lock-mode)
-If you invoke `lazy-lock-mode' directly rather than through
-`font-lock-support-mode', it now issues a warning:
+If you invoke 'lazy-lock-mode' directly rather than through
+'font-lock-support-mode', it now issues a warning:
"Use font-lock-support-mode rather than calling lazy-lock-mode"
** Menu support:
@@ -1116,7 +1116,7 @@ and "Open File...". "Open File..." now opens only existing files. This is
to support existing GUI file selection dialogs better.
*** The file selection dialog for Gtk+, Mac, W32 and Motif/LessTif can be
-disabled by customizing the variable `use-file-dialog'.
+disabled by customizing the variable 'use-file-dialog'.
*** The pop up menus for Lucid now stay up if you do a fast click and can
be navigated with the arrow keys (like Gtk+, Mac and W32).
@@ -1127,41 +1127,41 @@ the arrow keys, select with the return key and cancel with the escape keys.
*** The Lucid menus can display multilingual text in your locale. You have
to explicitly specify a fontSet resource for this to work, for example
-`-xrm "Emacs*fontSet: -*-helvetica-medium-r-*--*-120-*-*-*-*-*-*,*"'.
+'-xrm "Emacs*fontSet: -*-helvetica-medium-r-*--*-120-*-*-*-*-*-*,*"'.
*** Dialogs for Lucid/Athena and LessTif/Motif now pop down on pressing
ESC, like they do for Gtk+, Mac and W32.
*** For the Gtk+ version, you can make Emacs use the old file dialog
-by setting the variable `x-gtk-use-old-file-dialog' to t. Default is to use
+by setting the variable 'x-gtk-use-old-file-dialog' to t. Default is to use
the new dialog.
*** You can exit dialog windows and menus by typing C-g.
** Buffer Menu changes:
-*** The new options `buffers-menu-show-directories' and
-`buffers-menu-show-status' let you control how buffers are displayed
+*** The new options 'buffers-menu-show-directories' and
+'buffers-menu-show-status' let you control how buffers are displayed
in the menu dropped down when you click "Buffers" from the menu bar.
-`buffers-menu-show-directories' controls whether the menu displays
+'buffers-menu-show-directories' controls whether the menu displays
leading directories as part of the file name visited by the buffer.
-If its value is `unless-uniquify', the default, directories are
+If its value is 'unless-uniquify', the default, directories are
shown unless uniquify-buffer-name-style' is non-nil. The value of nil
and t turn the display of directories off and on, respectively.
-`buffers-menu-show-status' controls whether the Buffers menu includes
+'buffers-menu-show-status' controls whether the Buffers menu includes
the modified and read-only status of the buffers. By default it is
t, and the status is shown.
Setting these variables directly does not take effect until next time
the Buffers menu is regenerated.
-*** New command `Buffer-menu-toggle-files-only' toggles display of file
+*** New command 'Buffer-menu-toggle-files-only' toggles display of file
buffers only in the Buffer Menu. It is bound to T in Buffer Menu
mode.
-*** `buffer-menu' and `list-buffers' now list buffers whose names begin
+*** 'buffer-menu' and 'list-buffers' now list buffers whose names begin
with a space, when those buffers are visiting files. Normally buffers
whose names begin with space are omitted.
@@ -1174,12 +1174,12 @@ click to follow a link, whereas most other applications use a Mouse-1
click for both purposes, depending on whether you click outside or
inside a link. Now the behavior of a Mouse-1 click has been changed
to match this context-sensitive dual behavior. (If you prefer the old
-behavior, set the user option `mouse-1-click-follows-link' to nil.)
+behavior, set the user option 'mouse-1-click-follows-link' to nil.)
Depending on the current mode, a Mouse-2 click in Emacs can do much
more than just follow a link, so the new Mouse-1 behavior is only
activated for modes which explicitly mark a clickable text as a "link"
-(see the new function `mouse-on-link-p' for details). The Lisp
+(see the new function 'mouse-on-link-p' for details). The Lisp
packages that are included in release 22.1 have been adapted to do
this, but external packages may not yet support this. However, there
is no risk in using such packages, as the worst thing that could
@@ -1195,9 +1195,9 @@ Dragging the Mouse-1 inside a link still performs the original
drag-mouse-1 action, typically copy the text.
You can customize the new Mouse-1 behavior via the new user options
-`mouse-1-click-follows-link' and `mouse-1-click-in-non-selected-windows'.
+'mouse-1-click-follows-link' and 'mouse-1-click-in-non-selected-windows'.
-*** If you set the new variable `mouse-autoselect-window' to a non-nil
+*** If you set the new variable 'mouse-autoselect-window' to a non-nil
value, windows are automatically selected as you move the mouse from
one Emacs window to another, even within a frame. A minibuffer window
can be selected only when it is active.
@@ -1205,43 +1205,44 @@ can be selected only when it is active.
*** On X, when the window manager requires that you click on a frame to
select it (give it focus), the selected window and cursor position
normally changes according to the mouse click position. If you set
-the variable x-mouse-click-focus-ignore-position to t, the selected
+the variable 'x-mouse-click-focus-ignore-position' to t, the selected
window and cursor position do not change when you click on a frame
to give it focus.
*** Emacs normally highlights mouse sensitive text whenever the mouse
-is over the text. By setting the new variable `mouse-highlight', you
+is over the text. By setting the new variable 'mouse-highlight', you
can optionally enable mouse highlighting only after you move the
mouse, so that highlighting disappears when you press a key. You can
also disable mouse highlighting.
*** You can now customize if selecting a region by dragging the mouse
-shall not copy the selected text to the kill-ring by setting the new
-variable mouse-drag-copy-region to nil.
+shall not copy the selected text to the 'kill-ring' by setting the new
+variable 'mouse-drag-copy-region' to nil.
-*** Under X, mouse-wheel-mode is turned on by default.
+*** Under X, 'mouse-wheel-mode' is turned on by default.
*** Emacs ignores mouse-2 clicks while the mouse wheel is being moved.
People tend to push the mouse wheel (which counts as a mouse-2 click)
unintentionally while turning the wheel, so these clicks are now
-ignored. You can customize this with the mouse-wheel-click-event and
-mouse-wheel-inhibit-click-time variables.
+ignored. You can customize this with the 'mouse-wheel-click-event' and
+'mouse-wheel-inhibit-click-time' variables.
*** mouse-wheels can now scroll a specific fraction of the window
-(rather than a fixed number of lines) and the scrolling is `progressive'.
+(rather than a fixed number of lines) and the scrolling is 'progressive'.
** Multilingual Environment (Mule) changes:
-*** You can disable character translation for a file using the -*-
-construct. Include `enable-character-translation: nil' inside the
+*** You can disable character translation for a file using
+the 'enable-character-translation' variable set in the -*-
+construct. Include 'enable-character-translation: nil' inside the
-*-...-*- to disable any character translation that may happen by
various global and per-coding-system translation tables. You can also
specify it in a local variable list at the end of the file. For
shortcut, instead of using this long variable name, you can append the
character "!" at the end of coding-system name specified in -*-
construct or in a local variable list. For example, if a file has the
-following header, it is decoded by the coding system `iso-latin-1'
+following header, it is decoded by the coding system 'iso-latin-1'
without any character translation:
;; -*- coding: iso-latin-1!; -*-
@@ -1255,32 +1256,32 @@ default in some locale (e.g. vi_VN).
current locale settings if you are not using a window system. This
can mean that the META key doesn't work but generates non-ASCII
characters instead, depending on how the terminal (or terminal
-emulator) works. Use `set-keyboard-coding-system' (or customize
+emulator) works. Use 'set-keyboard-coding-system' (or customize
keyboard-coding-system) if you prefer META to work (the old default)
or if the locale doesn't describe the character set actually generated
-by the keyboard. See Info node `Unibyte Mode'.
+by the keyboard. See Info node 'Unibyte Mode'.
-*** The new command `set-file-name-coding-system' (C-x RET F) sets
+*** The new command 'set-file-name-coding-system' (C-x RET F) sets
coding system for encoding and decoding file names. A new menu item
(Options->Mule->Set Coding Systems->For File Name) invokes this
command.
-*** The new command `revert-buffer-with-coding-system' (C-x RET r)
+*** The new command 'revert-buffer-with-coding-system' (C-x RET r)
revisits the current file using a coding system that you specify.
-*** New command `recode-region' decodes the region again by a specified
+*** New command 'recode-region' decodes the region again by a specified
coding system.
-*** The new command `recode-file-name' changes the encoding of the name
+*** The new command 'recode-file-name' changes the encoding of the name
of a file.
-*** New command `ucs-insert' inserts a character specified by its
+*** New command 'ucs-insert' inserts a character specified by its
Unicode code point or character name.
*** New command quail-show-key shows what key (or key sequence) to type
in the current input method to input a character at point.
-*** Limited support for character `unification' has been added.
+*** Limited support for character 'unification' has been added.
Emacs now knows how to translate between different representations of
the same characters in various Emacs charsets according to standard
Unicode mappings. This applies mainly to characters in the ISO 8859
@@ -1317,7 +1318,7 @@ either Unicode (the mule-unicode charsets) or the iso-8859 charsets,
when possible. The latter are more space-efficient.
This is controlled by user option utf-fragment-on-decoding.
-*** Improved Thai support. A new minor mode `thai-word-mode' (which is
+*** Improved Thai support. A new minor mode 'thai-word-mode' (which is
automatically activated if you select Thai as a language
environment) changes key bindings of most word-oriented commands to
versions which recognize Thai words. Affected commands are
@@ -1335,33 +1336,33 @@ but currently only Devanagari, Malayalam and Tamil are supported.
*** The utf-8/16 coding systems have been enhanced.
By default, untranslatable utf-8 sequences are simply composed into
-single quasi-characters. User option `utf-translate-cjk-mode' (it is
+single quasi-characters. User option 'utf-translate-cjk-mode' (it is
turned on by default) arranges to translate many utf-8 CJK character
sequences into real Emacs characters in a similar way to the Mule-UCS
system. As this loads a fairly big data on demand, people who are not
interested in CJK characters may want to customize it to nil.
You can augment/amend the CJK translation via hash tables
-`ucs-mule-cjk-to-unicode' and `ucs-unicode-to-mule-cjk'. The utf-8
+'ucs-mule-cjk-to-unicode' and 'ucs-unicode-to-mule-cjk'. The utf-8
coding system now also encodes characters from most of Emacs's
one-dimensional internal charsets, specifically the ISO-8859 ones.
The utf-16 coding system is affected similarly.
-*** A UTF-7 coding system is available in the library `utf-7'.
+*** A UTF-7 coding system is available in the library 'utf-7'.
-*** A new coding system `euc-tw' has been added for traditional Chinese
+*** A new coding system 'euc-tw' has been added for traditional Chinese
in CNS encoding; it accepts both Big 5 and CNS as input; on saving,
Big 5 is then converted to CNS.
-*** Many new coding systems are available in the `code-pages' library.
+*** Many new coding systems are available in the 'code-pages' library.
These include complete versions of most of those in codepage.el, based
-on Unicode mappings. `codepage-setup' is now obsolete and is used
+on Unicode mappings. 'codepage-setup' is now obsolete and is used
only in the MS-DOS port of Emacs. All coding systems defined in
-`code-pages' are auto-loaded.
+'code-pages' are auto-loaded.
-*** New variable `utf-translate-cjk-unicode-range' controls which
-Unicode characters to translate in `utf-translate-cjk-mode'.
+*** New variable 'utf-translate-cjk-unicode-range' controls which
+Unicode characters to translate in 'utf-translate-cjk-mode'.
-*** iso-10646-1 (`Unicode') fonts can be used to display any range of
+*** iso-10646-1 ('Unicode') fonts can be used to display any range of
characters encodable by the utf-8 coding system. Just specify the
fontset appropriately.
@@ -1379,7 +1380,7 @@ faces.
*** The face-customization widget has been reworked to be less confusing.
In particular, when you enable a face attribute using the corresponding
-check-box, there's no longer a redundant `*' option in value selection
+check-box, there's no longer a redundant '*' option in value selection
for that attribute; the values you can choose are only those which make
sense for the attribute. When an attribute is de-selected by unchecking
its check-box, then the (now ignored, but still present temporarily in
@@ -1392,24 +1393,24 @@ under the "[State]" button.
** Dired mode:
-*** In Dired's ! command (dired-do-shell-command), `*' and `?' now
+*** In Dired's ! command (dired-do-shell-command), '*' and '?' now
control substitution of the file names only when they are surrounded
by whitespace. This means you can now use them as shell wildcards
-too. If you want to use just plain `*' as a wildcard, type `*""'; the
+too. If you want to use just plain '*' as a wildcard, type '*""'; the
double quotes make no difference in the shell, but they prevent
-special treatment in `dired-do-shell-command'.
+special treatment in 'dired-do-shell-command'.
-*** The Dired command `dired-goto-file' is now bound to j, not M-g.
+*** The Dired command 'dired-goto-file' is now bound to j, not M-g.
This is to avoid hiding the global key binding of M-g.
-*** New faces dired-header, dired-mark, dired-marked, dired-flagged,
-dired-ignored, dired-directory, dired-symlink, dired-warning
+*** New faces 'dired-header', 'dired-mark', 'dired-marked', 'dired-flagged',
+'dired-ignored', 'dired-directory', 'dired-symlink', 'dired-warning'
introduced for Dired mode instead of font-lock faces.
-*** New Dired command `dired-compare-directories' marks files
+*** New Dired command 'dired-compare-directories' marks files
with different file attributes in two dired buffers.
-*** New Dired command `dired-do-touch' (bound to T) changes timestamps
+*** New Dired command 'dired-do-touch' (bound to T) changes timestamps
of marked files with the value entered in the minibuffer.
*** In Dired, the w command now stores the current line's file name
@@ -1418,13 +1419,13 @@ into the kill ring. With a zero prefix arg, it stores the absolute file name.
*** In Dired-x, Omitting files is now a minor mode, dired-omit-mode.
The mode toggling command is bound to M-o. A new command
-dired-mark-omitted, bound to * O, marks omitted files. The variable
-dired-omit-files-p is obsoleted, use the mode toggling function
+'dired-mark-omitted', bound to * O, marks omitted files. The variable
+'dired-omit-files-p' is obsoleted, use the mode toggling function
instead.
-*** The variables dired-free-space-program and dired-free-space-args
-have been renamed to directory-free-space-program and
-directory-free-space-args, and they now apply whenever Emacs puts a
+*** The variables 'dired-free-space-program' and 'dired-free-space-args'
+have been renamed to 'directory-free-space-program' and
+'directory-free-space-args', and they now apply whenever Emacs puts a
directory listing into a buffer.
** Comint changes:
@@ -1436,33 +1437,33 @@ to know whether they are started inside Emacs should check INSIDE_EMACS
instead of EMACS.
*** The comint prompt can now be made read-only, using the new user
-option `comint-prompt-read-only'. This is not enabled by default,
+option 'comint-prompt-read-only'. This is not enabled by default,
except in IELM buffers. The read-only status of IELM prompts can be
-controlled with the new user option `ielm-prompt-read-only', which
-overrides `comint-prompt-read-only'.
+controlled with the new user option 'ielm-prompt-read-only', which
+overrides 'comint-prompt-read-only'.
-The new commands `comint-kill-whole-line' and `comint-kill-region'
+The new commands 'comint-kill-whole-line' and 'comint-kill-region'
support editing comint buffers with read-only prompts.
-`comint-kill-whole-line' is like `kill-whole-line', but ignores both
+'comint-kill-whole-line' is like 'kill-whole-line', but ignores both
read-only and field properties. Hence, it always kill entire
lines, including any prompts.
-`comint-kill-region' is like `kill-region', except that it ignores
+'comint-kill-region' is like 'kill-region', except that it ignores
read-only properties, if it is safe to do so. This means that if any
part of a prompt is deleted, then the entire prompt must be deleted
and that all prompts must stay at the beginning of a line. If this is
-not the case, then `comint-kill-region' behaves just like
-`kill-region' if read-only properties are involved: it copies the text
+not the case, then 'comint-kill-region' behaves just like
+'kill-region' if read-only properties are involved: it copies the text
to the kill-ring, but does not delete it.
-*** The new command `comint-insert-previous-argument' in comint-derived
+*** The new command 'comint-insert-previous-argument' in comint-derived
modes (shell-mode, etc.) inserts arguments from previous command lines,
-like bash's `ESC .' binding. It is bound by default to `C-c .', but
+like bash's 'ESC .' binding. It is bound by default to 'C-c .', but
otherwise behaves quite similarly to the bash version.
-*** `comint-use-prompt-regexp-instead-of-fields' has been renamed
-`comint-use-prompt-regexp'. The old name has been kept as an alias,
+*** 'comint-use-prompt-regexp-instead-of-fields' has been renamed
+'comint-use-prompt-regexp'. The old name has been kept as an alias,
but declared obsolete.
** M-x Compile changes:
@@ -1471,36 +1472,36 @@ but declared obsolete.
Quite a few more kinds of messages are recognized. Messages that are
recognized as warnings or informational come in orange or green, instead of
-red. Informational messages are by default skipped with `next-error'
-(controlled by `compilation-skip-threshold').
+red. Informational messages are by default skipped with 'next-error'
+(controlled by 'compilation-skip-threshold').
Location data is collected on the fly as the *compilation* buffer changes.
This means you could modify messages to make them point to different files.
This also means you can not go to locations of messages you may have deleted.
-The variable `compilation-error-regexp-alist' has now become customizable. If
+The variable 'compilation-error-regexp-alist' has now become customizable. If
you had added your own regexps to this, you'll probably need to include a
-leading `^', otherwise they'll match anywhere on a line. There is now also a
-`compilation-mode-font-lock-keywords' and it nicely handles all the checks
+leading '^', otherwise they'll match anywhere on a line. There is now also a
+'compilation-mode-font-lock-keywords' and it nicely handles all the checks
that configure outputs and -o options so you see at a glance where you are.
The new file etc/compilation.txt gives examples of each type of message.
-*** New user option `compilation-environment'.
+*** New user option 'compilation-environment'.
This option allows you to specify environment variables for inferior
compilation processes without affecting the environment that all
subprocesses inherit.
-*** New user option `compilation-disable-input'.
+*** New user option 'compilation-disable-input'.
If this is non-nil, send end-of-file as compilation process input.
-*** New options `next-error-highlight' and `next-error-highlight-no-select'
+*** New options 'next-error-highlight' and 'next-error-highlight-no-select'
specify the method of highlighting of the corresponding source line
-in new face `next-error'.
+in new face 'next-error'.
-*** A new minor mode `next-error-follow-minor-mode' can be used in
-compilation-mode, grep-mode, occur-mode, and diff-mode (i.e. all the
-modes that can use `next-error'). In this mode, cursor motion in the
+*** A new minor mode 'next-error-follow-minor-mode' can be used in
+'compilation-mode', 'grep-mode', 'occur-mode', and 'diff-mode' (i.e. all the
+modes that can use 'next-error'). In this mode, cursor motion in the
buffer causes automatic display in another window of the corresponding
matches, compilation errors, etc. This minor mode can be toggled with
C-c C-f.
@@ -1508,7 +1509,7 @@ C-c C-f.
*** When the left fringe is displayed, an arrow points to current message in
the compilation buffer.
-*** The new variable `compilation-context-lines' controls lines of leading
+*** The new variable 'compilation-context-lines' controls lines of leading
context before the current message. If nil and the left fringe is displayed,
it doesn't scroll the compilation output window. If there is no left fringe,
no arrow is displayed and a value of nil means display the message at the top
@@ -1516,9 +1517,9 @@ of the window.
** Occur mode changes:
-*** The new command `multi-occur' is just like `occur', except it can
+*** The new command 'multi-occur' is just like 'occur', except it can
search multiple buffers. There is also a new command
-`multi-occur-in-matching-buffers' which allows you to specify the
+'multi-occur-in-matching-buffers' which allows you to specify the
buffers to search by their filenames or buffer names. Internally,
Occur mode has been rewritten, and now uses font-lock, among other
changes.
@@ -1526,7 +1527,7 @@ changes.
*** You can now use next-error (C-x `) and previous-error to advance to
the next/previous matching line found by M-x occur.
-*** In the *Occur* buffer, `o' switches to it in another window, and
+*** In the *Occur* buffer, 'o' switches to it in another window, and
C-o displays the current line's occurrence in another window without
switching to it.
@@ -1537,75 +1538,75 @@ switching to it.
There's a new separate package grep.el, with its own submenu and
customization group.
-*** `grep-find' is now also available under the name `find-grep' where
-people knowing `find-grep-dired' would probably expect it.
+*** 'grep-find' is now also available under the name 'find-grep' where
+people knowing 'find-grep-dired' would probably expect it.
-*** New commands `lgrep' (local grep) and `rgrep' (recursive grep) are
-more user-friendly versions of `grep' and `grep-find', which prompt
+*** New commands 'lgrep' (local grep) and 'rgrep' (recursive grep) are
+more user-friendly versions of 'grep' and 'grep-find', which prompt
separately for the regular expression to match, the files to search,
and the base directory for the search. Case sensitivity of the
-search is controlled by the current value of `case-fold-search'.
+search is controlled by the current value of 'case-fold-search'.
These commands build the shell commands based on the new variables
-`grep-template' (lgrep) and `grep-find-template' (rgrep).
+'grep-template' (lgrep) and 'grep-find-template' (rgrep).
-The files to search can use aliases defined in `grep-files-aliases'.
+The files to search can use aliases defined in 'grep-files-aliases'.
-Subdirectories listed in `grep-find-ignored-directories' such as those
+Subdirectories listed in 'grep-find-ignored-directories' such as those
typically used by various version control systems, like CVS and arch,
-are automatically skipped by `rgrep'.
+are automatically skipped by 'rgrep'.
*** The grep commands provide highlighting support.
Hits are fontified in green, and hits in binary files in orange. Grep buffers
can be saved and automatically revisited.
-*** New option `grep-highlight-matches' highlights matches in *grep*
+*** New option 'grep-highlight-matches' highlights matches in *grep*
buffer. It uses a special feature of some grep programs which accept
--color option to output markers around matches. When going to the next
-match with `next-error' the exact match is highlighted in the source
-buffer. Otherwise, if `grep-highlight-matches' is nil, the whole
+match with 'next-error' the exact match is highlighted in the source
+buffer. Otherwise, if 'grep-highlight-matches' is nil, the whole
source line is highlighted.
*** New key bindings in grep output window:
SPC and DEL scrolls window up and down. C-n and C-p moves to next and
previous match in the grep window. RET jumps to the source line of
-the current match. `n' and `p' shows next and previous match in
-other window, but does not switch buffer. `{' and `}' jumps to the
+the current match. 'n' and 'p' shows next and previous match in
+other window, but does not switch buffer. '{' and '}' jumps to the
previous or next file in the grep output. TAB also jumps to the next
file.
-*** M-x grep now tries to avoid appending `/dev/null' to the command line
-by using GNU grep `-H' option instead. M-x grep automatically
+*** M-x grep now tries to avoid appending '/dev/null' to the command line
+by using GNU grep '-H' option instead. M-x grep automatically
detects whether this is possible or not the first time it is invoked.
-When `-H' is used, the grep command line supplied by the user is passed
+When '-H' is used, the grep command line supplied by the user is passed
unchanged to the system to execute, which allows more complicated
command lines to be used than was possible before.
-*** The new variables `grep-window-height' and `grep-scroll-output' override
+*** The new variables 'grep-window-height' and 'grep-scroll-output' override
the corresponding compilation mode settings, for grep commands only.
** Cursor display changes:
*** Emacs can produce an underscore-like (horizontal bar) cursor.
-The underscore cursor is set by putting `(cursor-type . hbar)' in
-default-frame-alist. It supports variable heights, like the `bar'
+The underscore cursor is set by putting '(cursor-type . hbar)' in
+'default-frame-alist'. It supports variable heights, like the 'bar'
cursor does.
-*** The variable `cursor-in-non-selected-windows' can now be set to any
+*** The variable 'cursor-in-non-selected-windows' can now be set to any
of the recognized cursor types.
*** Display of hollow cursors now obeys the buffer-local value (if any)
-of `cursor-in-non-selected-windows' in the buffer that the cursor
+of 'cursor-in-non-selected-windows' in the buffer that the cursor
appears in.
-*** On text terminals, the variable `visible-cursor' controls whether Emacs
+*** On text terminals, the variable 'visible-cursor' controls whether Emacs
uses the "very visible" cursor (the default) or the normal cursor.
*** The X resource cursorBlink can be used to turn off cursor blinking.
*** On X, MS Windows, and Mac OS, the blinking cursor's "off" state is
-now controlled by the variable `blink-cursor-alist'.
+now controlled by the variable 'blink-cursor-alist'.
** X Windows Support:
@@ -1614,8 +1615,8 @@ opens it, dropping text inserts the text. Dropping a file on a dired
buffer copies or moves the file to that directory.
*** Under X11, it is possible to swap Alt and Meta (and Super and Hyper).
-The new variables `x-alt-keysym', `x-hyper-keysym', `x-meta-keysym',
-and `x-super-keysym' can be used to choose which keysyms Emacs should
+The new variables 'x-alt-keysym', 'x-hyper-keysym', 'x-meta-keysym',
+and 'x-super-keysym' can be used to choose which keysyms Emacs should
use for the modifiers. For example, the following two lines swap
Meta and Alt:
(setq x-alt-keysym 'meta)
@@ -1624,10 +1625,10 @@ Meta and Alt:
*** The X resource useXIM can be used to turn off use of XIM, which can
speed up Emacs with slow networking to the X server.
-If the configure option `--without-xim' was used to turn off use of
+If the configure option '--without-xim' was used to turn off use of
XIM by default, the X resource useXIM can be used to turn it on.
-*** The new variable `x-select-request-type' controls how Emacs
+*** The new variable 'x-select-request-type' controls how Emacs
requests X selection. The default value is nil, which means that
Emacs requests X selection with types COMPOUND_TEXT and UTF8_STRING,
and use the more appropriately result.
@@ -1658,13 +1659,13 @@ mode for a tty color support. It is meant to be used on character
terminals whose capabilities are not set correctly in the terminal
database, or with terminal emulators which support colors, but don't
set the TERM environment variable to a name of a color-capable
-terminal. "emacs --color" uses the same color commands as GNU `ls'
+terminal. "emacs --color" uses the same color commands as GNU 'ls'
when invoked with "ls --color", so if your terminal can support colors
in "ls --color", it will support "emacs --color" as well. See the
user manual for the possible values of the MODE parameter.
*** Emacs now supports several character terminals which provide more
-than 8 colors. For example, for `xterm', 16-color, 88-color, and
+than 8 colors. For example, for 'xterm', 16-color, 88-color, and
256-color modes are supported. Emacs automatically notes at startup
the extended number of colors, and defines the appropriate entries for
all of these colors.
@@ -1675,16 +1676,16 @@ faces when running on a color terminal, including 16-, 88-, and
88-color or 256-color xterm, you will see essentially the same face
colors as on X.
-*** There's a new support for colors on `rxvt' terminal emulator.
+*** There's a new support for colors on 'rxvt' terminal emulator.
** ebnf2ps changes:
-*** New option `ebnf-arrow-extra-width' which specify extra width for arrow
+*** New option 'ebnf-arrow-extra-width' which specify extra width for arrow
shape drawing.
The extra width is used to avoid that the arrowhead and the terminal border
-overlap. It depends on `ebnf-arrow-shape' and `ebnf-line-width'.
+overlap. It depends on 'ebnf-arrow-shape' and 'ebnf-line-width'.
-*** New option `ebnf-arrow-scale' which specify the arrow scale.
+*** New option 'ebnf-arrow-scale' which specify the arrow scale.
Values lower than 1.0, shrink the arrow.
Values greater than 1.0, expand the arrow.
@@ -1695,11 +1696,11 @@ Values greater than 1.0, expand the arrow.
The new cua package provides CUA-like keybindings using C-x for
cut (kill), C-c for copy, C-v for paste (yank), and C-z for undo.
With cua, the region can be set and extended using shifted movement
-keys (like pc-selection-mode) and typed text replaces the active
-region (like delete-selection-mode). Do not enable these modes with
-cua-mode. Customize the variable `cua-mode' to enable cua.
+keys (like 'pc-selection-mode') and typed text replaces the active
+region (like 'delete-selection-mode'). Do not enable these modes with
+cua-mode. Customize the variable 'cua-mode' to enable cua.
-The cua-selection-mode enables the CUA keybindings for the region but
+The 'cua-selection-mode' enables the CUA keybindings for the region but
does not change the bindings for C-z/C-x/C-c/C-v. It can be used as a
replacement for pc-selection-mode.
@@ -1708,7 +1709,7 @@ rectangle highlighting: Use C-return to start a rectangle, extend it
using the movement commands (or mouse-3), and cut or copy it using C-x
or C-c (using C-w and M-w also works).
-Use M-o and M-c to `open' or `close' the rectangle, use M-b or M-f, to
+Use M-o and M-c to 'open' or 'close' the rectangle, use M-b or M-f, to
fill it with blanks or another character, use M-u or M-l to upcase or
downcase the rectangle, use M-i to increment the numbers in the
rectangle, use M-n to fill the rectangle with a numeric sequence (such
@@ -1731,7 +1732,7 @@ commentary in cua-base.el for more global mark related commands.
The features of cua also works with the standard Emacs bindings for
kill, copy, yank, and undo. If you want to use cua mode, but don't
want the C-x, C-c, C-v, and C-z bindings, you can customize the
-`cua-enable-cua-keys' variable.
+'cua-enable-cua-keys' variable.
Note: This version of cua mode is not backwards compatible with older
versions of cua.el and cua-mode.el. To ensure proper operation, you
@@ -1745,13 +1746,13 @@ files. But whereas Ange-FTP uses FTP to access the remote host,
Tramp uses a shell connection. The shell connection is always used
for filename completion and directory listings and suchlike, but for
the actual file transfer, you can choose between the so-called
-`inline' methods (which transfer the files through the shell
-connection using base64 or uu encoding) and the `out-of-band' methods
-(which invoke an external copying program such as `rcp' or `scp' or
-`rsync' to do the copying).
+'inline' methods (which transfer the files through the shell
+connection using base64 or uu encoding) and the 'out-of-band' methods
+(which invoke an external copying program such as 'rcp' or 'scp' or
+'rsync' to do the copying).
-Shell connections can be acquired via `rsh', `ssh', `telnet' and also
-`su' and `sudo'. Ange-FTP is still supported via the `ftp' method.
+Shell connections can be acquired via 'rsh', 'ssh', 'telnet' and also
+'su' and 'sudo'. Ange-FTP is still supported via the 'ftp' method.
If you want to disable Tramp you should set
@@ -1760,7 +1761,7 @@ If you want to disable Tramp you should set
Removing Tramp, and re-enabling Ange-FTP, can be achieved by M-x
tramp-unload-tramp.
-** The image-dired.el package allows you to easily view, tag and in
+** The 'image-dired' package allows you to easily view, tag and in
other ways manipulate image files and their thumbnails, using dired as
the main interface. Image-Dired provides functionality to generate
simple image galleries.
@@ -1775,11 +1776,11 @@ between viewing the image and viewing the text using C-c C-c.
** Calc is now part of the Emacs distribution.
Calc is an advanced desk calculator and mathematical tool written in
-Emacs Lisp. The prefix for Calc has been changed to `C-x *' and Calc
-can be started with `C-x * *'. The Calc manual is separate from the
+Emacs Lisp. The prefix for Calc has been changed to 'C-x *' and Calc
+can be started with 'C-x * *'. The Calc manual is separate from the
Emacs manual; within Emacs, type "C-h i m calc RET" to read the
-manual. A reference card is available in `etc/calccard.tex' and
-`etc/calccard.ps'.
+manual. A reference card is available in 'etc/calccard.tex' and
+'etc/calccard.ps'.
** Org mode is now part of the Emacs distribution
@@ -1791,9 +1792,9 @@ capabilities.
The Org mode table editor can be integrated into any major mode by
activating the minor mode, Orgtbl mode.
-The documentation for org-mode is in a separate manual; within Emacs,
+The documentation for 'org-mode' is in a separate manual; within Emacs,
type "C-h i m org RET" to read that manual. A reference card is
-available in `etc/orgcard.tex' and `etc/orgcard.ps'.
+available in 'etc/orgcard.tex' and 'etc/orgcard.ps'.
** ERC is now part of the Emacs distribution.
@@ -1818,7 +1819,7 @@ To start an IRC session using the default parameters, type M-x irc.
If you type C-u M-x irc, it prompts you for the server, nick, port and
startup channel parameters before connecting.
-** The new package ibuffer provides a powerful, completely
+** The new package 'ibuffer' provides a powerful, completely
customizable replacement for buff-menu.el.
** Newsticker is now part of the Emacs distribution.
@@ -1838,12 +1839,12 @@ package to do interactive opening of files and directories in addition
to interactive buffer switching. Ido is a superset of iswitchb (with
a few exceptions), so don't enable both packages.
-** The new global minor mode `file-name-shadow-mode' modifies the way
+** The new global minor mode 'file-name-shadow-mode' modifies the way
filenames being entered by the user in the minibuffer are displayed, so
that it's clear when part of the entered filename will be ignored due to
Emacs' filename parsing rules. The ignored portion can be made dim,
invisible, or otherwise less visually noticeable. The display method can
-be displayed by customizing the variable `file-name-shadow-properties'.
+be displayed by customizing the variable 'file-name-shadow-properties'.
** Emacs' keyboard macro facilities have been enhanced by the new
kmacro package.
@@ -1870,9 +1871,9 @@ The C-x e command now automatically terminates the current macro
before calling it, if used while defining a macro.
In addition, when ending or calling a macro with C-x e, the macro can
-be repeated immediately by typing just the `e'. You can customize
-this behavior via the variables kmacro-call-repeat-key and
-kmacro-call-repeat-with-arg.
+be repeated immediately by typing just the 'e'. You can customize
+this behavior via the variables 'kmacro-call-repeat-key' and
+'kmacro-call-repeat-with-arg'.
Keyboard macros can now be debugged and edited interactively.
C-x C-k SPC steps through the last keyboard macro one key sequence
@@ -1884,21 +1885,21 @@ keypad typically has the digits 0 to 9, a decimal point, keys marked
+, -, /, and *, an Enter key, and a NumLock toggle key. The keypad
package only controls the use of the digit and decimal keys.
-By customizing the variables `keypad-setup', `keypad-shifted-setup',
-`keypad-numlock-setup', and `keypad-numlock-shifted-setup', or by
-using the function `keypad-setup', you can rebind all digit keys and
+By customizing the variables 'keypad-setup', 'keypad-shifted-setup',
+'keypad-numlock-setup', and 'keypad-numlock-shifted-setup', or by
+using the function 'keypad-setup', you can rebind all digit keys and
the decimal key of the keypad in one step for each of the four
possible combinations of the Shift key state (not pressed/pressed) and
the NumLock toggle state (off/on).
The choices for the keypad keys in each of the above states are:
-`Plain numeric keypad' where the keys generates plain digits,
-`Numeric keypad with decimal key' where the character produced by the
+'Plain numeric keypad' where the keys generates plain digits,
+'Numeric keypad with decimal key' where the character produced by the
decimal key can be customized individually (for internationalization),
-`Numeric Prefix Arg' where the keypad keys produce numeric prefix args
-for Emacs editing commands, `Cursor keys' and `Shifted Cursor keys'
+'Numeric Prefix Arg' where the keypad keys produce numeric prefix args
+for Emacs editing commands, 'Cursor keys' and 'Shifted Cursor keys'
where the keys work like (shifted) arrow keys, home/end, etc., and
-`Unspecified/User-defined' where the keypad keys (kp-0, kp-1, etc.)
+'Unspecified/User-defined' where the keypad keys (kp-0, kp-1, etc.)
are left unspecified and can be bound individually through the global
or local keymaps.
@@ -1909,17 +1910,17 @@ the .emacs file, the normal Print item on the File menu is replaced
with a Print sub-menu which allows you to preview output through
ghostview, use ghostscript to print (if you don't have a PostScript
printer) or send directly to printer a PostScript code generated by
-`ps-print' package. Use M-x pr-help for more information.
+'ps-print' package. Use M-x pr-help for more information.
** The new package longlines.el provides a minor mode for editing text
-files composed of long lines, based on the `use-hard-newlines'
+files composed of long lines, based on the 'use-hard-newlines'
mechanism. The long lines are broken up by inserting soft newlines,
which are automatically removed when saving the file to disk or
copying into the kill ring, clipboard, etc. By default, Longlines
mode inserts soft newlines automatically during editing, a behavior
referred to as "soft word wrap" in other text editors. This is
similar to Refill mode, but more reliable. To turn the word wrap
-feature off, set `longlines-auto-wrap' to nil.
+feature off, set 'longlines-auto-wrap' to nil.
** SES mode (ses-mode) is a new major mode for creating and editing
spreadsheet files. Besides the usual Emacs features (intuitive command
@@ -1927,7 +1928,7 @@ letters, undo, cell formulas in Lisp, plaintext files, etc.) it also offers
viral immunity and import/export of tab-separated values.
** The new package table.el implements editable, WYSIWYG, embedded
-`text tables' in Emacs buffers. It simulates the effect of putting
+'text tables' in Emacs buffers. It simulates the effect of putting
these tables in a special major mode. The package emulates WYSIWYG
table editing available in modern word processors. The package also
can generate a table source in typesetting and markup languages such
@@ -1950,17 +1951,17 @@ There is also Global Reveal mode which affects all buffers.
** New minor mode, Visible mode, toggles invisibility in the current buffer.
When enabled, it makes all invisible text visible. When disabled, it
-restores the previous value of `buffer-invisibility-spec'.
+restores the previous value of 'buffer-invisibility-spec'.
** The new package flymake.el does on-the-fly syntax checking of program
source files. See the Flymake's Info manual for more details.
** savehist saves minibuffer histories between sessions.
-To use this feature, turn on savehist-mode in your `.emacs' file.
+To use this feature, turn on 'savehist-mode' in your '.emacs' file.
-** The ruler-mode.el library provides a minor mode for displaying an
+** The 'ruler-mode' library provides a minor mode for displaying an
"active" ruler in the header line. You can use the mouse to visually
-change the `fill-column', `window-margins' and `tab-stop-list'
+change the 'fill-column', 'window-margins' and 'tab-stop-list'
settings.
** The file t-mouse.el is now part of Emacs and provides access to mouse
@@ -1973,10 +1974,10 @@ paragraph will scroll the buffer by the respective amount of lines
instead and point will be kept vertically fixed relative to window
boundaries during scrolling.
-** The new global minor mode `size-indication-mode' (off by default)
+** The new global minor mode 'size-indication-mode' (off by default)
shows the size of accessible part of the buffer on the mode line.
-** The new package conf-mode.el handles thousands of configuration files, with
+** The new package 'conf-mode' handles thousands of configuration files, with
varying syntaxes for comments (;, #, //, /* */ or !), assignment (var = value,
var : value, var value or keyword var value) and sections ([section] or
section { }). Many files under /etc/, or with suffixes like .cf through
@@ -1985,10 +1986,10 @@ recognized.
** GDB-Script-mode is used for files like .gdbinit.
-** The new package dns-mode.el adds syntax highlighting of DNS master files.
-It is a modern replacement for zone-mode.el, which is now obsolete.
+** The new package 'dns-mode' adds syntax highlighting of DNS master files.
+It is a modern replacement for 'zone-mode', which is now obsolete.
-** `cfengine-mode' is a major mode for editing GNU Cfengine
+** 'cfengine-mode' is a major mode for editing GNU Cfengine
configuration files.
** The TCL package tcl-mode.el was replaced by tcl.el.
@@ -2012,10 +2013,10 @@ Info pages show embedded images, in Emacs frames with image support.
Info documentation that includes images, processed with makeinfo
version 4.7 or newer, compiles to Info pages with embedded images.
-*** `Info-index' offers completion.
+*** 'Info-index' offers completion.
*** http and ftp links in Info are now operational: they look like cross
-references and following them calls `browse-url'.
+references and following them calls 'browse-url'.
*** isearch in Info uses Info-search and searches through multiple nodes.
@@ -2023,43 +2024,43 @@ Before leaving the initial Info node isearch fails once with the error
message [initial node], and with subsequent C-s/C-r continues through
other nodes. When isearch fails for the rest of the manual, it wraps
around the whole manual to the top/final node. The user option
-`Info-isearch-search' controls whether to use Info-search for isearch,
+'Info-isearch-search' controls whether to use Info-search for isearch,
or the default isearch search function that wraps around the current
Info node.
-*** New search commands: `Info-search-case-sensitively' (bound to S),
-`Info-search-backward', and `Info-search-next' which repeats the last
+*** New search commands: 'Info-search-case-sensitively' (bound to S),
+'Info-search-backward', and 'Info-search-next' which repeats the last
search without prompting for a new search string.
-*** New command `info-apropos' searches the indices of the known
+*** New command 'info-apropos' searches the indices of the known
Info files on your system for a string, and builds a menu of the
possible matches.
-*** New command `Info-history-forward' (bound to r and new toolbar icon)
+*** New command 'Info-history-forward' (bound to r and new toolbar icon)
moves forward in history to the node you returned from after using
-`Info-history-back' (renamed from `Info-last').
+'Info-history-back' (renamed from 'Info-last').
-*** New command `Info-history' (bound to L) displays a menu of visited nodes.
+*** New command 'Info-history' (bound to L) displays a menu of visited nodes.
-*** New command `Info-toc' (bound to T) creates a node with table of contents
+*** New command 'Info-toc' (bound to T) creates a node with table of contents
from the tree structure of menus of the current Info file.
-*** New command `Info-copy-current-node-name' (bound to w) copies
+*** New command 'Info-copy-current-node-name' (bound to w) copies
the current Info node name into the kill ring. With a zero prefix
-arg, puts the node name inside the `info' function call.
+arg, puts the node name inside the 'info' function call.
-*** New face `info-xref-visited' distinguishes visited nodes from unvisited
-and a new option `Info-fontify-visited-nodes' to control this.
+*** New face 'info-xref-visited' distinguishes visited nodes from unvisited
+and a new option 'Info-fontify-visited-nodes' to control this.
-*** A numeric prefix argument of `info' selects an Info buffer
-with the number appended to the `*info*' buffer name (e.g. "*info*<2>").
+*** A numeric prefix argument of 'info' selects an Info buffer
+with the number appended to the '*info*' buffer name (e.g. "*info*<2>").
*** Info now hides node names in menus and cross references by default.
If you prefer the old behavior, you can set the new user option
-`Info-hide-note-references' to nil.
+'Info-hide-note-references' to nil.
-*** The default value for `Info-scroll-prefer-subnodes' is now nil.
+*** The default value for 'Info-scroll-prefer-subnodes' is now nil.
** Emacs server changes
@@ -2070,27 +2071,27 @@ If you prefer the old behavior, you can set the new user option
% emacsclient -s foo file1
% emacsclient -s bar file2
-*** The `emacsclient' command understands the options `--eval' and
-`--display' which tell Emacs respectively to evaluate the given Lisp
+*** The 'emacsclient' command understands the options '--eval' and
+'--display' which tell Emacs respectively to evaluate the given Lisp
expression and to use the given display when visiting files.
-*** User option `server-mode' can be used to start a server process.
+*** User option 'server-mode' can be used to start a server process.
** Locate changes
*** By default, reverting the *Locate* buffer now just runs the last
-`locate' command back over again without offering to update the locate
+'locate' command back over again without offering to update the locate
database (which normally only works if you have root privileges). If
you prefer the old behavior, set the new customizable option
-`locate-update-when-revert' to t.
+'locate-update-when-revert' to t.
** Desktop package
-*** Desktop saving is now a minor mode, `desktop-save-mode'.
+*** Desktop saving is now a minor mode, 'desktop-save-mode'.
-*** The variable `desktop-enable' is obsolete.
+*** The variable 'desktop-enable' is obsolete.
-Customize `desktop-save-mode' to enable desktop saving.
+Customize 'desktop-save-mode' to enable desktop saving.
*** Buffers are saved in the desktop file in the same order as that in the
buffer list.
@@ -2102,58 +2103,58 @@ idle).
*** New command line option --no-desktop
*** New commands:
- - desktop-revert reverts to the last loaded desktop.
- - desktop-change-dir kills current desktop and loads a new.
- - desktop-save-in-desktop-dir saves desktop in the directory from which
- it was loaded.
- - desktop-lazy-complete runs the desktop load to completion.
- - desktop-lazy-abort aborts lazy loading of the desktop.
+- 'desktop-revert' reverts to the last loaded desktop.
+- 'desktop-change-dir' kills current desktop and loads a new.
+- 'desktop-save-in-desktop-dir' saves desktop in the directory from which
+ it was loaded.
+- 'desktop-lazy-complete' runs the desktop load to completion.
+- 'desktop-lazy-abort' aborts lazy loading of the desktop.
*** New customizable variables:
- - desktop-save. Determines whether the desktop should be saved when it is
- killed.
- - desktop-file-name-format. Format in which desktop file names should be saved.
- - desktop-path. List of directories in which to lookup the desktop file.
- - desktop-locals-to-save. List of local variables to save.
- - desktop-globals-to-clear. List of global variables that `desktop-clear' will clear.
- - desktop-clear-preserve-buffers-regexp. Regexp identifying buffers that `desktop-clear'
- should not delete.
- - desktop-restore-eager. Number of buffers to restore immediately. Remaining buffers are
- restored lazily (when Emacs is idle).
- - desktop-lazy-verbose. Verbose reporting of lazily created buffers.
- - desktop-lazy-idle-delay. Idle delay before starting to create buffers.
+- 'desktop-save'. Determines whether the desktop should be saved when it is
+ killed.
+- 'desktop-file-name-format'. Format in which desktop file names should be saved.
+- 'desktop-path'. List of directories in which to lookup the desktop file.
+- 'desktop-locals-to-save'. List of local variables to save.
+- 'desktop-globals-to-clear'. List of global variables that 'desktop-clear' will clear.
+- 'desktop-clear-preserve-buffers-regexp'. Regexp identifying buffers that 'desktop-clear'
+ should not delete.
+- 'desktop-restore-eager'. Number of buffers to restore immediately. Remaining buffers are
+ restored lazily (when Emacs is idle).
+- 'desktop-lazy-verbose'. Verbose reporting of lazily created buffers.
+- 'desktop-lazy-idle-delay'. Idle delay before starting to create buffers.
*** New hooks:
- - desktop-after-read-hook run after a desktop is loaded.
- - desktop-no-desktop-file-hook run when no desktop file is found.
+- 'desktop-after-read-hook' run after a desktop is loaded.
+- 'desktop-no-desktop-file-hook' run when no desktop file is found.
** Recentf changes
-The recent file list is now automatically cleaned up when recentf mode is
-enabled. The new option `recentf-auto-cleanup' controls when to do
+The recent file list is now automatically cleaned up when 'recentf-mode' is
+enabled. The new option 'recentf-auto-cleanup' controls when to do
automatic cleanup.
The ten most recent files can be quickly opened by using the shortcut
keys 1 to 9, and 0, when the recent list is displayed in a buffer via
-the `recentf-open-files', or `recentf-open-more-files' commands.
+the 'recentf-open-files', or 'recentf-open-more-files' commands.
-The `recentf-keep' option replaces `recentf-keep-non-readable-files-p'
+The 'recentf-keep' option replaces 'recentf-keep-non-readable-files-p'
and provides a more general mechanism to customize which file names to
keep in the recent list.
-With the more advanced option `recentf-filename-handlers', you can
+With the more advanced option 'recentf-filename-handlers', you can
specify functions that successively transform recent file names. For
-example, if set to `file-truename' plus `abbreviate-file-name', the
+example, if set to 'file-truename' plus 'abbreviate-file-name', the
same file will not be in the recent list with different symbolic
links, and the file name will be abbreviated.
-To follow naming convention, `recentf-menu-append-commands-flag'
-replaces the misnamed option `recentf-menu-append-commands-p'. The
+To follow naming convention, 'recentf-menu-append-commands-flag'
+replaces the misnamed option 'recentf-menu-append-commands-p'. The
old name remains available as alias, but has been marked obsolete.
** Auto-Revert changes
-*** You can now use Auto Revert mode to `tail' a file.
+*** You can now use Auto Revert mode to 'tail' a file.
If point is at the end of a file buffer before reverting, Auto Revert
mode keeps it at the end after reverting. Similarly if point is
@@ -2165,20 +2166,20 @@ dependent.
If you are sure that the file will only change by growing at the end,
then you can tail the file more efficiently by using the new minor
-mode Auto Revert Tail mode. The function `auto-revert-tail-mode'
+mode Auto Revert Tail mode. The function 'auto-revert-tail-mode'
toggles this mode.
*** Auto Revert mode is now more careful to avoid excessive reverts and
other potential problems when deciding which non-file buffers to
revert. This matters especially if Global Auto Revert mode is enabled
-and `global-auto-revert-non-file-buffers' is non-nil. Auto Revert
+and 'global-auto-revert-non-file-buffers' is non-nil. Auto Revert
mode only reverts a non-file buffer if the buffer has a non-nil
-`revert-buffer-function' and a non-nil `buffer-stale-function', which
+'revert-buffer-function' and a non-nil 'buffer-stale-function', which
decides whether the buffer should be reverted. Currently, this means
that auto reverting works for Dired buffers (although this may not
work properly on all operating systems) and for the Buffer Menu.
-*** If the new user option `auto-revert-check-vc-info' is non-nil, Auto
+*** If the new user option 'auto-revert-check-vc-info' is non-nil, Auto
Revert mode reliably updates version control info (such as the version
control number in the mode line), in all version controlled buffers in
which it is active. If the option is nil, the default, then this info
@@ -2192,11 +2193,11 @@ is similar to the way sequential output to a terminal works.)
** Changes in Hi Lock
-*** hi-lock-mode now only affects a single buffer, and a new function
-`global-hi-lock-mode' enables Hi Lock in all buffers. By default, if
+*** 'hi-lock-mode' now only affects a single buffer, and a new function
+'global-hi-lock-mode' enables Hi Lock in all buffers. By default, if
hi-lock-mode is used in what appears to be the initialization file, a
warning message suggests to use global-hi-lock-mode instead. However,
-if the new variable `hi-lock-archaic-interface-deduce' is non-nil,
+if the new variable 'hi-lock-archaic-interface-deduce' is non-nil,
using hi-lock-mode in an initialization file will turn on Hi Lock in all
buffers and no warning will be issued (for compatibility with the
behavior in older versions of Emacs).
@@ -2214,7 +2215,7 @@ allout-encryption customization group.
*** Default command prefix was changed to "\C-c " (control-c space), to
avoid intruding on user's keybinding space. Customize the
-`allout-command-prefix' variable to your preference.
+'allout-command-prefix' variable to your preference.
*** Some previously rough topic-header format edge cases are reconciled.
Level 1 topics use the mode's comment format, and lines starting with the
@@ -2247,29 +2248,29 @@ leaving them hidden or raising an error.
*** Navigation within an item is easier. Repeated beginning-of-line and
end-of-line key commands (usually, ^A and ^E) cycle through the
beginning/end-of-line and then beginning/end of topic, etc. See new
-customization vars `allout-beginning-of-line-cycles' and
-`allout-end-of-line-cycles'.
+customization vars 'allout-beginning-of-line-cycles' and
+'allout-end-of-line-cycles'.
*** New or revised allout-mode activity hooks enable creation of
cooperative enhancements to allout mode without changes to the mode,
itself.
-See `allout-exposure-change-hook', `allout-structure-added-hook',
-`allout-structure-deleted-hook', and `allout-structure-shifted-hook'.
+See 'allout-exposure-change-hook', 'allout-structure-added-hook',
+'allout-structure-deleted-hook', and 'allout-structure-shifted-hook'.
-`allout-exposure-change-hook' replaces the existing
-`allout-view-change-hook', which is being deprecated. Both are still
-invoked, but `allout-view-change-hook' will eventually be ignored.
-`allout-exposure-change-hook' is called with explicit arguments detailing
+'allout-exposure-change-hook' replaces the existing
+'allout-view-change-hook', which is being deprecated. Both are still
+invoked, but 'allout-view-change-hook' will eventually be ignored.
+'allout-exposure-change-hook' is called with explicit arguments detailing
the specifics of each change (as are the other new hooks), making it easier
to use than the old version.
-There is a new mode deactivation hook, `allout-mode-deactivate-hook', for
+There is a new mode deactivation hook, 'allout-mode-deactivate-hook', for
coordinating with deactivation of allout-mode. Both that and the mode
-activation hook, `allout-mode-hook' are now run after the `allout-mode'
+activation hook, 'allout-mode-hook' are now run after the 'allout-mode'
variable is changed, rather than before.
-*** Allout now uses text overlay's `invisible' property for concealed text,
+*** Allout now uses text overlay's 'invisible' property for concealed text,
instead of selective-display. This simplifies the code, in particular
avoiding the need for kludges for isearch dynamic-display, discretionary
handling of edits of concealed text, undo concerns, etc.
@@ -2279,34 +2280,34 @@ handling of edits of concealed text, undo concerns, etc.
- repaired inhibition of inadvertent edits to concealed text, without
inhibiting undo; we now reveal undo changes within concealed text.
- auto-fill-mode is now left inactive when allout-mode starts, if it
- already was inactive. also, `allout-inhibit-auto-fill' custom
+ already was inactive. also, 'allout-inhibit-auto-fill' custom
configuration variable makes it easy to disable auto fill in allout
outlines in general or on a per-buffer basis.
- allout now tolerates fielded text in outlines without disruption.
- hot-spot navigation now is modularized with a new function,
- `allout-hotspot-key-handler', enabling easier use and enhancement of
+ 'allout-hotspot-key-handler', enabling easier use and enhancement of
the functionality in allout addons.
- repaired retention of topic body hanging indent upon topic depth shifts
- bulleting variation is simpler and more accommodating, both in the
default behavior and in ability to vary when creating new topics
- mode deactivation now does cleans up effectively, more properly
restoring affected variables and hooks to former state, removing
- overlays, etc. see `allout-add-resumptions' and
- `allout-do-resumptions', which replace the old `allout-resumptions'.
+ overlays, etc. see 'allout-add-resumptions' and
+ 'allout-do-resumptions', which replace the old 'allout-resumptions'.
- included a few unit-tests for interior functionality. developers can
have them automatically run at the end of module load by customizing
- the option `allout-run-unit-tests-on-load'.
+ the option 'allout-run-unit-tests-on-load'.
- many, many other, more minor tweaks, fixes, and refinements.
- version number incremented to 2.2
** Hideshow mode changes
-*** New variable `hs-set-up-overlay' allows customization of the overlay
+*** New variable 'hs-set-up-overlay' allows customization of the overlay
used to effect hiding for hideshow minor mode. Integration with isearch
-handles the overlay property `display' specially, preserving it during
+handles the overlay property 'display' specially, preserving it during
temporary overlay showing in the course of an isearch operation.
-*** New variable `hs-allow-nesting' non-nil means that hiding a block does
+*** New variable 'hs-allow-nesting' non-nil means that hiding a block does
not discard the hidden state of any "internal" blocks; when the parent
block is later shown, the internal blocks remain hidden. Default is nil.
@@ -2314,30 +2315,30 @@ block is later shown, the internal blocks remain hidden. Default is nil.
*** New ffap commands and keybindings:
-C-x C-r (`ffap-read-only'),
-C-x C-v (`ffap-alternate-file'), C-x C-d (`ffap-list-directory'),
-C-x 4 r (`ffap-read-only-other-window'), C-x 4 d (`ffap-dired-other-window'),
-C-x 5 r (`ffap-read-only-other-frame'), C-x 5 d (`ffap-dired-other-frame').
+C-x C-r ('ffap-read-only'),
+C-x C-v ('ffap-alternate-file'), C-x C-d ('ffap-list-directory'),
+C-x 4 r ('ffap-read-only-other-window'), C-x 4 d ('ffap-dired-other-window'),
+C-x 5 r ('ffap-read-only-other-frame'), C-x 5 d ('ffap-dired-other-frame').
*** FFAP accepts wildcards in a file name by default.
-C-x C-f passes the file name to `find-file' with non-nil WILDCARDS
-argument, which visits multiple files, and C-x d passes it to `dired'.
+C-x C-f passes the file name to 'find-file' with non-nil WILDCARDS
+argument, which visits multiple files, and C-x d passes it to 'dired'.
** Changes in Skeleton
-*** In skeleton.el, `-' marks the `skeleton-point' without interregion interaction.
+*** In skeleton.el, '-' marks the 'skeleton-point' without interregion interaction.
-`@' has reverted to only setting `skeleton-positions' and no longer
-sets `skeleton-point'. Skeletons which used @ to mark
-`skeleton-point' independent of `_' should now use `-' instead. The
-updated `skeleton-insert' docstring explains these new features along
+'@' has reverted to only setting 'skeleton-positions' and no longer
+sets 'skeleton-point'. Skeletons which used @ to mark
+'skeleton-point' independent of '_' should now use '-' instead. The
+updated 'skeleton-insert' docstring explains these new features along
with other details of skeleton construction.
-*** The variables `skeleton-transformation', `skeleton-filter', and
-`skeleton-pair-filter' have been renamed to
-`skeleton-transformation-function', `skeleton-filter-function', and
-`skeleton-pair-filter-function'. The old names are still available
+*** The variables 'skeleton-transformation', 'skeleton-filter', and
+'skeleton-pair-filter' have been renamed to
+'skeleton-transformation-function', 'skeleton-filter-function', and
+'skeleton-pair-filter-function'. The old names are still available
as aliases.
** HTML/SGML changes
@@ -2346,17 +2347,17 @@ as aliases.
automatically.
*** SGML mode has indentation and supports XML syntax.
-The new variable `sgml-xml-mode' tells SGML mode to use XML syntax.
+The new variable 'sgml-xml-mode' tells SGML mode to use XML syntax.
When this option is enabled, SGML tags are inserted in XML style,
i.e., there is always a closing tag.
By default, its setting is inferred on a buffer-by-buffer basis
from the file name or buffer contents.
-*** The variable `sgml-transformation' has been renamed to
-`sgml-transformation-function'. The old name is still available as
+*** The variable 'sgml-transformation' has been renamed to
+'sgml-transformation-function'. The old name is still available as
alias.
-*** `xml-mode' is now an alias for `sgml-mode', which has XML support.
+*** 'xml-mode' is now an alias for 'sgml-mode', which has XML support.
** TeX modes
@@ -2364,9 +2365,9 @@ alias.
*** C-c C-c prompts for a command to run, and tries to offer a good default.
-*** The user option `tex-start-options-string' has been replaced
-by two new user options: `tex-start-options', which should hold
-command-line options to feed to TeX, and `tex-start-commands' which should hold
+*** The user option 'tex-start-options-string' has been replaced
+by two new user options: 'tex-start-options', which should hold
+command-line options to feed to TeX, and 'tex-start-commands' which should hold
TeX commands to use at startup.
*** verbatim environments are now highlighted in courier by font-lock
@@ -2380,121 +2381,121 @@ The new command keys "<" and ">" in the TOC buffer promote/demote the
section at point or all sections in the current region, with full
support for multifile documents.
-The new command `reftex-toc-recenter' (`C-c -') shows the current
+The new command 'reftex-toc-recenter' ('C-c -') shows the current
section in the TOC buffer without selecting the TOC window.
Recentering can happen automatically in idle time when the option
-`reftex-auto-recenter-toc' is turned on. The highlight in the TOC
+'reftex-auto-recenter-toc' is turned on. The highlight in the TOC
buffer stays when the focus moves to a different window. A dedicated
frame can show the TOC with the current section always automatically
highlighted. The frame is created and deleted from the toc buffer
-with the `d' key.
+with the 'd' key.
The toc window can be split off horizontally instead of vertically.
-See new option `reftex-toc-split-windows-horizontally'.
+See new option 'reftex-toc-split-windows-horizontally'.
Labels can be renamed globally from the table of contents using the
-key `M-%'.
+key 'M-%'.
-The new command `reftex-goto-label' jumps directly to a label
+The new command 'reftex-goto-label' jumps directly to a label
location.
*** Changes related to citations and BibTeX database files
Commands that insert a citation now prompt for optional arguments when
called with a prefix argument. Related new options are
-`reftex-cite-prompt-optional-args' and `reftex-cite-cleanup-optional-args'.
+'reftex-cite-prompt-optional-args' and 'reftex-cite-cleanup-optional-args'.
-The new command `reftex-create-bibtex-file' creates a BibTeX database
+The new command 'reftex-create-bibtex-file' creates a BibTeX database
with all entries referenced in the current document. The keys "e" and
"E" allow to produce a BibTeX database file from entries marked in a
citation selection buffer.
-The command `reftex-citation' uses the word in the buffer before the
+The command 'reftex-citation' uses the word in the buffer before the
cursor as a default search string.
The support for chapterbib has been improved. Different chapters can
-now use BibTeX or an explicit `thebibliography' environment.
+now use BibTeX or an explicit 'thebibliography' environment.
The macros which specify the bibliography file (like \bibliography)
-can be configured with the new option `reftex-bibliography-commands'.
+can be configured with the new option 'reftex-bibliography-commands'.
Support for jurabib has been added.
*** Global index matched may be verified with a user function.
During global indexing, a user function can verify an index match.
-See new option `reftex-index-verify-function'.
+See new option 'reftex-index-verify-function'.
*** Parsing documents with many labels can be sped up.
Operating in a document with thousands of labels can be sped up
considerably by allowing RefTeX to derive the type of a label directly
-from the label prefix like `eq:' or `fig:'. The option
-`reftex-trust-label-prefix' needs to be configured in order to enable
+from the label prefix like 'eq:' or 'fig:'. The option
+'reftex-trust-label-prefix' needs to be configured in order to enable
this feature. While the speed-up is significant, this may reduce the
quality of the context offered by RefTeX to describe a label.
*** Miscellaneous changes
The macros which input a file in LaTeX (like \input, \include) can be
-configured in the new option `reftex-include-file-commands'.
+configured in the new option 'reftex-include-file-commands'.
RefTeX supports global incremental search.
** BibTeX mode
-*** The new command `bibtex-url' browses a URL for the BibTeX entry at
+*** The new command 'bibtex-url' browses a URL for the BibTeX entry at
point (bound to C-c C-l and mouse-2, RET on clickable fields).
-*** The new command `bibtex-entry-update' (bound to C-c C-u) updates
+*** The new command 'bibtex-entry-update' (bound to C-c C-u) updates
an existing BibTeX entry by inserting fields that may occur but are not
present.
-*** New `bibtex-entry-format' option `required-fields', enabled by default.
+*** New 'bibtex-entry-format' option 'required-fields', enabled by default.
-*** `bibtex-maintain-sorted-entries' can take values `plain',
-`crossref', and `entry-class' which control the sorting scheme used
-for BibTeX entries. `bibtex-sort-entry-class' controls the sorting
-scheme `entry-class'. TAB completion for reference keys and
+*** 'bibtex-maintain-sorted-entries' can take values 'plain',
+'crossref', and 'entry-class' which control the sorting scheme used
+for BibTeX entries. 'bibtex-sort-entry-class' controls the sorting
+scheme 'entry-class'. TAB completion for reference keys and
automatic detection of duplicates does not require anymore that
-`bibtex-maintain-sorted-entries' is non-nil.
+'bibtex-maintain-sorted-entries' is non-nil.
-*** The new command `bibtex-complete' completes word fragment before
+*** The new command 'bibtex-complete' completes word fragment before
point according to context (bound to M-tab).
-*** In BibTeX mode the command `fill-paragraph' (M-q) fills
+*** In BibTeX mode the command 'fill-paragraph' (M-q) fills
individual fields of a BibTeX entry.
-*** The new variable `bibtex-autofill-types' contains a list of entry
+*** The new variable 'bibtex-autofill-types' contains a list of entry
types for which fields are filled automatically (if possible).
-*** The new commands `bibtex-find-entry' and `bibtex-find-crossref'
+*** The new commands 'bibtex-find-entry' and 'bibtex-find-crossref'
locate entries and crossref'd entries (bound to C-c C-s and C-c C-x).
Crossref fields are clickable (bound to mouse-2, RET).
-*** The new variables `bibtex-files' and `bibtex-file-path' define a set
+*** The new variables 'bibtex-files' and 'bibtex-file-path' define a set
of BibTeX files that are searched for entry keys.
-*** The new command `bibtex-validate-globally' checks for duplicate keys
+*** The new command 'bibtex-validate-globally' checks for duplicate keys
in multiple BibTeX files.
-*** If the new variable `bibtex-autoadd-commas' is non-nil,
+*** If the new variable 'bibtex-autoadd-commas' is non-nil,
automatically add missing commas at end of BibTeX fields.
-*** The new command `bibtex-copy-summary-as-kill' pushes summary
+*** The new command 'bibtex-copy-summary-as-kill' pushes summary
of BibTeX entry to kill ring (bound to C-c C-t).
-*** If the new variable `bibtex-parse-keys-fast' is non-nil,
+*** If the new variable 'bibtex-parse-keys-fast' is non-nil,
use fast but simplified algorithm for parsing BibTeX keys.
*** The new variables bibtex-expand-strings and
bibtex-autokey-expand-strings control the expansion of strings when
extracting the content of a BibTeX field.
-*** The variables `bibtex-autokey-name-case-convert' and
-`bibtex-autokey-titleword-case-convert' have been renamed to
-`bibtex-autokey-name-case-convert-function' and
-`bibtex-autokey-titleword-case-convert-function'. The old names are
+*** The variables 'bibtex-autokey-name-case-convert' and
+'bibtex-autokey-titleword-case-convert' have been renamed to
+'bibtex-autokey-name-case-convert-function' and
+'bibtex-autokey-titleword-case-convert-function'. The old names are
still available as aliases.
** GUD changes
@@ -2518,7 +2519,7 @@ counter to the specified source line (the one where point is).
*** The variable tooltip-gud-tips-p has been removed. GUD tooltips can now be
toggled independently of normal tooltips with the minor mode
-`gud-tooltip-mode'.
+'gud-tooltip-mode'.
*** In graphical mode, with a C program, GUD Tooltips have been extended to
display the #define directive associated with an identifier when program is
@@ -2529,12 +2530,12 @@ not executing.
**** Search for source files using jdb classpath and class information.
Fast startup since there is no need to scan all source files up front.
There is also no need to create and maintain lists of source
-directories to scan. Look at `gud-jdb-use-classpath' and
-`gud-jdb-classpath' customization variables documentation.
+directories to scan. Look at 'gud-jdb-use-classpath' and
+'gud-jdb-classpath' customization variables documentation.
**** The previous method of searching for source files has been
preserved in case someone still wants/needs to use it.
-Set `gud-jdb-use-classpath' to nil.
+Set 'gud-jdb-use-classpath' to nil.
**** Supports the standard breakpoint (gud-break, gud-clear)
set/clear operations from Java source files under the classpath, stack
@@ -2546,42 +2547,42 @@ traversal (gud-up, gud-down), and run until current stack finish
*** Added jdb Customization Variables
-**** `gud-jdb-command-name'. What command line to use to invoke jdb.
+**** 'gud-jdb-command-name'. What command line to use to invoke jdb.
-**** `gud-jdb-use-classpath'. Allows selection of java source file searching
-method: set to t for new method, nil to scan `gud-jdb-directories' for
+**** 'gud-jdb-use-classpath'. Allows selection of java source file searching
+method: set to t for new method, nil to scan 'gud-jdb-directories' for
java sources (previous method).
-**** `gud-jdb-directories'. List of directories to scan and search for Java
-classes using the original gud-jdb method (if `gud-jdb-use-classpath'
+**** 'gud-jdb-directories'. List of directories to scan and search for Java
+classes using the original gud-jdb method (if 'gud-jdb-use-classpath'
is nil).
*** Minor Improvements
**** The STARTTLS wrapper (starttls.el) can now use GnuTLS
-instead of the OpenSSL based `starttls' tool. For backwards
-compatibility, it prefers `starttls', but you can toggle
-`starttls-use-gnutls' to switch to GnuTLS (or simply remove the
-`starttls' tool).
+instead of the OpenSSL based 'starttls' tool. For backwards
+compatibility, it prefers 'starttls', but you can toggle
+'starttls-use-gnutls' to switch to GnuTLS (or simply remove the
+'starttls' tool).
**** Do not allow debugger output history variable to grow without bounds.
** Lisp mode changes
-*** Lisp mode now uses `font-lock-doc-face' for doc strings.
+*** Lisp mode now uses 'font-lock-doc-face' for doc strings.
*** C-u C-M-q in Emacs Lisp mode pretty-prints the list after point.
*** New features in evaluation commands
-**** The function `eval-defun' (C-M-x) called on defface reinitializes
+**** The function 'eval-defun' (C-M-x) called on defface reinitializes
the face to the value specified in the defface expression.
**** Typing C-x C-e twice prints the value of the integer result
in additional formats (octal, hexadecimal, character) specified
-by the new function `eval-expression-print-format'. The same
-function also defines the result format for `eval-expression' (M-:),
-`eval-print-last-sexp' (C-j) and some edebug evaluation functions.
+by the new function 'eval-expression-print-format'. The same
+function also defines the result format for 'eval-expression' (M-:),
+'eval-print-last-sexp' (C-j) and some edebug evaluation functions.
** Changes to cmuscheme
@@ -2593,16 +2594,16 @@ is the name of the Scheme interpreter) exists, its contents are sent
to the Scheme subprocess upon startup.
*** There are new commands to instruct the Scheme interpreter to trace
-procedure calls (`scheme-trace-procedure') and to expand syntactic forms
-(`scheme-expand-current-form'). The commands actually sent to the Scheme
-subprocess are controlled by the user options `scheme-trace-command',
-`scheme-untrace-command' and `scheme-expand-current-form'.
+procedure calls ('scheme-trace-procedure') and to expand syntactic forms
+('scheme-expand-current-form'). The commands actually sent to the Scheme
+subprocess are controlled by the user options 'scheme-trace-command',
+'scheme-untrace-command' and 'scheme-expand-current-form'.
** Ewoc changes
-*** The new function `ewoc-delete' deletes specified nodes.
+*** The new function 'ewoc-delete' deletes specified nodes.
-*** `ewoc-create' now takes optional arg NOSEP, which inhibits insertion of
+*** 'ewoc-create' now takes optional arg NOSEP, which inhibits insertion of
a newline after each pretty-printed entry and after the header and footer.
This allows you to create multiple-entry ewocs on a single line and to
effect "invisible" nodes by arranging for the pretty-printer to not print
@@ -2610,13 +2611,13 @@ anything for those nodes.
For example, these two sequences of expressions behave identically:
-;; NOSEP nil
-(defun PP (data) (insert (format "%S" data)))
-(ewoc-create 'PP "start\n")
+ ;; NOSEP nil
+ (defun PP (data) (insert (format "%S" data)))
+ (ewoc-create 'PP "start\n")
-;; NOSEP t
-(defun PP (data) (insert (format "%S\n" data)))
-(ewoc-create 'PP "start\n\n" "\n" t)
+ ;; NOSEP t
+ (defun PP (data) (insert (format "%S\n" data)))
+ (ewoc-create 'PP "start\n\n" "\n" t)
** CC mode changes
@@ -2645,9 +2646,9 @@ Here is a summary:
**** Indentation Engine
The CC Mode indentation engine fully supports AWK mode.
-AWK mode handles code formatted in the conventional AWK fashion: `{'s
+AWK mode handles code formatted in the conventional AWK fashion: '{'s
which start actions, user-defined functions, or compound statements are
-placed on the same line as the associated construct; the matching `}'s
+placed on the same line as the associated construct; the matching '}'s
are normally placed under the start of the respective pattern, function
definition, or structured statement.
@@ -2752,7 +2753,7 @@ key-sequence. [N.B. "DEL" is the <backspace> key.]
**** The new command c-subword-mode is bound to C-c C-w.
-*** C-c C-s (`c-show-syntactic-information') now highlights the anchor
+*** C-c C-s ('c-show-syntactic-information') now highlights the anchor
position(s).
*** New syntactic symbols in IDL mode.
@@ -2762,25 +2763,25 @@ module-open, module-close, inmodule, composition-open,
composition-close, and incomposition.
*** New functions to do hungry delete without enabling hungry delete mode.
-The new functions `c-hungry-backspace' and `c-hungry-delete-forward'
+The new functions 'c-hungry-backspace' and 'c-hungry-delete-forward'
provide hungry deletion without having to toggle a mode. They are
bound to C-c C-DEL and C-c C-d (and several variants, for the benefit
of different keyboard setups. See "Changes in key sequences" above).
-*** Better control over `require-final-newline'.
+*** Better control over 'require-final-newline'.
-The variable `c-require-final-newline' specifies which of the modes
+The variable 'c-require-final-newline' specifies which of the modes
implemented by CC mode should insert final newlines. Its value is a
list of modes, and only those modes should do it. By default the list
includes C, C++ and Objective-C modes.
-Whichever modes are in this list will set `require-final-newline'
-based on `mode-require-final-newline'.
+Whichever modes are in this list will set 'require-final-newline'
+based on 'mode-require-final-newline'.
*** Format change for syntactic context elements.
-The elements in the syntactic context returned by `c-guess-basic-syntax'
-and stored in `c-syntactic-context' has been changed somewhat to allow
+The elements in the syntactic context returned by 'c-guess-basic-syntax'
+and stored in 'c-syntactic-context' has been changed somewhat to allow
attaching more information. They are now lists instead of single cons
cells. E.g. a line that previously had the syntactic analysis
@@ -2793,9 +2794,9 @@ is now analyzed as
In some cases there are more than one position given for a syntactic
symbol.
-This change might affect code that calls `c-guess-basic-syntax'
+This change might affect code that calls 'c-guess-basic-syntax'
directly, and custom lineup functions if they use
-`c-syntactic-context'. However, the argument given to lineup
+'c-syntactic-context'. However, the argument given to lineup
functions is still a single cons cell with nil or an integer in the
cdr.
@@ -2813,8 +2814,8 @@ languages. See the comment blurb near the top of cc-langs.el.
**** New initialization functions.
The initialization procedure has been split up into more functions to
-give better control: `c-basic-common-init', `c-font-lock-init', and
-`c-init-language-vars'.
+give better control: 'c-basic-common-init', 'c-font-lock-init', and
+'c-init-language-vars'.
*** Changes in analysis of nested syntactic constructs.
The syntactic analysis engine has better handling of cases where
@@ -2840,31 +2841,31 @@ its substatement. E.g:
**** Syntactic indentation inside macros.
The contents of multiline #define's are now analyzed and indented
syntactically just like other code. This can be disabled by the new
-variable `c-syntactic-indentation-in-macros'. A new syntactic symbol
-`cpp-define-intro' has been added to control the initial indentation
-inside `#define's.
+variable 'c-syntactic-indentation-in-macros'. A new syntactic symbol
+'cpp-define-intro' has been added to control the initial indentation
+inside '#define's.
-**** New lineup function `c-lineup-cpp-define'.
+**** New lineup function 'c-lineup-cpp-define'.
Now used by default to line up macro continuation lines. The behavior
of this function closely mimics the indentation one gets if the macro
is indented while the line continuation backslashes are temporarily
removed. If syntactic indentation in macros is turned off, it works
-much line `c-lineup-dont-change', which was used earlier, but handles
+much line 'c-lineup-dont-change', which was used earlier, but handles
empty lines within the macro better.
**** Automatically inserted newlines continues the macro if used within one.
This applies to the newlines inserted by the auto-newline mode, and to
-`c-context-line-break' and `c-context-open-line'.
+'c-context-line-break' and 'c-context-open-line'.
**** Better alignment of line continuation backslashes.
-`c-backslash-region' tries to adapt to surrounding backslashes. New
-variable `c-backslash-max-column' puts a limit on how far out
+'c-backslash-region' tries to adapt to surrounding backslashes. New
+variable 'c-backslash-max-column' puts a limit on how far out
backslashes can be moved.
**** Automatic alignment of line continuation backslashes.
-This is controlled by the new variable `c-auto-align-backslashes'. It
-affects `c-context-line-break', `c-context-open-line' and newlines
+This is controlled by the new variable 'c-auto-align-backslashes'. It
+affects 'c-context-line-break', 'c-context-open-line' and newlines
inserted in Auto-Newline mode.
**** Line indentation works better inside macros.
@@ -2876,48 +2877,48 @@ backslash) in the macro.
*** indent-for-comment is more customizable.
The behavior of M-; (indent-for-comment) is now configurable through
-the variable `c-indent-comment-alist'. The indentation behavior is
+the variable 'c-indent-comment-alist'. The indentation behavior is
based on the preceding code on the line, e.g. to get two spaces after
-#else and #endif but indentation to `comment-column' in most other
+#else and #endif but indentation to 'comment-column' in most other
cases (something which was hardcoded earlier).
-*** New function `c-context-open-line'.
-It's the open-line equivalent of `c-context-line-break'.
+*** New function 'c-context-open-line'.
+It's the open-line equivalent of 'c-context-line-break'.
*** New clean-ups
-**** `comment-close-slash'.
+**** 'comment-close-slash'.
With this clean-up, a block (i.e. c-style) comment can be terminated by
typing a slash at the start of a line.
-**** `c-one-liner-defun'
+**** 'c-one-liner-defun'
This clean-up compresses a short enough defun (for example, an AWK
pattern/action pair) onto a single line. "Short enough" is configurable.
*** New lineup functions
-**** `c-lineup-string-cont'
+**** 'c-lineup-string-cont'
This lineup function lines up a continued string under the one it
continues. E.g:
result = prefix + "A message "
"string."; <- c-lineup-string-cont
-**** `c-lineup-cascaded-calls'
+**** 'c-lineup-cascaded-calls'
Lines up series of calls separated by "->" or ".".
-**** `c-lineup-knr-region-comment'
+**** 'c-lineup-knr-region-comment'
Gives (what most people think is) better indentation of comments in
the "K&R region" between the function header and its body.
-**** `c-lineup-gcc-asm-reg'
+**** 'c-lineup-gcc-asm-reg'
Provides better indentation inside asm blocks.
-**** `c-lineup-argcont'
+**** 'c-lineup-argcont'
Lines up continued function arguments after the preceding comma.
*** Added toggle for syntactic indentation.
-The function `c-toggle-syntactic-indentation' can be used to toggle
+The function 'c-toggle-syntactic-indentation' can be used to toggle
syntactic indentation.
*** Better caching of the syntactic context.
@@ -2938,7 +2939,7 @@ Statements are recognized most of the time even when they occur in an
"invalid" context, e.g. in a function argument. In practice that can
happen when macros are involved.
-*** Improved the way `c-indent-exp' chooses the block to indent.
+*** Improved the way 'c-indent-exp' chooses the block to indent.
It now indents the block for the closest sexp following the point
whose closing paren ends on a different line. This means that the
point doesn't have to be immediately before the block to indent.
@@ -2953,13 +2954,13 @@ The former two couldn't be differentiated before, and the latter three
are new. Font-locking is robust now and offers new customizable
faces.
-*** The variable `makefile-query-one-target-method' has been renamed
-to `makefile-query-one-target-method-function'. The old name is still
+*** The variable 'makefile-query-one-target-method' has been renamed
+to 'makefile-query-one-target-method-function'. The old name is still
available as alias.
** Sql changes
-*** The variable `sql-product' controls the highlighting of different
+*** The variable 'sql-product' controls the highlighting of different
SQL dialects. This variable can be set globally via Customize, on a
buffer-specific basis via local variable settings, or for the current
session using the new SQL->Product submenu. (This menu replaces the
@@ -2984,24 +2985,23 @@ The following values are supported:
The current product name will be shown on the mode line following the
SQL mode indicator.
-The technique of setting `sql-mode-font-lock-defaults' directly in
-your `.emacs' will no longer establish the default highlighting -- Use
-`sql-product' to accomplish this.
+The technique of setting 'sql-mode-font-lock-defaults' directly in
+your '.emacs' will no longer establish the default highlighting -- Use
+'sql-product' to accomplish this.
ANSI keywords are always highlighted.
-*** The function `sql-add-product-keywords' can be used to add
+*** The function 'sql-add-product-keywords' can be used to add
font-lock rules to the product specific rules. For example, to have
-all identifiers ending in `_t' under MS SQLServer treated as a type,
+all identifiers ending in '_t' under MS SQLServer treated as a type,
you would use the following line in your .emacs file:
- (sql-add-product-keywords 'ms
- '(("\\<\\w+_t\\>" . font-lock-type-face)))
+ (sql-add-product-keywords 'ms '(("\\<\\w+_t\\>" . font-lock-type-face)))
*** Oracle support includes keyword highlighting for Oracle 9i.
Most SQL and PL/SQL keywords are implemented. SQL*Plus commands are
-highlighted in `font-lock-doc-face'.
+highlighted in 'font-lock-doc-face'.
*** Microsoft SQLServer support has been significantly improved.
@@ -3011,13 +3011,13 @@ osql flushes its error stream more frequently. Thus error messages
are displayed when they occur rather than when the session is
terminated.
-If the username and password are not provided to `sql-ms', osql is
-called with the `-E' command line argument to use the operating system
+If the username and password are not provided to 'sql-ms', osql is
+called with the '-E' command line argument to use the operating system
credentials to authenticate the user.
*** Postgres support is enhanced.
Keyword highlighting of Postgres 7.3 is implemented. Prompting for
-the username and the pgsql `-U' option is added.
+the username and the pgsql '-U' option is added.
*** MySQL support is enhanced.
Keyword highlighting of MySql 4.0 is implemented.
@@ -3027,30 +3027,30 @@ packages, procedures, functions, triggers, sequences, rules, and
defaults.
*** Added SQL->Start SQLi Session menu entry which calls the
-appropriate `sql-interactive-mode' wrapper for the current setting of
-`sql-product'.
+appropriate 'sql-interactive-mode' wrapper for the current setting of
+'sql-product'.
*** sql.el supports the SQLite interpreter--call 'sql-sqlite'.
** Fortran mode changes
-*** F90 mode and Fortran mode have support for `hs-minor-mode' (hideshow).
+*** F90 mode and Fortran mode have support for 'hs-minor-mode' (hideshow).
It cannot deal with every code format, but ought to handle a sizable
majority.
*** F90 mode and Fortran mode have new navigation commands
-`f90-end-of-block', `f90-beginning-of-block', `f90-next-block',
-`f90-previous-block', `fortran-end-of-block',
-`fortran-beginning-of-block'.
+'f90-end-of-block', 'f90-beginning-of-block', 'f90-next-block',
+'f90-previous-block', 'fortran-end-of-block',
+'fortran-beginning-of-block'.
*** Fortran mode does more font-locking by default. Use level 3
highlighting for the old default.
-*** Fortran mode has a new variable `fortran-directive-re'.
+*** Fortran mode has a new variable 'fortran-directive-re'.
Adapt this to match the format of any compiler directives you use.
Lines that match are never indented, and are given distinctive font-locking.
-*** The new function `f90-backslash-not-special' can be used to change
+*** The new function 'f90-backslash-not-special' can be used to change
the syntax of backslashes in F90 buffers.
** Miscellaneous programming mode changes
@@ -3058,38 +3058,38 @@ the syntax of backslashes in F90 buffers.
*** In sh-script, a continuation line is only indented if the backslash was
preceded by a SPC or a TAB.
-*** Perl mode has a new variable `perl-indent-continued-arguments'.
+*** Perl mode has a new variable 'perl-indent-continued-arguments'.
*** The old Octave mode bindings C-c f and C-c i have been changed
to C-c C-f and C-c C-i. The C-c C-i subcommands now have duplicate
bindings on control characters--thus, C-c C-i C-b is the same as
C-c C-i b, and so on.
-*** Prolog mode has a new variable `prolog-font-lock-keywords'
+*** Prolog mode has a new variable 'prolog-font-lock-keywords'
to support use of font-lock.
** VC Changes
*** New backends for Subversion and Meta-CVS.
-*** The new variable `vc-cvs-global-switches' specifies switches that
+*** The new variable 'vc-cvs-global-switches' specifies switches that
are passed to any CVS command invoked by VC.
These switches are used as "global options" for CVS, which means they
are inserted before the command name. For example, this allows you to
-specify a compression level using the `-z#' option for CVS.
+specify a compression level using the '-z#' option for CVS.
*** The key C-x C-q only changes the read-only state of the buffer
(toggle-read-only). It no longer checks files in or out.
We made this change because we held a poll and found that many users
were unhappy with the previous behavior. If you do prefer this
-behavior, you can bind `vc-toggle-read-only' to C-x C-q in your
-`.emacs' file:
+behavior, you can bind 'vc-toggle-read-only' to C-x C-q in your
+'.emacs' file:
(global-set-key "\C-x\C-q" 'vc-toggle-read-only)
-The function `vc-toggle-read-only' will continue to exist.
+The function 'vc-toggle-read-only' will continue to exist.
*** VC-Annotate mode enhancements
@@ -3107,13 +3107,13 @@ to view diffs or log entries directly from vc-annotate-mode:
** pcl-cvs changes
-*** In pcl-cvs mode, there is a new `d y' command to view the diffs
+*** In pcl-cvs mode, there is a new 'd y' command to view the diffs
between the local version of the file and yesterday's head revision
in the repository.
-*** In pcl-cvs mode, there is a new `d r' command to view the changes
+*** In pcl-cvs mode, there is a new 'd r' command to view the changes
anyone has committed to the repository since you last executed
-`checkout', `update' or `commit'. That means using cvs diff options
+'checkout', 'update' or 'commit'. That means using cvs diff options
-rBASE -rHEAD.
** Diff changes
@@ -3124,11 +3124,11 @@ anyone has committed to the repository since you last executed
These are the new bindings:
-C-c C-e diff-ediff-patch (old M-A)
-C-c C-n diff-restrict-view (old M-r)
-C-c C-r diff-reverse-direction (old M-R)
-C-c C-u diff-context->unified (old M-U)
-C-c C-w diff-refine-hunk (old C-c C-r)
+C-c C-e 'diff-ediff-patch' (old M-A)
+C-c C-n 'diff-restrict-view' (old M-r)
+C-c C-r 'diff-reverse-direction' (old M-R)
+C-c C-u 'diff-context->unified' (old M-U)
+C-c C-w 'diff-refine-hunk' (old C-c C-r)
To convert unified to context format, use C-u C-c C-u.
In addition, C-c C-u now operates on the region
@@ -3147,9 +3147,9 @@ currently highlighted regions in an inferior Ediff session. If you answer 'n'
then it reverts to the old behavior and asks the user to select regions for
comparison.
-*** The new command `ediff-backup' compares a file with its most recent
-backup using `ediff'. If you specify the name of a backup file,
-`ediff-backup' compares it with the file of which it is a backup.
+*** The new command 'ediff-backup' compares a file with its most recent
+backup using 'ediff'. If you specify the name of a backup file,
+'ediff-backup' compares it with the file of which it is a backup.
** Etags changes.
@@ -3160,11 +3160,11 @@ backup using `ediff'. If you specify the name of a backup file,
The syntax --ignore-case-regexp=/regex/ is now undocumented and retained
only for backward compatibility. The new equivalent syntax is
--regex=/regex/i. More generally, it is --regex=/TAGREGEX/TAGNAME/MODS,
-where `/TAGNAME' is optional, as usual, and MODS is a string of 0 or
-more characters among `i' (ignore case), `m' (multi-line) and `s'
-(single-line). The `m' and `s' modifiers behave as in Perl regular
-expressions: `m' allows regexps to match more than one line, while `s'
-(which implies `m') means that `.' matches newlines. The ability to
+where '/TAGNAME' is optional, as usual, and MODS is a string of 0 or
+more characters among 'i' (ignore case), 'm' (multi-line) and 's'
+(single-line). The 'm' and 's' modifiers behave as in Perl regular
+expressions: 'm' allows regexps to match more than one line, while 's'
+(which implies 'm') means that '.' matches newlines. The ability to
span newlines allows writing of much more powerful regular expressions
and rapid prototyping for tagging new languages.
@@ -3189,8 +3189,8 @@ per line. Lines beginning with space or tab are ignored.
**** New language HTML.
-Tags are generated for `title' as well as `h1', `h2', and `h3'. Also,
-when `name=' is used inside an anchor and whenever `id=' is used.
+Tags are generated for 'title' as well as 'h1', 'h2', and 'h3'. Also,
+when 'name=' is used inside an anchor and whenever 'id=' is used.
**** New language PHP.
@@ -3201,9 +3201,9 @@ specified to etags, variables are tags also.
All functions are tagged.
-**** The `::' qualifier triggers C++ parsing in C file.
+**** The '::' qualifier triggers C++ parsing in C file.
-Previously, only the `template' and `class' keywords had this effect.
+Previously, only the 'template' and 'class' keywords had this effect.
**** The GCC __attribute__ keyword is now recognized and ignored.
@@ -3248,16 +3248,16 @@ the file FILE.
** Rmail changes
-*** Support for `movemail' from GNU mailutils was added to Rmail.
+*** Support for 'movemail' from GNU mailutils was added to Rmail.
-This version of `movemail' allows you to read mail from a wide range of
+This version of 'movemail' allows you to read mail from a wide range of
mailbox formats, including remote POP3 and IMAP4 mailboxes with or
without TLS encryption. If GNU mailutils is installed on the system
-and its version of `movemail' can be found in exec-path, it will be
+and its version of 'movemail' can be found in exec-path, it will be
used instead of the native one.
-*** The new commands rmail-end-of-message and rmail-summary end-of-message,
-by default bound to `/', go to the end of the current mail message in
+*** The new commands 'rmail-end-of-message' and 'rmail-summary-end-of-message',
+by default bound to '/', go to the end of the current mail message in
Rmail and Rmail summary buffers.
*** Rmail now displays 5-digit message ids in its summary buffer.
@@ -3280,13 +3280,13 @@ version 5.0.2; see MH-E-NEWS for details.
** Miscellaneous mail changes
-*** The new variable `mail-default-directory' specifies
-`default-directory' for mail buffers. This directory is used for
+*** The new variable 'mail-default-directory' specifies
+'default-directory' for mail buffers. This directory is used for
auto-save files of mail buffers. It defaults to "~/".
*** The mode line can indicate new mail in a directory or file.
-See the documentation of the user option `display-time-mail-directory'.
+See the documentation of the user option 'display-time-mail-directory'.
** Calendar changes
@@ -3296,24 +3296,24 @@ convert Emacs diary entries to/from the iCalendar format.
*** The new package cal-html.el writes HTML files with calendar and
diary entries.
-*** The new functions `diary-from-outlook', `diary-from-outlook-gnus',
-and `diary-from-outlook-rmail' can be used to import diary entries
+*** The new functions 'diary-from-outlook', 'diary-from-outlook-gnus',
+and 'diary-from-outlook-rmail' can be used to import diary entries
from Outlook-format appointments in mail messages. The variable
-`diary-outlook-formats' can be customized to recognize additional
+'diary-outlook-formats' can be customized to recognize additional
formats.
*** The procedure for activating appointment reminders has changed:
-use the new function `appt-activate'. The new variable
-`appt-display-format' controls how reminders are displayed, replacing
-`appt-issue-message', `appt-visible', and `appt-msg-window'.
+use the new function 'appt-activate'. The new variable
+'appt-display-format' controls how reminders are displayed, replacing
+'appt-issue-message', 'appt-visible', and 'appt-msg-window'.
-*** The function `simple-diary-display' now by default sets a header line.
-This can be controlled through the variables `diary-header-line-flag'
-and `diary-header-line-format'.
+*** The function 'simple-diary-display' now by default sets a header line.
+This can be controlled through the variables 'diary-header-line-flag'
+and 'diary-header-line-format'.
*** Diary sexp entries can have custom marking in the calendar.
Diary sexp functions which only apply to certain days (such as
-`diary-block' or `diary-cyclic') now take an optional parameter MARK,
+'diary-block' or 'diary-cyclic') now take an optional parameter MARK,
which is the name of a face or a single-character string indicating
how to highlight the day in the calendar display. Specifying a
single-character string as @var{mark} places the character next to the
@@ -3327,76 +3327,76 @@ appointments, paydays or anything else using a sexp.
*** You can now use < and >, instead of C-x < and C-x >, to scroll
the calendar left or right.
-*** The new function `calendar-goto-day-of-year' (g D) prompts for a
+*** The new function 'calendar-goto-day-of-year' (g D) prompts for a
year and day number, and moves to that date. Negative day numbers
count backward from the end of the year.
-*** The new Calendar function `calendar-goto-iso-week' (g w)
+*** The new Calendar function 'calendar-goto-iso-week' (g w)
prompts for a year and a week number, and moves to the first
day of that ISO week.
-*** The functions `holiday-easter-etc' and `holiday-advent' now take
+*** The functions 'holiday-easter-etc' and 'holiday-advent' now take
optional arguments, in order to only report on the specified holiday
rather than all. This makes customization of variables such as
-`christian-holidays' simpler.
+'christian-holidays' simpler.
-*** The new variable `calendar-minimum-window-height' affects the
-window generated by the function `generate-calendar-window'.
+*** The new variable 'calendar-minimum-window-height' affects the
+window generated by the function 'generate-calendar-window'.
** Speedbar changes
*** Speedbar items can now be selected by clicking mouse-1, based on
-the `mouse-1-click-follows-link' mechanism.
+the 'mouse-1-click-follows-link' mechanism.
-*** The new command `speedbar-toggle-line-expansion', bound to SPC,
+*** The new command 'speedbar-toggle-line-expansion', bound to SPC,
contracts or expands the line under the cursor.
-*** New command `speedbar-create-directory', bound to `M'.
+*** New command 'speedbar-create-directory', bound to 'M'.
-*** The new commands `speedbar-expand-line-descendants' and
-`speedbar-contract-line-descendants', bound to `[' and `]'
+*** The new commands 'speedbar-expand-line-descendants' and
+'speedbar-contract-line-descendants', bound to '[' and ']'
respectively, expand and contract the line under cursor with all of
its descendants.
-*** The new user option `speedbar-use-tool-tips-flag', if non-nil,
+*** The new user option 'speedbar-use-tool-tips-flag', if non-nil,
means to display tool-tips for speedbar items.
-*** The new user option `speedbar-query-confirmation-method' controls
+*** The new user option 'speedbar-query-confirmation-method' controls
how querying is performed for file operations. A value of 'always
means to always query before file operations; 'none-but-delete means
to not query before any file operations, except before a file
deletion.
-*** The new user option `speedbar-select-frame-method' specifies how
+*** The new user option 'speedbar-select-frame-method' specifies how
to select a frame for displaying a file opened with the speedbar. A
value of 'attached means to use the attached frame (the frame that
speedbar was started from.) A number such as 1 or -1 means to pass
-that number to `other-frame'.
+that number to 'other-frame'.
*** SPC and DEL are no longer bound to scroll up/down in the speedbar
keymap.
*** The frame management code in speedbar.el has been split into a new
-`dframe' library. Emacs Lisp code that makes use of the speedbar
-should use `dframe-attached-frame' instead of
-`speedbar-attached-frame', `dframe-timer' instead of `speedbar-timer',
-`dframe-close-frame' instead of `speedbar-close-frame', and
-`dframe-activity-change-focus-flag' instead of
-`speedbar-activity-change-focus-flag'. The variables
-`speedbar-update-speed' and `speedbar-navigating-speed' are also
-obsolete; use `dframe-update-speed' instead.
+'dframe' library. Emacs Lisp code that makes use of the speedbar
+should use 'dframe-attached-frame' instead of
+'speedbar-attached-frame', 'dframe-timer' instead of 'speedbar-timer',
+'dframe-close-frame' instead of 'speedbar-close-frame', and
+'dframe-activity-change-focus-flag' instead of
+'speedbar-activity-change-focus-flag'. The variables
+'speedbar-update-speed' and 'speedbar-navigating-speed' are also
+obsolete; use 'dframe-update-speed' instead.
** battery.el changes
-*** display-battery-mode replaces display-battery.
+*** 'display-battery-mode' replaces 'display-battery'.
*** battery.el now works on recent versions of Mac OS X.
** Games
-*** The game `mpuz' is enhanced.
+*** The game 'mpuz' is enhanced.
-`mpuz' now allows the 2nd factor not to have two identical digits. By
+'mpuz' now allows the 2nd factor not to have two identical digits. By
default, all trivial operations involving whole lines are performed
automatically. The game uses faces for better visual feedback.
@@ -3412,70 +3412,70 @@ automatically. The game uses faces for better visual feedback.
** Miscellaneous
-*** The variable `woman-topic-at-point' is renamed
-to `woman-use-topic-at-point' and behaves differently: if this
-variable is non-nil, the `woman' command uses the word at point
+*** The variable 'woman-topic-at-point' is renamed
+to 'woman-use-topic-at-point' and behaves differently: if this
+variable is non-nil, the 'woman' command uses the word at point
automatically, without asking for a confirmation. Otherwise, the word
at point is suggested as default, but not inserted at the prompt.
-*** You can now customize `fill-nobreak-predicate' to control where
+*** You can now customize 'fill-nobreak-predicate' to control where
filling can break lines. The value is now normally a list of
functions, but it can also be a single function, for compatibility.
-Emacs provide two predicates, `fill-single-word-nobreak-p' and
-`fill-french-nobreak-p', for use as the value of
-`fill-nobreak-predicate'.
+Emacs provide two predicates, 'fill-single-word-nobreak-p' and
+'fill-french-nobreak-p', for use as the value of
+'fill-nobreak-predicate'.
*** M-x view-file and commands that use it now avoid interfering
with special modes such as Tar mode.
-*** `global-whitespace-mode' is a new alias for `whitespace-global-mode'.
+*** 'global-whitespace-mode' is a new alias for 'whitespace-global-mode'.
*** The saveplace.el package now filters out unreadable files.
When you exit Emacs, the saved positions in visited files no longer
include files that aren't readable, e.g. files that don't exist.
-Customize the new option `save-place-forget-unreadable-files' to nil
-to get the old behavior. The new options `save-place-save-skipped'
-and `save-place-skip-check-regexp' allow further fine-tuning of this
+Customize the new option 'save-place-forget-unreadable-files' to nil
+to get the old behavior. The new options 'save-place-save-skipped'
+and 'save-place-skip-check-regexp' allow further fine-tuning of this
feature.
-*** Commands `winner-redo' and `winner-undo', from winner.el, are now
+*** Commands 'winner-redo' and 'winner-undo', from winner.el, are now
bound to C-c <left> and C-c <right>, respectively. This is an
incompatible change.
-*** The type-break package now allows `type-break-file-name' to be nil
+*** The 'type-break' package now allows 'type-break-file-name' to be nil
and if so, doesn't store any data across sessions. This is handy if
-you don't want the `.type-break' file in your home directory or are
+you don't want the '.type-break' file in your home directory or are
annoyed by the need for interaction when you kill Emacs.
-*** `ps-print' can now print characters from the mule-unicode charsets.
+*** 'ps-print' can now print characters from the mule-unicode charsets.
Printing text with characters from the mule-unicode-* sets works with
-`ps-print', provided that you have installed the appropriate BDF
+'ps-print', provided that you have installed the appropriate BDF
fonts. See the file INSTALL for URLs where you can find these fonts.
-*** New command `strokes-global-set-stroke-string'.
-This is like `strokes-global-set-stroke', but it allows you to bind
+*** New command 'strokes-global-set-stroke-string'.
+This is like 'strokes-global-set-stroke', but it allows you to bind
the stroke directly to a string to insert. This is convenient for
using strokes as an input method.
-*** In Outline mode, `hide-body' no longer hides lines at the top
+*** In Outline mode, 'hide-body' no longer hides lines at the top
of the file that precede the first header line.
-*** `hide-ifdef-mode' now uses overlays rather than selective-display
+*** 'hide-ifdef-mode' now uses overlays rather than selective-display
to hide its text. This should be mostly transparent but slightly
changes the behavior of motion commands like C-e and C-p.
-*** In Artist mode the variable `artist-text-renderer' has been
-renamed to `artist-text-renderer-function'. The old name is still
+*** In Artist mode the variable 'artist-text-renderer' has been
+renamed to 'artist-text-renderer-function'. The old name is still
available as alias.
-*** In Enriched mode, `set-left-margin' and `set-right-margin' are now
-by default bound to `C-c [' and `C-c ]' instead of the former `C-c C-l'
-and `C-c C-r'.
+*** In Enriched mode, 'set-left-margin' and 'set-right-margin' are now
+by default bound to 'C-c [' and 'C-c ]' instead of the former 'C-c C-l'
+and 'C-c C-r'.
-*** `partial-completion-mode' now handles partial completion on directory names.
+*** 'partial-completion-mode' now handles partial completion on directory names.
*** You can now disable pc-selection-mode after enabling it.
@@ -3483,10 +3483,10 @@ M-x pc-selection-mode behaves like a proper minor mode, and with no
argument it toggles the mode. Turning off PC-Selection mode restores
the global key bindings that were replaced by turning on the mode.
-*** `uniquify-strip-common-suffix' tells uniquify to prefer
-`file|dir1' and `file|dir2' to `file|dir1/subdir' and `file|dir2/subdir'.
+*** 'uniquify-strip-common-suffix' tells uniquify to prefer
+'file|dir1' and 'file|dir2' to 'file|dir1/subdir' and 'file|dir2/subdir'.
-*** New user option `add-log-always-start-new-record'.
+*** New user option 'add-log-always-start-new-record'.
When this option is enabled, M-x add-change-log-entry always
starts a new record regardless of when the last record is.
@@ -3501,17 +3501,17 @@ when Emacs visits them.
*** calculator.el now has radix grouping mode.
-To enable this, set `calculator-output-radix' non-nil. In this mode a
+To enable this, set 'calculator-output-radix' non-nil. In this mode a
separator character is used every few digits, making it easier to see
byte boundaries etc. For more info, see the documentation of the
-variable `calculator-radix-grouping-mode'.
+variable 'calculator-radix-grouping-mode'.
*** LDAP support now defaults to ldapsearch from OpenLDAP version 2.
*** The terminal emulation code in term.el has been improved; it can
run most curses applications now.
-*** Support for `magic cookie' standout modes has been removed.
+*** Support for 'magic cookie' standout modes has been removed.
Emacs still works on terminals that require magic cookies in order to
use standout mode, but they can no longer display mode-lines in
@@ -3523,14 +3523,14 @@ inverse-video.
** The HOME directory defaults to Application Data under the user profile.
If you used a previous version of Emacs without setting the HOME
-environment variable and a `.emacs' was saved, then Emacs will continue
+environment variable and a '.emacs' was saved, then Emacs will continue
using C:/ as the default HOME. But if you are installing Emacs afresh,
the default location will be the "Application Data" (or similar
localized name) subdirectory of your user profile. A typical location
of this directory is "C:\Documents and Settings\USERNAME\Application Data",
where USERNAME is your user name.
-This change means that users can now have their own `.emacs' files on
+This change means that users can now have their own '.emacs' files on
shared computers, and the default HOME directory is less likely to be
read-only on computers that are administered by someone else.
@@ -3556,7 +3556,7 @@ See the Emacs 21.1 NEWS entry for tooltips for details.
** Pointing devices with more than 3 buttons are now supported on MS Windows.
-The new variable `w32-pass-extra-mouse-buttons-to-system' controls
+The new variable 'w32-pass-extra-mouse-buttons-to-system' controls
whether Emacs should handle the extra buttons itself (the default), or
pass them to Windows to be handled with system-wide functions.
@@ -3577,7 +3577,7 @@ the same way as wildcard X Resources do on X. Emacs now adds these
colors to the colormap prefixed by System (eg SystemMenu for the
default Menu background, SystemMenuText for the foreground), and uses
some of them to initialize some of the default faces.
-`list-colors-display' shows the list of System color names, in case
+'list-colors-display' shows the list of System color names, in case
you wish to use them in other faces.
** Running in a console window in Windows now uses the console size.
@@ -3614,30 +3614,30 @@ MS Windows, Emacs now uses the appropriate locale coding-system, so
the clipboard should work correctly for your local language without
any customizations.
-** On Mac OS, `keyboard-coding-system' changes based on the keyboard script.
+** On Mac OS, 'keyboard-coding-system' changes based on the keyboard script.
-** The variable `mac-keyboard-text-encoding' and the constants
-`kTextEncodingMacRoman', `kTextEncodingISOLatin1', and
-`kTextEncodingISOLatin2' are obsolete.
+** The variable 'mac-keyboard-text-encoding' and the constants
+'kTextEncodingMacRoman', 'kTextEncodingISOLatin1', and
+'kTextEncodingISOLatin2' are obsolete.
-** The variable `mac-command-key-is-meta' is obsolete. Use
-`mac-command-modifier' and `mac-option-modifier' instead.
+** The variable 'mac-command-key-is-meta' is obsolete. Use
+'mac-command-modifier' and 'mac-option-modifier' instead.
* Incompatible Lisp Changes in Emacs 22.1
** Mode line display ignores text properties as well as the
:propertize and :eval forms in the value of a variable whose
-`risky-local-variable' property is nil.
+'risky-local-variable' property is nil.
-The function `comint-send-input' now accepts 3 optional arguments:
+The function 'comint-send-input' now accepts 3 optional arguments:
(comint-send-input &optional no-newline artificial)
Callers sending input not from the user should use bind the 3rd
-argument `artificial' to a non-nil value, to prevent Emacs from
+argument 'artificial' to a non-nil value, to prevent Emacs from
deleting the part of subprocess output that matches the input.
-** The `read-file-name' function now returns a null string if the
+** The 'read-file-name' function now returns a null string if the
user just types RET.
** The variables post-command-idle-hook and post-command-idle-delay have
@@ -3650,28 +3650,28 @@ be multibyte or unibyte, respectively.
combining a face number and a character code into a numeric
glyph code is deprecated.
-Instead, the new functions `make-glyph-code', `glyph-char', and
-`glyph-face' must be used to create and decode glyph codes in
+Instead, the new functions 'make-glyph-code', 'glyph-char', and
+'glyph-face' must be used to create and decode glyph codes in
display tables.
-** `suppress-keymap' now works by remapping `self-insert-command' to
-the command `undefined'. (In earlier Emacs versions, it used
-`substitute-key-definition' to rebind self inserting characters to
-`undefined'.)
+** 'suppress-keymap' now works by remapping 'self-insert-command' to
+the command 'undefined'. (In earlier Emacs versions, it used
+'substitute-key-definition' to rebind self inserting characters to
+'undefined'.)
-** The third argument of `accept-process-output' is now milliseconds.
+** The third argument of 'accept-process-output' is now milliseconds.
It used to be microseconds.
-** The function find-operation-coding-system may be called with a cons
+** The function 'find-operation-coding-system' may be called with a cons
(FILENAME . BUFFER) in the second argument if the first argument
-OPERATION is `insert-file-contents', and thus a function registered in
-`file-coding-system-alist' is also called with such an argument.
+OPERATION is 'insert-file-contents', and thus a function registered in
+'file-coding-system-alist' is also called with such an argument.
** When Emacs receives a USR1 or USR2 signal, this generates
input events: sigusr1 or sigusr2. Use special-event-map to
handle these events.
-** The variable `memory-full' now remains t until
+** The variable 'memory-full' now remains t until
there is no longer a shortage of memory.
** Support for Mocklisp has been removed.
@@ -3683,139 +3683,139 @@ there is no longer a shortage of memory.
*** New syntax: \s now stands for the SPACE character.
-`?\s' is a new way to write the space character. You must make sure
-it is not followed by a dash, since `?\s-...' indicates the "super"
+'?\s' is a new way to write the space character. You must make sure
+it is not followed by a dash, since '?\s-...' indicates the "super"
modifier. However, it would be strange to write a character constant
-and a following symbol (beginning with `-') with no space between
+and a following symbol (beginning with '-') with no space between
them.
-`\s' stands for space in strings, too, but it is not really meant for
+'\s' stands for space in strings, too, but it is not really meant for
strings; it is easier and nicer just to write a space.
*** New syntax: \uXXXX and \UXXXXXXXX specify Unicode code points in hex.
For instance, you can use "\u0428" to specify a string consisting of
-CYRILLIC CAPITAL LETTER SHA, or `"U0001D6E2" to specify one consisting
+CYRILLIC CAPITAL LETTER SHA, or "\U0001D6E2" to specify one consisting
of MATHEMATICAL ITALIC CAPITAL ALPHA (the latter is greater than
#xFFFF and thus needs the longer syntax).
This syntax works for both character constants and strings.
-*** New function `unsafep' determines whether a Lisp form is safe.
+*** New function 'unsafep' determines whether a Lisp form is safe.
It returns nil if the given Lisp form can't possibly do anything
dangerous; otherwise it returns a reason why the form might be unsafe
(calls unknown function, alters global variable, etc.).
-*** The function `eql' is now available without requiring the CL package.
+*** The function 'eql' is now available without requiring the CL package.
-*** The new function `memql' is like `memq', but uses `eql' for comparison,
-that is, floats are compared by value and other elements with `eq'.
+*** The new function 'memql' is like 'memq', but uses 'eql' for comparison,
+that is, floats are compared by value and other elements with 'eq'.
-*** New functions `string-or-null-p' and `booleanp'.
+*** New functions 'string-or-null-p' and 'booleanp'.
-`string-or-null-p' returns non-nil if OBJECT is a string or nil.
-`booleanp' returns non-nil if OBJECT is t or nil.
+'string-or-null-p' returns non-nil if OBJECT is a string or nil.
+'booleanp' returns non-nil if OBJECT is t or nil.
-*** `makehash' is now obsolete. Use `make-hash-table' instead.
+*** 'makehash' is now obsolete. Use 'make-hash-table' instead.
-*** Minor change in the function `format'.
+*** Minor change in the function 'format'.
Some flags that were accepted but not implemented (such as "*") are no
longer accepted.
-*** `add-to-list' takes an optional third argument, APPEND.
+*** 'add-to-list' takes an optional third argument, APPEND.
If APPEND is non-nil, the new element gets added at the end of the
list instead of at the beginning. This change actually occurred in
Emacs 21.1, but was not documented then.
-*** New function `add-to-ordered-list' is like `add-to-list' but
+*** New function 'add-to-ordered-list' is like 'add-to-list' but
associates a numeric ordering of each element added to the list.
-*** New function `add-to-history' adds an element to a history list.
+*** New function 'add-to-history' adds an element to a history list.
Lisp packages should use this function to add elements to their
history lists.
-If `history-delete-duplicates' is non-nil, it removes duplicates of
+If 'history-delete-duplicates' is non-nil, it removes duplicates of
the new element from the history list it updates.
-*** New function `copy-tree' makes a copy of a tree.
+*** New function 'copy-tree' makes a copy of a tree.
It recursively copies through both CARs and CDRs.
-*** New function `delete-dups' deletes `equal' duplicate elements from a list.
+*** New function 'delete-dups' deletes 'equal' duplicate elements from a list.
-It modifies the list destructively, like `delete'. Of several `equal'
+It modifies the list destructively, like 'delete'. Of several 'equal'
occurrences of an element in the list, the one that's kept is the
first one.
-*** New function `rassq-delete-all'.
+*** New function 'rassq-delete-all'.
(rassq-delete-all VALUE ALIST) deletes, from ALIST, each element whose
-CDR is `eq' to the specified value.
+CDR is 'eq' to the specified value.
-*** Functions `get' and `plist-get' no longer give errors for bad plists.
+*** Functions 'get' and 'plist-get' no longer give errors for bad plists.
They return nil for a malformed property list or if the list is
cyclic.
-*** New functions `lax-plist-get' and `lax-plist-put'.
+*** New functions 'lax-plist-get' and 'lax-plist-put'.
-They are like `plist-get' and `plist-put', except that they compare
-the property name using `equal' rather than `eq'.
+They are like 'plist-get' and 'plist-put', except that they compare
+the property name using 'equal' rather than 'eq'.
-*** The function `number-sequence' makes a list of equally-separated numbers.
+*** The function 'number-sequence' makes a list of equally-separated numbers.
For instance, (number-sequence 4 9) returns (4 5 6 7 8 9). By
default, the separation is 1, but you can specify a different
separation as the third argument. (number-sequence 1.5 6 2) returns
(1.5 3.5 5.5).
-*** New variables `most-positive-fixnum' and `most-negative-fixnum'.
+*** New variables 'most-positive-fixnum' and 'most-negative-fixnum'.
They hold the largest and smallest possible integer values.
-*** The function `expt' handles negative exponents differently.
-The value for `(expt A B)', if both A and B are integers and B is
+*** The function 'expt' handles negative exponents differently.
+The value for '(expt A B)', if both A and B are integers and B is
negative, is now a float. For example: (expt 2 -2) => 0.25.
-*** The function `atan' now accepts an optional second argument.
+*** The function 'atan' now accepts an optional second argument.
-When called with 2 arguments, as in `(atan Y X)', `atan' returns the
+When called with 2 arguments, as in '(atan Y X)', 'atan' returns the
angle in radians between the vector [X, Y] and the X axis. (This is
-equivalent to the standard C library function `atan2'.)
+equivalent to the standard C library function 'atan2'.)
-*** New macro `with-case-table'
+*** New macro 'with-case-table'
This executes the body with the case table temporarily set to a given
case table.
-*** New macro `with-local-quit' temporarily allows quitting.
+*** New macro 'with-local-quit' temporarily allows quitting.
-A quit inside the body of `with-local-quit' is caught by the
-`with-local-quit' form itself, but another quit will happen later once
+A quit inside the body of 'with-local-quit' is caught by the
+'with-local-quit' form itself, but another quit will happen later once
the code that has inhibited quitting exits.
This is for use around potentially blocking or long-running code
-inside timer functions and `post-command-hook' functions.
+inside timer functions and 'post-command-hook' functions.
-*** New macro `define-obsolete-function-alias'.
+*** New macro 'define-obsolete-function-alias'.
-This combines `defalias' and `make-obsolete'.
+This combines 'defalias' and 'make-obsolete'.
-*** New macro `eval-at-startup' specifies expressions to
+*** New macro 'eval-at-startup' specifies expressions to
evaluate when Emacs starts up. If this is done after startup,
it evaluates those expressions immediately.
This is useful in packages that can be preloaded.
-*** New function `macroexpand-all' expands all macros in a form.
+*** New function 'macroexpand-all' expands all macros in a form.
It is similar to the Common-Lisp function of the same name.
One difference is that it guarantees to return the original argument
-if no expansion is done, which can be tested using `eq'.
+if no expansion is done, which can be tested using 'eq'.
*** A function or macro's doc string can now specify the calling pattern.
@@ -3824,60 +3824,60 @@ formatted so as to match the regexp "\n\n(fn .*)\\'". If you don't
specify this explicitly, Emacs determines it from the actual argument
names. Usually that default is right, but not always.
-*** New variable `print-continuous-numbering'.
+*** New variable 'print-continuous-numbering'.
When this is non-nil, successive calls to print functions use a single
numbering scheme for circular structure references. This is only
-relevant when `print-circle' is non-nil.
+relevant when 'print-circle' is non-nil.
-When you bind `print-continuous-numbering' to t, you should
-also bind `print-number-table' to nil.
+When you bind 'print-continuous-numbering' to t, you should
+also bind 'print-number-table' to nil.
-*** `list-faces-display' takes an optional argument, REGEXP.
+*** 'list-faces-display' takes an optional argument, REGEXP.
If it is non-nil, the function lists only faces matching this regexp.
-*** New hook `command-error-function'.
+*** New hook 'command-error-function'.
By setting this variable to a function, you can control
how the editor command loop shows the user an error message.
-*** `debug-on-entry' accepts primitive functions that are not special forms.
+*** 'debug-on-entry' accepts primitive functions that are not special forms.
** Lisp code indentation features:
-*** The `defmacro' form can contain indentation and edebug declarations.
+*** The 'defmacro' form can contain indentation and edebug declarations.
These declarations specify how to indent the macro calls in Lisp mode
and how to debug them with Edebug. You write them like this:
(defmacro NAME LAMBDA-LIST [DOC-STRING] [DECLARATION ...] ...)
-DECLARATION is a list `(declare DECLARATION-SPECIFIER ...)'. The
+DECLARATION is a list '(declare DECLARATION-SPECIFIER ...)'. The
possible declaration specifiers are:
(indent INDENT)
- Set NAME's `lisp-indent-function' property to INDENT.
+ Set NAME's 'lisp-indent-function' property to INDENT.
(edebug DEBUG)
- Set NAME's `edebug-form-spec' property to DEBUG. (This is
- equivalent to writing a `def-edebug-spec' for the macro,
+ Set NAME's 'edebug-form-spec' property to DEBUG. (This is
+ equivalent to writing a 'def-edebug-spec' for the macro,
but this is cleaner.)
*** cl-indent now allows customization of Indentation of backquoted forms.
-See the new user option `lisp-backquote-indentation'.
+See the new user option 'lisp-backquote-indentation'.
-*** cl-indent now handles indentation of simple and extended `loop' forms.
+*** cl-indent now handles indentation of simple and extended 'loop' forms.
-The new user options `lisp-loop-keyword-indentation',
-`lisp-loop-forms-indentation', and `lisp-simple-loop-indentation' can
+The new user options 'lisp-loop-keyword-indentation',
+'lisp-loop-forms-indentation', and 'lisp-simple-loop-indentation' can
be used to customize the indentation of keywords and forms in loop
forms.
** Variable aliases:
-*** New function: defvaralias ALIAS-VAR BASE-VAR [DOCSTRING]
+*** New function: 'defvaralias' ALIAS-VAR BASE-VAR [DOCSTRING]
This function defines the symbol ALIAS-VAR as a variable alias for
symbol BASE-VAR. This means that retrieving the value of ALIAS-VAR
@@ -3887,10 +3887,10 @@ changes the value of BASE-VAR.
DOCSTRING, if present, is the documentation for ALIAS-VAR; else it has
the same documentation as BASE-VAR.
-*** The macro `define-obsolete-variable-alias' combines `defvaralias' and
-`make-obsolete-variable'.
+*** The macro 'define-obsolete-variable-alias' combines 'defvaralias' and
+'make-obsolete-variable'.
-*** New function: indirect-variable VARIABLE
+*** New function: 'indirect-variable' VARIABLE
This function returns the variable at the end of the chain of aliases
of VARIABLE. If VARIABLE is not a symbol, or if VARIABLE is not
@@ -3901,12 +3901,12 @@ variables, including buffer-local and frame-local variables.
** defcustom changes:
-*** The package-version keyword has been added to provide
-`customize-changed-options' functionality to packages in the future.
+*** The ':package-version' keyword has been added to provide
+'customize-changed-options' functionality to packages in the future.
Developers who make use of this keyword must also update the new
-variable `customize-package-emacs-version-alist'.
+variable 'customize-package-emacs-version-alist'.
-*** The new customization type `float' requires a floating point number.
+*** The new customization type 'float' requires a floating point number.
** String changes:
@@ -3914,27 +3914,27 @@ variable `customize-package-emacs-version-alist'.
*** An octal escape in a string constant forces the string to be unibyte.
-*** New function `string-to-multibyte' converts a unibyte string to a
+*** New function 'string-to-multibyte' converts a unibyte string to a
multibyte string with the same individual character codes.
-*** `split-string' now includes null substrings in the returned list if
+*** 'split-string' now includes null substrings in the returned list if
the optional argument SEPARATORS is non-nil and there are matches for
SEPARATORS at the beginning or end of the string. If SEPARATORS is
nil, or if the new optional third argument OMIT-NULLS is non-nil, all
empty matches are omitted from the returned list.
-*** The new function `assoc-string' replaces `assoc-ignore-case' and
-`assoc-ignore-representation', which are still available, but have
+*** The new function 'assoc-string' replaces 'assoc-ignore-case' and
+'assoc-ignore-representation', which are still available, but have
been declared obsolete.
-*** New function `substring-no-properties' returns a substring without
+*** New function 'substring-no-properties' returns a substring without
text properties.
** Displaying warnings to the user.
-See the functions `warn' and `display-warning', or the Lisp Manual.
+See the functions 'warn' and 'display-warning', or the Lisp Manual.
If you want to be sure the warning will not be overlooked, this
-facility is much better than using `message', since it displays
+facility is much better than using 'message', since it displays
warnings in a separate window.
** Progress reporters.
@@ -3942,112 +3942,112 @@ warnings in a separate window.
These provide a simple and uniform way for commands to present
progress messages for the user.
-See the new functions `make-progress-reporter',
-`progress-reporter-update', `progress-reporter-force-update',
-`progress-reporter-done', and `dotimes-with-progress-reporter'.
+See the new functions 'make-progress-reporter',
+'progress-reporter-update', 'progress-reporter-force-update',
+'progress-reporter-done', and 'dotimes-with-progress-reporter'.
** Buffer positions:
-*** Function `compute-motion' now calculates the usable window
+*** Function 'compute-motion' now calculates the usable window
width if the WIDTH argument is nil. If the TOPOS argument is nil,
the usable window height and width is used.
-*** The `line-move', `scroll-up', and `scroll-down' functions will now
+*** The 'line-move', 'scroll-up', and 'scroll-down' functions will now
modify the window vscroll to scroll through display rows that are
taller that the height of the window, for example in the presence of
large images. To disable this feature, bind the new variable
-`auto-window-vscroll' to nil.
+'auto-window-vscroll' to nil.
-*** The argument to `forward-word', `backward-word' is optional.
+*** The argument to 'forward-word', 'backward-word' is optional.
It defaults to 1.
-*** Argument to `forward-to-indentation' and `backward-to-indentation' is optional.
+*** Argument to 'forward-to-indentation' and 'backward-to-indentation' is optional.
It defaults to 1.
-*** `field-beginning' and `field-end' take new optional argument, LIMIT.
+*** 'field-beginning' and 'field-end' take new optional argument, LIMIT.
This argument tells them not to search beyond LIMIT. Instead they
give up and return LIMIT.
-*** New function `window-line-height' is an efficient way to get
+*** New function 'window-line-height' is an efficient way to get
information about a specific text line in a window provided that the
window's display is up-to-date.
-*** New function `line-number-at-pos' returns the line number of a position.
+*** New function 'line-number-at-pos' returns the line number of a position.
It an optional buffer position argument that defaults to point.
-*** Function `pos-visible-in-window-p' now returns the pixel coordinates
+*** Function 'pos-visible-in-window-p' now returns the pixel coordinates
and partial visibility state of the corresponding row, if the PARTIALLY
arg is non-nil.
-*** New functions `posn-at-point' and `posn-at-x-y' return
+*** New functions 'posn-at-point' and 'posn-at-x-y' return
click-event-style position information for a given visible buffer
position or for a given window pixel coordinate.
-*** New function `mouse-on-link-p' tests if a position is in a clickable link.
+*** New function 'mouse-on-link-p' tests if a position is in a clickable link.
-This is the function used by the new `mouse-1-click-follows-link'
+This is the function used by the new 'mouse-1-click-follows-link'
functionality.
** Text modification:
-*** The new function `buffer-chars-modified-tick' returns a buffer's
+*** The new function 'buffer-chars-modified-tick' returns a buffer's
tick counter for changes to characters. Each time text in that buffer
is inserted or deleted, the character-change counter is updated to the
-tick counter (`buffer-modified-tick'). Text property changes leave it
+tick counter ('buffer-modified-tick'). Text property changes leave it
unchanged.
-*** The new function `insert-for-yank' normally works like `insert', but
-removes the text properties in the `yank-excluded-properties' list
-and handles the `yank-handler' text property.
+*** The new function 'insert-for-yank' normally works like 'insert', but
+removes the text properties in the 'yank-excluded-properties' list
+and handles the 'yank-handler' text property.
-*** The new function `insert-buffer-substring-as-yank' is like
-`insert-for-yank' except that it gets the text from another buffer as
-in `insert-buffer-substring'.
+*** The new function 'insert-buffer-substring-as-yank' is like
+'insert-for-yank' except that it gets the text from another buffer as
+in 'insert-buffer-substring'.
-*** The new function `insert-buffer-substring-no-properties' is like
-`insert-buffer-substring', but removes all text properties from the
+*** The new function 'insert-buffer-substring-no-properties' is like
+'insert-buffer-substring', but removes all text properties from the
inserted substring.
-*** The new function `filter-buffer-substring' extracts a buffer
+*** The new function 'filter-buffer-substring' extracts a buffer
substring, passes it through a set of filter functions, and returns
-the filtered substring. Use it instead of `buffer-substring' or
-`delete-and-extract-region' when copying text into a user-accessible
+the filtered substring. Use it instead of 'buffer-substring' or
+'delete-and-extract-region' when copying text into a user-accessible
data structure, such as the kill-ring, X clipboard, or a register.
The list of filter function is specified by the new variable
-`buffer-substring-filters'. For example, Longlines mode adds to
-`buffer-substring-filters' to remove soft newlines from the copied
+'buffer-substring-filters'. For example, Longlines mode adds to
+'buffer-substring-filters' to remove soft newlines from the copied
text.
-*** Function `translate-region' accepts also a char-table as TABLE
+*** Function 'translate-region' accepts also a char-table as TABLE
argument.
-*** The new translation table `translation-table-for-input'
+*** The new translation table 'translation-table-for-input'
is used for customizing self-insertion. The character to
be inserted is translated through it.
*** Text clones.
-The new function `text-clone-create'. Text clones are chunks of text
+The new function 'text-clone-create'. Text clones are chunks of text
that are kept identical by transparently propagating changes from one
clone to the other.
-*** The function `insert-string' is now obsolete.
+*** The function 'insert-string' is now obsolete.
** Filling changes.
*** In determining an adaptive fill prefix, Emacs now tries the function in
-`adaptive-fill-function' _before_ matching the buffer line against
-`adaptive-fill-regexp' rather than _after_ it.
+'adaptive-fill-function' _before_ matching the buffer line against
+'adaptive-fill-regexp' rather than _after_ it.
** Atomic change groups.
To perform some changes in the current buffer "atomically" so that
-they either all succeed or are all undone, use `atomic-change-group'
+they either all succeed or are all undone, use 'atomic-change-group'
around the code that makes changes. For instance:
(atomic-change-group
@@ -4055,45 +4055,45 @@ around the code that makes changes. For instance:
(delete-region x y))
If an error (or other nonlocal exit) occurs inside the body of
-`atomic-change-group', it unmakes all the changes in that buffer that
+'atomic-change-group', it unmakes all the changes in that buffer that
were during the execution of the body. The change group has no effect
on any other buffers--any such changes remain.
If you need something more sophisticated, you can directly call the
-lower-level functions that `atomic-change-group' uses. Here is how.
+lower-level functions that 'atomic-change-group' uses. Here is how.
-To set up a change group for one buffer, call `prepare-change-group'.
+To set up a change group for one buffer, call 'prepare-change-group'.
Specify the buffer as argument; it defaults to the current buffer.
This function returns a "handle" for the change group. You must save
the handle to activate the change group and then finish it.
Before you change the buffer again, you must activate the change
-group. Pass the handle to `activate-change-group' afterward to
+group. Pass the handle to 'activate-change-group' afterward to
do this.
After you make the changes, you must finish the change group. You can
either accept the changes or cancel them all. Call
-`accept-change-group' to accept the changes in the group as final;
-call `cancel-change-group' to undo them all.
-
-You should use `unwind-protect' to make sure the group is always
-finished. The call to `activate-change-group' should be inside the
-`unwind-protect', in case the user types C-g just after it runs.
-(This is one reason why `prepare-change-group' and
-`activate-change-group' are separate functions.) Once you finish the
+'accept-change-group' to accept the changes in the group as final;
+call 'cancel-change-group' to undo them all.
+
+You should use 'unwind-protect' to make sure the group is always
+finished. The call to 'activate-change-group' should be inside the
+'unwind-protect', in case the user types C-g just after it runs.
+(This is one reason why 'prepare-change-group' and
+'activate-change-group' are separate functions.) Once you finish the
group, don't use the handle again--don't try to finish the same group
twice.
-To make a multibuffer change group, call `prepare-change-group' once
-for each buffer you want to cover, then use `nconc' to combine the
+To make a multibuffer change group, call 'prepare-change-group' once
+for each buffer you want to cover, then use 'nconc' to combine the
returned values, like this:
(nconc (prepare-change-group buffer-1)
(prepare-change-group buffer-2))
You can then activate the multibuffer change group with a single call
-to `activate-change-group', and finish it with a single call to
-`accept-change-group' or `cancel-change-group'.
+to 'activate-change-group', and finish it with a single call to
+'accept-change-group' or 'cancel-change-group'.
Nested use of several change groups for the same buffer works as you
would expect. Non-nested use of change groups for the same buffer
@@ -4103,91 +4103,91 @@ finished.
** Buffer-related changes:
-*** The new function `buffer-local-value' returns the buffer-local
+*** The new function 'buffer-local-value' returns the buffer-local
binding of VARIABLE (a symbol) in buffer BUFFER. If VARIABLE does not
have a buffer-local binding in buffer BUFFER, it returns the default
value of VARIABLE instead.
-*** `list-buffers-noselect' now takes an additional argument, BUFFER-LIST.
+*** 'list-buffers-noselect' now takes an additional argument, BUFFER-LIST.
If it is non-nil, it specifies which buffers to list.
-*** `kill-buffer-hook' is now a permanent local.
+*** 'kill-buffer-hook' is now a permanent local.
-*** The function `frame-or-buffer-changed-p' now lets you maintain
+*** The function 'frame-or-buffer-changed-p' now lets you maintain
various status records in parallel.
It takes a variable (a symbol) as argument. If the variable is non-nil,
then its value should be a vector installed previously by
-`frame-or-buffer-changed-p'. If the frame names, buffer names, buffer
+'frame-or-buffer-changed-p'. If the frame names, buffer names, buffer
order, or their read-only or modified flags have changed, since the
time the vector's contents were recorded by a previous call to
-`frame-or-buffer-changed-p', then the function returns t. Otherwise
+'frame-or-buffer-changed-p', then the function returns t. Otherwise
it returns nil.
-On the first call to `frame-or-buffer-changed-p', the variable's
-value should be nil. `frame-or-buffer-changed-p' stores a suitable
+On the first call to 'frame-or-buffer-changed-p', the variable's
+value should be nil. 'frame-or-buffer-changed-p' stores a suitable
vector into the variable and returns t.
-If the variable is itself nil, then `frame-or-buffer-changed-p' uses,
+If the variable is itself nil, then 'frame-or-buffer-changed-p' uses,
for compatibility, an internal variable which exists only for this
purpose.
-*** The function `read-buffer' follows the convention for reading from
+*** The function 'read-buffer' follows the convention for reading from
the minibuffer with a default value: if DEF is non-nil, the minibuffer
prompt provided in PROMPT is edited to show the default value provided
in DEF before the terminal colon and space.
** Searching and matching changes:
-*** New function `looking-back' checks whether a regular expression matches
+*** New function 'looking-back' checks whether a regular expression matches
the text before point. Specifying the LIMIT argument bounds how far
back the match can start; this is a way to keep it from taking too long.
-*** The new variable `search-spaces-regexp' controls how to search
+*** The new variable 'search-spaces-regexp' controls how to search
for spaces in a regular expression. If it is non-nil, it should be a
regular expression, and any series of spaces stands for that regular
expression. If it is nil, spaces stand for themselves.
-Spaces inside of constructs such as `[..]' and inside loops such as
-`*', `+', and `?' are never replaced with `search-spaces-regexp'.
+Spaces inside of constructs such as '[..]' and inside loops such as
+'*', '+', and '?' are never replaced with 'search-spaces-regexp'.
-*** New regular expression operators, `\_<' and `\_>'.
+*** New regular expression operators, '\_<' and '\_>'.
These match the beginning and end of a symbol. A symbol is a
non-empty sequence of either word or symbol constituent characters, as
specified by the syntax table.
-*** `skip-chars-forward' and `skip-chars-backward' now handle
-character classes such as `[:alpha:]', along with individual
+*** 'skip-chars-forward' and 'skip-chars-backward' now handle
+character classes such as '[:alpha:]', along with individual
characters and ranges.
-*** In `replace-match', the replacement text no longer inherits
+*** In 'replace-match', the replacement text no longer inherits
properties from surrounding text.
-*** The list returned by `(match-data t)' now has the buffer as a final
-element, if the last match was on a buffer. `set-match-data'
+*** The list returned by '(match-data t)' now has the buffer as a final
+element, if the last match was on a buffer. 'set-match-data'
accepts such a list for restoring the match state.
-*** Functions `match-data' and `set-match-data' now have an optional
-argument `reseat'. When non-nil, all markers in the match data list
+*** Functions 'match-data' and 'set-match-data' now have an optional
+argument 'reseat'. When non-nil, all markers in the match data list
passed to these functions will be reseated to point to nowhere.
-*** rx.el has new corresponding `symbol-start' and `symbol-end' elements.
+*** rx.el has new corresponding 'symbol-start' and 'symbol-end' elements.
-*** The default value of `sentence-end' is now defined using the new
-variable `sentence-end-without-space', which contains such characters
+*** The default value of 'sentence-end' is now defined using the new
+variable 'sentence-end-without-space', which contains such characters
that end a sentence without following spaces.
-The function `sentence-end' should be used to obtain the value of the
-variable `sentence-end'. If the variable `sentence-end' is nil, then
+The function 'sentence-end' should be used to obtain the value of the
+variable 'sentence-end'. If the variable 'sentence-end' is nil, then
this function returns the regexp constructed from the variables
-`sentence-end-without-period', `sentence-end-double-space' and
-`sentence-end-without-space'.
+'sentence-end-without-period', 'sentence-end-double-space' and
+'sentence-end-without-space'.
** Undo changes:
-*** `buffer-undo-list' allows programmable elements.
+*** 'buffer-undo-list' allows programmable elements.
These elements have the form (apply FUNNAME . ARGS), where FUNNAME is
a symbol other than t or nil. That stands for a high-level change
@@ -4198,124 +4198,124 @@ which indicates that the change which took place was limited to the
range BEG...END and increased the buffer size by DELTA.
*** If the buffer's undo list for the current command gets longer than
-`undo-outer-limit', garbage collection empties it. This is to prevent
+'undo-outer-limit', garbage collection empties it. This is to prevent
it from using up the available memory and choking Emacs.
** Killing and yanking changes:
-*** New `yank-handler' text property can be used to control how
+*** New 'yank-handler' text property can be used to control how
previously killed text on the kill ring is reinserted.
-The value of the `yank-handler' property must be a list with one to four
+The value of the 'yank-handler' property must be a list with one to four
elements with the following format:
(FUNCTION PARAM NOEXCLUDE UNDO).
-The `insert-for-yank' function looks for a yank-handler property on
+The 'insert-for-yank' function looks for a yank-handler property on
the first character on its string argument (typically the first
-element on the kill-ring). If a `yank-handler' property is found,
-the normal behavior of `insert-for-yank' is modified in various ways:
+element on the kill-ring). If a 'yank-handler' property is found,
+the normal behavior of 'insert-for-yank' is modified in various ways:
- When FUNCTION is present and non-nil, it is called instead of `insert'
+ When FUNCTION is present and non-nil, it is called instead of 'insert'
to insert the string. FUNCTION takes one argument--the object to insert.
If PARAM is present and non-nil, it replaces STRING as the object
-passed to FUNCTION (or `insert'); for example, if FUNCTION is
-`yank-rectangle', PARAM should be a list of strings to insert as a
+passed to FUNCTION (or 'insert'); for example, if FUNCTION is
+'yank-rectangle', PARAM should be a list of strings to insert as a
rectangle.
If NOEXCLUDE is present and non-nil, the normal removal of the
-`yank-excluded-properties' is not performed; instead FUNCTION is
+'yank-excluded-properties' is not performed; instead FUNCTION is
responsible for removing those properties. This may be necessary
if FUNCTION adjusts point before or after inserting the object.
If UNDO is present and non-nil, it is a function that will be called
-by `yank-pop' to undo the insertion of the current object. It is
+by 'yank-pop' to undo the insertion of the current object. It is
called with two arguments, the start and end of the current region.
-FUNCTION can set `yank-undo-function' to override the UNDO value.
+FUNCTION can set 'yank-undo-function' to override the UNDO value.
-*** The functions `kill-new', `kill-append', and `kill-region' now have an
-optional argument to specify the `yank-handler' text property to put on
+*** The functions 'kill-new', 'kill-append', and 'kill-region' now have an
+optional argument to specify the 'yank-handler' text property to put on
the killed text.
-*** The function `yank-pop' will now use a non-nil value of the variable
-`yank-undo-function' (instead of `delete-region') to undo the previous
-`yank' or `yank-pop' command (or a call to `insert-for-yank'). The function
-`insert-for-yank' automatically sets that variable according to the UNDO
-element of the string argument's `yank-handler' text property if present.
+*** The function 'yank-pop' will now use a non-nil value of the variable
+'yank-undo-function' (instead of 'delete-region') to undo the previous
+'yank' or 'yank-pop' command (or a call to 'insert-for-yank'). The function
+'insert-for-yank' automatically sets that variable according to the UNDO
+element of the string argument's 'yank-handler' text property if present.
-*** The function `insert-for-yank' now supports strings where the
-`yank-handler' property does not span the first character of the
+*** The function 'insert-for-yank' now supports strings where the
+'yank-handler' property does not span the first character of the
string. The old behavior is available if you call
-`insert-for-yank-1' instead.
+'insert-for-yank-1' instead.
** Syntax table changes:
-*** The new function `syntax-ppss' provides an efficient way to find the
+*** The new function 'syntax-ppss' provides an efficient way to find the
current syntactic context at point.
-*** The new function `syntax-after' returns the syntax code
+*** The new function 'syntax-after' returns the syntax code
of the character after a specified buffer position, taking account
of text properties as well as the character code.
-*** `syntax-class' extracts the class of a syntax code (as returned
-by `syntax-after').
+*** 'syntax-class' extracts the class of a syntax code (as returned
+by 'syntax-after').
-*** The macro `with-syntax-table' no longer copies the syntax table.
+*** The macro 'with-syntax-table' no longer copies the syntax table.
** File operation changes:
-*** New vars `exec-suffixes' and `load-suffixes' used when
+*** New vars 'exec-suffixes' and 'load-suffixes' used when
searching for an executable or an Emacs Lisp file.
-*** New function `locate-file' searches for a file in a list of directories.
-`locate-file' accepts a name of a file to search (a string), and two
+*** New function 'locate-file' searches for a file in a list of directories.
+'locate-file' accepts a name of a file to search (a string), and two
lists: a list of directories to search in and a list of suffixes to
-try; typical usage might use `exec-path' and `load-path' for the list
-of directories, and `exec-suffixes' and `load-suffixes' for the list
+try; typical usage might use 'exec-path' and 'load-path' for the list
+of directories, and 'exec-suffixes' and 'load-suffixes' for the list
of suffixes. The function also accepts a predicate argument to
further filter candidate files.
One advantage of using this function is that the list of suffixes in
-`exec-suffixes' is OS-dependent, so this function will find
+'exec-suffixes' is OS-dependent, so this function will find
executables without polluting Lisp code with OS dependencies.
-*** The new function `file-remote-p' tests a file name and returns
+*** The new function 'file-remote-p' tests a file name and returns
non-nil if it specifies a remote file (one that Emacs accesses using
its own special methods and not directly through the file system).
The value in that case is an identifier for the remote file system.
-*** The new hook `before-save-hook' is invoked by `basic-save-buffer'
+*** The new hook 'before-save-hook' is invoked by 'basic-save-buffer'
before saving buffers. This allows packages to perform various final
tasks. For example, it can be used by the copyright package to make
sure saved files have the current year in any copyright headers.
-*** `file-chase-links' now takes an optional second argument LIMIT which
+*** 'file-chase-links' now takes an optional second argument LIMIT which
specifies the maximum number of links to chase through. If after that
many iterations the file name obtained is still a symbolic link,
-`file-chase-links' returns it anyway.
+'file-chase-links' returns it anyway.
-*** Functions `file-name-sans-extension' and `file-name-extension' now
+*** Functions 'file-name-sans-extension' and 'file-name-extension' now
ignore the leading dots in file names, so that file names such as
-`.emacs' are treated as extensionless.
+'.emacs' are treated as extensionless.
-*** If `buffer-save-without-query' is non-nil in some buffer,
-`save-some-buffers' will always save that buffer without asking (if
+*** If 'buffer-save-without-query' is non-nil in some buffer,
+'save-some-buffers' will always save that buffer without asking (if
it's modified).
-*** `buffer-auto-save-file-format' is the new name for what was
-formerly called `auto-save-file-format'. It is now a permanent local.
+*** 'buffer-auto-save-file-format' is the new name for what was
+formerly called 'auto-save-file-format'. It is now a permanent local.
-*** `visited-file-modtime' and `calendar-time-from-absolute' now return
+*** 'visited-file-modtime' and 'calendar-time-from-absolute' now return
a list of two integers, instead of a cons.
*** The precedence of file name handlers has been changed.
Instead of choosing the first handler that matches,
-`find-file-name-handler' now gives precedence to a file name handler
+'find-file-name-handler' now gives precedence to a file name handler
that matches nearest the end of the file name. More precisely, the
handler whose (match-beginning 0) is the largest is chosen. In case
of ties, the old "first matched" rule applies.
*** A file name handler can declare which operations it handles.
-You do this by putting an `operation' property on the handler name
+You do this by putting an 'operation' property on the handler name
symbol. The property value should be a list of the operations that
the handler really handles. It won't be called for any other
operations.
@@ -4323,88 +4323,88 @@ operations.
This is useful for autoloaded handlers, to prevent them from being
autoloaded when not really necessary.
-*** The function `make-auto-save-file-name' is now handled by file
+*** The function 'make-auto-save-file-name' is now handled by file
name handlers. This will be exploited for remote files mainly.
-*** The function `file-name-completion' accepts an optional argument
+*** The function 'file-name-completion' accepts an optional argument
PREDICATE, and rejects completion candidates that don't satisfy PREDICATE.
-*** The new primitive `set-file-times' sets a file's access and
+*** The new primitive 'set-file-times' sets a file's access and
modification times. Magic file name handlers can handle this
operation.
** Input changes:
-*** Functions `y-or-n-p', `read-char', `read-key-sequence' and the like, that
+*** Functions 'y-or-n-p', 'read-char', 'read-key-sequence' and the like, that
display a prompt but don't use the minibuffer, now display the prompt
using the text properties (esp. the face) of the prompt string.
-*** The functions `read-event', `read-char', and `read-char-exclusive'
+*** The functions 'read-event', 'read-char', and 'read-char-exclusive'
have a new optional argument SECONDS. If non-nil, this specifies a
maximum time to wait for input, in seconds. If no input arrives after
this time elapses, the functions stop waiting and return nil.
-*** An interactive specification can now use the code letter `U' to get
+*** An interactive specification can now use the code letter 'U' to get
the up-event that was discarded in case the last key sequence read for a
-previous `k' or `K' argument was a down-event; otherwise nil is used.
+previous 'k' or 'K' argument was a down-event; otherwise nil is used.
-*** The new interactive-specification `G' reads a file name
-much like `F', but if the input is a directory name (even defaulted),
+*** The new interactive-specification 'G' reads a file name
+much like 'F', but if the input is a directory name (even defaulted),
it returns just the directory name.
*** (while-no-input BODY...) runs BODY, but only so long as no input
arrives. If the user types or clicks anything, BODY stops as if a
-quit had occurred. `while-no-input' returns the value of BODY, if BODY
+quit had occurred. 'while-no-input' returns the value of BODY, if BODY
finishes. It returns nil if BODY was aborted by a quit, and t if
BODY was aborted by arrival of input.
-*** `recent-keys' now returns the last 300 keys.
+*** 'recent-keys' now returns the last 300 keys.
** Minibuffer changes:
-*** The new function `minibufferp' returns non-nil if its optional
+*** The new function 'minibufferp' returns non-nil if its optional
buffer argument is a minibuffer. If the argument is omitted, it
defaults to the current buffer.
-*** New function `minibuffer-selected-window' returns the window which
+*** New function 'minibuffer-selected-window' returns the window which
was selected when entering the minibuffer.
-*** The `read-file-name' function now takes an additional argument which
+*** The 'read-file-name' function now takes an additional argument which
specifies a predicate which the file name read must satisfy. The
-new variable `read-file-name-predicate' contains the predicate argument
+new variable 'read-file-name-predicate' contains the predicate argument
while reading the file name from the minibuffer; the predicate in this
-variable is used by read-file-name-internal to filter the completion list.
+variable is used by 'read-file-name-internal' to filter the completion list.
-*** The new variable `read-file-name-function' can be used by Lisp code
-to override the built-in `read-file-name' function.
+*** The new variable 'read-file-name-function' can be used by Lisp code
+to override the built-in 'read-file-name' function.
-*** The new variable `read-file-name-completion-ignore-case' specifies
+*** The new variable 'read-file-name-completion-ignore-case' specifies
whether completion ignores case when reading a file name with the
-`read-file-name' function.
+'read-file-name' function.
-*** The new function `read-directory-name' is for reading a directory name.
+*** The new function 'read-directory-name' is for reading a directory name.
-It is like `read-file-name' except that the defaulting works better
+It is like 'read-file-name' except that the defaulting works better
for directories, and completion inside it shows only directories.
-*** The new variable `history-add-new-input' specifies whether to add new
+*** The new variable 'history-add-new-input' specifies whether to add new
elements in history. If set to nil, minibuffer reading functions don't
add new elements to the history list, so it is possible to do this
-afterwards by calling `add-to-history' explicitly.
+afterwards by calling 'add-to-history' explicitly.
** Completion changes:
-*** The new function `minibuffer-completion-contents' returns the contents
+*** The new function 'minibuffer-completion-contents' returns the contents
of the minibuffer just before point. That is what completion commands
operate on.
-*** The functions `all-completions' and `try-completion' now accept lists
+*** The functions 'all-completions' and 'try-completion' now accept lists
of strings as well as hash-tables additionally to alists, obarrays
-and functions. Furthermore, the function `test-completion' is now
+and functions. Furthermore, the function 'test-completion' is now
exported to Lisp. The keys in alists and hash tables can be either
strings or symbols, which are automatically converted with to strings.
-*** The new macro `dynamic-completion-table' supports using functions
+*** The new macro 'dynamic-completion-table' supports using functions
as a dynamic completion table.
(dynamic-completion-table FUN)
@@ -4414,30 +4414,30 @@ and it should return an alist containing all the intended possible
completions. This alist can be a full list of possible completions so that FUN
can ignore the value of its argument. If completion is performed in the
minibuffer, FUN will be called in the buffer from which the minibuffer was
-entered. `dynamic-completion-table' then computes the completion.
+entered. 'dynamic-completion-table' then computes the completion.
-*** The new macro `lazy-completion-table' initializes a variable
+*** The new macro 'lazy-completion-table' initializes a variable
as a lazy completion table.
(lazy-completion-table VAR FUN)
If the completion table VAR is used for the first time (e.g., by passing VAR
-as an argument to `try-completion'), the function FUN is called with no
+as an argument to 'try-completion'), the function FUN is called with no
arguments. FUN must return the completion table that will be stored in VAR.
If completion is requested in the minibuffer, FUN will be called in the buffer
from which the minibuffer was entered. The return value of
-`lazy-completion-table' must be used to initialize the value of VAR.
+'lazy-completion-table' must be used to initialize the value of VAR.
** Abbrev changes:
-*** `define-abbrev' now accepts an optional argument SYSTEM-FLAG.
+*** 'define-abbrev' now accepts an optional argument SYSTEM-FLAG.
If non-nil, this marks the abbrev as a "system" abbrev, which means
that it won't be stored in the user's abbrevs file if he saves the
abbrevs. Major modes that predefine some abbrevs should always
specify this flag.
-*** The new function `copy-abbrev-table' copies an abbrev table.
+*** The new function 'copy-abbrev-table' copies an abbrev table.
It returns a new abbrev table that is a copy of a given abbrev table.
@@ -4446,7 +4446,7 @@ It returns a new abbrev table that is a copy of a given abbrev table.
*** Cleaner way to enter key sequences.
You can enter a constant key sequence in a more natural format, the
-same one used for saving keyboard macros, using the macro `kbd'. For
+same one used for saving keyboard macros, using the macro 'kbd'. For
example,
(kbd "C-x C-f") => "\^x\^f"
@@ -4455,7 +4455,7 @@ Actually, this format has existed since Emacs 20.1.
*** Interactive commands can be remapped through keymaps.
-This is an alternative to using `defadvice' or `substitute-key-definition'
+This is an alternative to using 'defadvice' or 'substitute-key-definition'
to modify the behavior of a key binding using the normal keymap
binding and lookup functionality.
@@ -4464,48 +4464,48 @@ remapped to another command, that command is run instead of the
original command.
Example:
-Suppose that minor mode `my-mode' has defined the commands
-`my-kill-line' and `my-kill-word', and it wants C-k (and any other key
-bound to `kill-line') to run the command `my-kill-line' instead of
-`kill-line', and likewise it wants to run `my-kill-word' instead of
-`kill-word'.
+Suppose that minor mode 'my-mode' has defined the commands
+'my-kill-line' and 'my-kill-word', and it wants C-k (and any other key
+bound to 'kill-line') to run the command 'my-kill-line' instead of
+'kill-line', and likewise it wants to run 'my-kill-word' instead of
+'kill-word'.
Instead of rebinding C-k and the other keys in the minor mode map,
-command remapping allows you to directly map `kill-line' into
-`my-kill-line' and `kill-word' into `my-kill-word' using `define-key':
+command remapping allows you to directly map 'kill-line' into
+'my-kill-line' and 'kill-word' into 'my-kill-word' using 'define-key':
(define-key my-mode-map [remap kill-line] 'my-kill-line)
(define-key my-mode-map [remap kill-word] 'my-kill-word)
-When `my-mode' is enabled, its minor mode keymap is enabled too. So
-when the user types C-k, that runs the command `my-kill-line'.
+When 'my-mode' is enabled, its minor mode keymap is enabled too. So
+when the user types C-k, that runs the command 'my-kill-line'.
Only one level of remapping is supported. In the above example, this
-means that if `my-kill-line' is remapped to `other-kill', then C-k still
-runs `my-kill-line'.
+means that if 'my-kill-line' is remapped to 'other-kill', then C-k still
+runs 'my-kill-line'.
The following changes have been made to provide command remapping:
-- Command remappings are defined using `define-key' with a prefix-key
- `remap', i.e. `(define-key MAP [remap CMD] DEF)' remaps command CMD
+- Command remappings are defined using 'define-key' with a prefix-key
+ 'remap', i.e. '(define-key MAP [remap CMD] DEF)' remaps command CMD
to definition DEF in keymap MAP. The definition is not limited to
another command; it can be anything accepted for a normal binding.
-- The new function `command-remapping' returns the binding for a
+- The new function 'command-remapping' returns the binding for a
remapped command in the current keymaps, or nil if not remapped.
-- `key-binding' now remaps interactive commands unless the optional
+- 'key-binding' now remaps interactive commands unless the optional
third argument NO-REMAP is non-nil.
-- `where-is-internal' now returns nil for a remapped command (e.g.
- `kill-line', when `my-mode' is enabled), and the actual key binding for
+- 'where-is-internal' now returns nil for a remapped command (e.g.
+ 'kill-line', when 'my-mode' is enabled), and the actual key binding for
the command it is remapped to (e.g. C-k for my-kill-line).
It also has a new optional fifth argument, NO-REMAP, which inhibits
- remapping if non-nil (e.g. it returns "C-k" for `kill-line', and
- "<kill-line>" for `my-kill-line').
+ remapping if non-nil (e.g. it returns "C-k" for 'kill-line', and
+ "<kill-line>" for 'my-kill-line').
-- The new variable `this-original-command' contains the original
- command before remapping. It is equal to `this-command' when the
+- The new variable 'this-original-command' contains the original
+ command before remapping. It is equal to 'this-command' when the
command was not remapped.
*** The definition of a key-binding passed to define-key can use XEmacs-style
@@ -4513,43 +4513,42 @@ key-sequences, such as [(control a)].
*** New keymaps for typing file names
-Two new keymaps, `minibuffer-local-filename-completion-map' and
-`minibuffer-local-must-match-filename-map', apply whenever
+Two new keymaps, 'minibuffer-local-filename-completion-map' and
+'minibuffer-local-must-match-filename-map', apply whenever
Emacs reads a file name in the minibuffer. These key maps override
-the usual binding of SPC to `minibuffer-complete-word' (so that file
+the usual binding of SPC to 'minibuffer-complete-word' (so that file
names with embedded spaces could be typed without the need to quote
the spaces).
-*** New function `current-active-maps' returns a list of currently
+*** New function 'current-active-maps' returns a list of currently
active keymaps.
-*** New function `describe-buffer-bindings' inserts the list of all
+*** New function 'describe-buffer-bindings' inserts the list of all
defined keys and their definitions.
-*** New function `keymap-prompt' returns the prompt string of a keymap.
+*** New function 'keymap-prompt' returns the prompt string of a keymap.
-*** If text has a `keymap' property, that keymap takes precedence
+*** If text has a 'keymap' property, that keymap takes precedence
over minor mode keymaps.
-*** The `keymap' property now also works at the ends of overlays and
+*** The 'keymap' property now also works at the ends of overlays and
text properties, according to their stickiness. This also means that it
-works with empty overlays. The same hold for the `local-map' property.
+works with empty overlays. The same hold for the 'local-map' property.
-*** `key-binding' will now look up mouse-specific bindings. The
-keymaps consulted by `key-binding' will get adapted if the key
+*** 'key-binding' will now look up mouse-specific bindings. The
+keymaps consulted by 'key-binding' will get adapted if the key
sequence is started with a mouse event. Instead of letting the click
position be determined from the key sequence itself, it is also
possible to specify it with an optional argument explicitly.
-*** `define-key-after' now accepts keys longer than 1.
+*** 'define-key-after' now accepts keys longer than 1.
-*** (map-keymap FUNCTION KEYMAP) applies the function to each binding
-in the keymap.
+*** 'map-keymap' applies a function to each binding in a keymap.
-*** New variable `emulation-mode-map-alists'.
+*** New variable 'emulation-mode-map-alists'.
Lisp packages using many minor mode keymaps can now maintain their own
-keymap alist separate from `minor-mode-map-alist' by adding their
+keymap alist separate from 'minor-mode-map-alist' by adding their
keymap alist to this list.
*** Dense keymaps now handle inheritance correctly.
@@ -4564,7 +4563,7 @@ bindings of the parent keymap.
On some systems, when Emacs reads the output from a subprocess, the
output data is read in very small blocks, potentially resulting in
very poor performance. This behavior can be remedied to some extent
-by setting the new variable `process-adaptive-read-buffering' to a
+by setting the new variable 'process-adaptive-read-buffering' to a
non-nil value (the default), as it will automatically delay reading
from such processes, allowing them to produce more output before
Emacs tries to read it.
@@ -4572,32 +4571,32 @@ Emacs tries to read it.
*** Processes now have an associated property list where programs can
maintain process state and other per-process related information.
-Use the new functions `process-get' and `process-put' to access, add,
+Use the new functions 'process-get' and 'process-put' to access, add,
and modify elements on this property list. Use the new functions
-`process-plist' and `set-process-plist' to access and replace the
+'process-plist' and 'set-process-plist' to access and replace the
entire property list of a process.
-*** Function `list-processes' now has an optional argument; if non-nil,
+*** Function 'list-processes' now has an optional argument; if non-nil,
it lists only the processes whose query-on-exit flag is set.
-*** New fns `set-process-query-on-exit-flag' and `process-query-on-exit-flag'.
+*** New fns 'set-process-query-on-exit-flag' and 'process-query-on-exit-flag'.
-These replace the old function `process-kill-without-query'. That
+These replace the old function 'process-kill-without-query'. That
function is still supported, but new code should use the new
functions.
-*** The new function `call-process-shell-command'.
+*** The new function 'call-process-shell-command'.
This executes a shell command synchronously in a separate process.
-*** The new function `process-file' is similar to `call-process', but
+*** The new function 'process-file' is similar to 'call-process', but
obeys file handlers. The file handler is chosen based on
-`default-directory'.
+'default-directory'.
-*** Function `signal-process' now accepts a process object or process
+*** Function 'signal-process' now accepts a process object or process
name in addition to a process id to identify the signaled process.
-*** Function `accept-process-output' has a new optional fourth arg
+*** Function 'accept-process-output' has a new optional fourth arg
JUST-THIS-ONE. If non-nil, only output from the specified process
is handled, suspending output from other processes. If value is an
integer, also inhibit running timers. This feature is generally not
@@ -4608,24 +4607,24 @@ speech synthesis.
if the process specifies t for its filter's multibyteness.
That multibyteness is decided by the value of
-`default-enable-multibyte-characters' when the process is created, and
-you can change it later with `set-process-filter-multibyte'.
+'default-enable-multibyte-characters' when the process is created, and
+you can change it later with 'set-process-filter-multibyte'.
-*** The new function `set-process-filter-multibyte' sets the
+*** The new function 'set-process-filter-multibyte' sets the
multibyteness of the strings passed to the process's filter.
-*** The new function `process-filter-multibyte-p' returns the
+*** The new function 'process-filter-multibyte-p' returns the
multibyteness of the strings passed to the process's filter.
-*** If a process's coding system is `raw-text' or `no-conversion' and its
+*** If a process's coding system is 'raw-text' or 'no-conversion' and its
buffer is multibyte, the output of the process is at first converted
-to multibyte by `string-to-multibyte' then inserted in the buffer.
-Previously, it was converted to multibyte by `string-as-multibyte',
+to multibyte by 'string-to-multibyte' then inserted in the buffer.
+Previously, it was converted to multibyte by 'string-as-multibyte',
which was not compatible with the behavior of file reading.
** Enhanced networking support.
-*** The new `make-network-process' function makes network connections.
+*** The new 'make-network-process' function makes network connections.
It allows opening of stream and datagram connections to a server, as well as
create a stream or datagram server inside Emacs.
@@ -4644,9 +4643,9 @@ To test for the availability of a given feature, use featurep like this:
(featurep 'make-network-process '(:type datagram))
(featurep 'make-network-process '(:family ipv6))
-*** The old `open-network-stream' now uses `make-network-process'.
+*** The old 'open-network-stream' now uses 'make-network-process'.
-*** `process-contact' has an optional KEY argument.
+*** 'process-contact' has an optional KEY argument.
Depending on this argument, you can get the complete list of network
process properties or a specific property. Using :local or :remote as
@@ -4655,14 +4654,14 @@ the KEY, you get the address of the local or remote end-point.
An Inet address is represented as a 5 element vector, where the first
4 elements contain the IP address and the fifth is the port number.
-*** New functions `stop-process' and `continue-process'.
+*** New functions 'stop-process' and 'continue-process'.
These functions stop and restart communication through a network
connection. For a server process, no connections are accepted in the
stopped state. For a client process, no input is received in the
stopped state.
-*** New function `format-network-address'.
+*** New function 'format-network-address'.
This function reformats the Lisp representation of a network address
to a printable string. For example, an IP address A.B.C.D and port
@@ -4670,22 +4669,22 @@ number P is represented as a five element vector [A B C D P], and the
printable string returned for this vector is "A.B.C.D:P". See the doc
string for other formatting options.
-*** New function `network-interface-list'.
+*** New function 'network-interface-list'.
This function returns a list of network interface names and their
current network addresses.
-*** New function `network-interface-info'.
+*** New function 'network-interface-info'.
This function returns the network address, hardware address, current
status, and other information about a specific network interface.
-*** New functions `process-datagram-address', `set-process-datagram-address'.
+*** New functions 'process-datagram-address', 'set-process-datagram-address'.
These functions are used with datagram-based network processes to get
and set the current address of the remote partner.
-*** Deleting a network process with `delete-process' calls the sentinel.
+*** Deleting a network process with 'delete-process' calls the sentinel.
The status message passed to the sentinel for a deleted network
process is "deleted". The message passed to the sentinel when the
@@ -4697,82 +4696,82 @@ connection is closed by the remote peer has been changed to
*** You can now make a window as short as one line.
A window that is just one line tall does not display either a mode
-line or a header line, even if the variables `mode-line-format' and
-`header-line-format' call for them. A window that is two lines tall
+line or a header line, even if the variables 'mode-line-format' and
+'header-line-format' call for them. A window that is two lines tall
cannot display both a mode line and a header line at once; if the
variables call for both, only the mode line actually appears.
-*** The new function `window-inside-edges' returns the edges of the
+*** The new function 'window-inside-edges' returns the edges of the
actual text portion of the window, not including the scroll bar or
divider line, the fringes, the display margins, the header line and
the mode line.
-*** The new functions `window-pixel-edges' and `window-inside-pixel-edges'
+*** The new functions 'window-pixel-edges' and 'window-inside-pixel-edges'
return window edges in units of pixels, rather than columns and lines.
-*** New function `window-body-height'.
+*** New function 'window-body-height'.
-This is like `window-height' but does not count the mode line or the
+This is like 'window-height' but does not count the mode line or the
header line.
-*** The new function `adjust-window-trailing-edge' moves the right
+*** The new function 'adjust-window-trailing-edge' moves the right
or bottom edge of a window. It does not move other window edges.
-*** The new macro `with-selected-window' temporarily switches the
-selected window without impacting the order of `buffer-list'.
+*** The new macro 'with-selected-window' temporarily switches the
+selected window without impacting the order of 'buffer-list'.
It saves and restores the current buffer, too.
-*** `select-window' takes an optional second argument NORECORD.
+*** 'select-window' takes an optional second argument NORECORD.
-This is like `switch-to-buffer'.
+This is like 'switch-to-buffer'.
-*** `save-selected-window' now saves and restores the selected window
+*** 'save-selected-window' now saves and restores the selected window
of every frame. This way, it restores everything that can be changed
-by calling `select-window'. It also saves and restores the current
+by calling 'select-window'. It also saves and restores the current
buffer.
-*** `set-window-buffer' has an optional argument KEEP-MARGINS.
+*** 'set-window-buffer' has an optional argument KEEP-MARGINS.
If non-nil, that says to preserve the window's current margin, fringe,
and scroll-bar settings.
-*** The new function `window-tree' returns a frame's window tree.
+*** The new function 'window-tree' returns a frame's window tree.
-*** The functions `get-lru-window' and `get-largest-window' take an optional
-argument `dedicated'. If non-nil, those functions do not ignore
+*** The functions 'get-lru-window' and 'get-largest-window' take an optional
+argument 'dedicated'. If non-nil, those functions do not ignore
dedicated windows.
** Customizable fringe bitmaps
-*** There are new display properties, `left-fringe' and `right-fringe',
+*** There are new display properties, 'left-fringe' and 'right-fringe',
that can be used to show a specific bitmap in the left or right fringe
bitmap of the display line.
-Format is `display (left-fringe BITMAP [FACE])', where BITMAP is a
+Format is 'display (left-fringe BITMAP [FACE])', where BITMAP is a
symbol identifying a fringe bitmap, either built-in or defined with
-`define-fringe-bitmap', and FACE is an optional face name to be used
-for displaying the bitmap instead of the default `fringe' face.
-When specified, FACE is automatically merged with the `fringe' face.
+'define-fringe-bitmap', and FACE is an optional face name to be used
+for displaying the bitmap instead of the default 'fringe' face.
+When specified, FACE is automatically merged with the 'fringe' face.
-*** New buffer-local variables `fringe-indicator-alist' and
-`fringe-cursor-alist' maps between logical (internal) fringe indicator
+*** New buffer-local variables 'fringe-indicator-alist' and
+'fringe-cursor-alist' maps between logical (internal) fringe indicator
and cursor symbols and the actual fringe bitmaps to be displayed.
This decouples the logical meaning of the fringe indicators from the
physical appearance, as well as allowing different fringe bitmaps to
be used in different windows showing different buffers.
-*** New function `define-fringe-bitmap' can now be used to create new
+*** New function 'define-fringe-bitmap' can now be used to create new
fringe bitmaps, as well as change the built-in fringe bitmaps.
-*** New function `destroy-fringe-bitmap' deletes a fringe bitmap
+*** New function 'destroy-fringe-bitmap' deletes a fringe bitmap
or restores a built-in one to its default value.
-*** New function `set-fringe-bitmap-face' specifies the face to be
+*** New function 'set-fringe-bitmap-face' specifies the face to be
used for a specific fringe bitmap. The face is automatically merged
-with the `fringe' face, so normally, the face should only specify the
+with the 'fringe' face, so normally, the face should only specify the
foreground color of the bitmap.
-*** New function `fringe-bitmaps-at-pos' returns the current fringe
+*** New function 'fringe-bitmaps-at-pos' returns the current fringe
bitmaps in the display line at a given buffer position.
** Other window fringe features:
@@ -4780,7 +4779,7 @@ bitmaps in the display line at a given buffer position.
*** Controlling the default left and right fringe widths.
The default left and right fringe widths for all windows of a frame
-can now be controlled by setting the `left-fringe' and `right-fringe'
+can now be controlled by setting the 'left-fringe' and 'right-fringe'
frame parameters to an integer value specifying the width in pixels.
Setting the width to 0 effectively removes the corresponding fringe.
@@ -4802,113 +4801,113 @@ fringe bitmaps is 8 pixels.
position settings.
To control the fringe widths of a window, either set the buffer-local
-variables `left-fringe-width', `right-fringe-width', or call
-`set-window-fringes'.
+variables 'left-fringe-width', 'right-fringe-width', or call
+'set-window-fringes'.
To control the fringe position in a window, that is, whether fringes
are positioned between the display margins and the window's text area,
or at the edges of the window, either set the buffer-local variable
-`fringes-outside-margins' or call `set-window-fringes'.
+'fringes-outside-margins' or call 'set-window-fringes'.
-The function `window-fringes' can be used to obtain the current
-settings. To make `left-fringe-width', `right-fringe-width', and
-`fringes-outside-margins' take effect, you must set them before
-displaying the buffer in a window, or use `set-window-buffer' to force
+The function 'window-fringes' can be used to obtain the current
+settings. To make 'left-fringe-width', 'right-fringe-width', and
+'fringes-outside-margins' take effect, you must set them before
+displaying the buffer in a window, or use 'set-window-buffer' to force
an update of the display margins.
**** Windows can now have their own individual scroll-bar settings
controlling the width and position of scroll-bars.
To control the scroll-bar of a window, either set the buffer-local
-variables `scroll-bar-mode' and `scroll-bar-width', or call
-`set-window-scroll-bars'. The function `window-scroll-bars' can be
-used to obtain the current settings. To make `scroll-bar-mode' and
-`scroll-bar-width' take effect, you must set them before displaying
-the buffer in a window, or use `set-window-buffer' to force an update
+variables 'scroll-bar-mode' and 'scroll-bar-width', or call
+'set-window-scroll-bars'. The function 'window-scroll-bars' can be
+used to obtain the current settings. To make 'scroll-bar-mode' and
+'scroll-bar-width' take effect, you must set them before displaying
+the buffer in a window, or use 'set-window-buffer' to force an update
of the display margins.
** Redisplay features:
-*** `sit-for' can now be called with args (SECONDS &optional NODISP).
+*** 'sit-for' can now be called with args (SECONDS &optional NODISP).
*** Iconifying or deiconifying a frame no longer makes sit-for return.
-*** New function `redisplay' causes an immediate redisplay if no input is
+*** New function 'redisplay' causes an immediate redisplay if no input is
available, equivalent to (sit-for 0). The call (redisplay t) forces
an immediate redisplay even if input is pending.
-*** New function `force-window-update' can initiate a full redisplay of
+*** New function 'force-window-update' can initiate a full redisplay of
one or all windows. Normally, this is not needed as changes in window
contents are detected automatically. However, certain implicit
changes to mode lines, header lines, or display properties may require
forcing an explicit window update.
-*** (char-displayable-p CHAR) returns non-nil if Emacs ought to be able
-to display CHAR. More precisely, if the selected frame's fontset has
-a font to display the character set that CHAR belongs to.
+*** 'char-displayable-p' returns non-nil if Emacs ought to be able to
+display its char argument. More precisely, if the selected frame's fontset has
+a font to display the character set that char belongs to.
Fontsets can specify a font on a per-character basis; when the fontset
does that, this value cannot be accurate.
*** You can define multiple overlay arrows via the new
-variable `overlay-arrow-variable-list'.
+variable 'overlay-arrow-variable-list'.
It contains a list of variables which contain overlay arrow position
-markers, including the original `overlay-arrow-position' variable.
+markers, including the original 'overlay-arrow-position' variable.
-Each variable on this list can have individual `overlay-arrow-string'
-and `overlay-arrow-bitmap' properties that specify an overlay arrow
+Each variable on this list can have individual 'overlay-arrow-string'
+and 'overlay-arrow-bitmap' properties that specify an overlay arrow
string (for non-window terminals) or fringe bitmap (for window
systems) to display at the corresponding overlay arrow position.
-If either property is not set, the default `overlay-arrow-string' or
+If either property is not set, the default 'overlay-arrow-string' or
'overlay-arrow-fringe-bitmap' will be used.
-*** New `line-height' and `line-spacing' properties for newline characters
+*** New 'line-height' and 'line-spacing' properties for newline characters
-A newline can now have `line-height' and `line-spacing' text or overlay
+A newline can now have 'line-height' and 'line-spacing' text or overlay
properties that control the height of the corresponding display row.
-If the `line-height' property value is t, the newline does not
+If the 'line-height' property value is t, the newline does not
contribute to the height of the display row; instead the height of the
-newline glyph is reduced. Also, a `line-spacing' property on this
+newline glyph is reduced. Also, a 'line-spacing' property on this
newline is ignored. This can be used to tile small images or image
slices without adding blank areas between the images.
-If the `line-height' property value is a positive integer, the value
+If the 'line-height' property value is a positive integer, the value
specifies the minimum line height in pixels. If necessary, the line
height it increased by increasing the line's ascent.
-If the `line-height' property value is a float, the minimum line
+If the 'line-height' property value is a float, the minimum line
height is calculated by multiplying the default frame line height by
the given value.
-If the `line-height' property value is a cons (FACE . RATIO), the
+If the 'line-height' property value is a cons (FACE . RATIO), the
minimum line height is calculated as RATIO * height of named FACE.
RATIO is int or float. If FACE is t, it specifies the current face.
-If the `line-height' property value is a cons (nil . RATIO), the line
+If the 'line-height' property value is a cons (nil . RATIO), the line
height is calculated as RATIO * actual height of the line's contents.
-If the `line-height' value is a cons (HEIGHT . TOTAL), HEIGHT specifies
+If the 'line-height' value is a cons (HEIGHT . TOTAL), HEIGHT specifies
the line height as described above, while TOTAL is any of the forms
described above and specifies the total height of the line, causing a
varying number of pixels to be inserted after the line to make it line
exactly that many pixels high.
-If the `line-spacing' property value is a positive integer, the value
+If the 'line-spacing' property value is a positive integer, the value
is used as additional pixels to insert after the display line; this
-overrides the default frame `line-spacing' and any buffer local value of
-the `line-spacing' variable.
+overrides the default frame 'line-spacing' and any buffer local value of
+the 'line-spacing' variable.
-If the `line-spacing' property is a float or cons, the line spacing
-is calculated as specified above for the `line-height' property.
+If the 'line-spacing' property is a float or cons, the line spacing
+is calculated as specified above for the 'line-height' property.
-*** The buffer local `line-spacing' variable can now have a float value,
+*** The buffer local 'line-spacing' variable can now have a float value,
which is used as a height relative to the default frame line height.
*** Enhancements to stretch display properties
-The display property stretch specification form `(space PROPS)', where
+The display property stretch specification form '(space PROPS)', where
PROPS is a property list, now allows pixel based width and height
specifications, as well as enhanced horizontal text alignment.
@@ -4925,22 +4924,22 @@ POS ::= left | center | right
FORM ::= (NUM . EXPR) | (OP EXPR ...)
OP ::= + | -
-The form `NUM' specifies a fractional width or height of the default
-frame font size. The form `(NUM)' specifies an absolute number of
+The form 'NUM' specifies a fractional width or height of the default
+frame font size. The form '(NUM)' specifies an absolute number of
pixels. If a symbol is specified, its buffer-local variable binding
-is used. The `in', `mm', and `cm' units specifies the number of
-pixels per inch, milli-meter, and centi-meter, resp. The `width' and
-`height' units correspond to the width and height of the current face
+is used. The 'in', 'mm', and 'cm' units specifies the number of
+pixels per inch, milli-meter, and centi-meter, resp. The 'width' and
+'height' units correspond to the width and height of the current face
font. An image specification corresponds to the width or height of
the image.
-The `left-fringe', `right-fringe', `left-margin', `right-margin',
-`scroll-bar', and `text' elements specify to the width of the
+The 'left-fringe', 'right-fringe', 'left-margin', 'right-margin',
+'scroll-bar', and 'text' elements specify to the width of the
corresponding area of the window.
-The `left', `center', and `right' positions can be used with :align-to
+The 'left', 'center', and 'right' positions can be used with :align-to
to specify a position relative to the left edge, center, or right edge
-of the text area. One of the above window elements (except `text')
+of the text area. One of the above window elements (except 'text')
can also be used with :align-to to specify that the position is
relative to the left edge of the given area. Once the base offset for
a relative position has been set (by the first occurrence of one of
@@ -4954,18 +4953,18 @@ If no specific base offset is set for alignment, it is always relative
to the left edge of the text area. For example, :align-to 0 in a
header line aligns with the first text column in the text area.
-The value of the form `(NUM . EXPR)' is the value of NUM multiplied by
+The value of the form '(NUM . EXPR)' is the value of NUM multiplied by
the value of the expression EXPR. For example, (2 . in) specifies a
width of 2 inches, while (0.5 . IMAGE) specifies half the width (or
height) of the specified image.
-The form `(+ EXPR ...)' adds up the value of the expressions.
-The form `(- EXPR ...)' negates or subtracts the value of the expressions.
+The form '(+ EXPR ...)' adds up the value of the expressions.
+The form '(- EXPR ...)' negates or subtracts the value of the expressions.
*** Normally, the cursor is displayed at the end of any overlay and
text property string that may be present at the current window
position. The cursor can now be placed on any character of such
-strings by giving that character a non-nil `cursor' text property.
+strings by giving that character a non-nil 'cursor' text property.
*** The display space :width and :align-to text properties are now
supported on text terminals.
@@ -4975,10 +4974,10 @@ supported on text terminals.
**** New display property (slice X Y WIDTH HEIGHT) can be used with
an image property to display only a specific slice of the image.
-**** Function `insert-image' has new optional fourth arg to
+**** Function 'insert-image' has new optional fourth arg to
specify image slice (X Y WIDTH HEIGHT).
-**** New function `insert-sliced-image' inserts a given image as a
+**** New function 'insert-sliced-image' inserts a given image as a
specified number of evenly sized slices (rows x columns).
*** Images can now have an associated image map via the :map property.
@@ -4993,20 +4992,20 @@ A polygon is a cons (poly . [X0 Y0 X1 Y1 ...]) where each pair in the
vector describes one corner in the polygon.
When the mouse pointer is above a hot-spot area of an image, the
-PLIST of that hot-spot is consulted; if it contains a `help-echo'
+PLIST of that hot-spot is consulted; if it contains a 'help-echo'
property it defines a tool-tip for the hot-spot, and if it contains
-a `pointer' property, it defines the shape of the mouse cursor when
-it is over the hot-spot. See the variable `void-area-text-pointer'
+a 'pointer' property, it defines the shape of the mouse cursor when
+it is over the hot-spot. See the variable 'void-area-text-pointer'
for possible pointer shapes.
When you click the mouse when the mouse pointer is over a hot-spot,
an event is composed by combining the ID of the hot-spot with the
-mouse event, e.g. [area4 mouse-1] if the hot-spot's ID is `area4'.
+mouse event, e.g. [area4 mouse-1] if the hot-spot's ID is 'area4'.
-*** The function `find-image' now searches in etc/images/ and etc/.
-The new variable `image-load-path' is a list of locations in which to
+*** The function 'find-image' now searches in etc/images/ and etc/.
+The new variable 'image-load-path' is a list of locations in which to
search for image files. The default is to search in etc/images, then
-in etc/, and finally in the directories specified by `load-path'.
+in etc/, and finally in the directories specified by 'load-path'.
Subdirectories of etc/ and etc/images are not recursively searched; if
you put an image file in a subdirectory, you have to specify it
explicitly; for example, if an image is put in etc/images/foo/bar.xpm:
@@ -5016,31 +5015,31 @@ explicitly; for example, if an image is put in etc/images/foo/bar.xpm:
Note that all images formerly located in the lisp directory have been
moved to etc/images.
-*** New function `image-load-path-for-library' returns a suitable
+*** New function 'image-load-path-for-library' returns a suitable
search path for images relative to library. This function is useful in
external packages to save users from having to update
-`image-load-path'.
+'image-load-path'.
-*** The new variable `max-image-size' defines the maximum size of
+*** The new variable 'max-image-size' defines the maximum size of
images that Emacs will load and display.
-*** The new variable `display-mm-dimensions-alist' can be used to
+*** The new variable 'display-mm-dimensions-alist' can be used to
override incorrect graphical display dimensions returned by functions
-`display-mm-height' and `display-mm-width'.
+'display-mm-height' and 'display-mm-width'.
** Mouse pointer features:
*** The mouse pointer shape in void text areas (i.e. after the end of a
line or below the last line in the buffer) of the text window is now
-controlled by the new variable `void-text-area-pointer'. The default
-is to use the `arrow' (non-text) pointer. Other choices are `text'
-(or nil), `hand', `vdrag', `hdrag', `modeline', and `hourglass'.
+controlled by the new variable 'void-text-area-pointer'. The default
+is to use the 'arrow' (non-text) pointer. Other choices are 'text'
+(or nil), 'hand', 'vdrag', 'hdrag', 'modeline', and 'hourglass'.
*** The mouse pointer shape over an image can now be controlled by the
:pointer image property.
*** The mouse pointer shape over ordinary text or images can now be
-controlled/overridden via the `pointer' text property.
+controlled/overridden via the 'pointer' text property.
** Mouse event enhancements:
@@ -5048,8 +5047,8 @@ controlled/overridden via the `pointer' text property.
you clicked. For mouse clicks in window margins and fringes, this is
a sensible buffer position corresponding to the surrounding text.
-*** Mouse events for clicks on window fringes now specify `left-fringe'
-or `right-fringe' as the area.
+*** Mouse events for clicks on window fringes now specify 'left-fringe'
+or 'right-fringe' as the area.
*** Mouse events include actual glyph column and row for all event types
and all areas.
@@ -5062,14 +5061,14 @@ the top left corner of the object (image or character) clicked on.
*** Mouse events include the pixel width and height of the object
(image or character) clicked on.
-*** Function `mouse-set-point' now works for events outside text area.
+*** Function 'mouse-set-point' now works for events outside text area.
-*** `posn-point' now returns buffer position for non-text area events.
+*** 'posn-point' now returns buffer position for non-text area events.
-*** New function `posn-area' returns window area clicked on (nil means
+*** New function 'posn-area' returns window area clicked on (nil means
text area).
-*** New function `posn-actual-col-row' returns the actual glyph coordinates
+*** New function 'posn-actual-col-row' returns the actual glyph coordinates
of the mouse event position.
*** New functions 'posn-object', 'posn-object-x-y', 'posn-object-width-height'.
@@ -5080,70 +5079,70 @@ the total width and height of that object.
** Text property and overlay changes:
-*** Arguments for `remove-overlays' are now optional, so that you can
+*** Arguments for 'remove-overlays' are now optional, so that you can
remove all overlays in the buffer with just (remove-overlays).
-*** New variable `char-property-alias-alist'.
+*** New variable 'char-property-alias-alist'.
This variable allows you to create alternative names for text
-properties. It works at the same level as `default-text-properties',
+properties. It works at the same level as 'default-text-properties',
although it applies to overlays as well. This variable was introduced
-to implement the `font-lock-face' property.
+to implement the 'font-lock-face' property.
-*** New function `get-char-property-and-overlay' accepts the same
-arguments as `get-char-property' and returns a cons whose car is the
-return value of `get-char-property' called with those arguments and
+*** New function 'get-char-property-and-overlay' accepts the same
+arguments as 'get-char-property' and returns a cons whose car is the
+return value of 'get-char-property' called with those arguments and
whose cdr is the overlay in which the property was found, or nil if
it was found as a text property or not found at all.
-*** The new function `remove-list-of-text-properties'.
+*** The new function 'remove-list-of-text-properties'.
-It is like `remove-text-properties' except that it takes a list of
+It is like 'remove-text-properties' except that it takes a list of
property names as argument rather than a property list.
** Face changes
-*** The variable `facemenu-unlisted-faces' has been removed.
+*** The variable 'facemenu-unlisted-faces' has been removed.
Emacs has a lot more faces than in the past, and nearly all of them
-needed to be excluded. The new variable `facemenu-listed-faces' lists
+needed to be excluded. The new variable 'facemenu-listed-faces' lists
the faces to include in the face menu.
-*** The new face attribute condition `min-colors' can be used to tailor
+*** The new face attribute condition 'min-colors' can be used to tailor
the face color to the number of colors supported by a display, and
define the foreground and background colors accordingly so that they
look best on a terminal that supports at least this many colors. This
is now the preferred method for defining default faces in a way that
makes a good use of the capabilities of the display.
-*** New function `display-supports-face-attributes-p' can be used to test
+*** New function 'display-supports-face-attributes-p' can be used to test
whether a given set of face attributes is actually displayable.
-A new predicate `supports' has also been added to the `defface' face
+A new predicate 'supports' has also been added to the 'defface' face
specification language, which can be used to do this test for faces
-defined with `defface'.
+defined with 'defface'.
-*** The special treatment of faces whose names are of the form `fg:COLOR'
-or `bg:COLOR' has been removed. Lisp programs should use the
-`defface' facility for defining faces with specific colors, or use
+*** The special treatment of faces whose names are of the form 'fg:COLOR'
+or 'bg:COLOR' has been removed. Lisp programs should use the
+'defface' facility for defining faces with specific colors, or use
the feature of specifying the face attributes :foreground and :background
-directly in the `face' property instead of using a named face.
+directly in the 'face' property instead of using a named face.
*** The first face specification element in a defface can specify
-`default' instead of frame classification. Then its attributes act as
+'default' instead of frame classification. Then its attributes act as
defaults that apply to all the subsequent cases (and can be overridden
by them).
-*** The function `face-differs-from-default-p' now truly checks
+*** The function 'face-differs-from-default-p' now truly checks
whether the given face displays differently from the default face or
not (previously it did only a very cursory check).
-*** `face-attribute', `face-foreground', `face-background', `face-stipple'.
+*** 'face-attribute', 'face-foreground', 'face-background', 'face-stipple'.
These now accept a new optional argument, INHERIT, which controls how
face inheritance is used when determining the value of a face
attribute.
-*** New functions `face-attribute-relative-p' and `merge-face-attribute'
+*** New functions 'face-attribute-relative-p' and 'merge-face-attribute'
help with handling relative face attributes.
*** The priority of faces in an :inherit attribute face list is reversed.
@@ -5152,9 +5151,9 @@ If a face contains an :inherit attribute with a list of faces, earlier
faces in the list override later faces in the list; in previous
releases of Emacs, the order was the opposite. This change was made
so that :inherit face lists operate identically to face lists in text
-`face' properties.
+'face' properties.
-*** The variable `face-font-rescale-alist' specifies how much larger
+*** The variable 'face-font-rescale-alist' specifies how much larger
(or smaller) font we should use. For instance, if the value is
'((SOME-FONTNAME-PATTERN . 1.3)) and a face requests a font of 10
point, we actually use a font of 13 point if the font matches
@@ -5166,33 +5165,33 @@ not specified. In previous releases of Emacs, if either foreground
or background color was unspecified, colors were not swapped. This
was inconsistent with the face behavior under X.
-*** `set-fontset-font', `fontset-info', `fontset-font' now operate on
+*** 'set-fontset-font', 'fontset-info', 'fontset-font' now operate on
the default fontset if the argument NAME is nil..
** Font-Lock changes:
-*** New special text property `font-lock-face'.
+*** New special text property 'font-lock-face'.
-This property acts like the `face' property, but it is controlled by
+This property acts like the 'face' property, but it is controlled by
M-x font-lock-mode. It is not, strictly speaking, a builtin text
property. Instead, it is implemented inside font-core.el, using the
-new variable `char-property-alias-alist'.
+new variable 'char-property-alias-alist'.
-*** font-lock can manage arbitrary text-properties beside `face'.
+*** font-lock can manage arbitrary text-properties beside 'face'.
-**** the FACENAME returned in `font-lock-keywords' can be a list of the
+**** the FACENAME returned in 'font-lock-keywords' can be a list of the
form (face FACE PROP1 VAL1 PROP2 VAL2 ...) so you can set other
-properties than `face'.
+properties than 'face'.
-**** `font-lock-extra-managed-props' can be set to make sure those
+**** 'font-lock-extra-managed-props' can be set to make sure those
extra properties are automatically cleaned up by font-lock.
-*** jit-lock obeys a new text-property `jit-lock-defer-multiline'.
+*** jit-lock obeys a new text-property 'jit-lock-defer-multiline'.
If a piece of text with that property gets contextually refontified
-(see `jit-lock-defer-contextually'), then all of that text will
+(see 'jit-lock-defer-contextually'), then all of that text will
be refontified. This is useful when the syntax of a textual element
-depends on text several lines further down (and when `font-lock-multiline'
+depends on text several lines further down (and when 'font-lock-multiline'
is not appropriate to solve that problem). For example in Perl:
s{
@@ -5201,85 +5200,85 @@ is not appropriate to solve that problem). For example in Perl:
bar
}e
-Adding/removing the last `e' changes the `bar' from being a piece of
-text to being a piece of code, so you'd put a `jit-lock-defer-multiline'
+Adding/removing the last 'e' changes the 'bar' from being a piece of
+text to being a piece of code, so you'd put a 'jit-lock-defer-multiline'
property over the second half of the command to force (deferred)
-refontification of `bar' whenever the `e' is added/removed.
+refontification of 'bar' whenever the 'e' is added/removed.
-*** `font-lock-extend-region-functions' makes it possible to alter the way
+*** 'font-lock-extend-region-functions' makes it possible to alter the way
the fontification region is chosen. This can be used to prevent rounding
up to whole lines, or to extend the region to include all related lines
of multiline constructs so that such constructs get properly recognized.
** Major mode mechanism changes:
-*** New variable `magic-mode-alist' determines major mode for a file by
-looking at the file contents. It takes precedence over `auto-mode-alist'.
+*** New variable 'magic-mode-alist' determines major mode for a file by
+looking at the file contents. It takes precedence over 'auto-mode-alist'.
-*** New variable `magic-fallback-mode-alist' determines major mode for a file by
-looking at the file contents. It is handled after `auto-mode-alist',
-only if `auto-mode-alist' (and `magic-mode-alist') says nothing about the file.
+*** New variable 'magic-fallback-mode-alist' determines major mode for a file by
+looking at the file contents. It is handled after 'auto-mode-alist',
+only if 'auto-mode-alist' (and 'magic-mode-alist') says nothing about the file.
-*** XML or SGML major mode is selected when file starts with an `<?xml'
-or `<!DOCTYPE' declaration.
+*** XML or SGML major mode is selected when file starts with an '<?xml'
+or '<!DOCTYPE' declaration.
*** An interpreter magic line (if present) takes precedence over the
file name when setting the major mode.
-*** If new variable `auto-mode-case-fold' is set to a non-nil value,
+*** If new variable 'auto-mode-case-fold' is set to a non-nil value,
Emacs will perform a second case-insensitive search through
-`auto-mode-alist' if the first case-sensitive search fails. This
+'auto-mode-alist' if the first case-sensitive search fails. This
means that a file FILE.TXT is opened in text-mode, and a file
PROG.HTML is opened in html-mode. Note however, that independent of
this setting, *.C files are usually recognized as C++ files. It also
has no effect on systems with case-insensitive file names.
*** All major mode functions should now run the new normal hook
-`after-change-major-mode-hook', at their very end, after the mode
-hooks. `run-mode-hooks' does this automatically.
+'after-change-major-mode-hook', at their very end, after the mode
+hooks. 'run-mode-hooks' does this automatically.
-*** Major modes can define `eldoc-documentation-function'
+*** Major modes can define 'eldoc-documentation-function'
locally to provide ElDoc functionality by some method appropriate to
the language.
-*** Use the new function `run-mode-hooks' to run the major mode's mode hook.
+*** Use the new function 'run-mode-hooks' to run the major mode's mode hook.
-*** The new function `run-mode-hooks' and the new macro `delay-mode-hooks'
-are used by `define-derived-mode' to make sure the mode hook for the
+*** The new function 'run-mode-hooks' and the new macro 'delay-mode-hooks'
+are used by 'define-derived-mode' to make sure the mode hook for the
parent mode is run at the end of the child mode.
-*** `define-derived-mode' by default creates a new empty abbrev table.
+*** 'define-derived-mode' by default creates a new empty abbrev table.
It does not copy abbrevs from the parent mode's abbrev table.
-*** If a major mode function has a non-nil `no-clone-indirect'
-property, `clone-indirect-buffer' signals an error if you use
+*** If a major mode function has a non-nil 'no-clone-indirect'
+property, 'clone-indirect-buffer' signals an error if you use
it in that buffer.
** Minor mode changes:
-*** `define-minor-mode' now accepts arbitrary additional keyword arguments
-and simply passes them to `defcustom', if applicable.
+*** 'define-minor-mode' now accepts arbitrary additional keyword arguments
+and simply passes them to 'defcustom', if applicable.
-*** `define-globalized-minor-mode'.
+*** 'define-globalized-minor-mode'.
This is a new name for what was formerly called
-`easy-mmode-define-global-mode'. The old name remains as an alias.
+'easy-mmode-define-global-mode'. The old name remains as an alias.
-*** `minor-mode-list' now holds a list of minor mode commands.
+*** 'minor-mode-list' now holds a list of minor mode commands.
** Command loop changes:
-*** The new function `called-interactively-p' does what many people
-have mistakenly believed `interactive-p' to do: it returns t if the
-calling function was called through `call-interactively'.
+*** The new function 'called-interactively-p' does what many people
+have mistakenly believed 'interactive-p' to do: it returns t if the
+calling function was called through 'call-interactively'.
Only use this when you cannot solve the problem by adding a new
INTERACTIVE argument to the command.
-*** The function `commandp' takes an additional optional argument.
+*** The function 'commandp' takes an additional optional argument.
-If it is non-nil, then `commandp' checks for a function that could be
-called with `call-interactively', and does not return t for keyboard
+If it is non-nil, then 'commandp' checks for a function that could be
+called with 'call-interactively', and does not return t for keyboard
macros.
*** When a command returns, the command loop moves point out from
@@ -5289,41 +5288,41 @@ covered by an image or composition property.
This makes it generally unnecessary to mark invisible text as intangible.
This is particularly good because the intangible property often has
unexpected side-effects since the property applies to everything
-(including `goto-char', ...) whereas this new code is only run after
-`post-command-hook' and thus does not care about intermediate states.
+(including 'goto-char', ...) whereas this new code is only run after
+'post-command-hook' and thus does not care about intermediate states.
-*** If a command sets `transient-mark-mode' to `only', that
+*** If a command sets 'transient-mark-mode' to 'only', that
enables Transient Mark mode for the following command only.
-During that following command, the value of `transient-mark-mode'
-is `identity'. If it is still `identity' at the end of the command,
+During that following command, the value of 'transient-mark-mode'
+is 'identity'. If it is still 'identity' at the end of the command,
the next return to the command loop changes to nil.
-*** Both the variable and the function `disabled-command-hook' have
-been renamed to `disabled-command-function'. The variable
-`disabled-command-hook' has been kept as an obsolete alias.
+*** Both the variable and the function 'disabled-command-hook' have
+been renamed to 'disabled-command-function'. The variable
+'disabled-command-hook' has been kept as an obsolete alias.
-*** `emacsserver' now runs `pre-command-hook' and `post-command-hook'
+*** 'emacsserver' now runs 'pre-command-hook' and 'post-command-hook'
when it receives a request from emacsclient.
-*** `current-idle-time' reports how long Emacs has been idle.
+*** 'current-idle-time' reports how long Emacs has been idle.
** Lisp file loading changes:
-*** `load-history' can now have elements of the form (t . FUNNAME),
+*** 'load-history' can now have elements of the form (t . FUNNAME),
which means FUNNAME was previously defined as an autoload (before the
current file redefined it).
-*** `load-history' now records (defun . FUNNAME) when a function is
+*** 'load-history' now records (defun . FUNNAME) when a function is
defined. For a variable, it records just the variable name.
-*** The function `symbol-file' can now search specifically for function,
+*** The function 'symbol-file' can now search specifically for function,
variable or face definitions.
-*** `provide' and `featurep' now accept an optional second argument
-to test/provide subfeatures. Also `provide' now checks `after-load-alist'
+*** 'provide' and 'featurep' now accept an optional second argument
+to test/provide subfeatures. Also 'provide' now checks 'after-load-alist'
and runs any code associated with the provided feature.
-*** The variable `recursive-load-depth-limit' has been deleted.
+*** The variable 'recursive-load-depth-limit' has been deleted.
Emacs now signals an error if the same file is loaded with more
than 3 levels of nesting.
@@ -5335,8 +5334,8 @@ warning and error messages have been brought into line with GNU standards
for these. As a result, you can use next-error and friends on the
compilation output buffer.
-*** The new macro `with-no-warnings' suppresses all compiler warnings
-inside its body. In terms of execution, it is equivalent to `progn'.
+*** The new macro 'with-no-warnings' suppresses all compiler warnings
+inside its body. In terms of execution, it is equivalent to 'progn'.
*** You can avoid warnings for possibly-undefined symbols with a
simple convention that the compiler understands. (This is mostly
@@ -5347,21 +5346,21 @@ forms:
(if (fboundp 'foo) <then> <else>)
(if (boundp 'foo) <then> <else)
-In the first case, using `foo' as a function inside the <then> form
+In the first case, using 'foo' as a function inside the <then> form
won't produce a warning if it's not defined as a function, and in the
-second case, using `foo' as a variable won't produce a warning if it's
+second case, using 'foo' as a variable won't produce a warning if it's
unbound. The test must be in exactly one of the above forms (after
-macro expansion), but such tests can be nested. Note that `when' and
-`unless' expand to `if', but `cond' doesn't.
+macro expansion), but such tests can be nested. Note that 'when' and
+'unless' expand to 'if', but 'cond' doesn't.
-*** `(featurep 'xemacs)' is treated by the compiler as nil. This
+*** '(featurep 'xemacs)' is treated by the compiler as nil. This
helps to avoid noisy compiler warnings in code meant to run under both
Emacs and XEmacs and can sometimes make the result significantly more
efficient. Since byte code from recent versions of XEmacs won't
generally run in Emacs and vice versa, this optimization doesn't lose
you anything.
-*** The local variable `no-byte-compile' in Lisp files is now obeyed.
+*** The local variable 'no-byte-compile' in Lisp files is now obeyed.
*** When a Lisp file uses CL functions at run-time, compiling the file
now issues warnings about these calls, unless the file performs
@@ -5369,33 +5368,33 @@ now issues warnings about these calls, unless the file performs
** Frame operations:
-*** New functions `frame-current-scroll-bars' and `window-current-scroll-bars'.
+*** New functions 'frame-current-scroll-bars' and 'window-current-scroll-bars'.
These functions return the current locations of the vertical and
horizontal scroll bars in a frame or window.
-*** The new function `modify-all-frames-parameters' modifies parameters
+*** The new function 'modify-all-frames-parameters' modifies parameters
for all (existing and future) frames.
-*** The new frame parameter `tty-color-mode' specifies the mode to use
+*** The new frame parameter 'tty-color-mode' specifies the mode to use
for color support on character terminal frames. Its value can be a
number of colors to support, or a symbol. See the Emacs Lisp
Reference manual for more detailed documentation.
*** When using non-toolkit scroll bars with the default width,
-the `scroll-bar-width' frame parameter value is nil.
+the 'scroll-bar-width' frame parameter value is nil.
** Mode line changes:
-*** New function `format-mode-line'.
+*** New function 'format-mode-line'.
This returns the mode line or header line of the selected (or a
specified) window as a string with or without text properties.
-*** The new mode-line construct `(:propertize ELT PROPS...)' can be
+*** The new mode-line construct '(:propertize ELT PROPS...)' can be
used to add text properties to mode-line elements.
-*** The new `%i' and `%I' constructs for `mode-line-format' can be used
+*** The new '%i' and '%I' constructs for 'mode-line-format' can be used
to display the size of the accessible part of the buffer on the mode
line.
@@ -5409,13 +5408,13 @@ proper name "file". In previous Emacs versions, you had to specify
several versions ago.
*** The dummy function keys made by easy-menu are now always lower case.
-If you specify the menu item name "Ada", for instance, it uses `ada'
+If you specify the menu item name "Ada", for instance, it uses 'ada'
as the "key" bound by that key binding.
This is relevant only if Lisp code looks for the bindings that were
made with easy-menu.
-*** `easy-menu-define' now allows you to use nil for the symbol name
+*** 'easy-menu-define' now allows you to use nil for the symbol name
if you don't need to give the menu a name. If you install the menu
into other keymaps right away (MAPS is non-nil), it usually doesn't
need to have a name.
@@ -5437,62 +5436,62 @@ the time it takes to convert the format.
3. For binary files where format conversion would be pointless and
wasteful.
-*** The new variable `auto-coding-functions' lets you specify functions
+*** The new variable 'auto-coding-functions' lets you specify functions
to examine a file being visited and deduce the proper coding system
for it. (If the coding system is detected incorrectly for a specific
-file, you can put a `coding:' tags to override it.)
+file, you can put a 'coding:' tags to override it.)
-*** The new variable `ascii-case-table' stores the case table for the
+*** The new variable 'ascii-case-table' stores the case table for the
ascii character set. Language environments (such as Turkish) may
alter the case correspondences of ASCII characters. This variable
saves the original ASCII case table before any such changes.
-*** The new function `merge-coding-systems' fills in unspecified aspects
+*** The new function 'merge-coding-systems' fills in unspecified aspects
of one coding system from another coding system.
-*** New coding system property `mime-text-unsuitable' indicates that
-the coding system's `mime-charset' is not suitable for MIME text
+*** New coding system property 'mime-text-unsuitable' indicates that
+the coding system's 'mime-charset' is not suitable for MIME text
parts, e.g. utf-16.
-*** New function `decode-coding-inserted-region' decodes a region as if
+*** New function 'decode-coding-inserted-region' decodes a region as if
it is read from a file without decoding.
-*** New CCL functions `lookup-character' and `lookup-integer' access
-hash tables defined by the Lisp function `define-translation-hash-table'.
+*** New CCL functions 'lookup-character' and 'lookup-integer' access
+hash tables defined by the Lisp function 'define-translation-hash-table'.
-*** New function `quail-find-key' returns a list of keys to type in the
+*** New function 'quail-find-key' returns a list of keys to type in the
current input method to input a character.
-*** `set-buffer-file-coding-system' now takes an additional argument,
+*** 'set-buffer-file-coding-system' now takes an additional argument,
NOMODIFY. If it is non-nil, it means don't mark the buffer modified.
** Operating system access:
-*** The new primitive `get-internal-run-time' returns the processor
+*** The new primitive 'get-internal-run-time' returns the processor
run time used by Emacs since start-up.
-*** Functions `user-uid' and `user-real-uid' now return floats if the
-user UID doesn't fit in a Lisp integer. Function `user-full-name'
+*** Functions 'user-uid' and 'user-real-uid' now return floats if the
+user UID doesn't fit in a Lisp integer. Function 'user-full-name'
accepts a float as UID parameter.
-*** New function `locale-info' accesses locale information.
+*** New function 'locale-info' accesses locale information.
*** On MS Windows, locale-coding-system is used to interact with the OS.
The Windows specific variable w32-system-coding-system, which was
formerly used for that purpose is now an alias for locale-coding-system.
-*** New function `redirect-debugging-output' can be used to redirect
+*** New function 'redirect-debugging-output' can be used to redirect
debugging output on the stderr file handle to a file.
** GC changes:
-*** New variable `gc-cons-percentage' automatically grows the GC cons threshold
+*** New variable 'gc-cons-percentage' automatically grows the GC cons threshold
as the heap size increases.
-*** New variables `gc-elapsed' and `gcs-done' provide extra information
+*** New variables 'gc-elapsed' and 'gcs-done' provide extra information
on garbage collection.
-*** The normal hook `post-gc-hook' is run at the end of garbage collection.
+*** The normal hook 'post-gc-hook' is run at the end of garbage collection.
The hook is run with GC inhibited, so use it with care.
@@ -5500,28 +5499,28 @@ The hook is run with GC inhibited, so use it with care.
*** A number of hooks have been renamed to better follow the conventions:
-`find-file-hooks' to `find-file-hook',
-`find-file-not-found-hooks' to `find-file-not-found-functions',
-`write-file-hooks' to `write-file-functions',
-`write-contents-hooks' to `write-contents-functions',
-`x-lost-selection-hooks' to `x-lost-selection-functions',
-`x-sent-selection-hooks' to `x-sent-selection-functions',
-`delete-frame-hook' to `delete-frame-functions'.
+'find-file-hooks' to 'find-file-hook',
+'find-file-not-found-hooks' to 'find-file-not-found-functions',
+'write-file-hooks' to 'write-file-functions',
+'write-contents-hooks' to 'write-contents-functions',
+'x-lost-selection-hooks' to 'x-lost-selection-functions',
+'x-sent-selection-hooks' to 'x-sent-selection-functions',
+'delete-frame-hook' to 'delete-frame-functions'.
In each case the old name remains as an alias for the moment.
-*** Variable `local-write-file-hooks' is marked obsolete.
+*** Variable 'local-write-file-hooks' is marked obsolete.
-Use the LOCAL arg of `add-hook'.
+Use the LOCAL arg of 'add-hook'.
-*** New function `x-send-client-message' sends a client message when
+*** New function 'x-send-client-message' sends a client message when
running under X.
* New Packages for Lisp Programming in Emacs 22.1
-** The new library button.el implements simple and fast `clickable
+** The new library button.el implements simple and fast 'clickable
buttons' in Emacs buffers. Buttons are much lighter-weight than the
-`widgets' implemented by widget.el, and can be used by lisp code that
+'widgets' implemented by widget.el, and can be used by lisp code that
doesn't require the full power of widgets. Emacs uses buttons for
such things as help and apropos buffers.
@@ -5545,15 +5544,15 @@ This is how to use sql.el and master.el together: the variable
sql-buffer contains the slave buffer. It is a local variable in the
SQL buffer.
-(add-hook 'sql-mode-hook
- (function (lambda ()
- (master-mode t)
- (master-set-slave sql-buffer))))
-(add-hook 'sql-set-sqli-hook
- (function (lambda ()
- (master-set-slave sql-buffer))))
+ (add-hook 'sql-mode-hook
+ (function (lambda ()
+ (master-mode t)
+ (master-set-slave sql-buffer))))
+ (add-hook 'sql-set-sqli-hook
+ (function (lambda ()
+ (master-set-slave sql-buffer))))
-** The new library benchmark.el does timing measurements on Lisp code.
+** The new library 'benchmark' does timing measurements on Lisp code.
This includes measuring garbage collection time.
@@ -5562,23 +5561,23 @@ This includes measuring garbage collection time.
This is so you can tell whether you've tested all paths in your Lisp
code. It works with edebug.
-The function `testcover-start' instruments all functions in a given
-file. Then test your code. The function `testcover-mark-all' adds
+The function 'testcover-start' instruments all functions in a given
+file. Then test your code. The function 'testcover-mark-all' adds
overlay "splotches" to the Lisp file's buffer to show where coverage
-is lacking. The command `testcover-next-mark' (bind it to a key!)
+is lacking. The command 'testcover-next-mark' (bind it to a key!)
will move point forward to the next spot that has a splotch.
Normally, a red splotch indicates the form was never completely
evaluated; a brown splotch means it always evaluated to the same
value. The red splotches are skipped for forms that can't possibly
-complete their evaluation, such as `error'. The brown splotches are
+complete their evaluation, such as 'error'. The brown splotches are
skipped for forms that are expected to always evaluate to the same
value, such as (setq x 14).
For difficult cases, you can add do-nothing macros to your code to
-help out the test coverage tool. The macro `noreturn' suppresses a
-red splotch. It is an error if the argument to `noreturn' does
-return. The macro `1value' suppresses a brown splotch for its argument.
+help out the test coverage tool. The macro 'noreturn' suppresses a
+red splotch. It is an error if the argument to 'noreturn' does
+return. The macro '1value' suppresses a brown splotch for its argument.
This macro is a no-op except during test-coverage -- then it signals
an error if the argument actually returns differing values.
diff --git a/etc/NEWS.23 b/etc/NEWS.23
index da483c3e7b1..ef87db79d92 100644
--- a/etc/NEWS.23
+++ b/etc/NEWS.23
@@ -11,7 +11,7 @@ This file is about changes in Emacs version 23.
See files NEWS.22, NEWS.21, NEWS.20, NEWS.19, NEWS.18, and NEWS.1-17
for changes in older Emacs versions.
-You can narrow news to a specific version by calling `view-emacs-news'
+You can narrow news to a specific version by calling 'view-emacs-news'
with a prefix argument or by typing C-u C-h C-n.
@@ -28,12 +28,12 @@ downloaded.
** EDE
-*** New variable `ede-project-directories'.
+*** New variable 'ede-project-directories'.
EDE now refuses to automatically load a project file (Project.ede)
unless the file is in one of the directories specified by this
variable. This reduces the risk of inadvertently loading malicious
-project files. The commands `M-x ede-new' and `M-x ede' now offer to
-save directories to `ede-project-directories'.
+project files. The commands 'M-x ede-new' and 'M-x ede' now offer to
+save directories to 'ede-project-directories'.
* Changes in Emacs 23.4 on non-free operating systems
@@ -51,10 +51,10 @@ used on x86-64 and s390x GNU/Linux architectures.
* Changes in Emacs 23.3
-** The last-resort backup file `%backup%~' is now written to
-`user-emacs-directory', instead of the user's home directory.
+** The last-resort backup file '%backup%~' is now written to
+'user-emacs-directory', instead of the user's home directory.
-** If Emacs creates `user-emacs-directory', that directory's
+** If Emacs creates 'user-emacs-directory', that directory's
permissions are now set to rwx------, ignoring the umask.
@@ -62,46 +62,46 @@ permissions are now set to rwx------, ignoring the umask.
** Calendar and diary
-*** The appt-add command takes an optional argument, the warning time.
-This can be used in place of the default appt-message-warning-time.
+*** The 'appt-add' command takes an optional argument, the warning time.
+This can be used in place of the default 'appt-message-warning-time'.
** Python mode
*** You can allow inferior Python processes to load modules from the
-current directory by setting `python-remove-cwd-from-path' to nil.
+current directory by setting 'python-remove-cwd-from-path' to nil.
** Rmail
-*** The default value of `rmail-enable-mime' is now t. Rmail decodes
+*** The default value of 'rmail-enable-mime' is now t. Rmail decodes
MIME contents automatically. You can customize the variable
-`rmail-enable-mime' back to `nil' to disable this automatic MIME
+'rmail-enable-mime' back to 'nil' to disable this automatic MIME
decoding.
-*** The command `rmail-mime' change the displaying of a MIME message
-between decoded presentation form and raw data if `rmail-enable-mime'
+*** The command 'rmail-mime' change the displaying of a MIME message
+between decoded presentation form and raw data if 'rmail-enable-mime'
is non-nil. And, with prefix argument, it change only the displaying
of the MIME entity at point.
-*** The new command `rmail-mime-next-item' (bound to TAB) moves point
+*** The new command 'rmail-mime-next-item' (bound to TAB) moves point
to the next item of MIME message.
-*** The new command `rmail-mime-previous-item' (bound to backtab) moves
+*** The new command 'rmail-mime-previous-item' (bound to backtab) moves
point to the previous item of MIME message.
-*** The new command `rmail-mime-toggle-hidden' (RET) hide or show the
+*** The new command 'rmail-mime-toggle-hidden' (RET) hide or show the
body of the MIME entity at point.
** VC and related modes
-*** New VC command `vc-log-incoming', bound to `C-x v I'.
+*** New VC command 'vc-log-incoming', bound to 'C-x v I'.
This shows a log of changes to be received with a pull operation.
For Git, this runs "git fetch" to make the necessary data available
locally; this requires version 1.7 or newer.
-*** New VC command `vc-log-outgoing', bound to `C-x v O'.
+*** New VC command 'vc-log-outgoing', bound to 'C-x v O'.
This shows a log of changes to be sent in the next commit.
-*** New VC command vc-find-conflicted-file.
+*** New VC command 'vc-find-conflicted-file'.
*** The 'g' key in VC diff, log, log-incoming and log-outgoing buffers
reruns the corresponding VC command to compute an up to date version
@@ -136,23 +136,23 @@ indentation, which can be adjusted via ad-hoc indentation rules.
* Incompatible Lisp Changes in Emacs 23.3
-** posn-col-row now excludes the header line from the row count
+** 'posn-col-row' now excludes the header line from the row count
If the frame has a header line, posn-col-row will count row numbers
starting from the first line of text below the header line.
* Lisp changes in Emacs 23.3
-** `e' and `pi' are now called `float-e' and `float-pi'.
+** 'e' and 'pi' are now called 'float-e' and 'float-pi'.
The old names are obsolete.
-** The use of unintern without an obarray arg is now obsolete.
+** The use of 'unintern' without an obarray arg is now obsolete.
-** The function `princ-list' is now obsolete.
+** The function 'princ-list' is now obsolete.
** The yank-handler argument to kill-region and friends is now obsolete.
-** New function byte-to-string, like char-to-string but for bytes.
+** New function 'byte-to-string', like 'char-to-string' but for bytes.
* Changes in Emacs 23.3 on non-free operating systems
@@ -171,12 +171,12 @@ This might not work on all platforms.
*** --enable-checking[=OPTIONS] builds emacs with extra runtime checks.
-** `make install' now consistently ignores umask, creating a
+** 'make install' now consistently ignores umask, creating a
world-readable install.
** Emacs compiles with Gconf support, if it is detected.
Use the configure option --without-gconf to disable this.
-This is used by the `font-use-system-font' feature (see below).
+This is used by the 'font-use-system-font' feature (see below).
* Startup Changes in Emacs 23.2
@@ -186,7 +186,7 @@ resource settings for the graphical widgets are still applied.
On Windows, the -Q option causes Emacs to ignore Registry settings,
but environment variables set on the Registry are still honored.
-*** The new variable `inhibit-x-resources' shows whether X resources
+*** The new variable 'inhibit-x-resources' shows whether X resources
were loaded.
** New command-line option -mm (--maximized) maximizes the initial frame.
@@ -196,19 +196,19 @@ were loaded.
** The maximum size of buffers (and the largest fixnum) is doubled.
On typical 32bit systems, buffers can now be up to 512MB.
-** The default value of `trash-directory' is now nil.
-This means that `move-file-to-trash' trashes files according to
+** The default value of 'trash-directory' is now nil.
+This means that 'move-file-to-trash' trashes files according to
freedesktop.org specifications, the same method used by the Gnome,
KDE, and XFCE desktops. (This change has no effect on Windows, which
-uses `system-move-file-to-trash' for trashing.)
+uses 'system-move-file-to-trash' for trashing.)
** The pointer now becomes invisible when typing.
-Customize `make-pointer-invisible' to disable this feature.
+Customize 'make-pointer-invisible' to disable this feature.
** Font changes
*** Emacs can use the system default monospaced font in Gnome.
-To enable this feature, set `font-use-system-font' to non-nil (it is
+To enable this feature, set 'font-use-system-font' to non-nil (it is
nil by default). If the system default changes, Emacs changes also.
This feature requires Gconf support, which is automatically included
at compile-time if configure detects the gconf libraries (you can
@@ -219,9 +219,9 @@ via the XSETTINGS mechanism. This includes antialias, hinting,
hintstyle, RGBA, DPI and lcdfilter changes.
** Killing a buffer with a running process now asks for confirmation.
-To remove this query, remove `process-kill-buffer-query-function' from
-`kill-buffer-query-functions', or set the appropriate process flag
-with `set-process-query-on-exit-flag'.
+To remove this query, remove 'process-kill-buffer-query-function' from
+'kill-buffer-query-functions', or set the appropriate process flag
+with 'set-process-query-on-exit-flag'.
** File-local variable changes
@@ -230,16 +230,16 @@ unconditionally. The previous behavior, toggling the mode, was
neither reliable nor generally desirable.
*** There are new commands for adding and removing file-local variables:
-`add-file-local-variable', `delete-file-local-variable',
-`add-file-local-variable-prop-line', and
-`delete-file-local-variable-prop-line'.
+'add-file-local-variable', 'delete-file-local-variable',
+'add-file-local-variable-prop-line', and
+'delete-file-local-variable-prop-line'.
*** There are new commands for adding and removing directory-local variables,
and copying them to and from file-local variable lists:
-`add-dir-local-variable', `delete-dir-local-variable',
-`copy-dir-locals-to-file-locals',
-`copy-dir-locals-to-file-locals-prop-line' and
-`copy-file-locals-to-dir-locals'.
+'add-dir-local-variable', 'delete-dir-local-variable',
+'copy-dir-locals-to-file-locals',
+'copy-dir-locals-to-file-locals-prop-line' and
+'copy-file-locals-to-dir-locals'.
** Internationalization changes
@@ -249,18 +249,18 @@ This refers to the EMACS_UNIBYTE environment variable as well as the
arguments. Customizing enable-multibyte-characters and setting
default-enable-multibyte-characters are also deprecated.
-*** New coding system `utf-8-hfs'.
-This is suitable for default-file-name-coding-system on Mac OS X; see
+*** New coding system 'utf-8-hfs'.
+This is suitable for 'default-file-name-coding-system' on Mac OS X; see
international/ucs-normalize.el.
** Function arguments in *Help* buffers are now shown in upper-case.
-Customize `help-downcase-arguments' to t to show them in lower-case.
+Customize 'help-downcase-arguments' to t to show them in lower-case.
-** New command `async-shell-command', bound globally to `M-&'.
-This executes the command asynchronously, similar to calling `M-!' and
-manually adding an ampersand to the end of the command. With `M-&',
+** New command 'async-shell-command', bound globally to 'M-&'.
+This executes the command asynchronously, similar to calling 'M-!' and
+manually adding an ampersand to the end of the command. With 'M-&',
you don't need the ampersand. The output appears in the buffer
-`*Async Shell Command*'.
+'*Async Shell Command*'.
** When running in a new enough xterm (newer than version 242), Emacs
asks xterm what the background color is and it sets up faces
@@ -272,95 +272,95 @@ consider the background light).
** Kill-ring and selection changes
-*** If `select-active-regions' is t, any active region automatically
+*** If 'select-active-regions' is t, any active region automatically
becomes the primary selection (for interaction with other window
applications). If you enable this, you might want to bind
-`mouse-yank-primary' to Mouse-2.
+'mouse-yank-primary' to Mouse-2.
-*** When `save-interprogram-paste-before-kill' is non-nil, the kill
+*** When 'save-interprogram-paste-before-kill' is non-nil, the kill
commands save the interprogram-paste selection into the kill ring
before doing anything else. This avoids losing the selection.
-*** When `kill-do-not-save-duplicates' is non-nil, identical
-subsequent kills are not duplicated in the `kill-ring'.
+*** When 'kill-do-not-save-duplicates' is non-nil, identical
+subsequent kills are not duplicated in the 'kill-ring'.
** Completion changes
-*** The new command `completion-at-point' provides mode-sensitive completion.
+*** The new command 'completion-at-point' provides mode-sensitive completion.
-*** tab-always-indent set to `complete' lets TAB do completion as well.
+*** 'tab-always-indent' set to 'complete' lets TAB do completion as well.
-*** The new completion-style `initials' is available.
+*** The new completion-style 'initials' is available.
For instance, this can complete M-x lch to list-command-history.
-*** The new variable `completions-format' determines how completions
+*** The new variable 'completions-format' determines how completions
are displayed in the *Completions* buffer. If you set it to
-`vertical', completions are sorted vertically in columns.
+'vertical', completions are sorted vertically in columns.
-** The default value of `blink-matching-paren-distance' is increased.
+** The default value of 'blink-matching-paren-distance' is increased.
** M-n provides more default values in the minibuffer for commands
that read file names. These include the file name at point (when ffap
-is loaded without ffap-bindings), the file name on the current line
+is loaded without 'ffap-bindings'), the file name on the current line
(in Dired buffers), and the directory names of adjacent Dired windows
(for Dired commands that operate on several directories, such as copy,
rename, or diff).
-** M-r is bound to the new `move-to-window-line-top-bottom'.
+** M-r is bound to the new 'move-to-window-line-top-bottom'.
This moves point to the window center, top and bottom on successive
invocations, in the same spirit as the C-l (recenter-top-bottom)
command.
-** The new variable `recenter-positions' determines the default
-cycling order of C-l (`recenter-top-bottom').
+** The new variable 'recenter-positions' determines the default
+cycling order of C-l ('recenter-top-bottom').
** The abbrevs file is now a file named abbrev_defs in
-user-emacs-directory; but the old location, ~/.abbrev_defs, is used if
+'user-emacs-directory'; but the old location, ~/.abbrev_defs, is used if
that file exists.
* Changes in Specialized Modes and Packages in Emacs 23.2
-** The bookmark menu has a narrowing search via bookmark-bmenu-search.
+** The bookmark menu has a narrowing search via 'bookmark-bmenu-search'.
** Calc
*** The Calc settings file is now a file named calc.el in
-user-emacs-directory; but the old location, ~/.calc.el, is used if
+'user-emacs-directory'; but the old location, ~/.calc.el, is used if
that file exists.
*** New twos-complement display.
-*** Graphing commands (`g f' etc.) now work on MS-Windows, if you have
+*** Graphing commands ('g f' etc.) now work on MS-Windows, if you have
the native Windows port of Gnuplot version 3.8 or later installed.
** Calendar and diary
*** Fancy diary display is now the default.
-If you prefer the simple display, customize `diary-display-function'.
+If you prefer the simple display, customize 'diary-display-function'.
*** The diary's fancy display now enables view-mode.
-*** The command `calendar-current-date' accepts an optional argument
+*** The command 'calendar-current-date' accepts an optional argument
giving an offset from today.
** Desktop
-*** The default value for `desktop-buffers-not-to-save' is nil.
+*** The default value for 'desktop-buffers-not-to-save' is nil.
This means Desktop will try restoring all buffers, when you restart
-your Emacs session. Also, `desktop-buffers-not-to-save' is only
+your Emacs session. Also, 'desktop-buffers-not-to-save' is only
effective for buffers that have no associated file. If you want to
exempt buffers that do correspond to files, customize the value of
-`desktop-files-not-to-save' instead.
+'desktop-files-not-to-save' instead.
** Dired
-*** The new variable `dired-auto-revert-buffer', if non-nil, causes
+*** The new variable 'dired-auto-revert-buffer', if non-nil, causes
Dired buffers to be reverted automatically on revisiting them.
** DocView
-*** When `doc-view-continuous' is non-nil, scrolling a line
+*** When 'doc-view-continuous' is non-nil, scrolling a line
on the page edge advances to the next/previous page.
** Elint
@@ -371,12 +371,12 @@ on the page edge advances to the next/previous page.
and can be run in batch mode.
*** Elint does a more thorough initialization, and recognizes more built-in
-functions and variables. Customize `elint-scan-preloaded' if you want
+functions and variables. Customize 'elint-scan-preloaded' if you want
to sacrifice some accuracy for a faster startup.
*** Elint attempts some basic understanding of featurep and (f)boundp tests.
-*** Customize `elint-ignored-warnings' to suppress some warnings.
+*** Customize 'elint-ignored-warnings' to suppress some warnings.
** GDB-UI
@@ -385,14 +385,14 @@ collections as watch expressions. These features require GDB 7.0 or later.
** Grep
-*** A new command `zrgrep' searches recursively in gzipped files.
+*** A new command 'zrgrep' searches recursively in gzipped files.
** Info
-*** The new command `Info-virtual-index' bound to "I" displays a menu of
+*** The new command 'Info-virtual-index' bound to "I" displays a menu of
matched topics found in the index.
-*** The new command `info-finder' replaces finder.el with a virtual Info
+*** The new command 'info-finder' replaces finder.el with a virtual Info
manual that generates an Info file which gives the same information
through a menu structure.
@@ -400,35 +400,35 @@ through a menu structure.
** Message mode is now the default mode for composing mail.
-The default for `mail-user-agent' is now message-user-agent, so the
-C-x m (`compose-mail') command uses Message mode instead of Mail mode.
+The default for 'mail-user-agent' is now message-user-agent, so the
+C-x m ('compose-mail') command uses Message mode instead of Mail mode.
Message mode has been included in Emacs, as part of the Gnus package,
for several years. It provides several features that are absent in
Mail mode, such as MIME handling.
-*** If the user has not customized mail-user-agent, `compose-mail'
+*** If the user has not customized mail-user-agent, 'compose-mail'
checks for Mail mode customizations, and issues a warning if these
customizations are found. This alerts users who may otherwise be
unaware that their mail configuration has changed.
-To disable this check, set compose-mail-user-agent-warnings to nil.
+To disable this check, set 'compose-mail-user-agent-warnings' to nil.
-** The default value of mail-interactive is t, since Emacs 23.1.
+** The default value of 'mail-interactive' is t, since Emacs 23.1.
(This was not announced at the time.) It means that when sending mail,
Emacs will wait for the process sending mail to return. If you
experience delays when sending mail, you may wish to set this to nil.
** nXML mode is now the default for editing XML files.
-** pcomplete provides a new command `pcomplete-std-completion' which
-is similar to `pcomplete' but using the standard completion UI code.
+** pcomplete provides a new command 'pcomplete-std-completion' which
+is similar to 'pcomplete' but using the standard completion UI code.
** Shell (and other comint modes)
-*** M-s is no longer bound to `comint-next-matching-input'.
+*** M-s is no longer bound to 'comint-next-matching-input'.
-*** M-r is now bound to `comint-history-isearch-backward-regexp'.
+*** M-r is now bound to 'comint-history-isearch-backward-regexp'.
This starts an incremental search of the comint/shell input history.
*** ansi-color is now enabled by default in Shell mode.
@@ -447,22 +447,22 @@ directory not controlled by any VCS, ask the user what VC backend to
use to create a repository, create a new repository and register the
file.
-*** New command `vc-root-print-log', bound to `C-x v L'.
-This displays a `*vc-change-log*' buffer showing the history of the
+*** New command 'vc-root-print-log', bound to 'C-x v L'.
+This displays a '*vc-change-log*' buffer showing the history of the
version-controlled directory tree as a whole.
-*** New command `vc-root-diff', bound to `C-x v D'.
-This is similar to `vc-diff', but compares the entire directory tree
+*** New command 'vc-root-diff', bound to 'C-x v D'.
+This is similar to 'vc-diff', but compares the entire directory tree
of the current VC directory with its working revision.
-*** `C-x v l' and `C-x v L' do not show the full log by default.
+*** 'C-x v l' and 'C-x v L' do not show the full log by default.
The number of entries shown can be chosen interactively with a prefix
-argument, or by customizing vc-log-show-limit. The `*vc-change-log*'
+argument, or by customizing vc-log-show-limit. The '*vc-change-log*'
buffer now contains buttons at the end of the buffer, which can be
used to increase the number of entries shown. RCS, SCCS, and CVS do
not support this feature.
-*** vc-annotate supports annotations through file copies and renames,
+*** 'vc-annotate' supports annotations through file copies and renames,
it displays the old names for the files and it can show logs/diffs for
the corresponding lines. Currently only Git and Mercurial take
advantage of this feature.
@@ -495,21 +495,21 @@ are stripped when copying text from the ChangeLog to the *VC-Log* buffer.
** Miscellaneous
-*** Interactively `multi-isearch-buffers' and `multi-isearch-buffers-regexp'
+*** Interactively 'multi-isearch-buffers' and 'multi-isearch-buffers-regexp'
read buffer names to search, one by one, ended with RET. With a prefix
argument, they ask for a regexp, and search in buffers whose names match
-the specified regexp. Interactively `multi-isearch-files' and
-`multi-isearch-files-regexp' read file names to search, one by one,
+the specified regexp. Interactively 'multi-isearch-files' and
+'multi-isearch-files-regexp' read file names to search, one by one,
ended with RET. With a prefix argument, they ask for a wildcard, and
search in file buffers whose file names match the specified wildcard.
*** Autorevert Tail mode now works also for remote files.
-*** The new eshell built-in commands `su' and `sudo' support Tramp.
-Thus, they change `default-directory' to reflect the new user id, and
+*** The new eshell built-in commands 'su' and 'sudo' support Tramp.
+Thus, they change 'default-directory' to reflect the new user id, and
let commands run under that user's permissions. This works even when
-`default-directory' is already remote. Calling the external commands
-is possible via `*su' or `*sudo', respectively.
+'default-directory' is already remote. Calling the external commands
+is possible via '*su' or '*sudo', respectively.
** Obsolete packages
@@ -529,13 +529,13 @@ edit and navigate source code. Parsers for C/C++, Java, Javascript,
and several other languages are included by default, and Semantic can
also interface with external tools such as GNU Global and GNU Idutils.
-To enable Semantic, use the global minor mode `semantic-mode'.
+To enable Semantic, use the global minor mode 'semantic-mode'.
See the Semantic manual for details.
*** EDE (Emacs Development Environment) is a package for managing code
projects, including features such as automatic Makefile generation.
-To enable EDE, use the minor mode `global-ede-mode'.
+To enable EDE, use the minor mode 'global-ede-mode'.
See the EDE manual for details.
*** SRecode is a library for recoding Semantic tags back into source
@@ -557,8 +557,8 @@ System (CLOS). It is used by the other CEDET packages.
* Incompatible Lisp Changes in Emacs 23.2
** The Lisp reader turns integers that are too large/small into floats.
-For instance, on machines where `536870911' is the largest integer,
-reading `536870912' gives the floating-point object `536870912.0'.
+For instance, on machines where '536870911' is the largest integer,
+reading '536870912' gives the floating-point object '536870912.0'.
This change only concerns the Lisp reader; it does not affect how
actual integer objects overflow.
@@ -573,18 +573,18 @@ be in use:
time-stamp-hhmm, baud-rate
** Support for generating Emacs 18 compatible bytecode (by setting
-the variable `byte-compile-compatibility') has been removed.
-
-** In image-mode.el `image-mode-maybe' is obsolete.
-Instead, you can either use `image-mode' (which displays an image file
-as the actual image initially), or `image-mode-as-text' (when you want
-to display an image file as text initially). `image-mode-as-text' is a
-combination of a non-image mode from `auto-mode-alist' (or Fundamental
-mode) and `image-minor-mode'. `image-minor-mode' provides a `C-c C-c'
+the variable 'byte-compile-compatibility') has been removed.
+
+** In image-mode.el 'image-mode-maybe' is obsolete.
+Instead, you can either use 'image-mode' (which displays an image file
+as the actual image initially), or 'image-mode-as-text' (when you want
+to display an image file as text initially). 'image-mode-as-text' is a
+combination of a non-image mode from 'auto-mode-alist' (or Fundamental
+mode) and 'image-minor-mode'. 'image-minor-mode' provides a 'C-c C-c'
key binding to toggle image display.
-`image-toggle-display-text' removes image properties.
-`image-toggle-display-image' adds image properties.
-`image-toggle-display' toggles between `image-mode-as-text' and `image-mode'.
+'image-toggle-display-text' removes image properties.
+'image-toggle-display-image' adds image properties.
+'image-toggle-display' toggles between 'image-mode-as-text' and 'image-mode'.
* Lisp changes in Emacs 23.2
@@ -592,113 +592,113 @@ key binding to toggle image display.
** All the default-FOO variables that hold the default value of the FOO
variable, are now declared obsolete.
-** read-key is a function halfway between read-event and read-key-sequence.
+** 'read-key' is a mix between 'read-event' and 'read-key-sequence'.
It reads a single key, but obeys input and escape sequence decoding.
** Frame parameter changes
-*** You can give the `fullscreen' frame parameter the value `maximized'.
+*** You can give the 'fullscreen' frame parameter the value 'maximized'.
This maximizes the frame.
-*** The new frame parameter `sticky' makes Emacs frames sticky in
+*** The new frame parameter 'sticky' makes Emacs frames sticky in
virtual desktops.
** Completion changes
-*** completion-base-size is obsoleted by completion-base-position.
+*** 'completion-base-size' is obsoleted by 'completion-base-position'.
This change causes a few backward incompatibilities, mostly with
-choose-completion-string-functions where the `mini-p' argument has
-been replaced by a `base-position' argument, and where the `base-size'
+'choose-completion-string-functions' where the 'mini-p' argument has
+been replaced by a 'base-position' argument, and where the 'base-size'
argument is now always nil.
-*** New function `completion-in-region' to use the standard completion
+*** New function 'completion-in-region' to use the standard completion
facilities on a particular region of text.
*** The 4th arg to all-completions (aka hide-spaces) is declared obsolete.
-*** completion-annotate-function specifies how to compute annotations
+*** 'completion-annotate-function' specifies how to compute annotations
for completions displayed in *Completions*.
** Minibuffer changes
*** read-file-name-predicate is obsolete. It was used to pass the predicate
-to read-file-name-internal because read-file-name-internal abused its `pred'
+to read-file-name-internal because read-file-name-internal abused its 'pred'
argument to pass the current directory, but this hack is not needed
any more.
** Changes to file-manipulation functions
-*** `delete-directory' has an optional parameter RECURSIVE.
+*** 'delete-directory' has an optional parameter RECURSIVE.
-*** New function `copy-directory', which copies a directory recursively.
+*** New function 'copy-directory', which copies a directory recursively.
** called-interactively-p now takes one argument and replaces interactive-p
which is now marked obsolete.
-** New function set-advertised-calling-convention makes it possible
+** New function 'set-advertised-calling-convention' makes it possible
to obsolete arguments as well as make some arguments mandatory.
** You can control which binding is preferentially shown in menus and
-docstrings by adding a `:advertised-binding' property to the corresponding
+docstrings by adding a ':advertised-binding' property to the corresponding
command's symbol. That property can hold a single binding or a list
of bindings.
** Network and process changes
-*** start-process-shell-command and start-file-process-shell-command
-now only take a single `command' argument.
+*** 'start-process-shell-command' and 'start-file-process-shell-command'
+now only take a single 'command' argument.
-*** The new variable `process-file-side-effects' should be set to nil
-if a `process-file' call does not change a remote file. This allows
+*** The new variable 'process-file-side-effects' should be set to nil
+if a 'process-file' call does not change a remote file. This allows
file name handlers such as Tramp to optimizations.
-*** make-network-process can now also create `seqpacket' Unix sockets.
+*** 'make-network-process' can now also create 'seqpacket' Unix sockets.
** Loading changes
-*** eval-next-after-load is obsolete.
+*** 'eval-next-after-load' is obsolete.
-*** New hook `after-load-functions' run after loading an Elisp file.
+*** New hook 'after-load-functions' run after loading an Elisp file.
** Byte compilation changes
*** Changing the file-names generated by byte-compilation by redefining
-the function `byte-compile-dest-file' before loading bytecomp.el is obsolete.
+the function 'byte-compile-dest-file' before loading bytecomp.el is obsolete.
Instead, customize byte-compile-dest-file-function.
-*** `byte-compile-warnings' has new members, `constants' and `suspicious'.
+*** 'byte-compile-warnings' has new members, 'constants' and 'suspicious'.
-** New macro with-silent-modifications to tweak text properties without
+** New macro 'with-silent-modifications' to tweak text properties without
affecting the buffer's modification state.
** Hash tables have a new printed representation that is readable.
-The feature `hashtable-print-readable' identifies this new
+The feature 'hashtable-print-readable' identifies this new
functionality.
** New functions for performing Unicode normalization:
-ucs-normalize-NFD-region, ucs-normalize-NFD-string,
-ucs-normalize-NFC-region, ucs-normalize-NFC-string,
-ucs-normalize-NFKD-region, ucs-normalize-NFKD-string,
-ucs-normalize-NFKC-region, ucs-normalize-NFKC-string,
-ucs-normalize-HFS-NFD-region, ucs-normalize-HFS-NFD-string,
-ucs-normalize-HFS-NFC-region, ucs-normalize-HFS-NFC-string.
+'ucs-normalize-NFD-region', 'ucs-normalize-NFD-string',
+'ucs-normalize-NFC-region', 'ucs-normalize-NFC-string',
+'ucs-normalize-NFKD-region', 'ucs-normalize-NFKD-string',
+'ucs-normalize-NFKC-region', 'ucs-normalize-NFKC-string',
+'ucs-normalize-HFS-NFD-region', 'ucs-normalize-HFS-NFD-string',
+'ucs-normalize-HFS-NFC-region', 'ucs-normalize-HFS-NFC-string'.
** Face aliases can now be marked as obsolete, using the macro
-`define-obsolete-face-alias'.
+'define-obsolete-face-alias'.
-** New function `window-full-height-p', analogous to the full-width version.
+** New function 'window-full-height-p', analogous to the full-width version.
* Changes in Emacs 23.2 on non-free operating systems
-** On MS-Windows, `display-time' now displays the system load average
+** On MS-Windows, 'display-time' now displays the system load average
as well as the time, as it does on GNU and Unix.
* Installation Changes in Emacs 23.1
** The default X toolkit is now Gtk+, rather than Lucid.
-The configure option `--with-gtk' has been removed. Gtk is now the
+The configure option '--with-gtk' has been removed. Gtk is now the
default toolkit, but you can use --with-x-toolkit=gtk if necessary.
** New font code.
@@ -749,7 +749,7 @@ See the list at the end of etc/MACHINES for details.
*** Support for Sun windows has been removed.
-*** The `emacstool' utility has been removed.
+*** The 'emacstool' utility has been removed.
** The following platforms will be removed in a future Emacs version:
If you are still using Emacs on one of these platforms, please email
@@ -771,7 +771,7 @@ executable format.
*** Platforms not supporting shared libraries (i.e., requiring the
NO_SHARED_LIBS compilation flag).
-** The configure options `--with-gcc', `--without-gcc' have been removed.
+** The configure options '--with-gcc', '--without-gcc' have been removed.
Configure will use gcc by default. Set the CC environment variable if
you need control over which C compiler is used.
@@ -782,22 +782,22 @@ or any later version.
** Emacs 23 comes with a new set of default icons.
Various resolutions are available as etc/images/icons/hicolor/*/apps/emacs.png.
-The Emacs 22 icon is available as `emacs22.png' in the same location.
+The Emacs 22 icon is available as 'emacs22.png' in the same location.
* Changes in Emacs 23.1
** Improved X Window System support
*** Emacs now supports using both X displays and ttys in one session.
-With an Emacs server active (M-x server-start), `emacsclient -t'
+With an Emacs server active (M-x server-start), 'emacsclient -t'
creates a tty frame connected to the running emacs server. You can
-use any number of different ttys. `emacsclient -c' creates a new X11
+use any number of different ttys. 'emacsclient -c' creates a new X11
frame on the current $DISPLAY (or a tty frame if $DISPLAY is not set).
There may be problems if a display exits unexpectedly and Emacs is compiled
with Gtk+, see etc/PROBLEMS.
You can test for the presence of this feature in your Lisp code by
-testing for the `multi-tty' feature.
+testing for the 'multi-tty' feature.
*** Emacs starts in the background, as a daemon, when given the
--daemon command line argument. It disconnects from the terminal and
@@ -809,7 +809,7 @@ terminal frames using emacsclient.
ALTERNATE_EDITOR is set to "") and emacsclient cannot connect to an
emacs server.
-*** The new command close-display-connection closes a connection to a
+*** The new command 'close-display-connection' closes a connection to a
remote display. There are some bugs for Gtk+. See etc/PROBLEMS.
*** Emacs now supports the XEmbed specification.
@@ -819,7 +819,7 @@ https://specifications.freedesktop.org/xembed-spec/xembed-spec-latest.html
for details about XEmbed.
*** Emacs can now set the frame opacity.
-The opacity of a frame can be controlled by setting the `alpha' frame
+The opacity of a frame can be controlled by setting the 'alpha' frame
parameter. This only takes effect on a compositing window manager for
the X Window System, such as Compiz, Beryl and Compiz Fusion, on Mac
OS X, or on Windows 2000 and later versions of Windows.
@@ -829,7 +829,7 @@ The alpha parameter should be an integer between 0 (transparent) and
cons cell (ACTIVE . INACTIVE), where ACTIVE is the opacity of an
active frame and INACTIVE is the opacity of non-active frames.
-The variable `frame-alpha-lower-limit' defines a lower bound for the
+The variable 'frame-alpha-lower-limit' defines a lower bound for the
opacity; the default is 20.
** Internationalization changes
@@ -838,15 +838,15 @@ opacity; the default is 20.
(It has about four times the code space, which should be plenty).
The internal encoding used for buffers and strings is now
-Unicode-based and called `utf-8-emacs' (`emacs-internal' is an alias
+Unicode-based and called 'utf-8-emacs' ('emacs-internal' is an alias
for this). This encoding is backward-compatible with Unicode's UTF-8
encoding. The internal encoding previously used by Emacs,
-`emacs-mule', is still available for reading and writing files.
+'emacs-mule', is still available for reading and writing files.
-During byte-compilation, Emacs 23 uses `utf-8-emacs' to write files.
+During byte-compilation, Emacs 23 uses 'utf-8-emacs' to write files.
As a result, byte-compiled files containing non-ASCII characters can't
be read by earlier versions of Emacs. Files compiled by Emacs 20, 21,
-or 22 are loaded correctly as `emacs-mule' (whether or not they
+or 22 are loaded correctly as 'emacs-mule' (whether or not they
contain multibyte characters). This takes somewhat more time, so it
may be worth recompiling existing .elc files which don't need to be
shared with older Emacsen.
@@ -864,24 +864,24 @@ Sinhala, and TaiViet.
*** The minor modes unify-8859-on-encoding-mode and
unify-8859-on-decoding-mode are obsolete.
-*** `ucs-insert' is bound to `C-x 8 RET' and in addition to hex numbers
+*** 'ucs-insert' is bound to 'C-x 8 RET' and in addition to hex numbers
accepts numbers in hash notation (e.g. #o21430 for octal, or #10r8984 for
decimal). It also accepts Unicode character names with completion.
-*** The `cyrillic-translit' input method supports many new characters.
+*** The 'cyrillic-translit' input method supports many new characters.
Common typographical characters available from Unicode were added to
-`cyrillic-translit': punctuation marks, accented characters, fractions,
+'cyrillic-translit': punctuation marks, accented characters, fractions,
and others.
** Emacs now supports serial port access on GNU/Linux, Unix, and
-Windows. The new command `serial-term' starts an interactive terminal
+Windows. The new command 'serial-term' starts an interactive terminal
on a serial port. The serial port can be configured at runtime with
the mode-line mouse menu.
** Menu Bar changes
*** In the Options menu, the "Set Default Font" item applies the
-selected font to the `default' face on all frames, not just the
+selected font to the 'default' face on all frames, not just the
current frame. Furthermore, if Emacs is compiled with both GTK and
Fontconfig support, the "Set Default Font" item uses the GTK font
selection dialog instead of an Emacs pop-up menu.
@@ -904,13 +904,13 @@ mode menus have been improved to include more functionality.
** Mode-line changes
-*** The mode-line displays a `@', instead of `-', if the
+*** The mode-line displays a '@', instead of '-', if the
default-directory for the current buffer is on a remote machine.
*** The mode-line displays a mode menu when mouse-1 is clicked on a
minor mode, in the same way as it already did for major modes.
-*** The `mode-line-emphasis' face is used to highlight certain
+*** The 'mode-line-emphasis' face is used to highlight certain
mode-line information (e.g. waiting for a VC command to finish).
*** The mode-line tooltips have been improved to provide more details.
@@ -919,37 +919,37 @@ mode-line information (e.g. waiting for a VC command to finish).
line are now interactive: mouse-1 can be used on them to pop up a menu.
** File deletion can make use of the Recycle Bin or system Trash folder.
-Set `delete-by-moving-to-trash' non-nil to use this. Deleted files
+Set 'delete-by-moving-to-trash' non-nil to use this. Deleted files
and directories will then be sent to the Recycle Bin on Windows, and
-to `trash-directory' on other systems.
+to 'trash-directory' on other systems.
** Directory-local variables can now be defined.
By default, Emacs looks in .dir-locals.el for directory-local
-variables. For more information, see `dir-locals-set-directory-class'
-and `dir-locals-set-class-variables'.
+variables. For more information, see 'dir-locals-set-directory-class'
+and 'dir-locals-set-class-variables'.
-** Emacs can now use `auth-source' for authentication.
-`smtpmail' and `url' (Tramp and Gnus also) use `auth-source' to obtain
+** Emacs can now use 'auth-source' for authentication.
+'smtpmail' and 'url' (Tramp and Gnus also) use 'auth-source' to obtain
login names and passwords. The match, if found, is reported
in *Messages* with the password blanked out.
-** `where-is-preferred-modifier' can specify your favorite modifier.
+** 'where-is-preferred-modifier' can specify your favorite modifier.
* Startup Changes in Emacs 23.1
-** The option `inhibit-startup-screen' (with aliases to old names
-`inhibit-splash-screen' and `inhibit-startup-message') doesn't inhibit
+** The option 'inhibit-startup-screen' (with aliases to old names
+'inhibit-splash-screen' and 'inhibit-startup-message') doesn't inhibit
display of the initial message in the *scratch* buffer. If you don't
want to display the initial message in the *scratch* buffer at startup,
-you can set the option `initial-scratch-message' to nil.
+you can set the option 'initial-scratch-message' to nil.
-** New user option `initial-buffer-choice' specifies what to display
+** New user option 'initial-buffer-choice' specifies what to display
after starting Emacs: startup screen, *scratch* buffer, visiting a
file or directory.
-** New alias `argv' for `command-line-args-left'
-This is a convenience alias, so that one can write `(pop argv)'
+** New alias 'argv' for 'command-line-args-left'
+This is a convenience alias, so that one can write '(pop argv)'
inside of --eval command line arguments in order to access
following arguments.
@@ -957,36 +957,36 @@ following arguments.
** Emacs now supports invocation by an X session manager.
It can save a session and restore it later. See the documentation of
-the functions `emacs-session-save' and `emacs-session-restore'.
+the functions 'emacs-session-save' and 'emacs-session-restore'.
(Actually, this feature was introduced with Emacs 22, but it was not
documented.)
* Incompatible Editing Changes in Emacs 23.1
-** In Dired, `dired-flag-garbage-files' is rebound from `&' to `%&'
+** In Dired, 'dired-flag-garbage-files' is rebound from '&' to '%&'
on the regexp command prefix map.
** In Dired-x, all command guesses for ! are now added to the default
list accessible by M-n instead of pushing all guesses temporarily into
the history list.
-** In Isearch mode, a special case of typing `C-w' at the beginning of
+** In Isearch mode, a special case of typing 'C-w' at the beginning of
the minibuffer that toggles word search (i.e. using key sequences
-`C-s RET C-w' or `C-s M-e C-w') is obsolete. You can use the global key
-`M-s w' to start word search, or type `M-s w' in Isearch mode to
+'C-s RET C-w' or 'C-s M-e C-w') is obsolete. You can use the global key
+'M-s w' to start word search, or type 'M-s w' in Isearch mode to
toggle word search. To start nonincremental word search you can now use
-`M-s w RET' and `M-s w C-r RET' instead of `C-s RET C-w' and `C-r RET C-w'.
+'M-s w RET' and 'M-s w C-r RET' instead of 'C-s RET C-w' and 'C-r RET C-w'.
-** In Info, `Info-search' is unbound from `M-s' to allow using `M-s w'
+** In Info, 'Info-search' is unbound from 'M-s' to allow using 'M-s w'
for word search as well as other search commands from the global prefix
-key `M-s'. `Info-search' is still bound to `s', and also incremental
-search commands `C-s', `C-M-s', `C-r', `C-M-r' are available for searching
+key 'M-s'. 'Info-search' is still bound to 's', and also incremental
+search commands 'C-s', 'C-M-s', 'C-r', 'C-M-r' are available for searching
through multiple Info nodes, together with their nonincremental versions
-`C-s RET', `C-r RET', `C-M-s RET', `C-M-r RET', `M-s w RET'.
+'C-s RET', 'C-r RET', 'C-M-s RET', 'C-M-r RET', 'M-s w RET'.
-** In Text mode, `center-line' and `center-paragraph' are rebound from
-`M-s' and `M-S' to global keys `M-o M-s' and `M-o M-S' on the global
-prefix map `M-o', which is intended for such formatting commands.
+** In Text mode, 'center-line' and 'center-paragraph' are rebound from
+'M-s' and 'M-S' to global keys 'M-o M-s' and 'M-o M-S' on the global
+prefix map 'M-o', which is intended for such formatting commands.
** The following input methods were removed in Emacs 22.2, but this was
not advertised: danish-alt-postfix, esperanto-alt-postfix,
@@ -1000,13 +1000,13 @@ identical.
** The C-n and C-p line-motion commands now move by screen lines,
taking continued lines and variable-width characters into account.
-Setting `line-move-visual' to nil reverts this to the previous
+Setting 'line-move-visual' to nil reverts this to the previous
behavior (i.e., motion by logical lines based on buffer contents
alone).
-** C-x C-c now invokes `save-buffers-kill-terminal', and C-z now
-invokes `suspend-frame'. These changes are for compatibility with the
-new multi-tty support (see `Improved X Window System support' above).
+** C-x C-c now invokes 'save-buffers-kill-terminal', and C-z now
+invokes 'suspend-frame'. These changes are for compatibility with the
+new multi-tty support (see 'Improved X Window System support' above).
** Mark changes
@@ -1027,13 +1027,13 @@ word at point.
*** When Transient Mark mode is on, TAB now indents the region if the
region is active.
-*** The variable `use-empty-active-region' controls whether an empty
+*** The variable 'use-empty-active-region' controls whether an empty
active region in Transient Mark mode should make commands operate on
that empty region.
** Temporarily active regions
-*** The new variable shift-select-mode, non-nil by default, controls
+*** The new minor mode 'shift-select-mode', non-nil by default, controls
shift-selection. When Shift Select mode is on, shift-translated
motion keys (e.g. S-left and S-down) activate and extend a temporary
region, similar to mouse-selection.
@@ -1055,8 +1055,8 @@ complete far enough and you entered RET by mistake. In that case,
Emacs puts the message "[Confirm]" in the minibuffer; type RET again
to create the file or buffer.
-The new variable confirm-nonexistent-file-or-buffer determines whether
-Emacs asks for confirmation. The default value is `after-completion'.
+The new variable 'confirm-nonexistent-file-or-buffer' determines whether
+Emacs asks for confirmation. The default value is 'after-completion'.
If you change it to t, Emacs always asks for confirmation; if you
change it to nil, Emacs never asks for confirmation.
@@ -1070,7 +1070,7 @@ attempts to perform partial-completion. If still no completion
alternatives are found, we fall back on the Emacs 22 rules for
performing completion.
-The new variable `completion-styles' can be customized to choose your
+The new variable 'completion-styles' can be customized to choose your
favorite completion style.
*** When M-n in the minibuffer reaches the end of the list of defaults,
@@ -1082,25 +1082,25 @@ searching minibuffer completion items.
*** Minibuffer input of shell commands now comes with completion.
-*** In the `C-x d' (Dired) prompt, typing M-n gives the visited file
+*** In the 'C-x d' (Dired) prompt, typing M-n gives the visited file
name of the current buffer.
*** In the M-! (shell-command) prompt, M-n provides some default commands.
These are guessed using the file extension of the current file, based
-on the file-handlers specified in the operating system's `mailcap'
+on the file-handlers specified in the operating system's 'mailcap'
file. The ! command in Dired (dired-do-shell-command) works
similarly, using the file displayed on the current line.
-*** A list of regexp default values is available via M-n for `occur',
-`keep-lines', `flush-lines' and `how-many'. This list includes the active
+*** A list of regexp default values is available via M-n for 'occur',
+'keep-lines', 'flush-lines' and 'how-many'. This list includes the active
region in transient-mark-mode, the word under the cursor, the last Isearch
regexp, the last Isearch string and the last replacement regexp.
-*** When enable-recursive-minibuffers is non-nil, operations which use
+*** When 'enable-recursive-minibuffers' is non-nil, operations which use
switch-to-buffer (such as C-x b and C-x C-f) do not fail any more when
used in a minibuffer or a dedicated window. Instead, they fallback on
using pop-to-buffer, which will use some other window. This change
-has no effect when enable-recursive-minibuffers is nil (the default).
+has no effect when 'enable-recursive-minibuffers' is nil (the default).
*** Isearch started in the minibuffer searches in the minibuffer history.
Reverse Isearch commands (C-r, C-M-r) search in previous minibuffer
@@ -1110,18 +1110,18 @@ element, it wraps to the last history element, and the forward search
wraps to the first history element. When the search is terminated, the
history element containing the search string becomes the current.
-*** The variable read-file-name-completion-ignore-case overrides
-completion-ignore-case for file name completion.
+*** The variable 'read-file-name-completion-ignore-case' overrides
+'completion-ignore-case' for file name completion.
-*** The variable read-buffer-completion-ignore-case overrides
-completion-ignore-case for buffer name completion.
+*** The variable 'read-buffer-completion-ignore-case' overrides
+'completion-ignore-case' for buffer name completion.
-*** The new command `minibuffer-force-complete' chooses one of the
+*** The new command 'minibuffer-force-complete' chooses one of the
possible completions, rather than stopping at the common prefix.
-*** If `completion-auto-help' is `lazy', Emacs shows the completions
+*** If 'completion-auto-help' is 'lazy', Emacs shows the completions
buffer only on the second attempt to complete. This was already
-supported in `partial-completion-mode'.
+supported in 'partial-completion-mode'.
** Face changes
@@ -1130,30 +1130,30 @@ size of the default face in the current buffer. The face is changed
via face remapping (see Lisp changes, below).
*** New commands to change the default face size in the current buffer.
-To increase it, type `C-x C-+' or `C-x C-='. To decrease it, type
-`C-x C--'. To restore the default (global) face size, type `C-x C-0'.
-These work via Text Scale mode, a new minor mode.
+To increase it, type 'C-x C-+' or 'C-x C-='. To decrease it, type
+'C-x C--'. To restore the default (global) face size, type 'C-x C-0'.
+These work via 'text-scale-mode', a new minor mode.
The final key in the above commands may be repeated without the
-leading `C-x', e.g. `C-x C-= C-= C-=' increases the face height by
+leading 'C-x', e.g. 'C-x C-= C-= C-=' increases the face height by
three steps. Each step scales the height of the default face by the
-value of the variable `text-scale-mode-step'.
+value of the variable 'text-scale-mode-step'.
-*** The commands buffer-face-mode and buffer-face-set can be used to
+*** The commands 'buffer-face-mode' and 'buffer-face-set' can be used to
remap the default face in the current buffer. See "Buffer Face mode",
under New Modes and Packages.
** Primary selection changes
*** You can disable kill ring commands from accessing the primary
-selection by setting `x-select-enable-primary' to nil.
+selection by setting 'x-select-enable-primary' to nil.
** Continuation lines can now be wrapped at word boundaries
(word-wrapping). This is controlled by the new per-buffer variable
-`word-wrap'. Word wrapping does not take place if continuation lines
+'word-wrap'. Word wrapping does not take place if continuation lines
are not shown, e.g. if truncate-lines is non-nil. The most convenient
way to enable word-wrapping is using the new minor mode Visual Line
-mode; in addition to setting `word-wrap' to t, this rebinds some
+mode; in addition to setting 'word-wrap' to t, this rebinds some
editing commands to work on screen lines rather than text lines. See
New Modes and Packages, below.
@@ -1163,7 +1163,7 @@ New Modes and Packages, below.
specify a minimum window width for partial-width windows, below which
lines are truncated. The default has been changed to 50.
-*** The new command balance-windows-area balances windows both
+*** The new command 'balance-windows-area' balances windows both
vertically and horizontally.
*** pop-to-buffer now always sets input focus when the popped-to window
@@ -1171,68 +1171,68 @@ is on a different frame.
** Miscellaneous changes:
-*** C-l is bound to the new command recenter-top-bottom, rather than recenter.
+*** C-l is bound to the new command 'recenter-top-bottom', rather than recenter.
This moves the current line to window center, top and bottom on
successive invocations.
*** scroll-preserve-screen-position also preserves the column position.
-*** If `yank-pop-change-selection' is t, rotating the kill ring also
+*** If 'yank-pop-change-selection' is t, rotating the kill ring also
updates the selection or clipboard to the current yank, just as M-w
would do so with the text it copies to the kill ring.
*** C-M-% now shows replacement as it would look in the buffer, with
-`\N' and `\&' substituted according to the match. Old behavior can be
-restored by customizing `query-replace-show-replacement'.
+'\N' and '\&' substituted according to the match. Old behavior can be
+restored by customizing 'query-replace-show-replacement'.
*** The command shell prompts for the default directory, when it is
called with a prefix and the default directory is a remote file name.
This is because some file name handlers (like ange-ftp) are not able to
run processes remotely.
-*** The new command kill-matching-buffers kills buffers whose name
+*** The new command 'kill-matching-buffers' kills buffers whose name
matches a regexp.
-*** The value of comment-style now defaults to `indent'.
+*** The value of comment-style now defaults to 'indent'.
Therefore, comment-start markers are inserted at the current indentation
of the region to comment, rather than the leftmost column.
-*** The new commands `pp-macroexpand-expression' and
-`pp-macroexpand-last-sexp' pretty-print macro expansions.
+*** The new commands 'pp-macroexpand-expression' and
+'pp-macroexpand-last-sexp' pretty-print macro expansions.
-*** The new command `set-file-modes' allows to set file's mode bits.
+*** The new command 'set-file-modes' allows to set file's mode bits.
The mode bits can be specified in symbolic notation, like with GNU
-Coreutils, in addition to an octal number. `chmod' is a new
+Coreutils, in addition to an octal number. 'chmod' is a new
convenience alias for this function.
-*** `next-error-recenter' specifies how next-error should recenter the
+*** 'next-error-recenter' specifies how next-error should recenter the
visited source file. Its value can be a number (for example, 0 for
top line, -1 for bottom line), or nil for no recentering.
*** When typing in a password in the echo area, C-y yanks the current
kill into the password.
-*** Tooltip frame parameters `font' and `color' in `tooltip-frame-parameters'
-are ignored. Customize the `tooltip' face instead.
+*** Tooltip frame parameters 'font' and 'color' in 'tooltip-frame-parameters'
+are ignored. Customize the 'tooltip' face instead.
-*** `mkdir' is a new convenience alias for `make-directory'.
+*** 'mkdir' is a new convenience alias for 'make-directory'.
* New Modes and Packages in Emacs 23.1
** Auto Composition Mode is a minor mode that composes characters
automatically when they are displayed. It is globally on by default.
-It uses `auto-composition-function' (default `auto-compose-chars').
+It uses 'auto-composition-function' (default 'auto-compose-chars').
** Bubbles, a new game, is similar to SameGame.
** Buffer Face mode is a minor mode for remapping the default face in
-the current buffer. The variable `buffer-face-mode-face' specifies
-the face to remap to. The command `buffer-face-set' prompts for a
-face name, sets `buffer-face-mode-face' to it, and enables
+the current buffer. The variable 'buffer-face-mode-face' specifies
+the face to remap to. The command 'buffer-face-set' prompts for a
+face name, sets 'buffer-face-mode-face' to it, and enables
buffer-face-mode. See "Face changes", under Editing Changes, for a
description of face remapping.
-** butterfly flips the desired bit on the drive platter.
+** 'butterfly' flips the desired bit on the drive platter.
See http://xkcd.com/378/
** bug-reference.el provides clickable links to bug reports.
@@ -1267,7 +1267,7 @@ display the search results with Rmail, Gnus and VM. Note that there
is an existing Gnus back end, nnmairix.el, which should be used with
Maildir/MH setups.
-** minibuffer-depth-indicate-mode shows the minibuffer depth in the prompt.
+** 'minibuffer-depth-indicate-mode' shows the minibuffer depth in the prompt.
** nXML Mode
This is a new mode for editing XML documents. It allows a schema to
@@ -1281,8 +1281,8 @@ any invalid parts of your document.
attribute name or data value by using information about what is
allowed by the schema in that context.
-** proced.el provides a Dired-like interface for operating on
-processes. Proced makes an Emacs buffer containing a listing of the
+** 'proced' provides a Dired-like interface for operating on processes.
+Proced makes an Emacs buffer containing a listing of the
current processes. You can use the normal Emacs commands to move
around in this buffer, and special Proced commands to operate on the
processes listed. It is currently only functional on GNU/Linux,
@@ -1299,7 +1299,7 @@ Manual.
** Visual Line mode provides support for editing by visual lines.
It turns on word-wrapping in the current buffer, and rebinds C-a, C-e,
and C-k to commands that operate by visual lines instead of logical
-lines. This is a more reliable replacement for longlines-mode.
+lines. This is a more reliable replacement for 'longlines-mode'.
This can also be turned on using the menu bar, via
Options -> Line Wrapping in this Buffer -> Word Wrap
@@ -1312,14 +1312,14 @@ interfaces according to the zeroconf specification. It communicates
with Avahi, a zeroconf implementation, via D-Bus messages on systems
which have installed this software.
-** There is a new `whitespace' package.
-(The pre-existing one has been renamed to `old-whitespace'.)
+** There is a new 'whitespace' package.
+(The pre-existing one has been renamed to 'old-whitespace'.)
Now, besides reporting bogus blanks, the whitespace package has a
minor mode and a global minor mode to visualize blanks (TAB, (HARD)
SPACE and NEWLINE). The visualization is made via faces and/or display
table. It can also indicate lines that extend beyond a given column,
trailing blanks, and empty lines at the start or end of a buffer.
-See `whitespace-style' for more details. The `whitespace-action' option
+See 'whitespace-style' for more details. The 'whitespace-action' option
specifies what to do when a buffer is visited, killed, or written.
@@ -1327,30 +1327,30 @@ specifies what to do when a buffer is visited, killed, or written.
** Abbrev has been rewritten in Elisp and extended with more flexibility.
-*** New functions: abbrev-get, abbrev-put, abbrev-table-get, abbrev-table-put,
-abbrev-table-p, abbrev-insert, abbrev-table-menu.
+*** New functions: 'abbrev-get', 'abbrev-put', 'abbrev-table-get',
+'abbrev-table-put', 'abbrev-table-p', 'abbrev-insert', 'abbrev-table-menu'.
-*** Special hook `abbrev-expand-functions' obsoletes `pre-abbrev-expand-hook'.
+*** Special hook 'abbrev-expand-functions' obsoletes 'pre-abbrev-expand-hook'.
-*** `make-abbrev-table', `define-abbrev', `define-abbrev-table' all take
+*** 'make-abbrev-table', 'define-abbrev', 'define-abbrev-table' all take
extra arguments for arbitrary properties.
-*** New variable `abbrev-minor-mode-table-alist'.
+*** New variable 'abbrev-minor-mode-table-alist'.
-*** `local-abbrev-table' can hold a list of abbrev-tables.
+*** 'local-abbrev-table' can hold a list of abbrev-tables.
*** Abbrevs have now the following special properties:
-`:count', `:system', `:enable-function', `:case-fixed'.
+':count', ':system', ':enable-function', ':case-fixed'.
*** Abbrev-tables have now the following special properties:
-`:parents', `:case-fixed', `:enable-function', `:regexp',
-`abbrev-table-modiff'.
+':parents', ':case-fixed', ':enable-function', ':regexp',
+'abbrev-table-modiff'.
** Apropos
-*** `apropos-library' describes the elements defined in a given library.
+*** 'apropos-library' describes the elements defined in a given library.
-*** Set `apropos-compact-layout' is you want a more compact (but wider) layout.
+*** Set 'apropos-compact-layout' is you want a more compact (but wider) layout.
** Archive Mode has basic support to browse Rar archives.
Note, however, that the free version of the unrar command only handles
@@ -1358,15 +1358,15 @@ versions 1 and 2 of the Rar format.
** BibTeX mode
-*** New command `bibtex-initialize' (re)initializes BibTeX buffers.
+*** New command 'bibtex-initialize' (re)initializes BibTeX buffers.
-*** New `bibtex-entry-format' options `whitespace', `braces', and
-`string', disabled by default.
+*** New 'bibtex-entry-format' options 'whitespace', 'braces', and
+'string', disabled by default.
-*** New variable `bibtex-cite-matcher-alist' contains rules to
-identify cited keys in BibTeX entries, used by `bibtex-find-crossref'.
+*** New variable 'bibtex-cite-matcher-alist' contains rules to
+identify cited keys in BibTeX entries, used by 'bibtex-find-crossref'.
-*** Command `bibtex-url' allows multiple URLs per entry.
+*** Command 'bibtex-url' allows multiple URLs per entry.
** Bookmarks
@@ -1376,10 +1376,10 @@ older Emacs cannot read one saved by Emacs 23.
** Calc
-*** `j *' (cal-sel-mult-both-sides) has an option to expand the denominator.
+*** 'j *' (cal-sel-mult-both-sides) has an option to expand the denominator.
-*** `calc-embedded-word-regexp' is used for finding words in
-`calc-embedded-word' in place of delimiters.
+*** 'calc-embedded-word-regexp' is used for finding words in
+'calc-embedded-word' in place of delimiters.
*** The separate Calc version number has been removed; use the Emacs
version for reference.
@@ -1400,15 +1400,15 @@ version for reference.
** Calendar and diary
-*** There is a new date style, `iso', essentially year/month/day.
-The variable `european-calendar-style' is obsolete - use `calendar-date-style'.
-Similarly, the commands `american-calendar' and `european-calendar'
-should be replaced by `calendar-set-date-style'.
+*** There is a new date style, 'iso', essentially year/month/day.
+The variable 'european-calendar-style' is obsolete - use 'calendar-date-style'.
+Similarly, the commands 'american-calendar' and 'european-calendar'
+should be replaced by 'calendar-set-date-style'.
*** The calendar namespace has been rationalized.
-All functions and variables now begin with a `calendar-', `diary-', or
-`holiday-' prefix. The various calendar systems have secondary
-prefixes, eg `calendar-french-'. The old names you are likely to use
+All functions and variables now begin with a 'calendar-', 'diary-', or
+'holiday-' prefix. The various calendar systems have secondary
+prefixes, eg 'calendar-french-'. The old names you are likely to use
directly still exist, for the time being, as aliases, but please start
using the new names.
@@ -1420,18 +1420,18 @@ calendar-day-header-width, and calendar-day-digit-width.
*** Text (e.g. ISO weeks) can be displayed between the calendar months.
See the variables calendar-intermonth-header and calendar-intermonth-text.
-*** The function `holiday-chinese' computes holidays on the Chinese calendar.
-It has been used to add items to the list `holiday-oriental-holidays'.
+*** The function 'holiday-chinese' computes holidays on the Chinese calendar.
+It has been used to add items to the list 'holiday-oriental-holidays'.
-*** `diary-remind' accepts a negative number -DAYS as a shorthand for
+*** 'diary-remind' accepts a negative number -DAYS as a shorthand for
the list (1 2 ... DAYS).
** Change Log mode
-*** The new command C-c C-f (change-log-find-file) finds the file
+*** The new command C-c C-f ('change-log-find-file') finds the file
associated with the current log entry.
-*** The new command C-c C-c (change-log-goto-source) goes to the
+*** The new command C-c C-c ('change-log-goto-source') goes to the
source code associated with a log entry.
** Compile and grep modes
@@ -1440,79 +1440,79 @@ source code associated with a log entry.
It has different colors for to show that: (a) the command is still
running, (b) successful completion, (c) error.
-*** compilation-auto-jump-to-first-error tells `compile' to jump to
+*** compilation-auto-jump-to-first-error tells 'compile' to jump to
the first error encountered during compilations.
-*** compilation-scroll-output accepts a new value, `first-error', which
+*** compilation-scroll-output accepts a new value, 'first-error', which
says to stop auto scrolling at the first error that occurs.
-*** The `cc' alias for C++ files in `grep-file-aliases' has been
-improved. `hh' can be used to match C++ header files and `cchh' both
+*** The 'cc' alias for C++ files in 'grep-file-aliases' has been
+improved. 'hh' can be used to match C++ header files and 'cchh' both
C++ sources and headers.
** Copyright
*** You can specify your copyright holders' names.
-Only copyright lines with holders matching `copyright-names-regexp' are
+Only copyright lines with holders matching 'copyright-names-regexp' are
considered for update.
*** Copyrights can be at the end of the buffer.
-This is controlled by `copyright-at-end-flag' (used by, e.g., change-log-mode).
+This is controlled by 'copyright-at-end-flag' (used by, e.g., change-log-mode).
** Custom
-*** defcustom accepts new keyword arguments, `:safe' and `:risky', which
-set a variable's `safe-local-variable' and `risky-local-variable' property.
+*** defcustom accepts new keyword arguments, ':safe' and ':risky', which
+set a variable's 'safe-local-variable' and 'risky-local-variable' property.
** Diff mode
-*** diff-refine-hunk highlights word-level details of changes in a diff hunk.
+*** 'diff-refine-hunk' highlights word-level details of changes in a diff hunk.
It's used automatically as you move through hunks, see
-diff-auto-refine-mode. It is bound to `C-c C-b'.
+'diff-auto-refine-mode'. It is bound to 'C-c C-b'.
-*** diff-add-change-log-entries-other-window iterates through the diff
+*** 'diff-add-change-log-entries-other-window' iterates through the diff
buffer and tries to create ChangeLog entries for each change.
-It is bound to `C-x 4 A'.
+It is bound to 'C-x 4 A'.
-*** Turning on `whitespace-mode' in a diff buffer will show trailing
+*** Turning on 'whitespace-mode' in a diff buffer will show trailing
whitespace problems in the modified lines.
** Dired
-*** In Dired, C-x C-q now runs the command wdired-change-to-wdired-mode,
+*** In Dired, C-x C-q now runs the command 'wdired-change-to-wdired-mode',
and C-x C-q in wdired-mode exits it with asking a question about
saving changes.
-*** `&' runs the command `dired-do-async-shell-command' that executes
+*** '&' runs the command 'dired-do-async-shell-command' that executes
the command asynchronously without the need to manually add ampersand
-to the end of the command. Its output appears in the buffer `*Async Shell
+to the end of the command. Its output appears in the buffer '*Async Shell
Command*'.
-*** `M-s f C-s' and `M-s f M-C-s' run Isearch that matches only at file names.
-When a new user option `dired-isearch-filenames' is t, then even ordinary
-Isearch started with `C-s' and `C-M-s' matches only at file names in the
-Dired buffer. When `dired-isearch-filenames' is `dwim' then activation of
+*** 'M-s f C-s' and 'M-s f M-C-s' run Isearch that matches only at file names.
+When a new user option 'dired-isearch-filenames' is t, then even ordinary
+Isearch started with 'C-s' and 'C-M-s' matches only at file names in the
+Dired buffer. When 'dired-isearch-filenames' is 'dwim' then activation of
file name Isearch depends on the position of point - if point is on a file
name initially, then Isearch matches only file names, otherwise it matches
everywhere in the Dired buffer. You can toggle file names matching on or
-off by typing `M-s f' in Isearch mode.
+off by typing 'M-s f' in Isearch mode.
-*** `M-s a C-s' and `M-s a M-C-s' run multi-file Isearch on the marked files.
+*** 'M-s a C-s' and 'M-s a M-C-s' run multi-file Isearch on the marked files.
They visit the first marked file in the sequence and display the usual Isearch
prompt for a string or a regexp where all Isearch commands are available.
-*** `Q' in Dired provides two new keys for multi-file replacement.
-The upper case key `Y' replaces all remaining matches in all remaining files
-with no more questions. The upper case key `N' stops doing replacements
+*** 'Q' in Dired provides two new keys for multi-file replacement.
+The upper case key 'Y' replaces all remaining matches in all remaining files
+with no more questions. The upper case key 'N' stops doing replacements
in the current file and skips to the next file. These multi-file keys
-are available for all commands that use `tags-query-replace'
-including `dired-do-query-replace-regexp', `vc-dir-query-replace-regexp',
-`reftex-query-replace-document'.
+are available for all commands that use 'tags-query-replace'
+including 'dired-do-query-replace-regexp', 'vc-dir-query-replace-regexp',
+'reftex-query-replace-document'.
** Fortran
*** The line length of fixed-form Fortran is not fixed at 72 any more.
-Customize the variable `fortran-line-length' to change it.
+Customize the variable 'fortran-line-length' to change it.
*** In Fortran mode, M-; is now bound to the standard comment-dwim,
rather than fortran-indent-comment.
@@ -1525,43 +1525,43 @@ rather than fortran-indent-comment.
There are many new features, bug fixes and improvements; see the file
GNUS-NEWS or the node "No Gnus" in the Gnus manual for details.
-*** In Emacs 23, Gnus uses Emacs' new internal coding system `utf-8-emacs' for
+*** In Emacs 23, Gnus uses Emacs' new internal coding system 'utf-8-emacs' for
saving articles, drafts, and ~/.newsrc.eld. These file may not be read
correctly in Emacs 22 and below. If you want to Gnus across different Emacs
-versions, you may set `mm-auto-save-coding-system' to `emacs-mule'.
+versions, you may set 'mm-auto-save-coding-system' to 'emacs-mule'.
-*** Passwords are consistently loaded through `auth-source'
-Gnus can use `auth-source' for POP and IMAP passwords. Also see that
-`smtpmail' and `url' support `auth-source' for SMTP and HTTP/HTTPS/RSS
+*** Passwords are consistently loaded through 'auth-source'
+Gnus can use 'auth-source' for POP and IMAP passwords. Also see that
+'smtpmail' and 'url' support 'auth-source' for SMTP and HTTP/HTTPS/RSS
authentication respectively.
** Help mode
-*** New macro `with-help-window' should set up help windows better
-than `with-output-to-temp-buffer' with `print-help-return-message'.
+*** New macro 'with-help-window' should set up help windows better
+than 'with-output-to-temp-buffer' with 'print-help-return-message'.
-*** New option `help-window-select' permits to customize whether help
+*** New option 'help-window-select' permits to customize whether help
window shall be automatically selected when invoking help.
-*** New variable `help-window-point-marker' permits one to specify a new
-position for point in help window (for example in `view-lossage').
+*** New variable 'help-window-point-marker' permits one to specify a new
+position for point in help window (for example in 'view-lossage').
** Isearch
-*** New command `isearch-forward-word' bound globally to `M-s w' starts
-incremental word search. New command `isearch-toggle-word' bound to the
-same key `M-s w' in Isearch mode toggles word searching on or off
+*** New command 'isearch-forward-word' bound globally to 'M-s w' starts
+incremental word search. New command 'isearch-toggle-word' bound to the
+same key 'M-s w' in Isearch mode toggles word searching on or off
while Isearch is active.
-*** New command `isearch-highlight-regexp' bound to `M-s h r' in Isearch
-mode runs `highlight-regexp' (`hi-lock-face-buffer') with the current
-search string as its regexp argument. The same key `M-s h r' and
-other keys on the `M-s h' prefix are bound globally to the command
-`highlight-regexp' and other hi-lock commands.
+*** New command 'isearch-highlight-regexp' bound to 'M-s h r' in Isearch
+mode runs 'highlight-regexp' ('hi-lock-face-buffer') with the current
+search string as its regexp argument. The same key 'M-s h r' and
+other keys on the 'M-s h' prefix are bound globally to the command
+'highlight-regexp' and other hi-lock commands.
-*** New command `isearch-occur' bound to `M-s o' in Isearch mode
-runs `occur' with the current search string. The same key `M-s o'
-is bound globally to the command `occur'.
+*** New command 'isearch-occur' bound to 'M-s o' in Isearch mode
+runs 'occur' with the current search string. The same key 'M-s o'
+is bound globally to the command 'occur'.
*** Isearch can now search through multiple ChangeLog files.
When running Isearch in a ChangeLog file, if the search fails,
@@ -1570,20 +1570,20 @@ if there is one (e.g. going from ChangeLog to ChangeLog.12).
This is enabled if multi-isearch-search is non-nil.
*** Two new commands to start Isearch on a list of marked buffers
-for buff-menu.el and ibuffer.el are bound to the keys `M-s a C-s' and
-`M-s a M-C-s'.
+for buff-menu.el and ibuffer.el are bound to the keys 'M-s a C-s' and
+'M-s a M-C-s'.
*** The part of an Isearch that failed to match is highlighted in
-`isearch-fail' face.
+'isearch-fail' face.
-*** `C-h C-h' in Isearch mode displays isearch-specific Help screen,
-`C-h b' displays all Isearch key bindings, `C-h k' displays the full
-documentation of the given Isearch key sequence, `C-h m' displays
+*** 'C-h C-h' in Isearch mode displays isearch-specific Help screen,
+'C-h b' displays all Isearch key bindings, 'C-h k' displays the full
+documentation of the given Isearch key sequence, 'C-h m' displays
documentation for Isearch mode. All the other Help commands exit
Isearch mode and execute their global definitions.
*** When started in the minibuffer, Isearch searches in the minibuffer
-history. See `Minibuffer changes', above.
+history. See 'Minibuffer changes', above.
** MH-E
@@ -1593,14 +1593,14 @@ history. See `Minibuffer changes', above.
*** The file etc/emacs.py now supports both Python 2 and 3, meaning
that either version can be used as inferior Python by python.el.
-*** Python mode now has `pdbtrack' functionality. When using pdb to
+*** Python mode now has 'pdbtrack' functionality. When using pdb to
debug a Python program, pdbtrack notices the pdb prompt and displays
the source file and line that the program is stopped at, much the same
way as gud-mode does for debugging C programs with gdb.
** Recentf
-*** The default value of `recentf-keep' prevents from checking of
+*** The default value of 'recentf-keep' prevents from checking of
remote files, if there is no established connection to the
corresponding remote host.
@@ -1631,37 +1631,37 @@ just a narrowed portion of the whole. So you cannot access the whole
of a message (or message collection) by a simple save-restriction and
widen. Instead, there are two buffers: the rmail-buffer, and the
rmail-view-buffer. The former is the buffer that you see, the latter
-is invisible. Most of the time, the invisible `view' buffer contains
+is invisible. Most of the time, the invisible 'view' buffer contains
the full contents of the Rmail file, and the Rmail buffer contains a
decoded copy of the current message (with only a subset of the
-headers). In this state, Rmail is said to be `swapped'.
+headers). In this state, Rmail is said to be 'swapped'.
You may find the following functions useful:
-`rmail-get-header' and `rmail-set-header' get or set the value of a
+'rmail-get-header' and 'rmail-set-header' get or set the value of a
message header, whether or not it is currently visible.
-`rmail-apply-in-message' is a general purpose function that calls a
+'rmail-apply-in-message' is a general purpose function that calls a
function (with arguments) which you specify on the full text of a given
message. To further narrow to just the headers, search forward for "\n\n".
-*** The new command `rmail-mime' displays MIME messages.
-It is bound to `v' in Rmail buffers and summaries. It displays plain
+*** The new command 'rmail-mime' displays MIME messages.
+It is bound to 'v' in Rmail buffers and summaries. It displays plain
text and multipart messages in a temporary buffer, and offers buttons
to save attachments.
-*** The command `rmail-redecode-body' no longer accepts the optional arg RAW.
+*** The command 'rmail-redecode-body' no longer accepts the optional arg RAW.
Since Rmail now holds messages in their original undecoded form in a
-separate buffer, `rmail-redecode-body' no longer encodes the original
+separate buffer, 'rmail-redecode-body' no longer encodes the original
message, and therefore there should be no need to avoid encoding it.
-*** The o command is now `rmail-output'. It is an all-purpose command
+*** The o command is now 'rmail-output'. It is an all-purpose command
for copying messages from Rmail and appending them to files. It
handles Babyl-format files as well as mbox-format files, and it
handles both kinds properly when they are visited in Emacs. It always
copies the full headers of the message.
-*** The C-o command is now `rmail-output-as-seen'. It uses
+*** The C-o command is now 'rmail-output-as-seen'. It uses
the message as displayed, appending it to an mbox file.
*** The modified status of the Rmail buffer is reported in the mode-line.
@@ -1669,7 +1669,7 @@ Previously, this information was hidden.
** TeX modes
-*** New option latex-indent-within-escaped-parens
+*** New option 'latex-indent-within-escaped-parens'
permits to customize indentation of LaTeX environments delimited
by escaped parens.
@@ -1694,27 +1694,27 @@ in square brackets, like in "/ssh:[::1]:".
*** Multihop syntax has been removed.
The pseudo-method "multi" has been removed. Instead, multi hops
-can be specified by the new variable `tramp-default-proxies-alist'.
+can be specified by the new variable 'tramp-default-proxies-alist'.
*** More default settings.
-Default values can be set via the variables `tramp-default-user',
-`tramp-default-user-alist' and `tramp-default-host'.
+Default values can be set via the variables 'tramp-default-user',
+'tramp-default-user-alist' and 'tramp-default-host'.
*** Connection information is cached.
In order to reduce connection setup, information about used
connections is kept persistently in a file. The name of this file is
-defined in the variable `tramp-persistency-file-name'.
+defined in the variable 'tramp-persistency-file-name'.
*** Control of remote processes.
Running processes on a remote host can be controlled by settings in
-`tramp-remote-path' and `tramp-remote-process-environment'.
+'tramp-remote-path' and 'tramp-remote-process-environment'.
*** Success of remote copy is checked.
-When the variable `file-precious-flag' is set, the success of a remote
+When the variable 'file-precious-flag' is set, the success of a remote
file copy is checked via the file's checksum.
*** Passwords can be read from an authentication file.
-Tramp uses the package `auth-source' to read passwords from a file, if
+Tramp uses the package 'auth-source' to read passwords from a file, if
necessary.
** VC and related modes
@@ -1725,7 +1725,7 @@ version-control systems such as Subversion, GNU Arch, Mercurial, Git
and Bzr. VC will now pass a multiple-file commit to these systems as
a single changeset.
-*** vc-dir is a new command that displays file names and their VC
+*** 'vc-dir' is a new command that displays file names and their VC
status. It allows to apply various VC operations to a file, a
directory or a set of files/directories.
@@ -1733,9 +1733,9 @@ directory or a set of files/directories.
(This was for the most part true in Emacs 22, but was not advertised).
This is because there is an increasing variety of VC systems, and they
do not all accept the same "common" options. For example, a CVS diff
-command used to append the values of `vc-cvs-diff-switches',
-`vc-diff-switches', and `diff-switches'. Now the first non-nil value
-from that sequence is used. The special value `t' means "no switches".
+command used to append the values of 'vc-cvs-diff-switches',
+'vc-diff-switches', and 'diff-switches'. Now the first non-nil value
+from that sequence is used. The special value 't' means "no switches".
*** Clicking on the VC mode-line entry now pops the VC menu.
@@ -1760,7 +1760,7 @@ active.
*** Log entries can be modified using the key "e" in log-view.
For now only CVS, RCS, SCCS and SVN support this functionality.
-This is done by the `modify-change-comment' backend function.
+This is done by the 'modify-change-comment' backend function.
*** In log-view-mode, for VC systems that support changesets, you can
see the diff for the whole changeset (not only for the current file)
@@ -1775,37 +1775,37 @@ to update it to the new VC.
** Miscellaneous
-*** comint-mode uses `start-file-process' now (see Lisp Changes).
-If `default-directory' is a remote file name, subprocesses are started
+*** comint-mode uses 'start-file-process' now (see Lisp Changes).
+If 'default-directory' is a remote file name, subprocesses are started
on the corresponding remote system.
*** ElDoc highlights the function argument under point
-with the face `eldoc-highlight-function-argument'.
+with the face 'eldoc-highlight-function-argument'.
*** In Etags, the --members option is now the default.
Use --no-members if you want the old default behavior of not tagging
struct members in C, members variables in C++ and variables in PHP.
-*** The `gdb' command only works with the graphical interface now.
-Use `gud-gdb' if you want the (old) text command mode.
+*** The 'gdb' command only works with the graphical interface now.
+Use 'gud-gdb' if you want the (old) text command mode.
-*** goto-address.el provides two new minor modes, goto-address-mode and
-goto-address-prog-mode, which buttonize URLS and email addresses.
+*** 'goto-address' provides two new minor modes, 'goto-address-mode' and
+'goto-address-prog-mode', which buttonize URLS and email addresses.
-*** The new command `eshell/info' runs info in an eshell buffer.
+*** The new command 'eshell/info' runs info in an eshell buffer.
-*** The new variable `ffap-rfc-directories' specifies a list of local
-directories in which `ffap-rfc' will first search for RFCs.
+*** The new variable 'ffap-rfc-directories' specifies a list of local
+directories in which 'ffap-rfc' will first search for RFCs.
*** hide-ifdef-mode allows shadowing ifdef-blocks instead of hiding them.
-See option `hide-ifdef-shadow' and function `hide-ifdef-toggle-shadowing'.
+See option 'hide-ifdef-shadow' and function 'hide-ifdef-toggle-shadowing'.
-*** `icomplete-prospects-height' now supersedes `icomplete-prospects-length'.
+*** 'icomplete-prospects-height' now supersedes 'icomplete-prospects-length'.
*** Info displays breadcrumbs in the header of the page.
See Info-breadcrumbs-depth to control it.
-*** net-utils has an `iwconfig' command, similar to the existing `ifconfig'.
+*** net-utils has an 'iwconfig' command, similar to the existing 'ifconfig'.
It is used to configure wireless interfaces.
*** The pcmpl-unix package supports hostname completion for ssh and scp.
@@ -1818,7 +1818,7 @@ smerge-auto-refine-mode.
*** talk.el has been extended for multiple tty support.
-*** A new command `display-time-world' has been added to the Time
+*** A new command 'display-time-world' has been added to the Time
package. It creates a buffer with an updating time display using
several time zones.
@@ -1831,16 +1831,16 @@ tex-suscript-height-minimum.
since users found iconification of view-mode frames distracting.
*** WoMan tries to add locale-specific manual page directories to the
-search path. This can be disabled by setting `woman-locale' to nil.
+search path. This can be disabled by setting 'woman-locale' to nil.
* Changes in Emacs 23.1 on non-free operating systems
** Case is now considered significant in completion on MS-Windows.
-The default value of `completion-ignore-case' is now nil on
+The default value of 'completion-ignore-case' is now nil on
MS-Windows, the same as it is for other operating systems. The
variable doesn't apply to reading a file name -- in that case Emacs
-heeds `read-file-name-completion-ignore-case' instead.
+heeds 'read-file-name-completion-ignore-case' instead.
** IPv6 is supported on MS-Windows.
Emacs now supports IPv6 on Windows XP and later, and earlier versions
@@ -1855,7 +1855,7 @@ In Emacs 22 only X supported the busy cursor.
** Battery status is available on MS-Windows
Emacs can now display the battery status in the mode-line when enabled with
display-battery-mode or from the Options menu. More verbose battery
-information is also available with the command `battery'. In Emacs 22
+information is also available with the command 'battery'. In Emacs 22
battery status was supported only on GNU/Linux and Mac.
** More keys available on MS-Windows.
@@ -1886,8 +1886,8 @@ freetype library, giving access to a wider range of font formats.
** Variables cannot be both buffer-local and frame-local any more.
-** `functionp' returns nil for special forms.
-I.e., it only returns t for objects that can be passed to `funcall'.
+** 'functionp' returns nil for special forms.
+I.e., it only returns t for objects that can be passed to 'funcall'.
** The behavior of map-char-table has changed. It may call the
specified function with a cons (FROM . TO) as a key if characters in
@@ -1895,32 +1895,32 @@ that range have the same value.
** Process changes
-*** The function `dired-call-process' has been removed.
+*** The function 'dired-call-process' has been removed.
*** The multibyteness of process filters is now determined by the
coding-system used for decoding. The functions
-`process-filter-multibyte-p' and `set-process-filter-multibyte' are
+'process-filter-multibyte-p' and 'set-process-filter-multibyte' are
obsolete.
-** The variable `byte-compile-warnings' can now be a list starting with `not',
+** The variable 'byte-compile-warnings' can now be a list starting with 'not',
meaning to disable the specified warnings. The meaning of this list
may therefore be the reverse of what you expect (of course, this is
-only an issue if you make use of the new `not' syntax). Rather than
+only an issue if you make use of the new 'not' syntax). Rather than
checking/manipulating elements directly, use the new functions
-`byte-compile-warning-enabled-p', `byte-compile-disable-warning', and
-`byte-compile-enable-warning.'
+'byte-compile-warning-enabled-p', 'byte-compile-disable-warning', and
+'byte-compile-enable-warning'.
-** `mode-name' is no longer guaranteed to be a string.
-Use `(format-mode-line mode-name)' to ensure a string value.
+** 'mode-name' is no longer guaranteed to be a string.
+Use '(format-mode-line mode-name)' to ensure a string value.
-** The function x-font-family-list has been removed.
-Use the new function font-family-list (see Lisp Changes, below).
+** The function 'x-font-family-list' has been removed.
+Use the new function 'font-family-list' (see Lisp Changes, below).
** Internationalization changes
-*** The value of the function `charset-id' is now always 0.
+*** The value of the function 'charset-id' is now always 0.
-*** The functions `register-char-codings' and `coding-system-spec'
+*** The functions 'register-char-codings' and 'coding-system-spec'
have been removed.
*** The cpXXX coding systems are now supported automatically.
@@ -1931,23 +1931,23 @@ enable support for these coding systems, have been deleted.
displaying various scripts with specific fonts, and are no longer
needed now that OpenType font support is available:
-**** `devanagari' and `devan-util', and all associated devanagari-* and
+**** 'devanagari' and 'devan-util', and all associated devanagari-* and
dev-* functions and variables (formerly used for Devanagari script).
-**** `kannada' and `knd-util', and all associated kannada-* and knd-*
+**** 'kannada' and 'knd-util', and all associated kannada-* and knd-*
functions and variables (formerly used for Kannada script).
-**** `malayalam' and `mlm-util', and all associated malayalam-* and
+**** 'malayalam' and 'mlm-util', and all associated malayalam-* and
mlm-* functions and variables (formerly used for Malayalam script).
-**** `tamil' and `tml-util, and all associated tamil-* and tml-*
+**** 'tamil' and 'tml-util', and all associated tamil-* and tml-*
functions and variables (formerly used for Tamil script).
-*** The meaning of NAME argument of `set-fontset-font' is changed.
+*** The meaning of NAME argument of 'set-fontset-font' is changed.
Previously nil is accepted as the default fontset. Now, nil is for
the fontset of the selected frame and t is for the default fontset.
-*** The meaning of FONTSET argument of `print-fontset' is changed.
+*** The meaning of FONTSET argument of 'print-fontset' is changed.
Now, nil is for the fontset of the selected frame and t is for the
default fontset.
@@ -1955,8 +1955,8 @@ default fontset.
different buffer current, Emacs no longer kills that buffer
automatically. This behavior existed in previous versions of Emacs,
but was undocumented. To kill a buffer after write-region, give the
-variable `write-region-post-annotation-function' a buffer-local value
-of `kill-buffer'.
+variable 'write-region-post-annotation-function' a buffer-local value
+of 'kill-buffer'.
** The variable temp-file-name-pattern has been removed.
This variable was only used by call-process-region, which now uses
@@ -1968,127 +1968,127 @@ arbitrary abbrev properties.
** end-of-defun-function is now guaranteed to work only when called
from the start of a defun. It must now leave point exactly at the end
-of defun, since `end-of-defun' now itself moves forward over
+of defun, since 'end-of-defun' now itself moves forward over
whitespace after calling it.
* Lisp Changes in Emacs 23.1
-** The new variable `generate-autoload-cookie' controls the magic comment
-string used by `update-file-autoloads' to find autoloaded forms. The
-variable `generated-autoload-file' similarly controls the name of the
-file where `update-file-autoloads' writes the calls to `autoload'.
-The default values are ";;;###autoload" and `loaddefs.el',
+** The new variable 'generate-autoload-cookie' controls the magic comment
+string used by 'update-file-autoloads' to find autoloaded forms. The
+variable 'generated-autoload-file' similarly controls the name of the
+file where 'update-file-autoloads' writes the calls to 'autoload'.
+The default values are ";;;###autoload" and 'loaddefs.el',
respectively.
-** New primitives `list-system-processes' and `process-attributes'
+** New primitives 'list-system-processes' and 'process-attributes'
let Lisp programs access the processes that are running on the local
machine. See the doc strings of these functions for more details.
Not all platforms support accessing this information; on those that
don't, these primitives will return nil.
-** New variable `user-emacs-directory'.
+** New variable 'user-emacs-directory'.
Use this instead of "~/.emacs.d".
-** If a local hook function has a non-nil `permanent-local-hook'
-property, `kill-all-local-variables' does not remove it from the local
+** If a local hook function has a non-nil 'permanent-local-hook'
+property, 'kill-all-local-variables' does not remove it from the local
value of the hook variable; it remains even if you change major modes.
-** `frame-inherited-parameters' lets new frames inherit parameters from
+** 'frame-inherited-parameters' lets new frames inherit parameters from
the selected frame.
-** New keymap `input-decode-map' overrides like key-translation-map, but
+** New keymap 'input-decode-map' overrides like key-translation-map, but
applies before function-key-map. Also it is terminal-local contrary to
key-translation-map. Terminal-specific key-sequences are generally added to
this map rather than to function-key-map now.
-** `ignore-errors' is now a standard macro (does not require the CL package).
+** 'ignore-errors' is now a standard macro (does not require the CL package).
-** `interprogram-paste-function' can now return one string or a list
+** 'interprogram-paste-function' can now return one string or a list
of strings. In the latter case, Emacs puts the second and following
strings on the kill ring.
-** In `condition-case', a handler can specify "let the debugger run first".
-You do this by writing `debug' in the list of conditions to be handled,
+** In 'condition-case', a handler can specify "let the debugger run first".
+You do this by writing 'debug' in the list of conditions to be handled,
like this:
(condition-case nil
(foo bar)
((debug error) nil))
-** clone-indirect-buffer now runs the clone-indirect-buffer-hook.
+** 'clone-indirect-buffer' now runs the 'clone-indirect-buffer-hook'.
-** `beginning-of-defun-function' now takes one argument, the count given to
-`beginning-of-defun'. (N.B. `end-of-defun-function' doesn't take any
+** 'beginning-of-defun-function' now takes one argument, the count given to
+'beginning-of-defun'. (N.B. 'end-of-defun-function' doesn't take any
arguments.)
-** `file-remote-p' has new optional parameters IDENTIFICATION and CONNECTED.
+** 'file-remote-p' has new optional parameters IDENTIFICATION and CONNECTED.
IDENTIFICATION specifies which part of the remote identifier has to be
returned. With CONNECTED passed non-nil, it is checked whether a
remote connection has been established already.
-** The new macro `declare-function' suppresses compiler warnings about
+** The new macro 'declare-function' suppresses compiler warnings about
undefined functions.
** Changes to interactive function handling
*** The new interactive spec code ^ says to first call
-handle-shift-selection if shift-select-mode is non-nil, before reading
+'handle-shift-selection' if shift-select-mode is non-nil, before reading
the command arguments. This is used for shift-selection (see above).
*** Built-in functions can now have an interactive specification that
-is not a prompt string. If the `intspec' parameter of a `DEFUN'
-starts with a `(', the string is evaluated as a Lisp form.
+is not a prompt string. If the 'intspec' parameter of a 'DEFUN'
+starts with a '(', the string is evaluated as a Lisp form.
*** The interactive-form of a function can be added post-facto via the
-`interactive-form' symbol property. Mostly useful to add complex
+'interactive-form' symbol property. Mostly useful to add complex
interactive forms to subroutines.
** Region changes
-*** Commands should use `use-region-p' to test whether there is
+*** Commands should use 'use-region-p' to test whether there is
an active region that they should operate on.
-*** `region-active-p' returns non-nil when Transient Mark mode is
+*** 'region-active-p' returns non-nil when Transient Mark mode is
enabled and the mark is active. Most commands that act specially on
-the active region in Transient Mark mode should use `use-region-p'
-instead of `region-active-p', because `use-region-p' obeys the new
-user option `use-empty-active-region' (see Editing Changes, above).
+the active region in Transient Mark mode should use 'use-region-p'
+instead of 'region-active-p', because 'use-region-p' obeys the new
+user option 'use-empty-active-region' (see Editing Changes, above).
-*** If a command sets `transient-mark-mode' to (only . OLDVAL), that
+*** If a command sets 'transient-mark-mode' to (only . OLDVAL), that
means to activate transient-mark-mode temporarily, until the next
unshifted point motion command or mark deactivation. Afterwards,
-reset transient-mark-mode to the value OLDVAL. The values `only' and
-`identity', introduced in Emacs 22, are now deprecated.
+reset transient-mark-mode to the value OLDVAL. The values 'only' and
+'identity', introduced in Emacs 22, are now deprecated.
** Emacs session information
-*** The new variables `before-init-time' and `after-init-time' record the
-value of `current-time' before and after Emacs loads the init files.
+*** The new variables 'before-init-time' and 'after-init-time' record the
+value of 'current-time' before and after Emacs loads the init files.
-*** The new function `emacs-uptime' returns the uptime of an Emacs instance.
+*** The new function 'emacs-uptime' returns the uptime of an Emacs instance.
-*** The new function `emacs-init-time' returns the duration of the
+*** The new function 'emacs-init-time' returns the duration of the
Emacs initialization.
** Changes affecting display-buffer
-*** display-buffer tries to be smarter when splitting windows.
-The new option split-window-preferred-function lets you specify your own
-function to pop up new windows. Its default value split-window-sensibly
+*** 'display-buffer' tries to be smarter when splitting windows.
+The new option 'split-window-preferred-function' lets you specify your own
+function to pop up new windows. Its default value 'split-window-sensibly'
can split a window either vertically or horizontally, whichever seems
more suitable in the current configuration. You can tune the behavior
-of split-window-sensibly by customizing split-height-threshold and the
-new option split-width-threshold. Both options now take the value nil
-to inhibit splitting in one direction. Setting split-width-threshold to
+of 'split-window-sensibly' by customizing 'split-height-threshold' and the
+new option 'split-width-threshold'. Both options now take the value nil
+to inhibit splitting in one direction. Setting 'split-width-threshold' to
nil inhibits horizontal splitting and gets you the behavior of Emacs 22
in this respect. In any case, display-buffer may now split the largest
window vertically even when it is not as wide as the containing frame.
-*** If pop-up-frames has the value `graphic-only', display-buffer only
+*** If 'pop-up-frames' has the value 'graphic-only', display-buffer only
makes a separate frame on graphic displays.
-*** select-frame and set-frame-selected-window have a new optional
+*** 'select-frame' and 'set-frame-selected-window' have a new optional
argument NORECORD. If non-nil, this will avoid messing with the order
of recently selected windows and the buffer list.
@@ -2096,56 +2096,56 @@ of recently selected windows and the buffer list.
These are analogous to frame parameters, but are associated with
individual windows.
-*** The new functions window-parameters, window-parameter, and
-set-window-parameter are used to query and set window parameters.
+*** The new functions 'window-parameters', 'window-parameter', and
+'set-window-parameter' are used to query and set window parameters.
** Minibuffer and completion changes
*** A list of default values can be specified for the DEFAULT argument of
-functions `read-from-minibuffer', `read-string', `read-command',
-`read-variable', `read-buffer', `completing-read'. Elements of this list
-are available for inserting into the minibuffer by typing `M-n'.
+functions 'read-from-minibuffer', 'read-string', 'read-command',
+'read-variable', 'read-buffer', 'completing-read'. Elements of this list
+are available for inserting into the minibuffer by typing 'M-n'.
For empty input these functions return the first element of this list.
-*** New function `read-regexp' uses the regexp history and some useful
+*** New function 'read-regexp' uses the regexp history and some useful
regexp defaults (string at point, last Isearch/replacement regexp/string)
via M-n when reading a regexp in the minibuffer.
*** minibuffer-local-must-match-filename-map is now named
minibuffer-local-filename-must-match-map.
-*** The `require-match' argument to `completing-read' accepts the new
-values `confirm-only' and `confirm-after-completion'.
+*** The 'require-match' argument to 'completing-read' accepts the new
+values 'confirm-only' and 'confirm-after-completion'.
** Search and replacement changes
*** The regexp form \(?<num>:<regexp>\) specifies the group number explicitly.
-*** New function `match-substitute-replacement' returns the result of
-`replace-match' without actually using it in the buffer.
+*** New function 'match-substitute-replacement' returns the result of
+'replace-match' without actually using it in the buffer.
-*** The new variable `replace-search-function' determines the function
+*** The new variable 'replace-search-function' determines the function
to use for searching in query-replace and replace-string. The
-function it specifies is called by `perform-replace' when its 4th
+function it specifies is called by 'perform-replace' when its 4th
argument is nil.
-*** The new variable `replace-re-search-function' determines the
-function to use for searching in `query-replace-regexp',
-`replace-regexp', `query-replace-regexp-eval', and
-`map-query-replace-regexp'. The function it specifies is called by
-`perform-replace' when its 4th argument is non-nil.
+*** The new variable 'replace-re-search-function' determines the
+function to use for searching in 'query-replace-regexp',
+'replace-regexp', 'query-replace-regexp-eval', and
+'map-query-replace-regexp'. The function it specifies is called by
+'perform-replace' when its 4th argument is non-nil.
-*** New keymap `search-map' bound to `M-s' provides global bindings
+*** New keymap 'search-map' bound to 'M-s' provides global bindings
for search related commands.
-*** New keymap `multi-query-replace-map' contains additional keys bound
-to `automatic-all' and `exit-current' for multi-buffer interactive replacement.
+*** New keymap 'multi-query-replace-map' contains additional keys bound
+to 'automatic-all' and 'exit-current' for multi-buffer interactive replacement.
-*** The variable `inhibit-changing-match-data', if non-nil, prevents
+*** The variable 'inhibit-changing-match-data', if non-nil, prevents
the search and match primitives from changing the match data.
-*** New functions `word-search-forward-lax' and `word-search-backward-lax'.
-These are like `word-search-forward and `word-search-backward', except
+*** New functions 'word-search-forward-lax' and 'word-search-backward-lax'.
+These are like 'word-search-forward' and 'word-search-backward', except
that the end of the search string need not match a word boundary,
unless it ends in whitespace.
@@ -2160,37 +2160,37 @@ variables defined in the current buffer.
** Face-remapping
*** Each face can be remapped to a different face definition using the
-variable `face-remapping-alist'. This is an alist that maps faces to
+variable 'face-remapping-alist'. This is an alist that maps faces to
replacement definitions (which can be face names, lists of face names,
or attribute/value plists. If this variable is buffer-local, the
remapping occurs only in that buffer.
*** text-scale-mode remaps the default face to a larger or smaller
size in the current buffer. This feature is used by the Buffer Face
-menu and the new `C-x C-+', `C-x C--', and `C-x C-0' commands (see
+menu and the new 'C-x C-+', 'C-x C--', and 'C-x C-0' commands (see
Editing Changes, above).
*** New functions:
-**** `face-remap-add-relative' adds a face remapping entry to the
+**** 'face-remap-add-relative' adds a face remapping entry to the
current buffer.
-**** ``face-remap-remove-relative' removes a face remapping entry from
+**** 'face-remap-remove-relative' removes a face remapping entry from
the current buffer.
-**** `face-remap-reset-base' restores a face to its global definition.
+**** 'face-remap-reset-base' restores a face to its global definition.
-**** `face-remap-set-base' sets the base remapping of a face.
+**** 'face-remap-set-base' sets the base remapping of a face.
** Process changes
-*** The new function `start-file-process' is similar to `start-process',
+*** The new function 'start-file-process' is similar to 'start-process',
but obeys file handlers. The file handler is chosen based on
-`default-directory'. The functions `start-file-process-shell-command'
-and `process-file-shell-command' are also new; they call internally
-`start-file-process' and `process-file', respectively.
+'default-directory'. The functions 'start-file-process-shell-command'
+and 'process-file-shell-command' are also new; they call internally
+'start-file-process' and 'process-file', respectively.
-*** The new function `process-lines' executes an external program and
+*** The new function 'process-lines' executes an external program and
returns its output as a list of lines.
** Character code, representation, and charset changes.
@@ -2213,105 +2213,105 @@ each dimension is no longer limited to 94 or 96.
**** A dynamic charset priority list is used to infer the charset of
characters for display.
-*** The functions `split-char' and `make-char' now accept up to 4
+*** The functions 'split-char' and 'make-char' now accept up to 4
positional codes instead of just 2.
-*** The functions `encode-char' and `decode-char' now accept any character sets.
+*** The functions 'encode-char' and 'decode-char' now accept any character sets.
-*** The function `define-charset' now accepts a completely different
+*** The function 'define-charset' now accepts a completely different
form of arguments (old-style arguments still work).
-*** The value of the function `char-charset' depends on the current
+*** The value of the function 'char-charset' depends on the current
priorities of charsets.
-*** The function get-char-code-property now accepts many Unicode base
-character properties. They are `name', `general-category',
-`canonical-combining-class', `bidi-class', `decomposition',
-`decimal-digit-value', `digit-value', `numeric-value', `mirrored',
-`old-name', `iso-10646-comment', `uppercase', `lowercase', and
-`titlecase'.
+*** The function 'get-char-code-property' now accepts many Unicode base
+character properties. They are 'name', 'general-category',
+'canonical-combining-class', 'bidi-class', 'decomposition',
+'decimal-digit-value', 'digit-value', 'numeric-value', 'mirrored',
+'old-name', 'iso-10646-comment', 'uppercase', 'lowercase', and
+'titlecase'.
-*** The functions `modify-syntax-entry' and `modify-category-entry' now
+*** The functions 'modify-syntax-entry' and 'modify-category-entry' now
accept a cons of characters as the first argument, and modify all
entries in that range of characters.
-*** Use of `translation-table-for-input' for character code unification
+*** Use of 'translation-table-for-input' for character code unification
is now obsolete, since Emacs 23.1 and later uses Unicode as basis for
internal representation of characters.
*** New functions:
-**** `characterp' returns t if and only if the argument is a character.
-This replaces `char-valid-p', which is now obsolete.
+**** 'characterp' returns t if and only if the argument is a character.
+This replaces 'char-valid-p', which is now obsolete.
-**** `max-char' returns the maximum character code (currently #x3FFFFF).
+**** 'max-char' returns the maximum character code (currently #x3FFFFF).
-**** `define-charset-alias' defines an alias of a charset.
+**** 'define-charset-alias' defines an alias of a charset.
-**** `set-charset-priority' sets priorities of charsets.
+**** 'set-charset-priority' sets priorities of charsets.
-**** `charset-priority-list' returns a prioritized list of charsets.
+**** 'charset-priority-list' returns a prioritized list of charsets.
-**** `unibyte-string' makes a unibyte string from bytes.
+**** 'unibyte-string' makes a unibyte string from bytes.
-**** `define-char-code-property' defines a character code property.
+**** 'define-char-code-property' defines a character code property.
-**** `char-code-property-description' returns the description string of
+**** 'char-code-property-description' returns the description string of
a character code property.
*** New variables:
-**** `find-word-boundary-function-table' is a char-table of functions to
+**** 'find-word-boundary-function-table' is a char-table of functions to
search for a word boundary.
-**** `char-script-table' is a char-table of script names.
+**** 'char-script-table' is a char-table of script names.
-**** `char-width-table' is a char-table of character widths.
+**** 'char-width-table' is a char-table of character widths.
-**** `print-charset-text-property' controls how to handle `charset' text
+**** 'print-charset-text-property' controls how to handle 'charset' text
property on printing a string.
-**** `printable-chars' is a char-table of printable characters.
+**** 'printable-chars' is a char-table of printable characters.
** Code conversion changes
-*** The new function `define-coding-system' should be used to define a
-coding system instead of `make-coding-system' (which is now obsolete).
+*** The new function 'define-coding-system' should be used to define a
+coding system instead of 'make-coding-system' (which is now obsolete).
-*** The functions `encode-coding-region' and `decode-coding-region'
+*** The functions 'encode-coding-region' and 'decode-coding-region'
have an optional 4th argument to specify where the result of
conversion should go.
-*** The functions `encode-coding-string' and `decode-coding-string'
+*** The functions 'encode-coding-string' and 'decode-coding-string'
have an optional 4th argument specifying a buffer to store the result
of conversion.
-*** The new variable `inhibit-null-byte-detection' controls whether to
+*** The new variable 'inhibit-null-byte-detection' controls whether to
consider text with null bytes as binary data. By default, it is
-`nil', and Emacs uses `no-conversion' for any text containing null
+'nil', and Emacs uses 'no-conversion' for any text containing null
bytes.
-*** The functions `set-coding-priority' and `make-coding-system' are obsolete.
+*** The functions 'set-coding-priority' and 'make-coding-system' are obsolete.
*** New functions:
-**** `with-coding-priority' executes Lisp code using the specified
+**** 'with-coding-priority' executes Lisp code using the specified
coding system priority order.
-**** `check-coding-systems-region' checks if the text in the region is
+**** 'check-coding-systems-region' checks if the text in the region is
encodable by the specified coding systems.
-**** `coding-system-aliases' returns a list of aliases of a coding system.
+**** 'coding-system-aliases' returns a list of aliases of a coding system.
-**** `coding-system-charset-list' returns a list of charsets supported
+**** 'coding-system-charset-list' returns a list of charsets supported
by a coding system.
-**** `coding-system-priority-list' returns a list of coding systems
+**** 'coding-system-priority-list' returns a list of coding systems
ordered by their priorities.
-**** `set-coding-system-priority' sets priorities of coding systems.
+**** 'set-coding-system-priority' sets priorities of coding systems.
-**** `coding-system-from-name' returns a coding system matching with
+**** 'coding-system-from-name' returns a coding system matching with
the argument name.
** There is a new input method, Robin, different from Quail.
@@ -2321,14 +2321,14 @@ ii) converts an existing buffer substring into another string
iii) reverse conversion (each character produced by a
robin rule can hold the original ASCII sequence as a char-code-property)
-*** The new function `robin-define-package' defines a Robin package.
+*** The new function 'robin-define-package' defines a Robin package.
-*** The new function `robin-modify-package' modifies an existing Robin package.
+*** The new function 'robin-modify-package' modifies an existing Robin package.
-*** The new function `robin-use-package' starts using a Robin package
+*** The new function 'robin-use-package' starts using a Robin package
as an input method.
-*** The new function `string-to-unibyte' is like `string-as-unibyte'
+*** The new function 'string-to-unibyte' is like 'string-as-unibyte'
but signals an error if STRING contains a non-ASCII, non-eight-bit
character.
@@ -2342,115 +2342,115 @@ Emacs.FontBackend: x,xft
If this resource is not set, Emacs tries to use all font backends
available on your graphic device.
-*** New frame parameter `font-backend' specifies a list of
+*** New frame parameter 'font-backend' specifies a list of
font-backends supported by the frame's graphic device. On X, they are
-currently `x' and `xft'.
+currently 'x' and 'xft'.
-*** The function `set-fontset-font' now accepts a script name as the
+*** The function 'set-fontset-font' now accepts a script name as the
second argument, and has an optional 5th argument to control how to
set the font.
*** New functions:
-**** `fontp' checks if the argument is a font-spec or font-entity.
+**** 'fontp' checks if the argument is a font-spec or font-entity.
-**** `font-spec' creates a new font-spec object.
+**** 'font-spec' creates a new font-spec object.
-**** `font-get' returns a font property value.
+**** 'font-get' returns a font property value.
-**** `font-put' sets a font property value.
+**** 'font-put' sets a font property value.
-**** `font-face-attributes' returns a plist of face attributes set by a font.
+**** 'font-face-attributes' returns a plist of face attributes set by a font.
-**** `list-fonts' returns a list of font-entities matching a font spec.
+**** 'list-fonts' returns a list of font-entities matching a font spec.
-**** `find-font' returns the font-entity best matching the given font spec.
+**** 'find-font' returns the font-entity best matching the given font spec.
-**** `font-family-list' returns a list of family names of available fonts.
+**** 'font-family-list' returns a list of family names of available fonts.
-**** `font-xlfd-name' returns an XLFD name of a given font spec, font
+**** 'font-xlfd-name' returns an XLFD name of a given font spec, font
entity, or font object.
-**** `clear-font-cache' clears all font caches.
+**** 'clear-font-cache' clears all font caches.
** Changes related to multiple-terminal (multi-tty) support
-*** $TERM is now set to `dumb' for subprocesses. If you want to know the
+*** $TERM is now set to 'dumb' for subprocesses. If you want to know the
$TERM inherited by Emacs you will have to look inside initial-environment.
-*** $DISPLAY is now dynamically inherited from the frame's `display'.
+*** $DISPLAY is now dynamically inherited from the frame's 'display'.
-*** The `window-system' variable is now frame-local. The new
-`initial-window-system' variable contains the `window-system' value
-for the first frame. `window-system' is also now a function that
+*** The 'window-system' variable is now frame-local. The new
+'initial-window-system' variable contains the 'window-system' value
+for the first frame. 'window-system' is also now a function that
takes a frame argument.
-*** The `keyboard-translate-table' variable and the terminal and
+*** The 'keyboard-translate-table' variable and the terminal and
keyboard coding systems are now terminal-local.
-*** You can specify a terminal device (`tty' parameter) and a terminal
-type (`tty-type' parameter) to `make-terminal-frame'.
+*** You can specify a terminal device ('tty' parameter) and a terminal
+type ('tty-type' parameter) to 'make-terminal-frame'.
-*** The function `make-frame-on-display' now works during a tty
+*** The function 'make-frame-on-display' now works during a tty
session.
-*** A new `terminal' data type.
-The functions `get-device-terminal', `terminal-parameters',
-`terminal-parameter', `set-terminal-parameter' use this data type.
+*** A new 'terminal' data type.
+The functions 'get-device-terminal', 'terminal-parameters',
+'terminal-parameter', 'set-terminal-parameter' use this data type.
-*** Function key sequences are now mapped using `local-function-key-map',
+*** Function key sequences are now mapped using 'local-function-key-map',
a new variable. This inherits from the global variable function-key-map,
which is not used directly any more.
*** New hooks:
-**** before-hack-local-variables-hook is called after setting new
-variable file-local-variables-alist, and before actually applying the
+**** 'before-hack-local-variables-hook' is called after setting new
+variable 'file-local-variables-alist', and before actually applying the
file-local variables.
-**** `suspend-tty-functions' and `resume-tty-functions' are called
+**** 'suspend-tty-functions' and 'resume-tty-functions' are called
after a tty frame has been suspended or resumed, respectively. The
functions are called with the terminal id of the frame being
suspended/resumed as a parameter.
-**** The special hook `delete-terminal-functions' is called before
+**** The special hook 'delete-terminal-functions' is called before
deleting a terminal.
*** New functions:
-**** `delete-terminal'
+**** 'delete-terminal'
-**** `suspend-tty'
+**** 'suspend-tty'
-**** `resume-tty'.
+**** 'resume-tty'.
-*** `initial-environment' holds the environment inherited from Emacs's parent.
+*** 'initial-environment' holds the environment inherited from Emacs's parent.
** Redisplay changes
*** For underlined characters, the distance between the underline and
-the baseline is controlled by a new variable, `underline-minimum-offset'.
+the baseline is controlled by a new variable, 'underline-minimum-offset'.
-*** You can now pass the value of the `invisible' property to
+*** You can now pass the value of the 'invisible' property to
invisible-p to check whether it would cause the text to be invisible.
This is convenient when checking invisibility of text with no buffer
position (e.g. in before/after-strings).
-*** `clear-image-cache' can be told to flush only images of a specific file.
+*** 'clear-image-cache' can be told to flush only images of a specific file.
-*** `vertical-motion' can now be given a goal column.
+*** 'vertical-motion' can now be given a goal column.
It now accepts a cons cell (COLS . LINES) in its first argument, which
says to stop, where possible, at a pixel x-position equal to COLS
times the default column width.
*** redisplay-end-trigger-functions, set-window-redisplay-end-trigger,
-and window-redisplay-end-trigger are obsolete. Use `jit-lock-register'
+and window-redisplay-end-trigger are obsolete. Use 'jit-lock-register'
instead.
-*** The new variables `wrap-prefix' and `line-prefix' specify display
+*** The new variables 'wrap-prefix' and 'line-prefix' specify display
specs which are appended at display-time to every continuation line
and non-continuation line, respectively. In addition, Emacs
-recognizes the `wrap-prefix' and `line-prefix' text or overlay
+recognizes the 'wrap-prefix' and 'line-prefix' text or overlay
properties; these have the same effects as the variables of the same
name, but take precedence.
@@ -2458,68 +2458,68 @@ name, but take precedence.
** Miscellaneous new functions
-*** `apply-partially' performs a "curried" application of a function.
+*** 'apply-partially' performs a "curried" application of a function.
-*** `buffer-swap-text' swaps text between two buffers. This can be
-useful for modes such as tar-mode, archive-mode, RMAIL.
+*** 'buffer-swap-text' swaps text between two buffers. This can be
+useful for modes such as 'tar-mode', 'archive-mode', RMAIL.
-*** `combine-and-quote-strings' produces a single string from a list of strings
+*** 'combine-and-quote-strings' produces a single string from a list of strings
sticking a separator string in between each pair, and quoting those
strings that include the separator as their substring. Useful for
consing shell command lines from the individual arguments.
-*** `custom-note-var-changed' tells Custom to treat the change in a
+*** 'custom-note-var-changed' tells Custom to treat the change in a
certain variable as having been made within Custom.
-*** `face-all-attributes' returns an alist describing all the basic
+*** 'face-all-attributes' returns an alist describing all the basic
attributes of a given face.
-*** `format-seconds' converts a number of seconds into a readable
+*** 'format-seconds' converts a number of seconds into a readable
string of days, hours, etc.
-*** `image-refresh' refreshes all images associated with a given image
+*** 'image-refresh' refreshes all images associated with a given image
specification.
-*** `locate-user-emacs-file' helps packages to select the appropriate
-place to save user-specific files. It defaults to `user-emacs-directory'
+*** 'locate-user-emacs-file' helps packages to select the appropriate
+place to save user-specific files. It defaults to 'user-emacs-directory'
unless the file already exists at $HOME.
-*** `read-color' reads a color name using the minibuffer.
+*** 'read-color' reads a color name using the minibuffer.
-*** `read-shell-command' does what its name says, with completion. It
-uses the minibuffer-local-shell-command-map for that.
+*** 'read-shell-command' does what its name says, with completion. It
+uses the 'minibuffer-local-shell-command-map' for that.
-*** `split-string-and-unquote' splits a string into a list of substrings
+*** 'split-string-and-unquote' splits a string into a list of substrings
on the boundaries of a given delimiter, and unquotes the substrings that
are quoted. Useful for taking apart shell commands.
-*** The two new functions `looking-at-p' and `string-match-p' can do
-the same matching as `looking-at' and `string-match' without changing
+*** The two new functions 'looking-at-p' and 'string-match-p' can do
+the same matching as 'looking-at' and 'string-match' without changing
the match data.
-*** The two new functions `make-serial-process' and
-`serial-process-configure' provide a Lisp interface to the new serial
+*** The two new functions 'make-serial-process' and
+'serial-process-configure' provide a Lisp interface to the new serial
port support (see Emacs changes, above).
** Miscellaneous new variables
-*** `auto-save-include-big-deletions', if non-nil, means auto-save is
+*** 'auto-save-include-big-deletions', if non-nil, means auto-save is
not turned off automatically after a big deletion.
-*** `read-circle', if nil, disables the reading of recursive Lisp
+*** 'read-circle', if nil, disables the reading of recursive Lisp
structures using the #N= and #N# syntax.
-*** `this-command-keys-shift-translated' is non-nil if the key
+*** 'this-command-keys-shift-translated' is non-nil if the key
sequence invoking the current command was found by shift-translation.
-*** `window-point-insertion-type' determines the insertion-type of the
+*** 'window-point-insertion-type' determines the insertion-type of the
marker used for window-point.
-*** bookmark provides `bookmark-make-record-function' so special major
+*** bookmark provides 'bookmark-make-record-function' so special major
modes like Info can teach bookmark.el how to save and restore the
relevant data.
-*** `fill-forward-paragraph-function' specifies which function the
+*** 'fill-forward-paragraph-function' specifies which function the
filling code should use to find paragraph boundaries.
@@ -2527,20 +2527,20 @@ filling code should use to find paragraph boundaries.
** The new package avl-tree.el deals with the AVL tree data structure.
-** The new package check-declare.el verifies the accuracy of
+** The new package 'check-declare' verifies the accuracy of
declare-function macros (see Lisp Changes, above).
-** find-cmd.el can build `find' commands using lisp syntax.
+** 'find-cmd' can build 'find' commands using lisp syntax.
** The package misearch.el has been added. It allows Isearch to search
-through multiple buffers. A variable `multi-isearch-next-buffer-function'
+through multiple buffers. A variable 'multi-isearch-next-buffer-function'
defines the function to call to get the next buffer to search in the series
-of multiple buffers. Top-level functions `multi-isearch-buffers',
-`multi-isearch-buffers-regexp', `multi-isearch-files' and
-`multi-isearch-files-regexp' accept a single argument that specifies
+of multiple buffers. Top-level functions 'multi-isearch-buffers',
+'multi-isearch-buffers-regexp', 'multi-isearch-files' and
+'multi-isearch-files-regexp' accept a single argument that specifies
a list of buffers/files to search for a string/regexp.
-** The new major mode `special-mode' is intended as a parent for
+** The new major mode 'special-mode' is intended as a parent for
major modes such as those that set the "'mode-class 'special" property.
diff --git a/etc/NEWS.24 b/etc/NEWS.24
index 0fd4037ed06..8ef479ac0aa 100644
--- a/etc/NEWS.24
+++ b/etc/NEWS.24
@@ -11,7 +11,7 @@ This file is about changes in Emacs version 24.
See files NEWS.23, NEWS.22, NEWS.21, NEWS.20, NEWS.19, NEWS.18,
and NEWS.1-17 for changes in older Emacs versions.
-You can narrow news to a specific version by calling `view-emacs-news'
+You can narrow news to a specific version by calling 'view-emacs-news'
with a prefix argument or by typing C-u C-h C-n.
@@ -19,29 +19,29 @@ with a prefix argument or by typing C-u C-h C-n.
** This is mainly a bug-fix release, but there are some other changes.
-** The default value of `history-length' has increased to 100.
+** The default value of 'history-length' has increased to 100.
-** The variable `redisplay-dont-pause' is obsolete.
+** The variable 'redisplay-dont-pause' is obsolete.
* Changes in Specialized Modes and Packages in Emacs 24.5
-** `call-process-shell-command' and `process-file-shell-command' no longer
+** 'call-process-shell-command' and 'process-file-shell-command' no longer
take "&rest args".
-** The option `browse-url-firefox-startup-arguments' no longer has an effect.
+** The option 'browse-url-firefox-startup-arguments' no longer has an effect.
** ERC
-*** New option `erc-rename-buffers'.
+*** New option 'erc-rename-buffers'.
-*** New faces `erc-my-nick-prefix-face' and `erc-nick-prefix-face'.
+*** New faces 'erc-my-nick-prefix-face' and 'erc-nick-prefix-face'.
-*** `erc-format-@nick' displays all user modes instead of only op and voice.
+*** 'erc-format-@nick' displays all user modes instead of only op and voice.
*** The display of irc commands in the current buffer has been disabled.
-*** `erc-version' now follows the Emacs version.
+*** 'erc-version' now follows the Emacs version.
** Obsolete packages
@@ -61,27 +61,27 @@ These emulations of old editors are believed to be no longer relevant
** Emacs can now be compiled with ACL (access control list) support.
This happens by default if a suitable support library is found at
build time, like libacl on GNU/Linux. To prevent this, use the
-configure option `--disable-acl'. See below for the features this provides.
+configure option '--disable-acl'. See below for the features this provides.
** Emacs can now be compiled with file notification support.
This happens by default if a suitable system library is found at
build time. To prevent this, use the configure option
-`--without-file-notification'. See below for file-notify features.
+'--without-file-notification'. See below for file-notify features.
This feature is not available for the Nextstep port.
** Emacs can now be compiled with zlib support.
This happens by default if zlib is present, which it normally is.
-To prevent this, use the configure option `--without-zlib'.
-This provides the function `zlib-decompress-region'; see below for details.
+To prevent this, use the configure option '--without-zlib'.
+This provides the function 'zlib-decompress-region'; see below for details.
-** The configure option `--without-compress-info' has been generalized,
-and renamed to `--without-compress-install'. It now prevents compression
+** The configure option '--without-compress-info' has been generalized,
+and renamed to '--without-compress-install'. It now prevents compression
of _any_ files during installation.
-** The configure option `--with-crt-dir' has been removed.
+** The configure option '--with-crt-dir' has been removed.
It is no longer needed, as the crt*.o files are no longer linked specially.
-** Directories passed to configure option `--enable-locallisppath' are
+** Directories passed to configure option '--enable-locallisppath' are
no longer created during installation.
** Emacs for Nextstep (OS X, GNUstep) can be built with ImageMagick support.
@@ -90,7 +90,7 @@ This requires pkg-config to be available at build time.
* Startup Changes in Emacs 24.4
-** When initializing `load-path', an empty element in the EMACSLOADPATH
+** When initializing 'load-path', an empty element in the EMACSLOADPATH
environment variable (either leading, e.g., ":/foo"; trailing, e.g.,
"/foo:"; or embedded, e.g., "/foo::/bar") is replaced with the default
load-path (the one that would have been used if EMACSLOADPATH was unset).
@@ -100,15 +100,15 @@ including the defaults). (In older versions of Emacs, an empty element
was replaced by ".", so use an explicit "." now if that is what you want.)
** The -L option, which normally prepends its argument to load-path,
-will instead append, if the argument begins with `:' (or `;' on MS Windows;
-i.e., `path-separator').
+will instead append, if the argument begins with ':' (or ';' on MS Windows;
+i.e., 'path-separator').
** If you use either site-load.el or site-init.el to customize the dumped
-Emacs executable, any changes to `load-path' that these files make
+Emacs executable, any changes to 'load-path' that these files make
will no longer be present after dumping. To affect a permanent change
-to `load-path', use the `--enable-locallisppath' option of `configure'.
+to 'load-path', use the '--enable-locallisppath' option of 'configure'.
-** The user option `initial-buffer-choice' can now specify a function
+** The user option 'initial-buffer-choice' can now specify a function
to set up the initial buffer.
@@ -122,7 +122,7 @@ ACLs are extended file attributes, used e.g. for finer-grained permissions.
*** Emacs preserves the ACL entries of files when backing up.
-*** New functions `file-acl' and `set-file-acl' get and set file ACLs.
+*** New functions 'file-acl' and 'set-file-acl' get and set file ACLs.
** Support for menus on text-mode terminals.
If the terminal supports a mouse, clicking on the menu bar, or on
@@ -131,14 +131,14 @@ menu defined at that position. Likewise, clicking C-mouse-1, C-mouse-2, or
C-mouse-3 on the text area will pop up the menus defined for those locations.
If the text terminal does not support a mouse, you can activate the
-first menu-bar menu by typing F10, which invokes `menu-bar-open'.
+first menu-bar menu by typing F10, which invokes 'menu-bar-open'.
-If you want the previous behavior, where F10 invoked `tmm-menubar',
-customize the option `tty-menu-open-use-tmm' to a non-nil value.
-(Typing M-` always invokes `tmm-menubar', even if `tty-menu-open-use-tmm'
+If you want the previous behavior, where F10 invoked 'tmm-menubar',
+customize the option 'tty-menu-open-use-tmm' to a non-nil value.
+(Typing M-` always invokes 'tmm-menubar', even if 'tty-menu-open-use-tmm'
is nil.)
-** New option `load-prefer-newer' affects how the `load' function chooses
+** New option 'load-prefer-newer' affects how the 'load' function chooses
the file to load. If this is non-nil, then when both .el and .elc
versions of a file exist, and the caller did not explicitly specify
which one to load, then the newer file is loaded. The default, nil,
@@ -146,64 +146,64 @@ means to always load the .elc file.
** Multi-monitor support
-*** New functions `display-monitor-attributes-list' and
-`frame-monitor-attributes' can be used to obtain information about
+*** New functions 'display-monitor-attributes-list' and
+'frame-monitor-attributes' can be used to obtain information about
each physical monitor on multi-monitor setups.
-*** The functions `display-pixel-width' and `display-pixel-height' now
+*** The functions 'display-pixel-width' and 'display-pixel-height' now
behave consistently among the platforms: they return the pixel width
or height for all physical monitors associated with the given display
as if they were on X. To get information for each physical
monitor, use the new functions above. Similar notes also apply to
-`x-display-pixel-width', `x-display-pixel-height', `display-mm-width',
-`display-mm-height', `x-display-mm-width', and `x-display-mm-height'.
+'x-display-pixel-width', 'x-display-pixel-height', 'display-mm-width',
+'display-mm-height', 'x-display-mm-width', and 'x-display-mm-height'.
-** New function `zlib-decompress-region', which decompresses gzip- and
+** New function 'zlib-decompress-region', which decompresses gzip- and
zlib-format compressed data using built-in zlib support (if available).
-** The *Messages* buffer is created in `messages-buffer-mode',
+** The *Messages* buffer is created in 'messages-buffer-mode',
a new major mode, with read-only status. Any code that might create
-the *Messages* buffer should call the function `messages-buffer' to do
+the *Messages* buffer should call the function 'messages-buffer' to do
so and set up the mode.
** The cursor stops blinking after 10 blinks (by default) on X and Nextstep.
-You can change the default by customizing `blink-cursor-blinks'.
+You can change the default by customizing 'blink-cursor-blinks'.
** In keymaps where SPC scrolls forward, S-SPC now scrolls backward.
This affects View mode, etc.
-** The default value of `make-backup-file-name-function' is no longer nil.
+** The default value of 'make-backup-file-name-function' is no longer nil.
Instead it defaults to a function that does what the nil value used to.
** Help
-*** The command `apropos-variable' is renamed to `apropos-user-option'.
-`apropos-user-option' shows all user options, while `apropos-variable'
+*** The command 'apropos-variable' is renamed to 'apropos-user-option'.
+'apropos-user-option' shows all user options, while 'apropos-variable'
shows all variables. When called with a universal prefix argument,
-the two commands swap their behaviors. When `apropos-do-all' is
+the two commands swap their behaviors. When 'apropos-do-all' is
non-nil, they output the same results.
-*** The key `?' now describes prefix bindings, like `C-h'.
+*** The key '?' now describes prefix bindings, like 'C-h'.
-*** The command `describe-function' has been extended for EIEIO.
+*** The command 'describe-function' has been extended for EIEIO.
Running it on constructors will show a full description of the
generated class. For generic functions, it will show all
implementations together with links to the source. The old commands
-`describe-class', `describe-constructor' and `describe-generic' were
+'describe-class', 'describe-constructor' and 'describe-generic' were
removed.
-*** The function `quail-help' is no longer an interactive command.
-Use `C-h C-\' (`describe-input-method') instead.
+*** The function 'quail-help' is no longer an interactive command.
+Use 'C-h C-\' ('describe-input-method') instead.
** Frame and window handling
-*** New commands `toggle-frame-fullscreen' and `toggle-frame-maximized',
+*** New commands 'toggle-frame-fullscreen' and 'toggle-frame-maximized',
bound to <f11> and M-<f10>, respectively.
-*** New hooks `focus-in-hook', `focus-out-hook'.
+*** New hooks 'focus-in-hook', 'focus-out-hook'.
These are normal hooks run when an Emacs frame gains or loses input focus.
-*** The function `window-in-direction' now takes additional arguments
+*** The function 'window-in-direction' now takes additional arguments
for specifying a reference point, wrapping the selection around frame
borders, and specifying ways to select the minibuffer window.
@@ -211,116 +211,116 @@ borders, and specifying ways to select the minibuffer window.
text rows or columns. When maximizing a frame or making it fullscreen,
remaining extra pixels are no longer given to the minibuffer, the rightmost
fringe, or other unusable space, but are distributed among the text
-areas of the frame's windows. If the new option `frame-resize-pixelwise'
+areas of the frame's windows. If the new option 'frame-resize-pixelwise'
is non-nil, all frame size changes happen pixelwise and set the
corresponding size hints for the window manager.
*** Emacs can now change window sizes in units of pixels.
Mouse-dragging a mode line or window divider now changes the size of
-adjacent windows pixelwise. If the new option `window-resize-pixelwise'
-is non-nil, functions like `balance-windows-area' and `fit-window-to-buffer'
+adjacent windows pixelwise. If the new option 'window-resize-pixelwise'
+is non-nil, functions like 'balance-windows-area' and 'fit-window-to-buffer'
resize windows pixelwise. Most functions for changing or accessing
window sizes now have an additional argument that allows changes to apply,
or values to be returned, in pixels instead of lines/columns.
-*** The functions `window-body-height' and `window-body-width' now never
+*** The functions 'window-body-height' and 'window-body-width' now never
count partially visible lines or columns if called with a nil PIXELWISE
argument.
*** Emacs can now draw dividers between adjacent windows. To put
dividers between side-by-side/vertically stacked windows customize the
-frame parameters `right-divider-width' and `bottom-divider-width' to
+frame parameters 'right-divider-width' and 'bottom-divider-width' to
some positive integer. You can drag dividers with the mouse (they show
a corresponding cursor when the mouse hovers over them). You can change
-the appearance of dividers by customizing the faces `window-divider',
-`window-divider-first-pixel', and `window-divider-last-pixel'. The last
+the appearance of dividers by customizing the faces 'window-divider',
+'window-divider-first-pixel', and 'window-divider-last-pixel'. The last
two are useful to provide a 3D effect, or to better distinguish dividers
from surrounding display objects.
*** New functions to return the pixel sizes of window components, namely
-`window-scroll-bar-width', `window-mode-line-height',
-`window-header-line-height', `window-right-divider-width', and
-`window-bottom-divider-width'.
+'window-scroll-bar-width', 'window-mode-line-height',
+'window-header-line-height', 'window-right-divider-width', and
+'window-bottom-divider-width'.
-*** The new function `window-text-pixel-size' returns the size of the
+*** The new function 'window-text-pixel-size' returns the size of the
text of a window's buffer in pixels. This allows functions like
-`fit-frame-to-buffer' and `fit-window-to-buffer' to accurately fit a
+'fit-frame-to-buffer' and 'fit-window-to-buffer' to accurately fit a
window to its buffer as it will be displayed.
-*** `fit-window-to-buffer' can now resize windows in both dimensions.
+*** 'fit-window-to-buffer' can now resize windows in both dimensions.
This behavior is controlled by the new option
-`fit-window-to-buffer-horizontally'. The new option
-`fit-frame-to-buffer' allows you to fit the window's frame to its buffer.
+'fit-window-to-buffer-horizontally'. The new option
+'fit-frame-to-buffer' allows you to fit the window's frame to its buffer.
-*** `fit-frame-to-buffer' now fits frames in both dimensions. The new
-options `fit-frame-to-buffer-margins' and `fit-frame-to-buffer-sizes'
+*** 'fit-frame-to-buffer' now fits frames in both dimensions. The new
+options 'fit-frame-to-buffer-margins' and 'fit-frame-to-buffer-sizes'
control the size of the frame and its position on screen.
*** Temp Buffer Resize Mode can now adjust the height and width of
-windows and frames. The new option `temp-buffer-max-width' allows you to
+windows and frames. The new option 'temp-buffer-max-width' allows you to
control the width of temporary buffer windows. Moreover, if the new
-option `fit-frame-to-buffer' is non-nil and the buffer appears in the
+option 'fit-frame-to-buffer' is non-nil and the buffer appears in the
root window of a frame, Temp Buffer Resize Mode will try to adjust the
width and/or height of the frame.
-*** `split-window' is now a non-interactive function, not a command.
-As a command, it was a special case of `C-x 2' (`split-window-below'),
+*** 'split-window' is now a non-interactive function, not a command.
+As a command, it was a special case of 'C-x 2' ('split-window-below'),
and as such superfluous. After being reimplemented in Lisp, its
interactive form was mistakenly retained.
-*** The functions `window-size' and `window-total-size' now have an
+*** The functions 'window-size' and 'window-total-size' now have an
optional argument to return a rounded size value.
-*** `window-state-put' now allows you to put a window state into internal
+*** 'window-state-put' now allows you to put a window state into internal
windows too.
-*** New option `scroll-bar-adjust-thumb-portion'.
+*** New option 'scroll-bar-adjust-thumb-portion'.
Available only on X, this option allows you to control over-scrolling
using the scroll bar (i.e., dragging the thumb down even when the end
of the buffer is visible).
-*** New display actions functions for `display-buffer':
+*** New display actions functions for 'display-buffer':
-**** `display-buffer-at-bottom' chooses or creates a window at the
+**** 'display-buffer-at-bottom' chooses or creates a window at the
bottom of the selected frame.
-**** `display-buffer-no-window' to not display the buffer in a window.
+**** 'display-buffer-no-window' to not display the buffer in a window.
-*** New display action alist entry `allow-no-window' to indicate the
-caller of `display-buffer' is ready to handle the case of not displaying
+*** New display action alist entry 'allow-no-window' to indicate the
+caller of 'display-buffer' is ready to handle the case of not displaying
the buffer in a window.
-*** `display-buffer-in-previous-window' is now a member of
-`display-buffer-fallback-action'.
+*** 'display-buffer-in-previous-window' is now a member of
+'display-buffer-fallback-action'.
** Lisp evaluation
-*** `eval-defun' on an already defined defcustom calls the :set function,
+*** 'eval-defun' on an already defined defcustom calls the :set function,
if there is one.
-*** The commands `eval-expression' (`M-:'), `eval-last-sexp' (`C-x C-e'),
-and `eval-print-last-sexp' (`C-j' in Lisp Interaction mode) can take a
+*** The commands 'eval-expression' ('M-:'), 'eval-last-sexp' ('C-x C-e'),
+and 'eval-print-last-sexp' ('C-j' in Lisp Interaction mode) can take a
zero prefix argument. This disables truncation of lists in the output,
-equivalent to setting `(eval-expression-)print-length' and
-`(eval-expression-)print-level' to nil. Additionally, it causes integers
+equivalent to setting '(eval-expression-)print-length' and
+'(eval-expression-)print-level' to nil. Additionally, it causes integers
to be printed in other formats (octal, hexadecimal, and character).
-*** New hook `eval-expression-minibuffer-setup-hook' run by
-`eval-expression' on entering the minibuffer.
+*** New hook 'eval-expression-minibuffer-setup-hook' run by
+'eval-expression' on entering the minibuffer.
-** `cache-long-line-scans' is now non-nil, and renamed to `cache-long-scans',
+** 'cache-long-line-scans' is now non-nil, and renamed to 'cache-long-scans',
because it affects caching of paragraph scanning results as well.
There is no reason to set this to nil except for debugging purposes.
-** `emacs-bzr-version' has been renamed to `emacs-repository-version',
+** 'emacs-bzr-version' has been renamed to 'emacs-repository-version',
and works for git too, if you fetch the repository notes.
-** The default value of `comment-use-global-state' is now t,
+** The default value of 'comment-use-global-state' is now t,
and this variable has been marked obsolete.
-** `write-region-inhibit-fsync' now defaults to t in batch mode.
+** 'write-region-inhibit-fsync' now defaults to t in batch mode.
-** The option `set-mark-default-inactive' has been deleted.
+** The option 'set-mark-default-inactive' has been deleted.
This unfinished feature was introduced by accident in Emacs 23.1;
simply disabling Transient Mark mode does the same thing.
@@ -329,69 +329,69 @@ simply disabling Transient Mark mode does the same thing.
** Indentation
-*** `electric-indent-mode' is now enabled by default.
+*** 'electric-indent-mode' is now enabled by default.
Typing RET reindents the current line and indents the new line.
-`C-j' inserts a newline but does not indent. In some programming modes,
-additional characters are electric (eg `{').
+'C-j' inserts a newline but does not indent. In some programming modes,
+additional characters are electric (eg '{').
-*** New buffer-local `electric-indent-local-mode'.
+*** New buffer-local 'electric-indent-local-mode'.
-*** The behavior of `C-x TAB' (`indent-rigidly') has changed.
+*** The behavior of 'C-x TAB' ('indent-rigidly') has changed.
When invoked without a prefix argument, it now activates a transient
mode in which typing <left>, <right>, <S-left>, and <S-right> adjusts
the text indentation in the region. Typing any other key resumes
normal editing behavior.
-*** `tab-stop-list' is now implicitly extended to infinity by repeating
+*** 'tab-stop-list' is now implicitly extended to infinity by repeating
the last step. Its default value is changed to nil, which means a tab
-stop every `tab-width' columns.
+stop every 'tab-width' columns.
-** Uniquify is enabled by default, with `post-forward-angle-brackets' style.
+** Uniquify is enabled by default, with 'post-forward-angle-brackets' style.
In other words, if you visit two files that have the same base name,
then rather than creating buffers basename and basename<2>,
Emacs uses basename<dirA> and basename<dirB>. To change this,
-customize `uniquify-buffer-name-style'. Set it to nil for the old behavior.
+customize 'uniquify-buffer-name-style'. Set it to nil for the old behavior.
-** New command `C-x SPC' (`rectangle-mark-mode') makes a rectangular region.
+** New command 'C-x SPC' ('rectangle-mark-mode') makes a rectangular region.
Most commands are still unaware of it, but kill/yank do work on the rectangle.
-** New option `visual-order-cursor-movement'.
+** New option 'visual-order-cursor-movement'.
If this is non-nil, cursor motion with arrow keys will follow the
visual order of characters on the screen: <left> always moves to the
left, <right> always moves to the right, disregarding the surrounding
bidirectional context.
-** New command `delete-duplicate-lines'.
+** New command 'delete-duplicate-lines'.
This searches the region for identical lines, and removes all but one
copy of each repeated line. The lines need not be sorted.
-** New command `cycle-spacing' acts like a smarter `just-one-space'.
+** New command 'cycle-spacing' acts like a smarter 'just-one-space'.
When called in succession, it cycles between spacing conventions:
one space, no spaces, original spacing.
-** `blink-matching-paren' now only highlights the matching open-paren
-by default, instead of moving the cursor. Set this variable to `jump' to
+** 'blink-matching-paren' now only highlights the matching open-paren
+by default, instead of moving the cursor. Set this variable to 'jump' to
restore the old behavior.
-** The new function `fill-single-char-nobreak-p' can stop fill from breaking
+** The new function 'fill-single-char-nobreak-p' can stop fill from breaking
a line after a one-letter word, which is an error in some typographical
-conventions. To use it, add it to the `fill-nobreak-predicate' hook.
+conventions. To use it, add it to the 'fill-nobreak-predicate' hook.
** Registers
-*** All interactive commands that read a register (`copy-to-register', etc.)
-now display a temporary window after `register-preview-delay' seconds
+*** All interactive commands that read a register ('copy-to-register', etc.)
+now display a temporary window after 'register-preview-delay' seconds
that summarizes existing registers. To disable this, set that option to nil.
Interactive commands that read registers and want to make use of this
-should use `register-read-with-preview' to read register names.
+should use 'register-read-with-preview' to read register names.
-*** New command `frameset-to-register' bound to `C-x r f', replacing
-`frame-configuration-to-register'. It offers similar functionality,
+*** New command 'frameset-to-register' bound to 'C-x r f', replacing
+'frame-configuration-to-register'. It offers similar functionality,
plus enhancements like the ability to restore deleted frames.
-(`frame-configuration-to-register' still exists, but no longer has a
+('frame-configuration-to-register' still exists, but no longer has a
key binding.)
-*** New command `C-x C-k x' (`kmacro-to-register') stores keyboard
+*** New command 'C-x C-k x' ('kmacro-to-register') stores keyboard
macros in registers.
@@ -399,18 +399,18 @@ macros in registers.
** Backtrace and debugger
-*** New Lisp debugger command `v' (`debugger-toggle-locals') toggles the
+*** New Lisp debugger command 'v' ('debugger-toggle-locals') toggles the
display of local variables of the current stack frame.
-*** The Lisp debugger's `e' command (`debugger-eval-expression') now includes
+*** The Lisp debugger's 'e' command ('debugger-eval-expression') now includes
the lexical environment when evaluating the code in the context at point
(and so allows you to access lexical variables).
-*** New minor mode `jit-lock-debug-mode' helps you debug code run via JIT Lock.
+*** New minor mode 'jit-lock-debug-mode' helps you debug code run via JIT Lock.
-** Battery information can now be retrieved from BSD's `apm' utility.
+** Battery information can now be retrieved from BSD's 'apm' utility.
-** In the Buffer Menu, `M-s a C-o' shows matches for a regexp in marked buffers.
+** In the Buffer Menu, 'M-s a C-o' shows matches for a regexp in marked buffers.
** Calc
@@ -420,22 +420,22 @@ Julian calendar for dates before September 14, 1752, and it used
December 31, 1 BC as its day number 1; the new scheme is more
consistent with Calendar's calendrical system and day numbering.
-*** The new option `calc-gregorian-switch' lets you configure if
+*** The new option 'calc-gregorian-switch' lets you configure if
(and when) Calc switches from the Julian to the Gregorian calendar.
*** Support for ISO 8601 dates.
** Calendar and Diary
-*** New faces `calendar-weekday-header', `calendar-weekend-header',
-and `calendar-month-header'.
+*** New faces 'calendar-weekday-header', 'calendar-weekend-header',
+and 'calendar-month-header'.
-*** New option `calendar-day-header-array'.
+*** New option 'calendar-day-header-array'.
-*** New variable `diary-from-outlook-function', used by the command
-`diary-from-outlook'.
+*** New variable 'diary-from-outlook-function', used by the command
+'diary-from-outlook'.
-*** The variable `calendar-font-lock-keywords' is obsolete.
+*** The variable 'calendar-font-lock-keywords' is obsolete.
** CEDET
@@ -443,7 +443,7 @@ and `calendar-month-header'.
**** The cpp-root project now supports executing a compile command.
It can be set through the new :compile-command slot or the
-buffer-local variable `compile-command'.
+buffer-local variable 'compile-command'.
**** Better selection of include directories for the 'linux' project.
Include directories now support out-of-tree build directories and
@@ -470,184 +470,184 @@ For example, this enables parsing of macros that open new namespaces.
*** The current CFEngine syntax is parsed from "cf-promises -s json".
There is a fallback syntax available if you don't have cf-promises or
-if your version doesn't support that option. See option `cfengine-cf-promises'.
+if your version doesn't support that option. See option 'cfengine-cf-promises'.
** cl-lib
-*** New macro `cl-tagbody'.
+*** New macro 'cl-tagbody'.
This executes statements while allowing for control transfer to labels.
*** letf is now just an alias for cl-letf.
** CUA mode
-*** CUA mode now uses `delete-selection-mode' and `shift-select-mode'.
+*** CUA mode now uses 'delete-selection-mode' and 'shift-select-mode'.
Hence, you can now enable it independently from those modes, and from
-`transient-mark-mode'.
+'transient-mark-mode'.
-*** `cua-highlight-region-shift-only' is now obsolete.
-You can disable `transient-mark-mode' to get the same result.
+*** 'cua-highlight-region-shift-only' is now obsolete.
+You can disable 'transient-mark-mode' to get the same result.
*** CUA's rectangles can now be used without CUA by calling the command
-`cua-rectangle-mark-mode'.
+'cua-rectangle-mark-mode'.
** Delete Selection mode can now be used without Transient Mark mode.
** Desktop
-*** `desktop-save-mode' by default now auto-saves an existing desktop file
-after `desktop-auto-save-timeout'. To disable this, customize that option
+*** 'desktop-save-mode' by default now auto-saves an existing desktop file
+after 'desktop-auto-save-timeout'. To disable this, customize that option
to nil (or zero).
*** Desktop now saves and restores the frame/window configuration.
-To disable this, set `desktop-restore-frames' to nil.
-See also related options `desktop-restore-reuses-frames',
-`desktop-restore-in-current-display', and `desktop-restore-forces-onscreen'.
+To disable this, set 'desktop-restore-frames' to nil.
+See also related options 'desktop-restore-reuses-frames',
+'desktop-restore-in-current-display', and 'desktop-restore-forces-onscreen'.
-** New Dired minor mode `dired-hide-details-mode' toggles whether details,
+** New Dired minor mode 'dired-hide-details-mode' toggles whether details,
such as file ownership or permissions, are visible in Dired buffers.
-See the new options `dired-hide-details-hide-symlink-targets' and
-`dired-hide-details-hide-information-lines' for customizing what to hide.
+See the new options 'dired-hide-details-hide-symlink-targets' and
+'dired-hide-details-hide-information-lines' for customizing what to hide.
-** You can enable ElDoc inside the `eval-expression' minibuffer with:
- (add-hook 'eval-expression-minibuffer-setup-hook 'eldoc-mode)
+** You can enable ElDoc inside the 'eval-expression' minibuffer with:
+ (add-hook 'eval-expression-minibuffer-setup-hook #'eldoc-mode)
The results display in the mode line.
** Electric Pair mode
-*** New option `electric-pair-preserve-balance', enabled by default.
+*** New option 'electric-pair-preserve-balance', enabled by default.
If non-nil, pairing/skipping only kicks in when that help the balance
of parentheses and quotes; i.e., the buffer should end up at least as
balanced as before.
You can further control this behavior by adjusting the predicates
-stored in `electric-pair-inhibit-predicate' and `electric-pair-skip-self'.
+stored in 'electric-pair-inhibit-predicate' and 'electric-pair-skip-self'.
-*** New option `electric-pair-delete-adjacent-pairs', enabled by default.
-In `electric-pair-mode', the commands `backward-delete-char' and
-`backward-delete-char-untabify' are now bound to electric variants
+*** New option 'electric-pair-delete-adjacent-pairs', enabled by default.
+In 'electric-pair-mode', the commands 'backward-delete-char' and
+'backward-delete-char-untabify' are now bound to electric variants
that delete the closer when invoked between adjacent pairs.
-*** New option `electric-pair-open-newline-between-pairs', enabled by default.
-In `electric-pair-mode', inserting a newline between adjacent pairs
+*** New option 'electric-pair-open-newline-between-pairs', enabled by default.
+In 'electric-pair-mode', inserting a newline between adjacent pairs
opens an extra newline after point, which is indented if
-`electric-indent-mode' is also set.
+'electric-indent-mode' is also set.
-*** New option `electric-pair-skip-whitespace', enabled by default.
+*** New option 'electric-pair-skip-whitespace', enabled by default.
This controls if skipping over closing delimiters should jump over any
-whitespace slack. Setting it to `chomp' makes it delete this
-whitespace. See also the variable `electric-pair-skip-whitespace-chars'.
+whitespace slack. Setting it to 'chomp' makes it delete this
+whitespace. See also the variable 'electric-pair-skip-whitespace-chars'.
*** New variables control the pairing in strings and comments.
-You can customize `electric-pair-text-pairs' and
-`electric-pair-text-syntax-table' to tweak pairing behavior inside
+You can customize 'electric-pair-text-pairs' and
+'electric-pair-text-syntax-table' to tweak pairing behavior inside
strings and comments.
-** New EPA option `epa-mail-aliases'.
-You can set this to a list of email address aliases that `epa-mail-encrypt'
+** New EPA option 'epa-mail-aliases'.
+You can set this to a list of email address aliases that 'epa-mail-encrypt'
should use to find keys.
-** New ERC option `erc-accidental-paste-threshold-seconds'.
+** New ERC option 'erc-accidental-paste-threshold-seconds'.
If set to a number, this can be used to avoid accidentally pasting large
amounts of data into the ERC input.
-** New ERT macro `skip-unless' allows skipping ERT tests.
+** New ERT macro 'skip-unless' allows skipping ERT tests.
** Eshell
-*** `eshell' now supports visual subcommands and options.
+*** 'eshell' now supports visual subcommands and options.
Eshell has been able to handle "visual" commands (interactive,
non-line oriented commands such as top that require display
capabilities not provided by eshell) by running them in an Emacs
-terminal emulator. See `eshell-visual-commands'.
+terminal emulator. See 'eshell-visual-commands'.
This feature has been extended to subcommands and options that make a
usually line-oriented command a visual command. Typical examples are
"git log" and "git <command> --help", which display their output in a
-pager by default. See `eshell-visual-subcommands' and `eshell-visual-options'.
+pager by default. See 'eshell-visual-subcommands' and 'eshell-visual-options'.
*** New Eshell-Tramp module.
External su and sudo commands are now the default; the internal,
Tramp-using variants can still be used by enabling the eshell-tramp module.
-** New F90 mode option `f90-smart-end-names'.
+** New F90 mode option 'f90-smart-end-names'.
-** New option `gnutls-verify-error', if non-nil, means that Emacs
+** New option 'gnutls-verify-error', if non-nil, means that Emacs
should reject SSL/TLS certificates that GnuTLS determines as invalid.
(This option defaults to nil at present, but this is expected to change
in a future release.)
** Hi-Lock
-*** New global command `M-s h .' (`highlight-symbol-at-point') highlights
+*** New global command 'M-s h .' ('highlight-symbol-at-point') highlights
the symbol near point.
-*** New option `hi-lock-auto-select-face'. When non-nil, hi-lock commands
-will cycle through faces in `hi-lock-face-defaults' without prompting.
+*** New option 'hi-lock-auto-select-face'. When non-nil, hi-lock commands
+will cycle through faces in 'hi-lock-face-defaults' without prompting.
** Icomplete is now more similar to Ido.
*** Icomplete by default now applies to all forms of minibuffer completion.
-The variable `icomplete-with-completion-tables' (now a user option)
+The variable 'icomplete-with-completion-tables' (now a user option)
controls this. To restore the old behavior, set it back to
'(internal-complete-buffer).
*** You can navigate through and select completions using the keys
-from `icomplete-minibuffer-map'.
+from 'icomplete-minibuffer-map'.
*** The string that separates potential completions is now a customizable
-option (`icomplete-separator'). The default is " | " rather than ",".
+option ('icomplete-separator'). The default is " | " rather than ",".
-*** New face `icomplete-first-match'; and new options
-`icomplete-hide-common-prefix' and `icomplete-show-matches-on-no-input'.
+*** New face 'icomplete-first-match'; and new options
+'icomplete-hide-common-prefix' and 'icomplete-show-matches-on-no-input'.
-*** The option `icomplete-show-key-bindings' has been removed.
+*** The option 'icomplete-show-key-bindings' has been removed.
** Ido
*** An Ido user manual is now included.
-*** The option `ido-use-virtual-buffers' can now take the value `auto'.
+*** The option 'ido-use-virtual-buffers' can now take the value 'auto'.
This means to use virtual buffers if the current ido input does not match
an existing buffer.
-*** The variable `ido-decorations' can optionally have two new elements,
+*** The variable 'ido-decorations' can optionally have two new elements,
which are the brackets to use around the sole remaining completion.
** Image mode
-*** New commands `n' (`image-next-file') and `p' (`image-previous-file')
+*** New commands 'n' ('image-next-file') and 'p' ('image-previous-file')
visit the next image file and the previous image file in the same
directory, respectively.
*** New commands to show specific frames of multi-frame images.
-`f' (`image-next-frame') and `b' (`image-previous-frame') visit the
-next or previous frame. `F' (`image-goto-frame') shows a specific frame.
+'f' ('image-next-frame') and 'b' ('image-previous-frame') visit the
+next or previous frame. 'F' ('image-goto-frame') shows a specific frame.
*** New commands to speed up, slow down, or reverse animation.
-`a +' (`image-increase-speed') and `a -' (`image-decrease-speed') to
-speed up and slow down the animation. `a r' (`image-reverse-speed')
-to reverse it and `a 0' (`image-reset-speed') to reset it.
+'a +' ('image-increase-speed') and 'a -' ('image-decrease-speed') to
+speed up and slow down the animation. 'a r' ('image-reverse-speed')
+to reverse it and 'a 0' ('image-reset-speed') to reset it.
-*** The command `image-mode-fit-frame' deletes other windows.
+*** The command 'image-mode-fit-frame' deletes other windows.
When toggling, it restores the frame's previous window configuration.
It also has an optional frame argument, which can be used by Lisp
callers to fit the image to a frame other than the selected frame.
-** New Imenu option `imenu-generic-skip-comments-and-strings'.
+** New Imenu option 'imenu-generic-skip-comments-and-strings'.
** Info
-*** New Info face `info-index-match', used to highlight matches in index
-entries displayed by `Info-index-next', `Info-virtual-index' and
-`info-apropos'.
+*** New Info face 'info-index-match', used to highlight matches in index
+entries displayed by 'Info-index-next', 'Info-virtual-index' and
+'info-apropos'.
*** The Info-edit command is obsolete. Editing Info nodes by hand
has not been relevant for some time.
** JS Mode
-*** New option `js-switch-indent-offset'.
+*** New option 'js-switch-indent-offset'.
*** Better indentation of multiple-variable declarations.
If a declaration spans several lines, variables on the following lines
@@ -674,10 +674,10 @@ are lined up to the first one.
*** All delphi-* variables and functions have been renamed to opascal-*.
Obsolete aliases exist for those likely to have been used externally.
-*** The option `delphi-newline-always-indents' has been removed.
-Use `electric-indent-mode' instead.
+*** The option 'delphi-newline-always-indents' has been removed.
+Use 'electric-indent-mode' instead.
-*** The TAB key runs the standard `indent-for-tab-command', not `delphi-tab'.
+*** The TAB key runs the standard 'indent-for-tab-command', not 'delphi-tab'.
** Package
@@ -685,43 +685,43 @@ Use `electric-indent-mode' instead.
Maintainers of package archives should consider signing their packages
to enhance security.
-**** If the user option `package-check-signature' is non-nil,
+**** If the user option 'package-check-signature' is non-nil,
Emacs tries to check package signatures at install time.
-The value `allow-unsigned' allows installation of unsigned packages.
+The value 'allow-unsigned' allows installation of unsigned packages.
-**** The user option `package-unsigned-archives' lists archives where
+**** The user option 'package-unsigned-archives' lists archives where
Emacs will not try to check signatures.
-*** New option `package-pinned-packages'. This is useful if you have multiple
+*** New option 'package-pinned-packages'. This is useful if you have multiple
archives enabled, with more than one offering a given package that you want.
-*** In the `list-packages' buffer, you can use `f' (`package-menu-filter')
+*** In the 'list-packages' buffer, you can use 'f' ('package-menu-filter')
to filter the list of packages by a keyword.
-*** In the `describe-package' buffer, there are now buttons listing the
+*** In the 'describe-package' buffer, there are now buttons listing the
keywords related to the package. Click on a button to see other packages
related to that keyword.
-*** The format of `archive-contents' files, generated by package
+*** The format of 'archive-contents' files, generated by package
repositories, has changed to allow a new (fifth) element in the data
vectors, containing an associative list with extra properties.
-(For example, `describe-package' uses the `:url' extra property to
+(For example, 'describe-package' uses the ':url' extra property to
display a "Homepage" header.)
-** In Prolog mode, `prolog-use-smie' has been removed,
+** In Prolog mode, 'prolog-use-smie' has been removed,
along with the non-SMIE indentation code.
** Python mode
*** Out of the box support for CPython, iPython and readline based shells.
-**** `python-shell-completion-module-string-code' is no longer used.
+**** 'python-shell-completion-module-string-code' is no longer used.
*** Automatic shell prompt detection. New user options:
-**** `python-shell-interpreter-interactive-arg'.
-**** `python-shell-prompt-detect-enabled'.
-**** `python-shell-prompt-detect-failure-warning'.
-**** `python-shell-prompt-input-regexps'.
-**** `python-shell-prompt-output-regexps'.
+**** 'python-shell-interpreter-interactive-arg'.
+**** 'python-shell-prompt-detect-enabled'.
+**** 'python-shell-prompt-detect-failure-warning'.
+**** 'python-shell-prompt-input-regexps'.
+**** 'python-shell-prompt-output-regexps'.
*** Python shell support for remote hosts via tramp.
@@ -729,106 +729,106 @@ along with the non-SMIE indentation code.
** Remember
-*** The new command `remember-notes' creates a buffer that is saved on exit.
+*** The new command 'remember-notes' creates a buffer that is saved on exit.
You can use it as a more permanent *scratch* buffer.
*** Remember can now store notes in separate files.
-To use this, add `remember-store-in-files' to the `remember-handler-functions'
-option. The files are saved in `remember-data-directory' using
-names specified by `remember-directory-file-name-format'.
+To use this, add 'remember-store-in-files' to the 'remember-handler-functions'
+option. The files are saved in 'remember-data-directory' using
+names specified by 'remember-directory-file-name-format'.
** Rmail
-*** Customize `rmail-mbox-format' to influence some minor aspects of
+*** Customize 'rmail-mbox-format' to influence some minor aspects of
how Rmail displays non-MIME messages.
-*** The `unrmail' command now converts from BABYL to mboxrd format,
-rather than mboxo. Customize `unrmail-mbox-format' to change this.
+*** The 'unrmail' command now converts from BABYL to mboxrd format,
+rather than mboxo. Customize 'unrmail-mbox-format' to change this.
** Ruby mode
*** Improved syntax highlighting and indentation.
-*** New `electric-indent-mode' integration.
+*** New 'electric-indent-mode' integration.
-*** New option `ruby-encoding-magic-comment-style'.
+*** New option 'ruby-encoding-magic-comment-style'.
-*** New option `ruby-custom-encoding-magic-comment-template'.
+*** New option 'ruby-custom-encoding-magic-comment-template'.
-*** New option `ruby-align-to-stmt-keywords'.
+*** New option 'ruby-align-to-stmt-keywords'.
-*** New option `ruby-align-chained-calls'.
+*** New option 'ruby-align-chained-calls'.
-*** More Ruby file types have been added to `auto-mode-alist'.
+*** More Ruby file types have been added to 'auto-mode-alist'.
** Search and Replace
-*** New global command `M-s .' (`isearch-forward-symbol-at-point')
+*** New global command 'M-s .' ('isearch-forward-symbol-at-point')
starts a symbol (identifier) incremental search forward with the
symbol found near point added to the search string initially.
-*** `C-x 8 RET' in Isearch mode reads a character by its Unicode name
+*** 'C-x 8 RET' in Isearch mode reads a character by its Unicode name
and adds it to the search string.
-*** `M-s i' in Isearch mode toggles whether search matches invisible text.
+*** 'M-s i' in Isearch mode toggles whether search matches invisible text.
-*** `query-replace' skips invisible text when `search-invisible' is nil,
-and opens overlays with hidden text when `search-invisible' is `open'.
+*** 'query-replace' skips invisible text when 'search-invisible' is nil,
+and opens overlays with hidden text when 'search-invisible' is 'open'.
*** A negative prefix argument of replacement commands replaces backward.
-`M-- M-%' replaces a string backward, `M-- C-M-%' replaces a regexp
-backward, `M-s w words M-- M-%' replaces a sequence of words backward.
+'M-- M-%' replaces a string backward, 'M-- C-M-%' replaces a regexp
+backward, 'M-s w words M-- M-%' replaces a sequence of words backward.
*** By default, prefix arguments do not now terminate Isearch mode.
-Set `isearch-allow-prefix' to nil to restore the old behavior.
+Set 'isearch-allow-prefix' to nil to restore the old behavior.
*** More Isearch commands accept prefix arguments, namely
-`isearch-printing-char', `isearch-quote-char', `isearch-yank-word',
-`isearch-yank-line'.
+'isearch-printing-char', 'isearch-quote-char', 'isearch-yank-word',
+'isearch-yank-line'.
*** Word search now matches whitespace at the beginning/end
of the search string if it contains leading/trailing whitespace.
In an incremental word search or when using a non-nil LAX argument
-of `word-search-regexp', the lax matching can also match part of
+of 'word-search-regexp', the lax matching can also match part of
the first word (in addition to the lax matching of the last word).
The same rules are now applied to the symbol search, with the difference
that it matches symbols, and non-symbol characters between symbols.
-** New SES command `ses-rename-cell' allows assignment of names to SES cells.
+** New SES command 'ses-rename-cell' allows assignment of names to SES cells.
-** The shell.el option `explicit-bash-args' includes --noediting by default.
+** The shell.el option 'explicit-bash-args' includes --noediting by default.
All non-ancient Bash versions support this option.
** Shell Script mode
-*** The SMIE indentation engine is now used by default - see `sh-use-smie'.
+*** The SMIE indentation engine is now used by default - see 'sh-use-smie'.
-*** `sh-mode' now has its own setting for `add-log-current-defun-function'.
+*** 'sh-mode' now has its own setting for 'add-log-current-defun-function'.
** SMIE
-*** You can customize the SMIE indentation of a mode via `smie-config'.
-The command `smie-config-guess' can help you derive the appropriate
+*** You can customize the SMIE indentation of a mode via 'smie-config'.
+The command 'smie-config-guess' can help you derive the appropriate
indentation settings, if you provide it with an indented sample file.
-Use `smie-config-save' to save the result.
+Use 'smie-config-save' to save the result.
*** You can customize the SMIE indentation of a file by adding an entry to
-the file's local variables of the form: `eval: (smie-config-local '(RULES))'.
+the file's local variables of the form: 'eval: (smie-config-local '(RULES))'.
-*** New commands `smie-config-show-indent' and `smie-config-set-indent'.
+*** New commands 'smie-config-show-indent' and 'smie-config-set-indent'.
** SQL mode
*** Improved login monitoring and appropriate response to login failures.
-New variable `sql-login-delay' defines maximum wait time for a connection.
+New variable 'sql-login-delay' defines maximum wait time for a connection.
*** Oracle support.
SQL*Plus script placeholders are properly highlighted and identified
-in `sql-placeholders-filter'. When starting SQL*Plus, `sql-oracle-options'
+in 'sql-placeholders-filter'. When starting SQL*Plus, 'sql-oracle-options'
are passed before the logon parameter, as required. The default now
-includes `-L', to limit the number of logon attempts per invocation.
+includes '-L', to limit the number of logon attempts per invocation.
-** New Term mode option `term-suppress-hard-newline'.
+** New Term mode option 'term-suppress-hard-newline'.
** Todo mode has been rewritten and enhanced.
The Todo mode user manual describes all commands and most user
@@ -861,11 +861,11 @@ or in archive files, undoing or unarchiving done items.
** Trace
-*** `trace-function' and `trace-function-background' no longer prompt for
+*** 'trace-function' and 'trace-function-background' no longer prompt for
the output buffer. Unless you use a prefix argument, they output to
-`trace-buffer'.
+'trace-buffer'.
-*** With a prefix argument, `trace-function' and `trace-function-background'
+*** With a prefix argument, 'trace-function' and 'trace-function-background'
will prompt for a "context". This is a Lisp expression, whose value at the
time the function is entered/exited is printed along with the function's
name and arguments.
@@ -873,13 +873,13 @@ name and arguments.
** Tramp
*** New connection method "adb", which allows to access Android
-devices by the Android Debug Bridge. The variable `tramp-adb-program'
+devices by the Android Debug Bridge. The variable 'tramp-adb-program'
can be used to adapt the path of the "adb" program, if needed.
-*** Handlers for `file-acl' and `set-file-acl' for remote machines
+*** Handlers for 'file-acl' and 'set-file-acl' for remote machines
that support POSIX ACLs.
-*** Handlers for `file-notify-add-watch' and `file-notify-rm-watch'
+*** Handlers for 'file-notify-add-watch' and 'file-notify-rm-watch'
for remote machines that support filesystem notifications.
*** The experimental url syntax for remote file names has been removed.
@@ -887,34 +887,34 @@ for remote machines that support filesystem notifications.
*** The connection methods "plink1", "ssh1", "ssh2", "scp1", "scp2",
"scpc" and "rsyncc" are discontinued. The ssh option
"ControlMaster=auto" is set automatically in all ssh-based methods,
-when possible. See `tramp-use-ssh-controlmaster-options'.
+when possible. See 'tramp-use-ssh-controlmaster-options'.
-** New URL command `url-cookie-list' displays the current cookies,
+** New URL command 'url-cookie-list' displays the current cookies,
and allows you to interactively remove cookies.
** VC and related modes
-*** In VC directory mode, `D' displays diffs between VC-controlled
+*** In VC directory mode, 'D' displays diffs between VC-controlled
whole tree revisions.
-*** In VC directory mode, `L' lists the change log for the current VC
+*** In VC directory mode, 'L' lists the change log for the current VC
controlled tree in a window.
-*** In VC directory mode, `I' shows a log of changes that will be
+*** In VC directory mode, 'I' shows a log of changes that will be
received with a pull operation.
-*** `C-x v G' (globally) and `G' (in VC directory mode) ignores a file
+*** 'C-x v G' (globally) and 'G' (in VC directory mode) ignores a file
under current version control system. When called with a prefix
argument, you can remove a file from the ignored file list.
** VHDL mode
-*** New options: `vhdl-actual-generic-name', `vhdl-beautify-options'.
+*** New options: 'vhdl-actual-generic-name', 'vhdl-beautify-options'.
-*** New commands: `vhdl-fix-statement-region', `vhdl-fix-statement-buffer'.
+*** New commands: 'vhdl-fix-statement-region', 'vhdl-fix-statement-buffer'.
-** The Woman commands `woman-default-faces' and `woman-monochrome-faces'
-are obsolete. Customize the `woman-*' faces instead.
+** The Woman commands 'woman-default-faces' and 'woman-monochrome-faces'
+are obsolete. Customize the 'woman-*' faces instead.
** More packages look for ~/.emacs.d/<foo> additionally to ~/.<foo>.
Affected files:
@@ -939,9 +939,9 @@ Also the following files used by the now obsolete otodo-mode.el:
** Obsolete packages
-*** iswitchb.el; use icomplete-mode.
+*** iswitchb.el; use 'icomplete-mode'.
-*** longlines.el; use visual-line-mode.
+*** longlines.el; use 'visual-line-mode'.
*** meese.el.
@@ -958,17 +958,17 @@ Also the following files used by the now obsolete otodo-mode.el:
* New Modes and Packages in Emacs 24.4
-** New package eww.el provides a built-in web browser.
+** New package 'eww' provides a built-in web browser.
This requires Emacs to have been compiled with libxml2 support.
** New package nadvice.el offers lighter-weight advice facilities.
It is layered as:
-*** `add-function'/`remove-function', which can be used to add/remove code on
-any function-carrying place, such as process filters or `<foo>-function' hooks.
+*** 'add-function'/'remove-function', which can be used to add/remove code on
+any function-carrying place, such as process filters or '<foo>-function' hooks.
-*** `advice-add'/`advice-remove' to add/remove a piece of advice on a named
-function, much like `defadvice' does.
+*** 'advice-add'/'advice-remove' to add/remove a piece of advice on a named
+function, much like 'defadvice' does.
** New package frameset.el provides a set of operations to save a frameset
(the state of all or a subset of the existing frames and windows, somewhat
@@ -979,23 +979,23 @@ restore it at some point in the future.
notifications. It requires that Emacs be compiled with one of the
low-level libraries gfilenotify.c, inotify.c or w32notify.c.
-** New minor modes `prettify-symbols-mode' and `global-prettify-symbols-mode'
+** New minor modes 'prettify-symbols-mode' and 'global-prettify-symbols-mode'
display specified symbols as composed characters. E.g., in Emacs Lisp mode,
this replaces the string "lambda" with the Greek lambda character.
-** New minor mode `superword-mode', which overrides the default word motion
+** New minor mode 'superword-mode', which overrides the default word motion
commands to treat "symbol_words" as a single word, similar to what
-`subword-mode' does.
+'subword-mode' does.
* Incompatible Lisp Changes in Emacs 24.4
** The default file coding for Emacs Lisp files is now utf-8.
-(See `file-coding-system-alist'.) In most cases, this change is
+(See 'file-coding-system-alist'.) In most cases, this change is
transparent, but files that contain unusual characters without
specifying an explicit coding system may fail to load with obscure
errors. You should either convert them to utf-8 or add an explicit
-`coding:' cookie.
+'coding:' cookie.
** Default process filters and sentinels are not nil any more.
Instead they default to a function that does what the nil value used to do.
@@ -1007,57 +1007,57 @@ don't feel it's right to document them. For now, don't assume in your
code that the values of overlay priority can only be either nil or an
integer, always test them with an appropriate predicate to be one or
the other. If you need to sort arbitrary overlays into priority
-order, `overlays-at' can now optionally do this.
+order, 'overlays-at' can now optionally do this.
You should still only specify integer priorities on overlays you create.
-** The cars of the elements in `interpreter-mode-alist' are now
+** The cars of the elements in 'interpreter-mode-alist' are now
treated as regexps rather than literal strings.
-** `overriding-terminal-local-map' no longer replaces the local keymaps.
+** 'overriding-terminal-local-map' no longer replaces the local keymaps.
It used to disable the minor mode, major mode, and text-property keymaps,
whereas now it simply has higher precedence.
-** `kill-region' has lost its `yank-handler' optional argument.
+** 'kill-region' has lost its 'yank-handler' optional argument.
-** `(input-pending-p)' no longer runs other timers that are ready to run.
+** '(input-pending-p)' no longer runs other timers that are ready to run.
The new optional CHECK-TIMERS parameter allows for the prior behavior.
-** `defvar' and `defcustom' in a let-binding affect the "external" default.
+** 'defvar' and 'defcustom' in a let-binding affect the "external" default.
** The syntax of ?» and ?« is now punctuation instead of matched parens.
Some languages match those as »...«, and others as «...», so it is
better for Emacs to stay neutral by default.
-** `read-event' does not always decode chars in ttys any more. As was the case
-in Emacs 22 and before, `read-event' (and `read-char') by default read raw
+** 'read-event' does not always decode chars in ttys any more. As was the case
+in Emacs 22 and before, 'read-event' (and 'read-char') by default read raw
bytes from the terminal. If you want to read decoded chars instead (as was
always the case in Emacs-23, for example), pass a non-nil
-`inherit-input-method' argument.
+'inherit-input-method' argument.
-** In `symbol-function', nil and "unbound" are indistinguishable.
-`symbol-function' does not signal a `void-function' error any more.
-To determine if a symbol's function definition is void, use `fboundp'.
+** In 'symbol-function', nil and "unbound" are indistinguishable.
+'symbol-function' does not signal a 'void-function' error any more.
+To determine if a symbol's function definition is void, use 'fboundp'.
-** `defadvice' does not honor the `freeze' flag and cannot advise
+** 'defadvice' does not honor the 'freeze' flag and cannot advise
special-forms any more.
-** `dolist' no longer binds VAR while evaluating the RESULT form,
+** 'dolist' no longer binds VAR while evaluating the RESULT form,
when lexical binding is enabled. Previously, VAR was bound to nil,
which often led to spurious unused-variable warnings.
-** The return value of `backup-buffer' has changed.
+** The return value of 'backup-buffer' has changed.
The second argument is no longer an SELinux context, instead it is an
alist of extended attributes as returned by the new function
-`file-extended-attributes'. The attributes can be applied to another
-file using `set-file-extended-attributes'.
+'file-extended-attributes'. The attributes can be applied to another
+file using 'set-file-extended-attributes'.
-** By default `copy-file' no longer copies file permission bits to an
+** By default 'copy-file' no longer copies file permission bits to an
existing destination; and it sets the file permission bits of a newly
created destination to those of the source, masked by the default file
permissions. To copy the file permission bits, pass t as the
-PRESERVE-PERMISSIONS argument of `copy-file'.
+PRESERVE-PERMISSIONS argument of 'copy-file'.
-** `visited-file-modtime' now returns -1 for nonexistent files.
+** 'visited-file-modtime' now returns -1 for nonexistent files.
Formerly it returned a list (-1 LOW USEC PSEC), but this was ambiguous
in the presence of files with negative time stamps.
@@ -1067,7 +1067,7 @@ value when looking up variables.
** In compiled Lisp files, the header no longer includes a timestamp.
-** The option `inhibit-local-menu-bar-menus' has been removed.
+** The option 'inhibit-local-menu-bar-menus' has been removed.
* Lisp Changes in Emacs 24.4
@@ -1076,111 +1076,111 @@ value when looking up variables.
and name of global variables, constants, and functions should be separated
by two hyphens if the symbol is not meant to be used by other packages.
-** The second argument of `eval' can now specify a lexical environment.
+** The second argument of 'eval' can now specify a lexical environment.
-** New macro `define-alternatives' can be used to define generic commands.
+** New macro 'define-alternatives' can be used to define generic commands.
Generic commands are interactive functions whose implementation can be
selected among several alternatives, as a matter of user preference.
** Numeric comparison functions =, <, >, <=, >= can now take many arguments.
-** New functions `special-form-p' and `macrop'.
+** New functions 'special-form-p' and 'macrop'.
-** New macro `with-eval-after-load'.
-This is like the old `eval-after-load', but better behaved.
+** New macro 'with-eval-after-load'.
+This is like the old 'eval-after-load', but better behaved.
-** If you give a symbol a `defalias-fset-function' property, `defalias'
+** If you give a symbol a 'defalias-fset-function' property, 'defalias'
on that symbol will use the associated value as a function to call
-in place of `fset'.
+in place of 'fset'.
-** New variable `enable-dir-local-variables'.
+** New variable 'enable-dir-local-variables'.
Directory-local variables are ignored if this is nil. This may be
useful for modes that want to ignore directory-locals while still
respecting file-local variables.
-** `read-regexp' now uses the new variable `read-regexp-defaults-function'
+** 'read-regexp' now uses the new variable 'read-regexp-defaults-function'
as a function to call to provide default values.
-** New functions `group-gid' and `group-real-gid'.
+** New functions 'group-gid' and 'group-real-gid'.
-** New function `get-pos-property'.
+** New function 'get-pos-property'.
-** New hook `pre-redisplay-function'.
+** New hook 'pre-redisplay-function'.
-** `byte-compile-interactive-only-functions' is now obsolete.
+** 'byte-compile-interactive-only-functions' is now obsolete.
To specify that a command should only be called interactively, give it
-a non-nil `interactive-only' property.
+a non-nil 'interactive-only' property.
-** New function `string-suffix-p'.
+** New function 'string-suffix-p'.
-** `split-string' now takes an optional argument TRIM.
+** 'split-string' now takes an optional argument TRIM.
The value, if non-nil, is a regexp that specifies what to trim from
the start and end of each substring.
-** New function `delete-consecutive-dups'.
+** New function 'delete-consecutive-dups'.
** Completion
-*** The separator used by `completing-read-multiple' is now a regexp.
-The default `crm-separator' has been changed to allow surrounding spaces
+*** The separator used by 'completing-read-multiple' is now a regexp.
+The default 'crm-separator' has been changed to allow surrounding spaces
around the comma.
-*** New function `completion-table-with-cache' is a wrapper for
-`completion-table-dynamic' that caches the result of the last lookup.
+*** New function 'completion-table-with-cache' is a wrapper for
+'completion-table-dynamic' that caches the result of the last lookup.
-*** New function `completion-table-merge' to combine several
+*** New function 'completion-table-merge' to combine several
completion tables by merging their completions.
-*** The `common-substring' argument of `display-completion-list',
+*** The 'common-substring' argument of 'display-completion-list',
which has been documented as obsolete since Emacs 23.1, is now _really_
obsolete, and no longer advertised. Instead either call
-`completion-hilit-commonality' to add the highlighting; or use
-`completion-all-completions', which returns highlighted strings.
+'completion-hilit-commonality' to add the highlighting; or use
+'completion-all-completions', which returns highlighted strings.
** Encoding and decoding of text
-*** New coding-system `prefer-utf-8'.
-This is like `undecided' but prefers UTF-8 on decoding if the text to
+*** New coding-system 'prefer-utf-8'.
+This is like 'undecided' but prefers UTF-8 on decoding if the text to
be decoded does not contain any invalid UTF-8 sequences. On encoding,
any non-ASCII characters are automatically encoded as UTF-8.
-*** New attributes of coding-systems whose type is `undecided'.
-Two new attributes, `:inhibit-null-byte-detection' and
-`:inhibit-iso-escape-detection', determine how to detect encoding of
+*** New attributes of coding-systems whose type is 'undecided'.
+Two new attributes, ':inhibit-null-byte-detection' and
+':inhibit-iso-escape-detection', determine how to detect encoding of
text that includes null bytes and ISO-2022 escape sequences, respectively.
Each of these attributes can be either nil, zero, or t. If t, decoding
text ignores null bytes and ISO-2022 sequences, respectively. If nil,
null bytes cause text to be decoded with no-conversion, and ISO-2022
sequences cause Emacs to assume the text is encoded in one of the ISO-2022
encodings, such as iso-2022-7bit. If zero, Emacs consults the variables
-`inhibit-null-byte-detection' and `inhibit-iso-escape-detection'.
-The new attribute `:prefer-utf-8', if non-nil, causes Emacs to prefer
+'inhibit-null-byte-detection' and 'inhibit-iso-escape-detection'.
+The new attribute ':prefer-utf-8', if non-nil, causes Emacs to prefer
UTF-8 encoding and decoding, whenever possible.
-These attributes are only meaningful for coding-systems of type `undecided'.
-(The type of a coding-system is determined by its `:coding-type' attribute
-and can be accessed by calling the `coding-system-type' function.)
+These attributes are only meaningful for coding-systems of type 'undecided'.
+(The type of a coding-system is determined by its ':coding-type' attribute
+and can be accessed by calling the 'coding-system-type' function.)
** Error-handling
-*** New function `define-error'.
+*** New function 'define-error'.
-*** `with-demoted-errors' takes an additional argument `format'.
+*** 'with-demoted-errors' takes an additional argument 'format'.
*** Errors from timer functions are no longer silently discarded,
but are reported as messages. So you may see "Error running timer"
messages from code that was failing silently till now. Set
-`debug-on-error' non-nil to get a real error and a backtrace.
+'debug-on-error' non-nil to get a real error and a backtrace.
** Faces
-*** Face specs set via Custom themes now replace the `defface' spec
+*** Face specs set via Custom themes now replace the 'defface' spec
rather than inheriting from it. In other words, setting a face via a
theme now behaves like setting it via Customize: you only need to
specify the attributes that you want, you don't need to unset those
that you don't want.
-*** The function `face-spec-set' is now like `setq' for face specs.
+*** The function 'face-spec-set' is now like 'setq' for face specs.
Its third arg now accepts values specifying a face spec type (defface,
custom, or override spec), and the relevant spec is set accordingly.
@@ -1188,7 +1188,7 @@ custom, or override spec), and the relevant spec is set accordingly.
specifies foreground to use if background color is near the foreground
color that would otherwise have been used.
-*** New function `add-face-text-property', which can be used to
+*** New function 'add-face-text-property', which can be used to
conveniently prepend/append new face properties.
*** New face characteristic (supports :underline (:style wave))
@@ -1199,76 +1199,76 @@ specifies whether or not the terminal can display a wavy line.
*** Support for filesystem notifications.
Emacs now supports notifications of filesystem changes, such as
creation, modification, and deletion of files. This requires the
-`glib' API, or the 'inotify' API (on GNU/Linux systems only). On
+'glib' API, or the 'inotify' API (on GNU/Linux systems only). On
MS-Windows systems, this is supported for Windows XP and newer.
-*** The 9th element returned by `file-attributes' is now unspecified.
+*** The 9th element returned by 'file-attributes' is now unspecified.
Formerly, it was t if the file's gid would change if file were deleted
and recreated. This value has been inaccurate for years on many
platforms, and nobody seems to have noticed or cared.
-*** The 6th argument to `copy-file' has been renamed to
+*** The 6th argument to 'copy-file' has been renamed to
PRESERVE-PERMISSIONS as it now handles ACL entries and the traditional
Unix file permission bits as well as SELinux context.
-*** The function `file-ownership-preserved-p' now has an optional
+*** The function 'file-ownership-preserved-p' now has an optional
argument GROUP which causes it check for file group too. This can be
-used in place of the 9th element of `file-attributes'.
+used in place of the 9th element of 'file-attributes'.
-*** The function `set-visited-file-modtime' now accepts a 0 or -1 argument,
-with the same interpretation as the returned value of `visited-file-modtime'.
+*** The function 'set-visited-file-modtime' now accepts a 0 or -1 argument,
+with the same interpretation as the returned value of 'visited-file-modtime'.
** Image API
-*** `image-animated-p' is now `image-multi-frame-p'.
+*** 'image-animated-p' is now 'image-multi-frame-p'.
It returns non-nil for any image that contains multiple frames,
whether or not it specifies a frame delay.
-*** New variable `image-default-frame-delay' gives the frame delay for
+*** New variable 'image-default-frame-delay' gives the frame delay for
animated images which do not specify a frame delay.
-*** New functions `image-current-frame' and `image-show-frame' for getting
+*** New functions 'image-current-frame' and 'image-show-frame' for getting
and setting the current frame of a multi-frame image.
** ImageMagick
*** ImageMagick images now support the :max-width and :max-height keywords.
-*** When using `create-image' with image data, you can pass a :format
+*** When using 'create-image' with image data, you can pass a :format
attribute (via the property-list argument) in order to help
ImageMagick detect the image type. The value should be a MIME
-content-type that is found in the new variable `image-format-suffixes'.
+content-type that is found in the new variable 'image-format-suffixes'.
** Revert and Autorevert
*** If Emacs is compiled with file notification support, it uses notifications
instead of checking file time stamps. To disable this, set the user option
-`auto-revert-use-notify' to nil. Alternatively, you can specify a regular
+'auto-revert-use-notify' to nil. Alternatively, you can specify a regular
expression matching directories to be excluded from file notifications via
-`auto-revert-notify-exclude-dir-regexp'.
+'auto-revert-notify-exclude-dir-regexp'.
-*** The default values of `buffer-stale-function', `revert-buffer-function',
-and `revert-buffer-insert-file-contents-function' are no longer nil.
+*** The default values of 'buffer-stale-function', 'revert-buffer-function',
+and 'revert-buffer-insert-file-contents-function' are no longer nil.
Instead they default to functions that do what the nil value used to.
-*** `buffer-stale-function' is now used for buffers visiting files too.
+*** 'buffer-stale-function' is now used for buffers visiting files too.
-*** The new user option `auto-revert-remote-files' enables reversion
+*** The new user option 'auto-revert-remote-files' enables reversion
of remote files, if non-nil.
** Terminal
*** Functions to pop up menus and dialogs now work on all terminals,
-including TTYs. This includes `x-popup-menu', `x-popup-dialog',
-`message-box', `yes-or-no-p', etc.
+including TTYs. This includes 'x-popup-menu', 'x-popup-dialog',
+'message-box', 'yes-or-no-p', etc.
-The function `display-popup-menus-p' will now return non-nil for a
+The function 'display-popup-menus-p' will now return non-nil for a
display or frame whenever a mouse is supported on that display or frame.
-*** New hook `tty-setup-hook', run at the end of initializing a text terminal.
+*** New hook 'tty-setup-hook', run at the end of initializing a text terminal.
-*** The hook `term-setup-hook' is obsolete. It is entirely equivalent
-to `emacs-startup-hook'. See also the new `tty-setup-hook'.
+*** The hook 'term-setup-hook' is obsolete. It is entirely equivalent
+to 'emacs-startup-hook'. See also the new 'tty-setup-hook'.
** Minor internal changes to the details of lock files.
The lock for DIR/FILE is now _always_ DIR/.#FILE.
@@ -1279,34 +1279,34 @@ On file systems that do not support symbolic links, the lock is now a
regular file with contents being what would have been in the symlink.
** New bool-vector set operation functions:
-*** `bool-vector-exclusive-or'
-*** `bool-vector-union'
-*** `bool-vector-intersection'
-*** `bool-vector-set-difference'
-*** `bool-vector-not'
-*** `bool-vector-subsetp'
-*** `bool-vector-count-consecutive'
-*** `bool-vector-count-population'
+*** 'bool-vector-exclusive-or'
+*** 'bool-vector-union'
+*** 'bool-vector-intersection'
+*** 'bool-vector-set-difference'
+*** 'bool-vector-not'
+*** 'bool-vector-subsetp'
+*** 'bool-vector-count-consecutive'
+*** 'bool-vector-count-population'
** New library subr-x.el with miscellaneous small utility functions:
-*** `hash-table-keys'
-*** `hash-table-values'
-*** `string-blank-p'
-*** `string-empty-p'
-*** `string-join'
-*** `string-reverse'
-*** `string-trim-left'
-*** `string-trim-right'
-*** `string-trim'
-*** `string-remove-prefix'
-*** `string-remove-suffix'
-
-** The `time-to-seconds' alias to `float-time' is no longer marked obsolete.
-
-** The spelling of the rx.el category `chinese-two-byte' has been
+*** 'hash-table-keys'
+*** 'hash-table-values'
+*** 'string-blank-p'
+*** 'string-empty-p'
+*** 'string-join'
+*** 'string-reverse'
+*** 'string-trim-left'
+*** 'string-trim-right'
+*** 'string-trim'
+*** 'string-remove-prefix'
+*** 'string-remove-suffix'
+
+** The 'time-to-seconds' alias to 'float-time' is no longer marked obsolete.
+
+** The spelling of the rx.el category 'chinese-two-byte' has been
corrected (the first 'e' was missing).
-** EIEIO namespace cleanup, obsolete-aliasing functions to use `eieio-' prefix:
+** EIEIO namespace cleanup, obsolete-aliasing functions to use 'eieio-' prefix:
*** object-name -> eieio-object-name
*** object-class -> eieio-object-class
*** object-class-fast -> eieio--object-class
@@ -1326,21 +1326,21 @@ corrected (the first 'e' was missing).
*** class-direct-superclasses -> eieio-class-parents
** Obsoleted functions
-*** `log10'
-*** `dont-compile'
-*** `lisp-complete-symbol'
-*** `field-complete'
-*** `minibuffer-completion-contents'
-*** `isearch-nonincremental-exit-minibuffer'
-*** `isearch-filter-visible'
-*** `generic-make-keywords-list'
-*** `get-upcase-table' (use `case-table-get-table' instead).
-
-** `with-wrapper-hook' is obsoleted by `add-function'.
+*** 'log10'
+*** 'dont-compile'
+*** 'lisp-complete-symbol'
+*** 'field-complete'
+*** 'minibuffer-completion-contents'
+*** 'isearch-nonincremental-exit-minibuffer'
+*** 'isearch-filter-visible'
+*** 'generic-make-keywords-list'
+*** 'get-upcase-table' (use 'case-table-get-table' instead).
+
+** 'with-wrapper-hook' is obsoleted by 'add-function'.
The few hooks that used with-wrapper-hook are replaced as follows:
-*** `abbrev-expand-function' obsoletes `abbrev-expand-functions'.
-*** `completion-in-region-function' obsoletes `completion-in-region-functions'.
-*** `filter-buffer-substring-function' obsoletes `filter-buffer-substring-functions'.
+*** 'abbrev-expand-function' obsoletes 'abbrev-expand-functions'.
+*** 'completion-in-region-function' obsoletes 'completion-in-region-functions'.
+*** 'filter-buffer-substring-function' obsoletes 'filter-buffer-substring-functions'.
* Changes in Emacs 24.4 on Non-Free Operating Systems
@@ -1352,10 +1352,10 @@ GNUstep and Mac OS X 10.4 use the old font backend.
** Improved fullscreen support on Mac OS X 10.7 and newer, where the
default fullscreen method is now "native" fullscreen. To use the
-old style fullscreen, customize `ns-use-native-fullscreen' to nil.
+old style fullscreen, customize 'ns-use-native-fullscreen' to nil.
** On Mac OS X 10.7 and newer, Emacs can use sRGB colorspace, and does so
-by default. Customize `ns-use-srgb-colorspace' to go back to the old method.
+by default. Customize 'ns-use-srgb-colorspace' to go back to the old method.
Note that this does not apply to images.
** The procedure for building Emacs on MS-Windows has changed.
@@ -1378,7 +1378,7 @@ need to set any variables due to this change.)
** Emacs on Windows 2000 and later can now access files and directories
whose names cannot be encoded in the current system codepage.
-The new variable `w32-unicode-filenames' controls this feature: if it
+The new variable 'w32-unicode-filenames' controls this feature: if it
is t, Emacs uses Unicode APIs to pass file names to system calls,
which lifts the limitation of file names to the current locale.
@@ -1386,57 +1386,57 @@ which lifts the limitation of file names to the current locale.
This helps to prevent losing your edits if the same file is being
edited in another Emacs session or by another user. See the node
"Interlocking" in the Emacs User Manual for the details. To disable
-file locking, customize `create-lockfiles' to nil.
+file locking, customize 'create-lockfiles' to nil.
** The "generate a backtrace on fatal error" feature now works on MS-Windows.
The backtrace is written to the 'emacs_backtrace.txt' file in the
directory where Emacs was running.
-** The `network-interface-list' and `network-interface-info' functions
+** The 'network-interface-list' and 'network-interface-info' functions
are now available on MS-Windows.
-** The variable `buffer-file-type' is no longer supported.
+** The variable 'buffer-file-type' is no longer supported.
Setting it has no effect, and %t in the mode-line format is ignored.
-Likewise, `file-name-buffer-file-type-alist' is now obsolete, and
+Likewise, 'file-name-buffer-file-type-alist' is now obsolete, and
modifying it has no effect.
* Installation Changes in Emacs 24.3
** The default X toolkit is now Gtk+ version 3.
-If you don't pass `--with-x-toolkit' to configure, or if you use
-`--with-x-toolkit=gtk' or `--with-x-toolkit=yes', configure will try
+If you don't pass '--with-x-toolkit' to configure, or if you use
+'--with-x-toolkit=gtk' or '--with-x-toolkit=yes', configure will try
to build with Gtk+ version 3, and if that fails, try Gtk+ version 2.
You can explicitly require a specific version by passing
-`--with-x-toolkit=gtk2' or `--with-x-toolkit=gtk3' to configure.
+'--with-x-toolkit=gtk2' or '--with-x-toolkit=gtk3' to configure.
-** New configure option `--enable-link-time-optimization', to utilize
+** New configure option '--enable-link-time-optimization', to utilize
an appropriate feature provided by GCC since version 4.5.0.
-** New configure option `--without-all' to disable most of the optional
+** New configure option '--without-all' to disable most of the optional
features (image support, etc.) that are normally enabled by default.
-** New configure option `--enable-gcc-warnings' (for developing/debugging
+** New configure option '--enable-gcc-warnings' (for developing/debugging
Emacs). If building with GCC, this enables compile-time checks that
warn/give errors about possibly-questionable C code. On a recent GNU
system there should be no warnings; on older and on non-GNU systems
the results may be useful to developers.
-** The configure option `--enable-use-lisp-union-type' has been
-renamed to `--enable-check-lisp-object-type', as the resulting
+** The configure option '--enable-use-lisp-union-type' has been
+renamed to '--enable-check-lisp-object-type', as the resulting
Lisp_Object type no longer uses a union to implement the compile time
check that this option enables.
-** The configure option `--disable-maintainer-mode' has been removed,
+** The configure option '--disable-maintainer-mode' has been removed,
as it was confusingly-named and rarely useful.
-** The configure options `--program-prefix', `--program-suffix', and
-`--program-transform-name' apply to more than just the installed
+** The configure options '--program-prefix', '--program-suffix', and
+'--program-transform-name' apply to more than just the installed
binaries. Now they also affect the man pages, icons, and the
etc/emacs.desktop file; but not the info pages, since this would break
links between the various manuals.
-** You can use `NO_BIN_LINK=t make install' to prevent the installation
+** You can use 'NO_BIN_LINK=t make install' to prevent the installation
overwriting "emacs" in the installation bin/ directory with a link
to "emacs-VERSION".
@@ -1446,31 +1446,31 @@ to "emacs-VERSION".
/usr/pkg/lib to the linker search path. You must add them yourself if
you want them.
-** The standalone scripts `rcs-checkin' and `vcdiff' have been removed
+** The standalone scripts 'rcs-checkin' and 'vcdiff' have been removed
(from the bin and libexec directories, respectively). The former is
no longer relevant, the latter is replaced by lisp (in vc-sccs.el).
* Startup Changes in Emacs 24.3
-** Emacs no longer searches for `leim-list.el' files beneath the standard
+** Emacs no longer searches for 'leim-list.el' files beneath the standard
lisp/ directory. There should not be any there anyway. If you have
been adding them there, put them somewhere else; e.g., site-lisp.
-** The `--no-site-lisp' command line option now works for Nextstep builds.
+** The '--no-site-lisp' command line option now works for Nextstep builds.
* Changes in Emacs 24.3
** Help
-*** `C-h f' (`describe-function') can now perform autoloading.
+*** 'C-h f' ('describe-function') can now perform autoloading.
When this command is called for an autoloaded function whose docstring
contains a key substitution construct, that function's library is
automatically loaded, so that the documentation can be shown
-correctly. To disable this, set `help-enable-auto-load' to nil.
+correctly. To disable this, set 'help-enable-auto-load' to nil.
-*** `C-h f' now reports previously-autoloaded functions as "autoloaded",
+*** 'C-h f' now reports previously-autoloaded functions as "autoloaded",
even after their associated libraries have been loaded (and the
autoloads have been redefined as functions).
@@ -1480,68 +1480,68 @@ autoloads have been redefined as functions).
:background image specification property.
*** When available, ImageMagick support is automatically enabled.
-It is no longer necessary to call `imagemagick-register-types'
+It is no longer necessary to call 'imagemagick-register-types'
explicitly to install ImageMagick image types; that function is called
automatically at startup, or when customizing an imagemagick- option.
-*** Setting `imagemagick-types-inhibit' to t now disables the use of
-ImageMagick to view images. (You must call `imagemagick-register-types'
+*** Setting 'imagemagick-types-inhibit' to t now disables the use of
+ImageMagick to view images. (You must call 'imagemagick-register-types'
afterwards if you do not use customize to change this.)
-*** The new variable `imagemagick-enabled-types' also affects which
+*** The new variable 'imagemagick-enabled-types' also affects which
ImageMagick types are treated as images. The function
-`imagemagick-filter-types' returns the list of types that will be
+'imagemagick-filter-types' returns the list of types that will be
treated as images.
** Minibuffer
-*** In minibuffer filename prompts, `C-M-f' and `C-M-b' now move to the
+*** In minibuffer filename prompts, 'C-M-f' and 'C-M-b' now move to the
next and previous path separator, respectively.
-*** `minibuffer-electric-default-mode' can shorten "(default ...)" to "[...]"
-in minibuffer prompts. Just set `minibuffer-eldef-shorten-default'
+*** 'minibuffer-electric-default-mode' can shorten "(default ...)" to "[...]"
+in minibuffer prompts. Just set 'minibuffer-eldef-shorten-default'
non-nil before enabling the mode.
** Mode line
-*** New option `mode-line-default-help-echo' specifies the help text
+*** New option 'mode-line-default-help-echo' specifies the help text
(shown in a tooltip or in the echo area) for any part of the mode line
that does not have its own specialized help text.
*** You can now click mouse-3 in the coding system indicator to invoke
-`set-buffer-file-coding-system'.
+'set-buffer-file-coding-system'.
** Server and client
-*** emacsclient now obeys string values for `initial-buffer-choice',
+*** emacsclient now obeys string values for 'initial-buffer-choice',
if it is told to open a new frame without specifying any file to visit
or expression to evaluate.
-*** New option `server-auth-key' specifies a shared server key.
+*** New option 'server-auth-key' specifies a shared server key.
** Emacs now generates backtraces on fatal errors.
On encountering a fatal error, Emacs now outputs a textual description
of the fatal signal, and a short backtrace on platforms like glibc
that support backtraces.
-** `C-x C-q' is now bound to the new minor mode `read-only-mode'.
-This minor mode replaces `toggle-read-only', which is now obsolete.
+** 'C-x C-q' is now bound to the new minor mode 'read-only-mode'.
+This minor mode replaces 'toggle-read-only', which is now obsolete.
-** Most `y-or-n' prompts now allow you to scroll the selected window.
-Typing `C-v' or `M-v' at a y-or-n prompt scrolls forward or backward
+** Most 'y-or-n' prompts now allow you to scroll the selected window.
+Typing 'C-v' or 'M-v' at a y-or-n prompt scrolls forward or backward
respectively, without exiting from the prompt.
** In the Package Menu, newly-available packages are listed as "new",
and sorted above the other "available" packages by default.
** If your Emacs was built from a repository checkout, the new variable
-`emacs-bzr-version' contains information about the bzr revision used.
+'emacs-bzr-version' contains information about the bzr revision used.
-** New option `create-lockfiles' specifies usage of lockfiles.
+** New option 'create-lockfiles' specifies usage of lockfiles.
It defaults to t. Changing it to nil inhibits the creation of lock
files (use this with caution).
-** New option `enable-remote-dir-locals', if non-nil, allows directory-local
+** New option 'enable-remote-dir-locals', if non-nil, allows directory-local
variables on remote hosts.
** The entry for PCL-CVS has been removed from the Tools menu.
@@ -1550,16 +1550,16 @@ The PCL-CVS commands are still available via the keyboard.
** Using "unibyte: t" in Lisp source files is obsolete.
Use "coding: raw-text" instead.
-** In the buffer made by `M-x report-emacs-bug', the `C-c m' binding
-has been changed to `C-c M-i' (`report-emacs-bug-insert-to-mailer').
+** In the buffer made by 'M-x report-emacs-bug', the 'C-c m' binding
+has been changed to 'C-c M-i' ('report-emacs-bug-insert-to-mailer').
The previous binding, introduced in Emacs 24.1, was a mistake, because
-`C-c LETTER' bindings are reserved for user customizations.
+'C-c LETTER' bindings are reserved for user customizations.
** Internationalization
*** New language environment: Persian.
-*** New input method `vietnamese-vni'.
+*** New input method 'vietnamese-vni'.
** Nextstep (GNUstep / OS X) port
@@ -1576,54 +1576,54 @@ menu/toolbar.
*** Non-regexp Isearch now performs "lax" space matching.
Each sequence of spaces in the supplied search string may match any
sequence of one or more whitespace characters, as specified by the
-variable `search-whitespace-regexp'. (This variable is also used by a
+variable 'search-whitespace-regexp'. (This variable is also used by a
similar existing feature for regexp Isearch.)
-*** New Isearch command `M-s SPC' toggles lax space matching.
+*** New Isearch command 'M-s SPC' toggles lax space matching.
This applies to both ordinary and regexp Isearch.
-*** New option `replace-lax-whitespace'.
-If non-nil, `query-replace' uses flexible whitespace matching too.
+*** New option 'replace-lax-whitespace'.
+If non-nil, 'query-replace' uses flexible whitespace matching too.
The default is nil.
-*** Global `M-s _' starts a symbol (identifier) incremental search,
-and `M-s _' in Isearch toggles symbol search mode.
-`M-s c' in Isearch toggles search case-sensitivity.
+*** Global 'M-s _' starts a symbol (identifier) incremental search,
+and 'M-s _' in Isearch toggles symbol search mode.
+'M-s c' in Isearch toggles search case-sensitivity.
** Navigation commands
-*** New binding `M-g c' for `goto-char'.
+*** New binding 'M-g c' for 'goto-char'.
-*** New binding `M-g TAB' for `move-to-column'.
+*** New binding 'M-g TAB' for 'move-to-column'.
-*** `M-g TAB' (`move-to-column') prompts for a column number if called
+*** 'M-g TAB' ('move-to-column') prompts for a column number if called
interactively with no prefix arg. Previously, it moved to column 1.
-** New option `yank-handled-properties' allows processing of text
+** New option 'yank-handled-properties' allows processing of text
properties on yanked text, in ways that are more general than just
-removing them (as is done by `yank-excluded-properties').
+removing them (as is done by 'yank-excluded-properties').
-** New option `delete-trailing-lines' specifies whether
+** New option 'delete-trailing-lines' specifies whether
M-x delete-trailing-whitespace should delete trailing lines at the end
of the buffer. It defaults to t.
-** `C-u M-=' now counts lines/words/characters in the entire buffer.
+** 'C-u M-=' now counts lines/words/characters in the entire buffer.
-** `C-x 8 RET' is now bound to `insert-char', which is now a command.
-`ucs-insert' is now an obsolete alias for `insert-char'.
+** 'C-x 8 RET' is now bound to 'insert-char', which is now a command.
+'ucs-insert' is now an obsolete alias for 'insert-char'.
-** The `z' key no longer has a binding in most special modes.
-It used to be bound to `kill-this-buffer', but `z' is too easy to
+** The 'z' key no longer has a binding in most special modes.
+It used to be bound to 'kill-this-buffer', but 'z' is too easy to
accidentally type.
-** New command `C-x r M-w' (`copy-rectangle-as-kill').
+** New command 'C-x r M-w' ('copy-rectangle-as-kill').
It copies the region-rectangle as the last rectangle kill.
** Registers
-*** `C-x r +' is now overloaded to invoke `append-to-register'.
+*** 'C-x r +' is now overloaded to invoke 'append-to-register'.
-*** New option `register-separator' specifies the register containing
+*** New option 'register-separator' specifies the register containing
the text to put between collected texts for use with
M-x append-to-register and M-x prepend-to-register.
@@ -1633,58 +1633,58 @@ M-x append-to-register and M-x prepend-to-register.
** Common Lisp emulation (CL)
*** CL's main entry is now (require 'cl-lib).
-`cl-lib' is like the old `cl' except that it uses the namespace cleanly;
+'cl-lib' is like the old 'cl' except that it uses the namespace cleanly;
i.e., all its definitions have the "cl-" prefix (and internal definitions
use the "cl--" prefix).
-If `cl' provided a feature under the name `foo', then `cl-lib'
-provides it under the name `cl-foo' instead; with the exceptions of the
-few `cl' definitions that had to use `foo*' to avoid conflicts with
-pre-existing Elisp entities. These have been renamed to `cl-foo'
-rather than `cl-foo*'.
+If 'cl' provided a feature under the name 'foo', then 'cl-lib'
+provides it under the name 'cl-foo' instead; with the exceptions of the
+few 'cl' definitions that had to use 'foo*' to avoid conflicts with
+pre-existing Elisp entities. These have been renamed to 'cl-foo'
+rather than 'cl-foo*'.
-The old `cl' is now deprecated and is mainly just a bunch of aliases that
+The old 'cl' is now deprecated and is mainly just a bunch of aliases that
provide the old, non-prefixed names. Some exceptions are listed below:
-*** `cl-flet' is not like `flet' (which is deprecated).
-Instead it obeys the behavior of Common-Lisp's `flet'.
+*** 'cl-flet' is not like 'flet' (which is deprecated).
+Instead it obeys the behavior of Common-Lisp's 'flet'.
In particular, in cl-flet function definitions are lexically scoped,
whereas in flet the scoping is dynamic.
-*** `cl-labels' is slightly different from `labels'.
-The difference is that it relies on the `lexical-binding' machinery
-(as opposed to the `lexical-let' machinery used previously) to capture
-definitions in closures, so such closures will only work if `lexical-binding'
+*** 'cl-labels' is slightly different from 'labels'.
+The difference is that it relies on the 'lexical-binding' machinery
+(as opposed to the 'lexical-let' machinery used previously) to capture
+definitions in closures, so such closures will only work if 'lexical-binding'
is in use.
-*** `cl-letf' is not exactly like `letf'.
+*** 'cl-letf' is not exactly like 'letf'.
The only difference is in details that relate to some deprecated usage
-of `symbol-function' in place forms.
+of 'symbol-function' in place forms.
-*** `progv' was rewritten to use the `let' machinery.
+*** 'progv' was rewritten to use the 'let' machinery.
A side effect is that variables without corresponding values are bound
to nil rather than being made unbound.
-*** The following methods of extending `setf' are obsolete
+*** The following methods of extending 'setf' are obsolete
(use features from gv.el instead):
-`define-modify-macro' (use `gv-letplace')
-`defsetf' (use `gv-define-simple-setter' or `gv-define-setter')
-`define-setf-expander' (use `gv-define-setter' or `gv-define-expander')
-`get-setf-method' no longer exists (see "Incompatible Lisp Changes")
+'define-modify-macro' (use 'gv-letplace')
+'defsetf' (use 'gv-define-simple-setter' or 'gv-define-setter')
+'define-setf-expander' (use 'gv-define-setter' or 'gv-define-expander')
+'get-setf-method' no longer exists (see "Incompatible Lisp Changes")
** Diff mode
*** Changes are now highlighted using the same color scheme as in
modern VCSes. Deletions are displayed in red (new faces
-`diff-refine-removed' and `smerge-refined-removed', and new definition
-of `diff-removed'), insertions in green (new faces `diff-refine-added'
-and `smerge-refined-added', and new definition of `diff-added').
+'diff-refine-removed' and 'smerge-refined-removed', and new definition
+of 'diff-removed'), insertions in green (new faces 'diff-refine-added'
+and 'smerge-refined-added', and new definition of 'diff-added').
-*** The variable `diff-use-changed-face' defines whether to use the
-face `diff-changed', or `diff-removed' and `diff-added' to highlight
+*** The variable 'diff-use-changed-face' defines whether to use the
+face 'diff-changed', or 'diff-removed' and 'diff-added' to highlight
changes in context diffs.
-*** The new command `diff-delete-trailing-whitespace' removes trailing
+*** The new command 'diff-delete-trailing-whitespace' removes trailing
whitespace introduced by a diff.
** Ediff now uses the same color scheme as Diff mode.
@@ -1704,22 +1704,22 @@ text based shell).
*** Some user options have been removed, including:
-**** `python-indent-string-contents': Strings are never indented.
+**** 'python-indent-string-contents': Strings are never indented.
-**** `python-honour-comment-indentation':
+**** 'python-honour-comment-indentation':
Comments are always considered as indentation markers.
-**** `python-continuation-offset': Indentation is automatically
+**** 'python-continuation-offset': Indentation is automatically
calculated in a pep8 compliant way depending on the context.
-**** `python-shell-prompt-alist', `python-shell-continuation-prompt-alist':
+**** 'python-shell-prompt-alist', 'python-shell-continuation-prompt-alist':
Have no direct mapping as the shell interaction is completely different.
-**** `python-python-command', `python-jython-command':
-Replaced by `python-shell-interpreter'.
+**** 'python-python-command', 'python-jython-command':
+Replaced by 'python-shell-interpreter'.
-**** `inferior-python-filter-regexp', `python-remove-cwd-from-path',
-`python-pdbtrack-minor-mode-string', `python-source-modes':
+**** 'inferior-python-filter-regexp', 'python-remove-cwd-from-path',
+'python-pdbtrack-minor-mode-string', 'python-source-modes':
No longer relevant.
*** Some commands have been replaced (old -> new):
@@ -1746,48 +1746,48 @@ and python-shell-switch-to-shell
** D-Bus
-*** New variables `dbus-compiled-version' and `dbus-runtime-version'.
+*** New variables 'dbus-compiled-version' and 'dbus-runtime-version'.
*** The D-Bus object manager interface is implemented.
*** Variables of type :(u)int32 and :(u)int64 accept floating points,
if their value does not fit into Emacs's integer range.
-*** The function `dbus-call-method' is now non-blocking.
-It can be interrupted by `C-g'. `dbus-call-method-non-blocking' is obsolete.
+*** The function 'dbus-call-method' is now non-blocking.
+It can be interrupted by 'C-g'. 'dbus-call-method-non-blocking' is obsolete.
*** Signals can also be sent as unicast messages.
-*** The argument list of `dbus-register-signal' has been extended,
+*** The argument list of 'dbus-register-signal' has been extended,
according to the new match rule types of D-Bus.
-*** `dbus-init-bus' supports private connections.
+*** 'dbus-init-bus' supports private connections.
-*** There is a new function `dbus-setenv'.
+*** There is a new function 'dbus-setenv'.
-** `desktop-path' no longer includes the "." directory.
+** 'desktop-path' no longer includes the "." directory.
Desktop files are now located in ~/.emacs.d by default.
** Dired
-*** `dired-do-async-shell-command' executes each file sequentially
-if the command ends in `;' (when operating on multiple files).
+*** 'dired-do-async-shell-command' executes each file sequentially
+if the command ends in ';' (when operating on multiple files).
Otherwise, it executes the command on each file in parallel.
-*** Typing `M-n' in the minibuffer of `dired-do-chmod', `dired-do-chgrp',
-`dired-do-chown', and `dired-do-touch' yanks the attributes of the
+*** Typing 'M-n' in the minibuffer of 'dired-do-chmod', 'dired-do-chgrp',
+'dired-do-chown', and 'dired-do-touch' yanks the attributes of the
file at point.
-*** When the region is active, `m' (`dired-mark'), `u' (`dired-unmark'),
-`DEL' (`dired-unmark-backward'), and `d' (`dired-flag-file-deletion')
+*** When the region is active, 'm' ('dired-mark'), 'u' ('dired-unmark'),
+'DEL' ('dired-unmark-backward'), and 'd' ('dired-flag-file-deletion')
mark/unmark/flag all files in the active region.
-*** The minibuffer default for `=' (`dired-diff') has changed.
+*** The minibuffer default for '=' ('dired-diff') has changed.
It is now the backup file for the file at point, if one exists.
In Transient Mark mode the default is the file at the active mark.
-*** `M-=' is no longer bound to `dired-backup-diff' in Dired buffers.
-The global binding for `M-=', `count-words-region' is in effect.
+*** 'M-=' is no longer bound to 'dired-backup-diff' in Dired buffers.
+The global binding for 'M-=', 'count-words-region' is in effect.
** ERC
@@ -1797,27 +1797,27 @@ receive a private message or your nickname is mentioned.
*** ERC will look up server/channel names via auth-source and use any
channel keys found.
-*** New option `erc-lurker-hide-list', similar to `erc-hide-list', but
+*** New option 'erc-lurker-hide-list', similar to 'erc-hide-list', but
only applies to messages sent by lurkers.
** reStructuredText mode
-*** Keybindings (see `C-c C-h'), TAB indentation, filling and auto-filling,
+*** Keybindings (see 'C-c C-h'), TAB indentation, filling and auto-filling,
fontification, comment handling, and customization have all been revised
and improved.
-*** Support for `imenu' and `which-function-mode'.
+*** Support for 'imenu' and 'which-function-mode'.
*** The reStructuredText syntax is more closely covered.
Sphinx support has been improved.
-*** `rst-insert-list' inserts new list or continues existing lists.
+*** 'rst-insert-list' inserts new list or continues existing lists.
-*** A negative prefix argument always works for `rst-adjust'.
+*** A negative prefix argument always works for 'rst-adjust'.
*** The window configuration is reset after displaying a TOC.
-*** The constant `rst-version' describes the rst.el package version.
+*** The constant 'rst-version' describes the rst.el package version.
** Ruby mode
@@ -1827,28 +1827,28 @@ steps definitions.
*** Improved syntax highlighting and indentation.
-*** New command `ruby-toggle-block', bound to `C-c {'.
+*** New command 'ruby-toggle-block', bound to 'C-c {'.
*** Some non-standard keybindings/commands have been removed:
-**** `ruby-electric-brace'; use `electric-indent-mode' instead.
+**** 'ruby-electric-brace'; use 'electric-indent-mode' instead.
-**** `ruby-mark-defun'; use `mark-defun'.
+**** 'ruby-mark-defun'; use 'mark-defun'.
-**** `ruby-beginning-of-defun' and `ruby-end-of-defun' are replaced by
-appropriate settings for the variables `beginning-of-defun-function'
-and `end-of-defun-function'.
+**** 'ruby-beginning-of-defun' and 'ruby-end-of-defun' are replaced by
+appropriate settings for the variables 'beginning-of-defun-function'
+and 'end-of-defun-function'.
-**** Non-standard keybindings for `backward-kill-word', `comment-region',
-`reindent-then-newline-and-indent' and `newline' have been removed.
+**** Non-standard keybindings for 'backward-kill-word', 'comment-region',
+'reindent-then-newline-and-indent' and 'newline' have been removed.
** Shell Script mode
-*** Pairing of parens/quotes uses `electric-pair-mode' instead of skeleton-pair.
+*** Pairing of parens/quotes uses 'electric-pair-mode' instead of skeleton-pair.
-*** `sh-electric-here-document-mode' now controls auto-insertion of here-docs.
+*** 'sh-electric-here-document-mode' now controls auto-insertion of here-docs.
-*** `sh-use-smie' lets you choose a new indentation and navigation code.
+*** 'sh-use-smie' lets you choose a new indentation and navigation code.
** VHDL mode
@@ -1863,48 +1863,48 @@ and `end-of-defun-function'.
** Apropos
*** The faces used by Apropos are now directly customizable.
-These faces are named `apropos-symbol', `apropos-keybinding', and so on;
-see the `apropos' Custom group for details.
+These faces are named 'apropos-symbol', 'apropos-keybinding', and so on;
+see the 'apropos' Custom group for details.
*** The old options whose values specified faces to use have been removed
-(i.e. `apropos-symbol-face', `apropos-keybinding-face', `apropos-label-face',
-`apropos-match-face' and `apropos-property-face'.).
+(i.e. 'apropos-symbol-face', 'apropos-keybinding-face', 'apropos-label-face',
+'apropos-match-face' and 'apropos-property-face'.).
** Buffer Menu
*** This package has been rewritten to use Tabulated List mode.
-*** Option `Buffer-menu-buffer+size-width' is now obsolete.
-Use `Buffer-menu-name-width' and `Buffer-menu-size-width' instead.
+*** Option 'Buffer-menu-buffer+size-width' is now obsolete.
+Use 'Buffer-menu-name-width' and 'Buffer-menu-size-width' instead.
** Calc
*** Algebraic simplification mode is now the default.
To restrict to the limited simplifications given by the former
-default simplification mode, use `m I'.
+default simplification mode, use 'm I'.
** Calendar
*** You can customize the header text that appears above each calendar month.
-See the variable `calendar-month-header'.
+See the variable 'calendar-month-header'.
-*** New LaTeX calendar style, produced by `cal-tex-cursor-week2-summary'.
+*** New LaTeX calendar style, produced by 'cal-tex-cursor-week2-summary'.
*** The calendars produced by cal-html include holidays.
-Customize `cal-html-holidays' to change this.
+Customize 'cal-html-holidays' to change this.
** CEDET
*** The major modes from the parser generators "Bovine" and "Wisent"
are now properly integrated in Emacs. The file suffixes ".by" and ".wy"
-are in `auto-mode-alist', and the corresponding manuals are included.
+are in 'auto-mode-alist', and the corresponding manuals are included.
*** EDE
**** Menu support for the "Configuration" feature. This allows users to
choose the active configuration (such as debug or install) from the menu.
-**** New command `ede-set' to interactively set project-local variables.
+**** New command 'ede-set' to interactively set project-local variables.
**** Support for compiling, debugging, and running in "generic" projects.
@@ -1950,24 +1950,24 @@ mode (like Java).
**** Support for merging tables from multiple related modes, such as
default -> c++ -> arduino.
-** Compile has a new option `compilation-always-kill'.
+** Compile has a new option 'compilation-always-kill'.
** Customize
-*** `custom-reset-button-menu' now defaults to t.
+*** 'custom-reset-button-menu' now defaults to t.
-*** Non-option variables are never matched in `customize-apropos' and
-`customize-apropos-options' (i.e., the prefix argument does nothing for
+*** Non-option variables are never matched in 'customize-apropos' and
+'customize-apropos-options' (i.e., the prefix argument does nothing for
these commands now).
** Term
-*** The variables `term-default-fg-color' and `term-default-bg-color'
-are now deprecated in favor of the customizable face `term'.
+*** The variables 'term-default-fg-color' and 'term-default-bg-color'
+are now deprecated in favor of the customizable face 'term'.
*** You can customize how to display ANSI terminal colors and styles
-by customizing the corresponding `term-color-<COLOR>',
-`term-color-underline' and `term-color-bold' faces.
+by customizing the corresponding 'term-color-<COLOR>',
+'term-color-underline' and 'term-color-bold' faces.
** Tramp
@@ -1977,86 +1977,86 @@ by customizing the corresponding `term-color-<COLOR>',
** URL
-*** Structs made by `url-generic-parse-url' have nil `attributes' slot.
+*** Structs made by 'url-generic-parse-url' have nil 'attributes' slot.
Previously, this slot stored semicolon-separated attribute-value pairs
appended to some imap URLs, but this is not compatible with RFC 3986.
-So now the `filename' slot stores the entire path and query components,
-and the `attributes' slot is always nil.
+So now the 'filename' slot stores the entire path and query components,
+and the 'attributes' slot is always nil.
-*** New function `url-encode-url' for encoding a URI string.
-The `url-retrieve' function now uses this to encode its URL argument,
+*** New function 'url-encode-url' for encoding a URI string.
+The 'url-retrieve' function now uses this to encode its URL argument,
in case that is not properly encoded.
** notifications.el supports now version 1.2 of the Notifications API.
-The function `notifications-get-capabilities' returns the supported
+The function 'notifications-get-capabilities' returns the supported
server properties.
** Flymake uses fringe bitmaps to indicate errors and warnings.
-See `flymake-fringe-indicator-position', `flymake-error-bitmap' and
-`flymake-warning-bitmap'.
+See 'flymake-fringe-indicator-position', 'flymake-error-bitmap' and
+'flymake-warning-bitmap'.
-** The FFAP option `ffap-url-unwrap-remote' can now be a list of strings,
+** The FFAP option 'ffap-url-unwrap-remote' can now be a list of strings,
specifying URL types that should be converted to remote file names at
the FFAP prompt. The default is now '("ftp").
-** New Ibuffer `derived-mode' filter, bound to `/ M'.
-The old binding for `/ M' (filter by used-mode) is now bound to `/ m'.
+** New Ibuffer 'derived-mode' filter, bound to '/ M'.
+The old binding for '/ M' (filter by used-mode) is now bound to '/ m'.
-** New option `mouse-avoidance-banish-position' specifies where the
-`banish' mouse avoidance setting moves the mouse.
+** New option 'mouse-avoidance-banish-position' specifies where the
+'banish' mouse avoidance setting moves the mouse.
-** In Perl mode, new option `perl-indent-parens-as-block' causes non-block
+** In Perl mode, new option 'perl-indent-parens-as-block' causes non-block
closing brackets to be aligned with the line of the opening bracket.
-** In Proced mode, new command `proced-renice' renices marked processes.
+** In Proced mode, new command 'proced-renice' renices marked processes.
-** New option `async-shell-command-buffer' specifies the buffer to use
-for a new asynchronous `shell-command' when the default output buffer
-`*Async Shell Command*' is already in use.
+** New option 'async-shell-command-buffer' specifies the buffer to use
+for a new asynchronous 'shell-command' when the default output buffer
+'*Async Shell Command*' is already in use.
-** SQL mode has a new option `sql-db2-escape-newlines'.
+** SQL mode has a new option 'sql-db2-escape-newlines'.
If non-nil, newlines sent to the command interpreter will be escaped
by a backslash. The default does not escape the newlines and assumes
that the sql statement will be terminated by a semicolon.
-** New command `tabulated-list-sort', bound to `S' in Tabulated List mode
+** New command 'tabulated-list-sort', bound to 'S' in Tabulated List mode
(and modes that derive from it), sorts the column at point, or the Nth
column if a numeric prefix argument is given.
-** `which-func-modes' now defaults to t, so Which Function mode, when
+** 'which-func-modes' now defaults to t, so Which Function mode, when
enabled, applies to all applicable major modes.
-** `winner-mode-hook' now runs when the mode is disabled, as well as when
+** 'winner-mode-hook' now runs when the mode is disabled, as well as when
it is enabled.
** Follow mode no longer works by using advice.
-The option `follow-intercept-processes' has been removed.
+The option 'follow-intercept-processes' has been removed.
-** `javascript-generic-mode' is now an obsolete alias for `js-mode'.
+** 'javascript-generic-mode' is now an obsolete alias for 'js-mode'.
** Hooks renamed to avoid obsolete "-hooks" suffix:
-*** semantic-lex-reset-hooks -> semantic-lex-reset-functions
-*** semantic-change-hooks -> semantic-change-functions
-*** semantic-edits-new-change-hooks -> semantic-edits-new-change-functions
-*** semantic-edits-delete-change-hooks -> semantic-edits-delete-change-functions
-*** semantic-edits-reparse-change-hooks -> semantic-edits-reparse-change-functions
-*** semanticdb-save-database-hooks -> semanticdb-save-database-functions
-*** c-prepare-bug-report-hooks -> c-prepare-bug-report-hook
-*** rcirc-sentinel-hooks -> rcirc-sentinel-functions
-*** rcirc-receive-message-hooks -> rcirc-receive-message-functions
-*** rcirc-activity-hooks -> rcirc-activity-functions
-*** rcirc-print-hooks -> rcirc-print-functions
-*** dbus-event-error-hooks -> dbus-event-error-functions
-*** eieio-pre-method-execution-hooks -> eieio-pre-method-execution-functions
-*** checkdoc-style-hooks -> checkdoc-style-functions
-*** checkdoc-comment-style-hooks -> checkdoc-comment-style-functions
-*** archive-extract-hooks -> archive-extract-hook
-*** filesets-cache-fill-content-hooks -> filesets-cache-fill-content-hook
-*** hfy-post-html-hooks -> hfy-post-html-hook
-*** nndiary-request-create-group-hooks -> nndiary-request-create-group-functions
-*** nndiary-request-update-info-hooks -> nndiary-request-update-info-functions
-*** nndiary-request-accept-article-hooks -> nndiary-request-accept-article-functions
-*** gnus-subscribe-newsgroup-hooks -> gnus-subscribe-newsgroup-functions
+*** 'semantic-lex-reset-hooks' -> 'semantic-lex-reset-functions'
+*** 'semantic-change-hooks' -> 'semantic-change-functions'
+*** 'semantic-edits-new-change-hooks' -> 'semantic-edits-new-change-functions'
+*** 'semantic-edits-delete-change-hooks' -> 'semantic-edits-delete-change-functions'
+*** 'semantic-edits-reparse-change-hooks' -> 'semantic-edits-reparse-change-functions'
+*** 'semanticdb-save-database-hooks' -> 'semanticdb-save-database-functions'
+*** 'c-prepare-bug-report-hooks' -> 'c-prepare-bug-report-hook'
+*** 'rcirc-sentinel-hooks' -> 'rcirc-sentinel-functions'
+*** 'rcirc-receive-message-hooks' -> 'rcirc-receive-message-functions'
+*** 'rcirc-activity-hooks' -> 'rcirc-activity-functions'
+*** 'rcirc-print-hooks' -> 'rcirc-print-functions'
+*** 'dbus-event-error-hooks' -> 'dbus-event-error-functions'
+*** 'eieio-pre-method-execution-hooks' -> 'eieio-pre-method-execution-functions'
+*** 'checkdoc-style-hooks' -> 'checkdoc-style-functions'
+*** 'checkdoc-comment-style-hooks' -> 'checkdoc-comment-style-functions'
+*** 'archive-extract-hooks' -> 'archive-extract-hook'
+*** 'filesets-cache-fill-content-hooks' -> 'filesets-cache-fill-content-hook'
+*** 'hfy-post-html-hooks' -> 'hfy-post-html-hook'
+*** 'nndiary-request-create-group-hooks' -> 'nndiary-request-create-group-functions'
+*** 'nndiary-request-update-info-hooks' -> 'nndiary-request-update-info-functions'
+*** 'nndiary-request-accept-article-hooks' -> 'nndiary-request-accept-article-functions'
+*** 'gnus-subscribe-newsgroup-hooks' -> 'gnus-subscribe-newsgroup-functions'
** Obsolete packages
@@ -2074,44 +2074,44 @@ inefficiency, and not namespace-clean.
* Incompatible Lisp Changes in Emacs 24.3
-** Docstrings starting with `*' no longer indicate user options.
-Only variables defined using `defcustom' are considered user options.
-The function `user-variable-p' is now an obsolete alias for
-`custom-variable-p'.
+** Docstrings starting with '*' no longer indicate user options.
+Only variables defined using 'defcustom' are considered user options.
+The function 'user-variable-p' is now an obsolete alias for
+'custom-variable-p'.
-** The return values of `defalias', `defun' and `defmacro' have changed,
-and are now undefined. For backwards compatibility, `defun' and
-`defmacro' currently return the name of the newly defined
+** The return values of 'defalias', 'defun' and 'defmacro' have changed,
+and are now undefined. For backwards compatibility, 'defun' and
+'defmacro' currently return the name of the newly defined
function/macro, but this should not be relied upon.
-** `random' by default now returns a different random sequence in
-every Emacs run. Use `(random S)', where S is a string, to set the
+** 'random' by default now returns a different random sequence in
+every Emacs run. Use '(random S)', where S is a string, to set the
random seed to a value based on S, in order to get a repeatable
sequence in later calls.
-** If the NEWTEXT arg to `replace-match' contains a substring "\?",
+** If the NEWTEXT arg to 'replace-match' contains a substring "\?",
that substring is inserted literally even if the LITERAL arg is
non-nil, instead of causing an error to be signaled.
-** `select-window' now always makes the window's buffer current.
+** 'select-window' now always makes the window's buffer current.
It does so even if the window was selected before.
-** The function `x-select-font' can return a font spec, instead of a
+** The function 'x-select-font' can return a font spec, instead of a
font name as a string. Whether it returns a font spec or a font name
depends on the graphical library.
-** `face-spec-set' no longer sets frame-specific attributes when the
+** 'face-spec-set' no longer sets frame-specific attributes when the
third argument is a frame (that usage was obsolete since Emacs 22.2).
-** `set-buffer-multibyte' now signals an error in narrowed buffers.
+** 'set-buffer-multibyte' now signals an error in narrowed buffers.
-** The CL package's `get-setf-method' function no longer exists.
+** The CL package's 'get-setf-method' function no longer exists.
Generalized variables are now part of core Emacs Lisp, and implemented
differently to the way cl.el used to do it. It is not possible to
-define a compatible replacement for `get-setf-method'. See the file
+define a compatible replacement for 'get-setf-method'. See the file
gv.el for internal details of the new implementation.
-** The arguments of `dbus-register-signal' are no longer just strings,
+** The arguments of 'dbus-register-signal' are no longer just strings,
but keywords or keyword-string pairs. The old argument list will
still be supported for Emacs 24.x.
@@ -2120,55 +2120,55 @@ Some Lisp symbols have been renamed to correct their spelling,
or to be more consistent with standard Emacs terminology.
*** Renamed functions
-**** hangul-input-method-inactivate -> hangul-input-method-deactivate
-**** inactivate-input-method -> deactivate-input-method
-**** quail-inactivate -> quail-deactivate
-**** robin-inactivate -> robin-deactivate
-**** viper-inactivate-input-method -> viper-deactivate-input-method
-**** viper-inactivate-input-method-action ->
- viper-deactivate-input-method-action
-**** ucs-input-inactivate -> ucs-input-deactivate
+**** 'hangul-input-method-inactivate' -> 'hangul-input-method-deactivate'
+**** 'inactivate-input-method' -> 'deactivate-input-method'
+**** 'quail-inactivate' -> 'quail-deactivate'
+**** 'robin-inactivate' -> 'robin-deactivate'
+**** 'viper-inactivate-input-method' -> 'viper-deactivate-input-method'
+**** 'viper-inactivate-input-method-action' ->
+ 'viper-deactivate-input-method-action'
+**** 'ucs-input-inactivate' -> 'ucs-input-deactivate'
*** Renamed hooks
The old hooks are still supported for backward compatibility, but they
are deprecated and will be removed eventually.
-**** input-method-inactivate-hook -> input-method-deactivate-hook
-**** robin-inactivate-hook -> robin-deactivate-hook
-**** quail-inactivate-hook -> quail-deactivate-hook
+**** 'input-method-inactivate-hook' -> 'input-method-deactivate-hook'
+**** 'robin-inactivate-hook' -> 'robin-deactivate-hook'
+**** 'quail-inactivate-hook' -> 'quail-deactivate-hook'
*** Renamed variables
-**** follow-deactive-menu -> follow-inactive-menu
-**** inactivate-current-input-method-function ->
- deactivate-current-input-method-function
+**** 'follow-deactive-menu' -> 'follow-inactive-menu'
+**** 'inactivate-current-input-method-function' ->
+ 'deactivate-current-input-method-function'
** Some obsolete functions, variables, and faces have been removed:
-*** `last-input-char', `last-command-char', `unread-command-char'
-*** `facemenu-unlisted-faces'
-*** `rmail-decode-mime-charset'
-*** `iswitchb-read-buffer'
-*** `sc-version', `sc-submit-bug-report'
-*** `set-char-table-default'
-*** `string-to-sequence' (use `string-to-list' or `string-to-vector')
-*** `compile-internal'
-*** `modeline'
-*** `mode-line-inverse-video'
-*** `follow-mode-off-hook'
-*** `cvs-commit-buffer-require-final-newline'
-(use `log-edit-require-final-newline' instead)
-*** `cvs-changelog-full-paragraphs'
-(use `log-edit-changelog-full-paragraphs' instead)
-*** `cvs-diff-ignore-marks', `cvs-diff-buffer-name'
-*** `vc-ignore-vc-files' (use `vc-handled-backends' instead)
-*** `vc-master-templates' (use `vc-handled-backends' instead)
-*** `vc-checkout-carefully'
+*** 'last-input-char', 'last-command-char', 'unread-command-char'
+*** 'facemenu-unlisted-faces'
+*** 'rmail-decode-mime-charset'
+*** 'iswitchb-read-buffer'
+*** 'sc-version', 'sc-submit-bug-report'
+*** 'set-char-table-default'
+*** 'string-to-sequence' (use 'string-to-list' or 'string-to-vector')
+*** 'compile-internal'
+*** 'modeline'
+*** 'mode-line-inverse-video'
+*** 'follow-mode-off-hook'
+*** 'cvs-commit-buffer-require-final-newline'
+(use 'log-edit-require-final-newline' instead)
+*** 'cvs-changelog-full-paragraphs'
+(use 'log-edit-changelog-full-paragraphs' instead)
+*** 'cvs-diff-ignore-marks', 'cvs-diff-buffer-name'
+*** 'vc-ignore-vc-files' (use 'vc-handled-backends' instead)
+*** 'vc-master-templates' (use 'vc-handled-backends' instead)
+*** 'vc-checkout-carefully'
* Lisp Changes in Emacs 24.3
** CL-style generalized variables are now in core Elisp.
-`setf' is autoloaded; `push' and `pop' accept generalized variables.
-You can define your own generalized variables using `gv-define-simple-setter',
-`gv-define-setter', etc.
+'setf' is autoloaded; 'push' and 'pop' accept generalized variables.
+You can define your own generalized variables using 'gv-define-simple-setter',
+'gv-define-setter', etc.
** Emacs tries to macroexpand interpreted (non-compiled) files during load.
This can significantly speed up execution of non-byte-compiled code,
@@ -2183,108 +2183,108 @@ Try M-x profiler-start, do some work, and then call M-x profiler-report.
When finished, use M-x profiler-stop. The sampling rate can be based on
CPU time or memory allocations.
-** `defun' also accepts a (declare DECLS) form, like `defmacro'.
-The interpretation of the DECLS is determined by `defun-declarations-alist'.
+** 'defun' also accepts a (declare DECLS) form, like 'defmacro'.
+The interpretation of the DECLS is determined by 'defun-declarations-alist'.
-** New macros `setq-local' and `defvar-local'.
+** New macros 'setq-local' and 'defvar-local'.
** Face underlining can now use a wave.
-** `read-regexp' has a new argument HISTORY; the first argument PROMPT
-of `read-regexp' accepts a string ending with a colon and space, and its
-second argument DEFAULTS can be a list of strings accessible via `M-n'
+** 'read-regexp' has a new argument HISTORY; the first argument PROMPT
+of 'read-regexp' accepts a string ending with a colon and space, and its
+second argument DEFAULTS can be a list of strings accessible via 'M-n'
in the minibuffer ahead of other hard-coded useful regexp-related values.
-More commands use `read-regexp' now to read their regexp arguments.
+More commands use 'read-regexp' now to read their regexp arguments.
** Completion
-*** New function `completion-table-with-quoting' to handle completion
+*** New function 'completion-table-with-quoting' to handle completion
in the presence of quoting, such as file completion in shell buffers.
-*** New function `completion-table-subvert' to use an existing completion
+*** New function 'completion-table-subvert' to use an existing completion
table, but with a different prefix.
** Debugger
-*** New error type and new function `user-error'.
+*** New error type and new function 'user-error'.
These do not trigger the debugger.
-*** New option `debugger-bury-or-kill', saying what to do with the
+*** New option 'debugger-bury-or-kill', saying what to do with the
debugger buffer when exiting debug.
-*** Set `debug-on-message' to enter the debugger when a certain
+*** Set 'debug-on-message' to enter the debugger when a certain
message is displayed in the echo area. This can be useful when trying
to work out which code is doing something.
-*** New var `inhibit-debugger', automatically set to prevent accidental
+*** New var 'inhibit-debugger', automatically set to prevent accidental
recursive invocations.
** Window handling
-*** New command `fit-frame-to-buffer' adjusts the frame height to
+*** New command 'fit-frame-to-buffer' adjusts the frame height to
fit the contents.
-*** The command `fit-window-to-buffer' can adjust the frame height
-if the new option `fit-frame-to-buffer' is non-nil.
+*** The command 'fit-window-to-buffer' can adjust the frame height
+if the new option 'fit-frame-to-buffer' is non-nil.
-*** New macro `with-temp-buffer-window', similar to
-`with-output-to-temp-buffer'.
+*** New macro 'with-temp-buffer-window', similar to
+'with-output-to-temp-buffer'.
-*** `temp-buffer-resize-mode' no longer resizes windows that have been
+*** 'temp-buffer-resize-mode' no longer resizes windows that have been
reused.
-*** New option `switch-to-buffer-preserve-window-point' to restore a
+*** New option 'switch-to-buffer-preserve-window-point' to restore a
window's point when switching buffers.
-*** New display action alist entries `window-height' and `window-width'
-specify the size of new windows created by `display-buffer'.
+*** New display action alist entries 'window-height' and 'window-width'
+specify the size of new windows created by 'display-buffer'.
-*** New display action alist entry `pop-up-frame-parameters', if
+*** New display action alist entry 'pop-up-frame-parameters', if
non-nil, specifies frame parameters to give any newly-created frame.
-*** New display action alist entry `inhibit-switch-frame', if non-nil,
+*** New display action alist entry 'inhibit-switch-frame', if non-nil,
tells display action functions to avoid changing which frame is
selected.
-*** New display action alist entry `previous-window', if non-nil,
-specifies window to reuse in `display-buffer-in-previous-window'.
+*** New display action alist entry 'previous-window', if non-nil,
+specifies window to reuse in 'display-buffer-in-previous-window'.
-*** New display action functions `display-buffer-below-selected',
-and `display-buffer-in-previous-window'.
+*** New display action functions 'display-buffer-below-selected',
+and 'display-buffer-in-previous-window'.
-*** The functions `get-lru-window', `get-mru-window' and `get-largest-window'
+*** The functions 'get-lru-window', 'get-mru-window' and 'get-largest-window'
now accept a third argument to avoid choosing the selected window.
-*** Additional values recognized for option `window-combination-limit'.
+*** Additional values recognized for option 'window-combination-limit'.
*** The following variables are obsolete, as they can be replaced by
-appropriate entries in the `display-buffer-alist' function introduced
+appropriate entries in the 'display-buffer-alist' function introduced
in Emacs 24.1:
-**** `dired-shrink-to-fit'
-**** `display-buffer-reuse-frames'
-**** `display-buffer-function'
-**** `special-display-buffer-names'
-**** `special-display-frame-alist'
-**** `special-display-function'
-**** `special-display-regexps'
+**** 'dired-shrink-to-fit'
+**** 'display-buffer-reuse-frames'
+**** 'display-buffer-function'
+**** 'special-display-buffer-names'
+**** 'special-display-frame-alist'
+**** 'special-display-function'
+**** 'special-display-regexps'
** Time
-*** `current-time-string' no longer requires that its argument's year
+*** 'current-time-string' no longer requires that its argument's year
must be in the range 1000..9999. It now works with any year supported
by the underlying C implementation.
-*** `current-time' now returns extended-format time stamps
+*** 'current-time' now returns extended-format time stamps
(HIGH LOW USEC PSEC), where the new PSEC slot specifies picoseconds.
PSEC is typically a multiple of 1000 on current machines. Other
-functions that use this format, such as `file-attributes' and
-`format-time-string', have been changed accordingly. Old-format time
+functions that use this format, such as 'file-attributes' and
+'format-time-string', have been changed accordingly. Old-format time
stamps are still accepted.
-*** The format of timers in `timer-list' and `timer-idle-list' is now
+*** The format of timers in 'timer-list' and 'timer-idle-list' is now
[TRIGGERED-P HI-SECS LO-SECS USECS REPEAT-DELAY FUNCTION ARGS IDLE-DELAY PSECS].
The PSECS slot is new, and uses picosecond resolution. It can be
-accessed via the new `timer--psecs' accessor.
+accessed via the new 'timer--psecs' accessor.
*** Last-modified time stamps in undo lists now are of the form
(t HI-SECS LO-SECS USECS PSECS) instead of (t HI-SECS . LO-SECS).
@@ -2293,7 +2293,7 @@ accessed via the new `timer--psecs' accessor.
*** Improved security when handling persistent objects:
-**** `eieio-persistent-read' now features optional arguments for specifying
+**** 'eieio-persistent-read' now features optional arguments for specifying
the class to load, as well as a flag stating whether subclasses are allowed;
if provided, other classes will be rejected by the reader. For
compatibility with existing code, if the class is omitted only a
@@ -2305,74 +2305,74 @@ without evaluation of suspicious code.
**** All slots that contain objects must have a :type. Slots with lists
of objects must use a new type predicate for a list of an object type.
-*** Support for `find-function' and similar utilities, through the addition
+*** Support for 'find-function' and similar utilities, through the addition
of filename support to generated symbols.
** Floating point functions now always return special values like NaN,
instead of signaling errors, if given invalid args; e.g., (log -1.0).
Previously, they returned NaNs on some platforms but signaled errors
-on others. The affected functions are acos, asin, tan, exp, expt,
-log, log10, sqrt, and mod.
+on others. The affected functions are 'acos', 'asin', 'tan', 'exp', 'expt',
+'log', 'log10', 'sqrt', and 'mod'.
-** New fringe bitmap `exclamation-mark'.
+** New fringe bitmap 'exclamation-mark'.
** Miscellaneous changes to special forms and macros
-*** `defun' and `defmacro' are now macros rather than special forms.
+*** 'defun' and 'defmacro' are now macros rather than special forms.
-*** `kbd' is now a function rather than a macro.
+*** 'kbd' is now a function rather than a macro.
** Miscellaneous new functions
-*** `set-temporary-overlay-map' sets up a temporary keymap that
+*** 'set-temporary-overlay-map' sets up a temporary keymap that
takes precedence over most other maps for a short while (normally one key).
-*** `autoloadp' tests if its argument is an autoloaded object.
+*** 'autoloadp' tests if its argument is an autoloaded object.
-*** `autoload-do-load' performs the autoloading operation.
+*** 'autoload-do-load' performs the autoloading operation.
-*** `buffer-narrowed-p' tests if the buffer is narrowed.
+*** 'buffer-narrowed-p' tests if the buffer is narrowed.
-*** `file-name-base' returns a file name sans directory and extension.
+*** 'file-name-base' returns a file name sans directory and extension.
-*** `function-get' fetches a function property, following aliases.
+*** 'function-get' fetches a function property, following aliases.
-*** `posnp' tests if an object is a `posn'.
+*** 'posnp' tests if an object is a 'posn'.
-*** `system-users' returns the user names on the system.
+*** 'system-users' returns the user names on the system.
-*** `system-groups' returns the group names on the system.
+*** 'system-groups' returns the group names on the system.
-*** `tty-top-frame' returns the topmost frame of a text terminal.
+*** 'tty-top-frame' returns the topmost frame of a text terminal.
** The following functions and variables are obsolete:
-*** `automount-dir-prefix' (use `directory-abbrev-alist')
-*** `buffer-has-markers-at'
-*** `macro-declaration-function' (use `macro-declarations-alist')
-*** `window-system-version' (provides no useful information)
-*** `dired-pop-to-buffer' (use `dired-mark-pop-up')
-*** `query-replace-interactive'
-*** `font-list-limit' (has had no effect since Emacs < 23)
+*** 'automount-dir-prefix' (use 'directory-abbrev-alist')
+*** 'buffer-has-markers-at'
+*** 'macro-declaration-function' (use 'macro-declarations-alist')
+*** 'window-system-version' (provides no useful information)
+*** 'dired-pop-to-buffer' (use 'dired-mark-pop-up')
+*** 'query-replace-interactive'
+*** 'font-list-limit' (has had no effect since Emacs < 23)
* Changes in Emacs 24.3 on Non-Free Operating Systems
** Cygwin builds can use the native MS Windows user interface.
-Pass `--with-w32' to configure. The default remains the X11 interface.
+Pass '--with-w32' to configure. The default remains the X11 interface.
** Two new functions are available in Cygwin builds:
-`cygwin-convert-file-name-from-windows' and
-`cygwin-convert-file-name-to-windows'. These functions allow Lisp
+'cygwin-convert-file-name-from-windows' and
+'cygwin-convert-file-name-to-windows'. These functions allow Lisp
code to access the Cygwin file-name mapping machinery to convert
between Cygwin and Windows-native file and directory names.
** When invoked with the -nw switch to run on the Windows text-mode terminal,
-Emacs now supports `mouse-highlight', help-echo (in the echo area), and
-`mouse-autoselect-window'.
+Emacs now supports 'mouse-highlight', help-echo (in the echo area), and
+'mouse-autoselect-window'.
** On MS Windows Vista and later Emacs now supports symbolic links.
-** On MS Windows, you can pass `--without-libxml2' to configure.bat to omit
+** On MS Windows, you can pass '--without-libxml2' to configure.bat to omit
support for libxml2, even if its presence is detected.
** On OS X, the Nextstep port requires Mac OS X 10.4 or later.
@@ -2396,23 +2396,23 @@ also depend on Gtk+. You can disable them with --without-rsvg and
** Emacs can be compiled with GnuTLS support.
This happens by default if a suitably recent version of the library is
found at build time. To prevent this, use the configure option
-`--without-gnutls'. See below for GnuTLS features.
+'--without-gnutls'. See below for GnuTLS features.
** Emacs can be compiled with SELinux support.
This happens by default if a suitably recent version of the library is
found at build time. To prevent this, use the configure option
-`--without-selinux'. See below for SELinux features.
+'--without-selinux'. See below for SELinux features.
** Emacs can be compiled with ImageMagick support.
This happens by default if a suitably recent version of the library is
found at build time. To prevent this, use the configure option
-`--without-imagemagick'. See below for ImageMagick features.
+'--without-imagemagick'. See below for ImageMagick features.
This feature is not available for the Nextstep or MS ports.
** Emacs can be compiled with libxml2 support.
This happens by default if a suitably recent version of the library is
found at build time. To prevent this, use the configure option
-`--without-xml2'. See below for libxml2 features.
+'--without-xml2'. See below for libxml2 features.
** By default, the installed Info and man pages are compressed.
You can disable this by configuring --without-compress-info.
@@ -2431,9 +2431,9 @@ This is only useful for Emacs developers to debug certain types of bugs.
This is not a new feature; only the configure flag is new.
** The standalone programs digest-doc and sorted-doc are removed.
-Emacs now uses Lisp commands `doc-file-to-man' and `doc-file-to-info'.
+Emacs now uses Lisp commands 'doc-file-to-man' and 'doc-file-to-info'.
-** The standalone program `fakemail' is removed.
+** The standalone program 'fakemail' is removed.
If you need it, feedmail.el provides a superset of the functionality.
@@ -2443,7 +2443,7 @@ If you need it, feedmail.el provides a superset of the functionality.
command line arguments, and the EMACS_UNIBYTE environment variable, no
longer have any effect. (They were declared obsolete in Emacs 23.)
-** New command line option `--no-site-lisp' removes site-lisp directories
+** New command line option '--no-site-lisp' removes site-lisp directories
from load-path. -Q now implies this. This option does not affect the
EMACSLOADPATH environment variable (and hence has no effect for
Nextstep builds).
@@ -2453,35 +2453,35 @@ Nextstep builds).
** Completion
-*** Many packages now use the `completion-at-point' command,
+*** Many packages now use the 'completion-at-point' command,
rather than implementing separate completion commands.
-*** `completion-at-point' now handles tags and semantic completion.
+*** 'completion-at-point' now handles tags and semantic completion.
*** Completion in a non-minibuffer now tries to detect the end of completion
and pops down the *Completions* buffer accordingly.
-*** New option `completion-cycle-threshold' allows completion cycling.
+*** New option 'completion-cycle-threshold' allows completion cycling.
-*** New option `completion-category-overrides' for overriding the
+*** New option 'completion-category-overrides' for overriding the
default completion style in certain circumstances.
-*** New completion style `substring'.
+*** New completion style 'substring'.
-*** Completion of buffer names uses `substring' completion by default.
+*** Completion of buffer names uses 'substring' completion by default.
-*** The option `widget-complete-field' has been removed.
+*** The option 'widget-complete-field' has been removed.
** Mail changes
*** The first time you try sending mail, Emacs asks for a mail method.
-This is implemented by a new default for `send-mail-function', which
-is `sendmail-query-once'. This offers to use the smtpmail package, or
+This is implemented by a new default for 'send-mail-function', which
+is 'sendmail-query-once'. This offers to use the smtpmail package, or
to use the old defaults relying on external mail facilities
-(`sendmail-send-it' on GNU/Linux and other Unix-like systems, and
-`mailclient-send-it' on Windows).
+('sendmail-send-it' on GNU/Linux and other Unix-like systems, and
+'mailclient-send-it' on Windows).
-*** Typing `C-c m' in the buffer made by `M-x report-emacs-bug'
+*** Typing 'C-c m' in the buffer made by 'M-x report-emacs-bug'
transfers the report to your desktop's preferred mail client, if there
is one. This uses either the "xdg-email" utility, or Mac OS's "open"
command.
@@ -2491,7 +2491,7 @@ and Mail mode changes
** Emacs server and client changes
-*** New option `server-port' specifies the port for TCP Emacs servers.
+*** New option 'server-port' specifies the port for TCP Emacs servers.
*** New emacsclient argument -q/--quiet suppresses some status messages.
@@ -2514,13 +2514,13 @@ scripts. The display reordering is a "full bidirectionality" class
implementation of the Unicode Bidirectional Algorithm (UBA). Buffers
with no RTL text should look exactly the same as before.
-**** New buffer-local variable `bidi-display-reordering'.
+**** New buffer-local variable 'bidi-display-reordering'.
To disable display reordering in a buffer, change this to nil.
-**** New buffer-local variable `bidi-paragraph-direction'.
+**** New buffer-local variable 'bidi-paragraph-direction'.
If nil (the default), Emacs determines the base direction of each
paragraph from its text, as specified by the UBA. Setting the value
-to `right-to-left' or `left-to-right' forces a base direction on each
+to 'right-to-left' or 'left-to-right' forces a base direction on each
paragraph.
Paragraphs with right-to-left base direction are displayed starting at
@@ -2528,18 +2528,18 @@ the right window edge.
*** Enhanced support for characters with no glyphs in available fonts,
or, on text terminals, characters that cannot be encoded by the
-terminal coding system. The new option `glyphless-char-display-control'
+terminal coding system. The new option 'glyphless-char-display-control'
specifies how to display them: as a hexadecimal code in a box, a thin
1-pixel space, an empty box, etc.
*** New input methods for Farsi and Bulgarian
(farsi-isiri-9147, farsi-transliterate-banan, bulgarian-alt-phonetic).
-*** `nobreak-char-display' now also highlights Unicode hyphen chars
+*** 'nobreak-char-display' now also highlights Unicode hyphen chars
(U+2010 and U+2011).
*** New Hebrew translation of the Emacs Tutorial.
-Type `C-u C-h t' to choose it in case your language setup doesn't
+Type 'C-u C-h t' to choose it in case your language setup doesn't
automatically select it.
** An Emacs Lisp package manager is now included.
@@ -2549,36 +2549,36 @@ from a package repository at https://elpa.gnu.org.
*** M-x list-packages shows a list of packages, which can be
selected for installation.
-*** New command `describe-package', bound to `C-h P'.
+*** New command 'describe-package', bound to 'C-h P'.
*** By default, all installed packages are loaded automatically when
-Emacs starts up. To disable this, set `package-enable-at-startup' to
-nil. To specify the packages to load, customize `package-load-list'.
+Emacs starts up. To disable this, set 'package-enable-at-startup' to
+nil. To specify the packages to load, customize 'package-load-list'.
** Custom theme changes
-*** New command `M-x customize-themes', which provides a convenient
+*** New command 'M-x customize-themes', which provides a convenient
interface for enabling and disabling Custom themes.
-*** New option `custom-theme-load-path' is the load path for themes.
-Emacs no longer looks for Custom themes in `load-path'. The default
-value of `custom-theme-load-path' says to look for themes in
-`custom-theme-directory', followed by a subdirectory of
-`data-directory' named "themes/", which contains a small selection of
+*** New option 'custom-theme-load-path' is the load path for themes.
+Emacs no longer looks for Custom themes in 'load-path'. The default
+value of 'custom-theme-load-path' says to look for themes in
+'custom-theme-directory', followed by a subdirectory of
+'data-directory' named "themes/", which contains a small selection of
built-in Custom themes.
-*** New option `custom-safe-themes' records known-safe theme files.
+*** New option 'custom-safe-themes' records known-safe theme files.
If a theme is not in this list, Emacs queries before loading it, and
-offers to save the theme to `custom-safe-themes' automatically. By
+offers to save the theme to 'custom-safe-themes' automatically. By
default, all themes included in Emacs are treated as safe.
** Improved GTK integration
*** GTK scroll-bars are now placed on the right by default.
-The function `set-scroll-bar-mode' can change this.
+The function 'set-scroll-bar-mode' can change this.
*** GTK tool bars can have just text, just images or images and text.
-Customize `tool-bar-style' to choose the style. On a Gnome desktop,
+Customize 'tool-bar-style' to choose the style. On a Gnome desktop,
the default is taken from desktop settings.
*** GTK tool bars can be placed on any edge of the frame.
@@ -2586,11 +2586,11 @@ The frame-parameter tool-bar-position controls this. It takes the
values top, left, right or bottom. The Options => Show/Hide menu has
entries for this.
-*** The default colors for selected text (the `region' face) are taken
+*** The default colors for selected text (the 'region' face) are taken
from the GTK theme when Emacs is built with GTK.
*** Emacs uses GTK tooltips by default if built with GTK.
-You can disable this by changing `x-gtk-use-system-tooltips' to nil.
+You can disable this by changing 'x-gtk-use-system-tooltips' to nil.
** Graphical interface changes
@@ -2598,8 +2598,8 @@ You can disable this by changing `x-gtk-use-system-tooltips' to nil.
Also, the first dash (which does not indicate anything) is just
displayed as a space.
-*** `menu-bar-select-buffer-function' lets you choose another operation
-instead of `switch-to-buffer' when selecting an item in the Buffers menu.
+*** 'menu-bar-select-buffer-function' lets you choose another operation
+instead of 'switch-to-buffer' when selecting an item in the Buffers menu.
*** Lucid menus and dialogs can display antialiased fonts if Emacs is
built with Xft. These fonts can be set via X resources, for example:
@@ -2607,37 +2607,37 @@ Emacs.pane.menubar.font: Courier-12
** Exiting changes
-*** Emacs now calls `kill-emacs' if it receives SIGTERM or SIGHUP,
+*** Emacs now calls 'kill-emacs' if it receives SIGTERM or SIGHUP,
or if it receives a SIGINT signal in batch mode.
-*** `kill-emacs-hook' is now also run in batch mode.
-Third-party code which adds to `kill-emacs-hook' should check if they
+*** 'kill-emacs-hook' is now also run in batch mode.
+Third-party code which adds to 'kill-emacs-hook' should check if they
do the right thing in batch mode.
** Scrolling changes
-*** New scrolling commands `scroll-up-command' and `scroll-down-command'
+*** New scrolling commands 'scroll-up-command' and 'scroll-down-command'
(bound to C-v/[next] and M-v/[prior]) do not signal errors at top/bottom
of buffer at first key-press (instead they move to top/bottom of buffer)
-when `scroll-error-top-bottom' is non-nil.
+when 'scroll-error-top-bottom' is non-nil.
-*** New option `scroll-error-top-bottom' (see above).
+*** New option 'scroll-error-top-bottom' (see above).
-*** New scrolling commands `scroll-up-line' and `scroll-down-line'
+*** New scrolling commands 'scroll-up-line' and 'scroll-down-line'
scroll a line instead of full screen.
-*** New property `scroll-command' should be set on a command's symbol to
-define it as a scroll command affected by `scroll-preserve-screen-position'.
+*** New property 'scroll-command' should be set on a command's symbol to
+define it as a scroll command affected by 'scroll-preserve-screen-position'.
-*** If you customize `scroll-conservatively' to a value greater than 100,
+*** If you customize 'scroll-conservatively' to a value greater than 100,
Emacs will never recenter point in the window when it scrolls due to
-cursor motion commands or commands that move point (e.f., `M-g M-g').
-Previously, you needed to use `most-positive-fixnum' as the value of
-`scroll-conservatively' to achieve the same effect.
+cursor motion commands or commands that move point (e.f., 'M-g M-g').
+Previously, you needed to use 'most-positive-fixnum' as the value of
+'scroll-conservatively' to achieve the same effect.
*** "Aggressive" scrolling now honors the scroll margins.
-If you customize `scroll-up-aggressively' or
-`scroll-down-aggressively' and move point off the window, Emacs now
+If you customize 'scroll-up-aggressively' or
+'scroll-down-aggressively' and move point off the window, Emacs now
scrolls the window so as to avoid positioning point inside the scroll
margin.
@@ -2645,20 +2645,20 @@ margin.
This requires Emacs to be linked with libselinux at build time.
*** Emacs preserves the SELinux file context when backing up.
-Also, the function `copy-file' has an extra optional argument for
-preserving SELinux context, and the return value of `backup-buffer'
+Also, the function 'copy-file' has an extra optional argument for
+preserving SELinux context, and the return value of 'backup-buffer'
now includes the SELinux context.
-*** New functions `file-selinux-context' and `set-file-selinux-context'
+*** New functions 'file-selinux-context' and 'set-file-selinux-context'
get and set the SELinux context of a file.
** Trash changes
-*** `delete-by-moving-to-trash' now only affects commands that specify
+*** 'delete-by-moving-to-trash' now only affects commands that specify
trashing. This avoids inadvertently trashing temporary files.
-*** Calling `delete-file' or `delete-directory' with a prefix argument
-now forces true deletion, regardless of `delete-by-moving-to-trash'.
+*** Calling 'delete-file' or 'delete-directory' with a prefix argument
+now forces true deletion, regardless of 'delete-by-moving-to-trash'.
** File- and directory-local variable changes
@@ -2670,124 +2670,124 @@ subdirectories.
*** Directory local variables can apply to some file-less buffers.
Affected modes include dired, vc-dir, and log-edit. For example,
adding "(diff-mode . ((mode . whitespace)))" to .dir-locals.el will
-turn on `whitespace-mode' for *vc-diff* buffers. Modes should call
-`hack-dir-local-variables-non-file-buffer' to support this.
+turn on 'whitespace-mode' for *vc-diff* buffers. Modes should call
+'hack-dir-local-variables-non-file-buffer' to support this.
*** Using "mode: MINOR-MODE" to enable a minor mode is deprecated.
Instead, use "eval: (minor-mode 1)".
-*** The variable `inhibit-first-line-modes-regexps' has been renamed
-to `inhibit-local-variables-regexps'. As the name suggests, it now
+*** The variable 'inhibit-first-line-modes-regexps' has been renamed
+to 'inhibit-local-variables-regexps'. As the name suggests, it now
applies to ALL file local variables, not just -*- lines. The
-associated `inhibit-first-line-modes-suffixes' has been renamed in the
+associated 'inhibit-first-line-modes-suffixes' has been renamed in the
corresponding way.
** Window changes
-*** The `quit-window' command now restores the last buffer displayed
+*** The 'quit-window' command now restores the last buffer displayed
in the quitted window.
*** Resizing an Emacs frame now preserves proportional window sizes,
modulo restrictions like window minimum sizes and fixed-size windows.
-*** The behavior of `display-buffer' is now customizable in detail.
+*** The behavior of 'display-buffer' is now customizable in detail.
-**** New option `display-buffer-base-action' specifies a list of
+**** New option 'display-buffer-base-action' specifies a list of
user-determined display "actions" (functions and optional arguments
for choosing the displaying window).
This takes precedence over the default display action, which is
-specified by `display-buffer-fallback-action'.
+specified by 'display-buffer-fallback-action'.
-**** New option `display-buffer-alist' maps buffer name regexps to
-display actions, taking precedence over `display-buffer-base-action'.
+**** New option 'display-buffer-alist' maps buffer name regexps to
+display actions, taking precedence over 'display-buffer-base-action'.
-*** New option `window-combination-limit'.
-The new option `window-combination-limit' allows to return the space
+*** New option 'window-combination-limit'.
+The new option 'window-combination-limit' allows to return the space
obtained for resizing or creating a window more reliably to the window
from which such space was obtained.
-*** New option `window-combination-resize'.
-The new option `window-combination-resize' allows to split a window that
+*** New option 'window-combination-resize'.
+The new option 'window-combination-resize' allows to split a window that
otherwise cannot be split because it's too small by stealing space from
other windows in the same combination. Subsequent resizing or deletion
of the window will resize all windows in the same combination as well.
-*** New option `frame-auto-hide-function' lets you choose between
+*** New option 'frame-auto-hide-function' lets you choose between
iconifying or deleting a frame when burying a buffer in a dedicated
frame, or quitting a window showing a buffer in a frame of its own.
-*** New commands `maximize-window' and `minimize-window'.
+*** New commands 'maximize-window' and 'minimize-window'.
These maximize and minimize the size of a window within its frame.
-*** New commands `switch-to-prev-buffer' and `switch-to-next-buffer'.
+*** New commands 'switch-to-prev-buffer' and 'switch-to-next-buffer'.
These functions allow to navigate through the live buffers that have
been shown in a specific window.
** Minibuffer changes
-*** The inactive minibuffer has its own major mode `minibuffer-inactive-mode'.
+*** The inactive minibuffer has its own major mode 'minibuffer-inactive-mode'.
This is handy for minibuffer-only frames, and is also used for the feature
where mouse-1 pops up *Messages*"', which can now easily be changed.
-*** Minibuffers set `truncate-lines' to nil.
+*** Minibuffers set 'truncate-lines' to nil.
If you want to change the value to something else, you could use
-for example `minibuffer-setup-hook'.
+for example 'minibuffer-setup-hook'.
-** `auto-mode-case-fold' is now enabled by default.
+** 'auto-mode-case-fold' is now enabled by default.
-** `backup-by-copying-when-mismatch' now defaults to t.
+** 'backup-by-copying-when-mismatch' now defaults to t.
-** New basic faces `error', `warning', `success'.
+** New basic faces 'error', 'warning', 'success'.
These are used to highlight text indicating failure, caution or
successful operation.
-** New option `list-colors-sort' defines the color sort order
-for `list-colors-display'.
+** New option 'list-colors-sort' defines the color sort order
+for 'list-colors-display'.
-** The variable `focus-follows-mouse' now always defaults to nil.
+** The variable 'focus-follows-mouse' now always defaults to nil.
* Editing Changes in Emacs 24.1
** Search changes
-*** C-y in Isearch is now bound to `isearch-yank-kill', instead of
-`isearch-yank-line'.
+*** C-y in Isearch is now bound to 'isearch-yank-kill', instead of
+'isearch-yank-line'.
-*** M-y in Isearch is now bound to `isearch-yank-pop', instead of
-`isearch-yank-kill'.
+*** M-y in Isearch is now bound to 'isearch-yank-pop', instead of
+'isearch-yank-kill'.
-*** M-s C-e in Isearch is now bound to `isearch-yank-line'.
+*** M-s C-e in Isearch is now bound to 'isearch-yank-line'.
-** New commands `count-words-region' and `count-words'.
+** New commands 'count-words-region' and 'count-words'.
-*** M-= is bound to `count-words-region', not `count-lines-region'.
-The `count-words-region' command, when called interactively, reports
+*** M-= is bound to 'count-words-region', not 'count-lines-region'.
+The 'count-words-region' command, when called interactively, reports
the number of lines, words, and characters in the region. It is a
-superset of the old `count-lines-region', which is now an obsolete
+superset of the old 'count-lines-region', which is now an obsolete
alias for it.
-** The command `just-one-space' (M-SPC), if given a negative argument,
+** The command 'just-one-space' (M-SPC), if given a negative argument,
also deletes newlines around point.
** Deletion changes
-*** New option `delete-active-region'.
+*** New option 'delete-active-region'.
If non-nil, [delete] and DEL delete the region if it is active and no
-prefix argument is given. If set to `kill', those commands kill
+prefix argument is given. If set to 'kill', those commands kill
instead.
-*** New command `delete-forward-char', bound to [delete].
-This is meant for interactive use, and obeys `delete-active-region'.
-The command `delete-char' does not obey `delete-active-region'.
+*** New command 'delete-forward-char', bound to [delete].
+This is meant for interactive use, and obeys 'delete-active-region'.
+The command 'delete-char' does not obey 'delete-active-region'.
-*** `delete-backward-char' is now a Lisp function.
-Apart from obeying `delete-active-region', its behavior is unchanged.
+*** 'delete-backward-char' is now a Lisp function.
+Apart from obeying 'delete-active-region', its behavior is unchanged.
However, the byte compiler now warns if it is called from Lisp; Lisp
callers should use delete-char with a negative argument instead.
-*** The option `mouse-region-delete-keys' has been deleted.
+*** The option 'mouse-region-delete-keys' has been deleted.
** Selection changes.
@@ -2799,70 +2799,70 @@ mouse commands use the primary selection.
In the following, we provide a list of these changes, followed by a
list of steps to get the old behavior back if you prefer that.
-*** `select-active-regions' now defaults to t.
+*** 'select-active-regions' now defaults to t.
Merely selecting text (e.g. with drag-mouse-1) no longer puts it in
the kill ring. The selected text is put in the primary selection, if
the system possesses a separate primary selection facility (e.g. X).
-**** `select-active-regions' also accepts a new value, `only'.
+**** 'select-active-regions' also accepts a new value, 'only'.
This means to only set the primary selection for temporarily active
regions (usually made by mouse-dragging or shift-selection);
"ordinary" active regions, such as those made with C-SPC followed by
point motion, do not alter the primary selection.
-**** `mouse-drag-copy-region' now defaults to nil.
+**** 'mouse-drag-copy-region' now defaults to nil.
-*** mouse-2 is now bound to `mouse-yank-primary'.
+*** mouse-2 is now bound to 'mouse-yank-primary'.
This pastes from the primary selection, ignoring the kill-ring.
-Previously, mouse-2 was bound to `mouse-yank-at-click'.
+Previously, mouse-2 was bound to 'mouse-yank-at-click'.
-*** `x-select-enable-clipboard' now defaults to t on all platforms.
+*** 'x-select-enable-clipboard' now defaults to t on all platforms.
-*** `x-select-enable-primary' now defaults to nil.
+*** 'x-select-enable-primary' now defaults to nil.
Thus, commands that kill text or copy it to the kill-ring (such as
M-w, C-w, and C-k) also use the clipboard---not the primary selection.
**** The "Copy", "Cut", and "Paste" items in the "Edit" menu are now
exactly equivalent to M-w, C-w, and C-y respectively.
-**** Note that on MS-Windows, `x-select-enable-clipboard' was already
+**** Note that on MS-Windows, 'x-select-enable-clipboard' was already
non-nil by default, as Windows does not support the primary selection
between applications.
*** To return to the previous behavior, do the following:
-**** Change `select-active-regions' to nil.
-**** Change `mouse-drag-copy-region' to t.
-**** Change `x-select-enable-primary' to t (on X only).
-**** Change `x-select-enable-clipboard' to nil.
-**** Bind `mouse-yank-at-click' to mouse-2.
+**** Change 'select-active-regions' to nil.
+**** Change 'mouse-drag-copy-region' to t.
+**** Change 'x-select-enable-primary' to t (on X only).
+**** Change 'x-select-enable-clipboard' to nil.
+**** Bind 'mouse-yank-at-click' to mouse-2.
*** Support for X cut buffers has been removed.
*** X clipboard managers are now supported.
-To inhibit this, change `x-select-enable-clipboard-manager' to nil.
+To inhibit this, change 'x-select-enable-clipboard-manager' to nil.
-** New command `C-x r N' (`rectangle-number-lines') numbers the lines
+** New command 'C-x r N' ('rectangle-number-lines') numbers the lines
in the current rectangle. With a prefix argument, this prompts for a
number to count from and for a format string.
-** `redisplay-dont-pause' now defaults to t.
+** 'redisplay-dont-pause' now defaults to t.
This makes Emacs feel more responsive to editing commands that arrive
at high rate, e.g. if you lean on some key, because stopping redisplay
in the middle (when this variable is nil) forces more expensive
updates later on, and Emacs appears to be unable to keep up.
** The behavior of <TAB> for active regions in Text mode has changed.
-In Text and related modes, typing <TAB> (`indent-for-tab-command')
+In Text and related modes, typing <TAB> ('indent-for-tab-command')
when the region is active causes Emacs to indent all the lines in the
region, aligning them with the line previous to the first line in the
region (or with the left margin if there is no previous line).
-** When `occur' is called with a prefix argument, matching strings are
-collected into the `*Occur*' buffer without line numbers. If there
-are parenthesized subexpressions in the specified regexp, `occur'
+** When 'occur' is called with a prefix argument, matching strings are
+collected into the '*Occur*' buffer without line numbers. If there
+are parenthesized subexpressions in the specified regexp, 'occur'
reads replacement text that may contain \\& and \\N whose convention
-follows `replace-match'.
+follows 'replace-match'.
* Changes in Specialized Modes and Packages in Emacs 24.1
@@ -2872,19 +2872,19 @@ follows `replace-match'.
** BibTeX mode
*** BibTeX mode now supports biblatex.
-Use the variable `bibtex-dialect' to select different BibTeX dialects.
-`bibtex-entry-field-alist' is now an obsolete alias for
-`bibtex-BibTeX-entry-alist'.
+Use the variable 'bibtex-dialect' to select different BibTeX dialects.
+'bibtex-entry-field-alist' is now an obsolete alias for
+'bibtex-BibTeX-entry-alist'.
-*** New command `bibtex-search-entries', bound to C-c C-a.
+*** New command 'bibtex-search-entries', bound to C-c C-a.
-*** New `bibtex-entry-format' option `sort-fields', disabled by default.
+*** New 'bibtex-entry-format' option 'sort-fields', disabled by default.
-*** New variable `bibtex-search-entry-globally'.
+*** New variable 'bibtex-search-entry-globally'.
** Browse-url
-*** New option `browse-url-mailto-function' specifies how to handle "mailto:"s.
+*** New option 'browse-url-mailto-function' specifies how to handle "mailto:"s.
*** The default browser used by the package is now the "xdg-open" program,
on platforms that support it. This calls your desktop's preferred browser.
@@ -2900,32 +2900,32 @@ using TeX or LaTeX mode.
*** New option to highlight selections using faces.
-*** `calc-histogram' has the option of using a vector to determine the bins.
+*** 'calc-histogram' has the option of using a vector to determine the bins.
*** New "O" option prefix.
-*** Use the "O" prefix to "d r" (`calc-radix') to turn on twos-complement mode.
+*** Use the "O" prefix to "d r" ('calc-radix') to turn on twos-complement mode.
** Calendar, Diary, and Appt
*** Diary entries can contain non-printing "comments".
-See the variable `diary-comment-start'.
+See the variable 'diary-comment-start'.
*** Appointments can specify their individual warning times.
-See the variable `appt-warning-time-regexp'.
+See the variable 'appt-warning-time-regexp'.
-*** The function specified by `appt-disp-window-function' may be passed
+*** The function specified by 'appt-disp-window-function' may be passed
lists of arguments if multiple appointments are due at similar times.
If you are using a custom function for this, you should update it.
-*** New function `diary-hebrew-birthday'.
+*** New function 'diary-hebrew-birthday'.
-*** Elements of `calendar-day-abbrev-array' and `calendar-month-abbrev-array'
+*** Elements of 'calendar-day-abbrev-array' and 'calendar-month-abbrev-array'
may no longer be nil, but must all be strings.
*** The obsolete (since Emacs 22.1) method of enabling the appt
-package by adding `appt-make-list' to `diary-hook' has been removed.
-Use `appt-activate' instead.
+package by adding 'appt-make-list' to 'diary-hook' has been removed.
+Use 'appt-activate' instead.
*** Some appt variables (obsolete since Emacs 22.1) have been removed:
appt-issue-message (use the function appt-activate)
@@ -2941,7 +2941,7 @@ The main entry point is M-x c-guess.
*** Java Mode now supports Java 5.0 (Tiger) and 6 (Mustang).
-*** `c-beginning-of-defun' and `c-end-of-defun' now respect nested scopes.
+*** 'c-beginning-of-defun' and 'c-end-of-defun' now respect nested scopes.
Thus C-M-a will, by default, go to the beginning of the immediate function,
not the top level.
@@ -2954,13 +2954,13 @@ parsed as a statement continuation.
** Compilation mode
*** Compilation mode can be used without Font Lock mode.
-`compilation-parse-errors-function' is now obsolete.
+'compilation-parse-errors-function' is now obsolete.
-*** New variable `compilation-filter-start', which is bound while
-`compilation-filter-hook' runs. It records the start position of the
-text inserted by `compilation-filter'.
+*** New variable 'compilation-filter-start', which is bound while
+'compilation-filter-hook' runs. It records the start position of the
+text inserted by 'compilation-filter'.
-*** `compilation-error-screen-columns' and `compilation-first-column'
+*** 'compilation-error-screen-columns' and 'compilation-first-column'
are obeyed in the editing buffer. So programming language modes can
set them, whereas previously only the value in the *Compilation*
buffer was used.
@@ -2968,31 +2968,31 @@ buffer was used.
** Customize
*** Customize buffers now contain a search field.
-The search is performed using `customize-apropos'.
-To turn off the search field, set `custom-search-field' to nil.
+The search is performed using 'customize-apropos'.
+To turn off the search field, set 'custom-search-field' to nil.
*** Options in customize group buffers start out hidden if not customized.
Use the arrow to the left of the option name to toggle visibility.
-*** custom-buffer-sort-alphabetically now defaults to t.
+*** 'custom-buffer-sort-alphabetically' now defaults to t.
*** The color widget now has a "Choose" button, which allows you to
-choose a color via `list-colors-display'.
+choose a color via 'list-colors-display'.
** D-Bus
*** It is now possible to access buses other than the default system
or session bus.
-*** The `dbus-register-method' and `dbus-register-property' functions
+*** The 'dbus-register-method' and 'dbus-register-property' functions
optionally do not register names.
-*** The new function `dbus-register-service' registers a known service
+*** The new function 'dbus-register-service' registers a known service
name on a D-Bus without also registering a property or a method.
** Dired-x
-*** C-x C-j (`dired-jump') and C-x 4 C-j (`dired-jump-other-window'),
+*** C-x C-j ('dired-jump') and C-x 4 C-j ('dired-jump-other-window'),
if called with a prefix argument, read a file name from the minibuffer
instead of using the current buffer.
@@ -3001,18 +3001,18 @@ The standard directory local variables feature replaces it.
** ERC changes
-*** New options `erc-autojoin-timing' and `erc-autojoin-delay',
+*** New options 'erc-autojoin-timing' and 'erc-autojoin-delay',
controlling attempts to autojoin a channel.
-*** New variable `erc-coding-system-precedence': If we use `undecided'
+*** New variable 'erc-coding-system-precedence': If we use 'undecided'
as the server coding system, this variable will then be consulted.
The default is to decode strings that can be decoded as utf-8 as
-utf-8, and do the normal `undecided' decoding for the rest.
+utf-8, and do the normal 'undecided' decoding for the rest.
** Eshell changes
-*** The default value of `eshell-directory-name' has changed
-to be an "eshell" directory in `user-emacs-directory'.
+*** The default value of 'eshell-directory-name' has changed
+to be an "eshell" directory in 'user-emacs-directory'.
The old "~/.eshell/" directory is still used if it exists, though.
** gdb-mi
@@ -3023,8 +3023,8 @@ debugging of several threads.
** Image mode
-*** RET (`image-toggle-animation') toggles animation, if applicable.
-Animation plays once, unless the option `image-animate-loop' is non-nil.
+*** RET ('image-toggle-animation') toggles animation, if applicable.
+Animation plays once, unless the option 'image-animate-loop' is non-nil.
** Info
@@ -3034,9 +3034,9 @@ that buffer. (This is handy if you have many manuals in many *info*
buffers, and don't remember the name of the buffer visiting the manual
you want to consult.) Otherwise, it loads and displays the manual.
-*** `e' is now bound to `end-of-buffer' rather than to `Info-edit'.
+*** 'e' is now bound to 'end-of-buffer' rather than to 'Info-edit'.
This is for compatibility with the stand-alone Info reader program,
-and also because `Info-edit' is a rarely used command that is disabled
+and also because 'Info-edit' is a rarely used command that is disabled
by default.
** Mail mode changes (not Message mode)
@@ -3054,9 +3054,9 @@ See MH-E-NEWS for details.
** mpc.el: Can use pseudo tags of the form tag1|tag2 as a union of two tags.
-** nXML mode no longer binds C-RET to `nxml-complete'.
-Completion is now performed via `completion-at-point', bound to C-M-i
-or M-TAB. If `nxml-bind-meta-tab-to-complete-flag' is non-nil (the
+** nXML mode no longer binds C-RET to 'nxml-complete'.
+Completion is now performed via 'completion-at-point', bound to C-M-i
+or M-TAB. If 'nxml-bind-meta-tab-to-complete-flag' is non-nil (the
default), this performs tag completion.
** Org mode has been updated to version 7.8.09.
@@ -3068,30 +3068,30 @@ support for more variants, including Mercury, and a lot more.
** Rmail
-*** The command `rmail-epa-decrypt' decrypts OpenPGP data
+*** The command 'rmail-epa-decrypt' decrypts OpenPGP data
in the Rmail incoming message.
-*** The variable `rmail-message-filter' no longer has any effect.
+*** The variable 'rmail-message-filter' no longer has any effect.
This change was made in Emacs 23.1 but was not advertised at the time.
-Try using `rmail-show-message-hook' instead.
+Try using 'rmail-show-message-hook' instead.
** Shell mode
*** M-x shell prompts for the shell path name if the default directory
is a remote file name and neither the environment variable $ESHELL nor
-the variable `explicit-shell-file-name' is set.
+the variable 'explicit-shell-file-name' is set.
-*** TAB is now bound to the standard `completion-at-point' command,
+*** TAB is now bound to the standard 'completion-at-point' command,
which now implements the pcomplete rules for shell command completion.
** SMTPmail
*** SMTPmail now uses encrypted connections (via STARTTLS) by default
if the mail server supports them. This uses either built-in GnuTLS
-support, or the starttls.el library. Customize `smtpmail-stream-type'
+support, or the starttls.el library. Customize 'smtpmail-stream-type'
to change this.
-*** The variable `smtpmail-auth-credentials' has been removed.
+*** The variable 'smtpmail-auth-credentials' has been removed.
By default, the information is now stored in the file ~/.authinfo.
This was the default value of smtpmail-auth-credentials. If you had
customized smtpmail-auth-credentials to a list of user names and
@@ -3110,7 +3110,7 @@ then the equivalent line in ~/.authinfo would be
See the auth-source manual for more information, e.g. on encrypting
the credentials file.
-*** The variable `smtpmail-starttls-credentials' has been removed.
+*** The variable 'smtpmail-starttls-credentials' has been removed.
If you had that set, you need to put
machine smtp.whatever.foo port 25 key "~/.my_smtp_tls.key" cert "~/.my_smtp_tls.cert"
@@ -3118,36 +3118,36 @@ If you had that set, you need to put
in your ~/.authinfo file instead.
*** SMTPmail defaults to using the address in the From: header as the
-SMTP MAIL FROM envelope. To override this, set `mail-envelope-from'
+SMTP MAIL FROM envelope. To override this, set 'mail-envelope-from'
to the address you wish to use instead.
** SQL mode
-*** New options `sql-port', `sql-connection-alist', `sql-send-terminator',
-and `sql-oracle-scan-on'.
+*** New options 'sql-port', 'sql-connection-alist', 'sql-send-terminator',
+and 'sql-oracle-scan-on'.
*** New options controlling prompting for login parameters.
-Each supported product has a custom variable `sql-*-login-params',
+Each supported product has a custom variable 'sql-*-login-params',
which is a list of the parameters to be prompted for before a
connection is established.
-*** The command `sql-product-interactive' now takes a prefix argument,
+*** The command 'sql-product-interactive' now takes a prefix argument,
which causes it to prompt for an SQL product.
*** Product-specific SQL interactive commands now take prefix arguments.
-These commands (`sql-sqlite', `sql-postgres', `sql-mysql', etc.),
+These commands ('sql-sqlite', 'sql-postgres', 'sql-mysql', etc.),
given a prefix argument, prompt for a name for the SQL interactive
-buffer. This reduces the need for calling `sql-rename-buffer'.
+buffer. This reduces the need for calling 'sql-rename-buffer'.
*** SQL interactive modes suppress command continuation prompts, and
replace tabs with spaces. The first change impacts multiple line SQL
statements entered with C-j between each line, statements yanked into
-the buffer and statements sent with `sql-send-*' functions. The
+the buffer and statements sent with 'sql-send-*' functions. The
second prevents the MySQL and Postgres interpreters from listing
-object name completions when sent text via `sql-send-*' functions.
+object name completions when sent text via 'sql-send-*' functions.
-*** New command `sql-connect' starts a predefined SQLi session,
-using the login parameters from `sql-connection-alist'.
+*** New command 'sql-connect' starts a predefined SQLi session,
+using the login parameters from 'sql-connection-alist'.
*** New "Save Connection" menu item in SQLi buffers.
This gathers the login params specified for the SQLi session, if it
@@ -3169,53 +3169,53 @@ sql-list-all and sql-list-table.
*** The following access methods are discontinued: "ssh1_old",
"ssh2_old", "scp1_old", "scp2_old", "imap", "imaps" and "fish".
-*** The user option `remote-file-name-inhibit-cache' controls whether
+*** The user option 'remote-file-name-inhibit-cache' controls whether
remote file attributes are cached for better performance.
-*** The option `ange-ftp-binary-file-name-regexp' has changed its
+*** The option 'ange-ftp-binary-file-name-regexp' has changed its
default value to "".
-*** Handlers for `file-selinux-context' and `set-file-selinux-context'
+*** Handlers for 'file-selinux-context' and 'set-file-selinux-context'
for remote machines which support SELinux.
-** New function `url-queue-retrieve', which behaves like url-retrieve,
-but with limits (`url-queue-parallel-processes', `url-queue-timeout') on
+** New function 'url-queue-retrieve', which behaves like 'url-retrieve',
+but with limits ('url-queue-parallel-processes', 'url-queue-timeout') on
the degree of parallelism.
** VC and related modes
*** Support for pulling on distributed version control systems.
-The command C-x v + (`vc-pull') runs a "pull" operation, if it is
+The command C-x v + ('vc-pull') runs a "pull" operation, if it is
supported (currently with Bzr, Git, and Mercurial), to update the
current branch and working tree. A prefix argument means to prompt
the user for specifics, e.g. a pull location.
-*** `vc-update' is now an alias for `vc-pull'.
+*** 'vc-update' is now an alias for 'vc-pull'.
*** Support for merging on distributed version control systems.
-The command C-x v m (`vc-merge') now runs a "merge" operation, if it
+The command C-x v m ('vc-merge') now runs a "merge" operation, if it
is supported (currently with Bzr, Git, and Mercurial), to merge
changes from another branch into the current one. It prompts for
specifics, e.g. a merge source.
-*** New option `vc-revert-show-diff' controls whether `vc-revert'
+*** New option 'vc-revert-show-diff' controls whether 'vc-revert'
shows a diff while querying the user. It defaults to t.
*** Log entries in some Log View buffers can be toggled to display a
longer description by typing RET (log-view-toggle-entry-display).
This is currently supported for Bzr, Git, and Mercurial (to support
-another backend, define a `log-view-expanded-log-entry-function').
-In the Log View buffers made by C-x v L (`vc-print-root-log'), you can
+another backend, define a 'log-view-expanded-log-entry-function').
+In the Log View buffers made by C-x v L ('vc-print-root-log'), you can
use this to display the full log entry for the revision at point.
-*** New command `vc-ediff' allows visual comparison of two revisions
-of a file similar to `vc-diff', but using ediff backend.
+*** New command 'vc-ediff' allows visual comparison of two revisions
+of a file similar to 'vc-diff', but using ediff backend.
-*** The option `vc-initial-comment' was removed in Emacs 23.2, but
+*** The option 'vc-initial-comment' was removed in Emacs 23.2, but
this was not advertised at the time.
-*** `vc-toggle-read-only' is an obsolete alias for `toggle-read-only'.
-Since Emacs 23, it has done the same thing as `toggle-read-only', but
+*** 'vc-toggle-read-only' is an obsolete alias for 'toggle-read-only'.
+Since Emacs 23, it has done the same thing as 'toggle-read-only', but
this was not advertised at the time.
** Obsolete modes
@@ -3226,8 +3226,8 @@ this was not advertised at the time.
*** partial-completion-mode (complete.el) is obsolete.
You can get a comparable behavior with:
-(setq completion-styles '(partial-completion initials))
-(setq completion-pcm-complete-word-inserts-delimiters t)
+ (setq completion-styles '(partial-completion initials))
+ (setq completion-pcm-complete-word-inserts-delimiters t)
*** pc-mode.el is obsolete (CUA mode is much more comprehensive).
@@ -3242,17 +3242,17 @@ They are superseded by shift-select-mode, enabled by default since 23.1.
** Miscellaneous
-*** The Landmark game is now invoked with `landmark', not `lm'.
+*** The Landmark game is now invoked with 'landmark', not 'lm'.
Its functions and variables have been similarly renamed.
-*** In `ido-file-completion-map', C-v is no longer bound to `ido-toggle-vc'.
+*** In 'ido-file-completion-map', C-v is no longer bound to 'ido-toggle-vc'.
(This interfered with cua-mode.)
*** f90.el has some support for Fortran 2008 syntax.
-*** `copyright-fix-years' can optionally convert consecutive years to ranges.
+*** 'copyright-fix-years' can optionally convert consecutive years to ranges.
-*** New command `nato-region' converts text to NATO phonetic alphabet.
+*** New command 'nato-region' converts text to NATO phonetic alphabet.
* New Modes and Packages in Emacs 24.1
@@ -3260,28 +3260,28 @@ Its functions and variables have been similarly renamed.
** Occur Edit mode applies edits made in *Occur* buffers to the
original buffers. It is bound to "e" in Occur mode.
-** New global minor mode electric-pair-mode.
+** New global minor mode 'electric-pair-mode'.
When enabled, typing an open parenthesis automatically inserts the
matching closing one.
-** New global minor mode electric-indent-mode.
+** New global minor mode 'electric-indent-mode'.
When enabled, typing certain characters triggers reindentation.
-Major modes wishing to use this can set electric-indent-chars or
-electric-indent-functions.
+Major modes wishing to use this can set 'electric-indent-chars' or
+'electric-indent-functions'.
-** New global minor mode electric-layout-mode.
+** New global minor mode 'electric-layout-mode'.
When enabled, typing certain characters automatically inserts newlines.
-Major modes wishing to use this can set electric-layout-rules.
+Major modes wishing to use this can set 'electric-layout-rules'.
** tabulated-list.el provides a generic major mode for tabulated data,
from which other modes can be derived.
-** pcase.el provides the ML-style pattern matching macro `pcase'.
+** pcase.el provides the ML-style pattern matching macro 'pcase'.
** secrets.el is an implementation of the Secret Service API, an
interface to password managers like GNOME Keyring or KDE Wallet. The
Secret Service API requires D-Bus for communication. The command
-`secrets-show-secrets' offers a buffer with a visualization of the
+'secrets-show-secrets' offers a buffer with a visualization of the
secrets.
** notifications.el provides an implementation of the Desktop
@@ -3294,7 +3294,7 @@ soap-inspect.el is an interactive inspector for SOAP WSDL structures.
** New emacs-lock.el package.
The previous version has been moved to obsolete/old-emacs-lock.el.
-Now, there is a proper minor mode `emacs-lock-mode'. Protection
+Now, there is a proper minor mode 'emacs-lock-mode'. Protection
against exiting Emacs and killing the buffer can be set separately.
The mechanism for automatically turning off protection for buffers
with dead inferior processes has been generalized.
@@ -3305,26 +3305,26 @@ with dead inferior processes has been generalized.
** Passing a nil argument to a minor mode function call now ENABLES
the minor mode unconditionally. This is so that you can write e.g.
- (add-hook 'text-mode-hook 'foo-mode)
+ (add-hook 'text-mode-hook #'foo-mode)
to enable foo-mode in Text mode buffers, removing the need for
-`turn-on-foo-mode' style functions. This affects all mode commands
-defined by `define-minor-mode'. If called interactively, the mode
+'turn-on-foo-mode' style functions. This affects all mode commands
+defined by 'define-minor-mode'. If called interactively, the mode
command still toggles the minor mode.
-** The return value of `backup-buffer' has changed.
+** The return value of 'backup-buffer' has changed.
It is now a list of three elements, where the second element is a list
describing the original file's SELinux context. If Emacs or the
system lacks SELinux support, the context list is (nil nil nil nil).
See "Basic SELinux support" above, under "Changes in Emacs 24.1".
-** `char-direction-table' and the `char-direction' function were deleted.
+** 'char-direction-table' and the 'char-direction' function were deleted.
They were buggy and inferior to the new support of bidirectional
editing introduced in Emacs 24. If you need the bidirectional
-properties of a character, use `get-char-code-property' with the last
-argument `bidi-class'.
+properties of a character, use 'get-char-code-property' with the last
+argument 'bidi-class'.
-** `copy-directory' now copies the source directory as a subdirectory
+** 'copy-directory' now copies the source directory as a subdirectory
of the target directory, if the latter is an existing directory. The
new optional arg COPY-CONTENTS, if non-nil, makes the function copy
the contents directly into a pre-existing target directory.
@@ -3348,22 +3348,22 @@ for key sequence notation: instead of [(control ,)] and [(control ')],
you should write [(control ?,)] and [(control ?')], which will work in
older Emacsen too.
-** The macro `eval-at-startup' was removed in Emacs 23.2, but this
-was not advertised at the time. The function `custom-initialize-delay'
+** The macro 'eval-at-startup' was removed in Emacs 23.2, but this
+was not advertised at the time. The function 'custom-initialize-delay'
replaced all known uses.
-** `view-buffer' now treats special mode-class in the same way that
-`view-file' has since Emacs 22 (i.e. it won't enable View mode if the
+** 'view-buffer' now treats special mode-class in the same way that
+'view-file' has since Emacs 22 (i.e. it won't enable View mode if the
major mode is special).
** Menu and tool bar changes
-*** During startup, Emacs no longer adds entries for `menu-bar-lines'
-and `tool-bar-lines' to `default-frame-alist' and `initial-frame-alist'.
-With these alist entries omitted, `make-frame' checks the value of the
-variable `menu-bar-mode'/`tool-bar-mode' to determine whether to create
+*** During startup, Emacs no longer adds entries for 'menu-bar-lines'
+and 'tool-bar-lines' to 'default-frame-alist' and 'initial-frame-alist'.
+With these alist entries omitted, 'make-frame' checks the value of the
+variable 'menu-bar-mode'/'tool-bar-mode' to determine whether to create
a menu-bar or tool-bar, respectively. If the alist entries are added,
-they override the value of `menu-bar-mode'/`tool-bar-mode'.
+they override the value of 'menu-bar-mode'/'tool-bar-mode'.
*** The menu bar bindings's caches are not used any more.
Use (where-is-internal <def> nil t) instead.
@@ -3371,82 +3371,82 @@ Use (where-is-internal <def> nil t) instead.
** Regions created by mouse dragging are now normal active regions,
similar to those created by shift-selection (see Selection changes
above). In previous Emacs versions, these regions were delineated by
-`mouse-drag-overlay'; that variable has been removed.
+'mouse-drag-overlay'; that variable has been removed.
-** The fourth argument of `filter-buffer-substring' has been removed.
+** The fourth argument of 'filter-buffer-substring' has been removed.
If you want to remove text properties from the final result, simply
pass the result through substring-no-properties.
-** cl.el no longer provides `cl-19'.
+** cl.el no longer provides 'cl-19'.
** The following obsolete functions and aliases have been removed
(the appropriate new function is given in parentheses; "not needed"
means you can just remove all calls to the function in question):
-*** `comint-kill-output' (`comint-delete-output')
-*** `decompose-composite-char' (`char-to-string')
-*** `outline-visible' (`outline-invisible-p')
-*** `internal-find-face' (`facep')
-*** `internal-get-face' (`facep and check-face')
-*** `frame-update-faces' (not needed)
-*** `frame-update-face-colors' (`frame-set-background-mode')
-*** `x-frob-font-weight' and `x-frob-font-slant' (`make-face-*' functions)
-*** `x-make-font-bold' and `x-make-font-demibold' (`make-face-bold')
-*** `x-make-font-italic' and `x-make-font-oblique' (`make-face-italic')
-*** `x-make-font-bold-italic' (`make-face-bold-italic')
-*** `x-make-font-unbold' (`make-face-unbold')
-*** `x-make-font-unitalic' (`make-face-unitalic')
-*** `mldrag-drag-mode-line' (`mouse-drag-mode-line')
-*** `mldrag-drag-vertical-line' (`mouse-drag-vertical-line')
-*** `iswitchb-default-keybindings' (`iswitchb-mode')
-*** `char-bytes' (== 1)
-*** `isearch-return-char' (`isearch-printing-char')
-*** `make-local-hook' (not needed)
-*** `set-screen-height' (`set-frame-height')
-*** `set-screen-width' (`set-frame-width')
+*** 'comint-kill-output' ('comint-delete-output')
+*** 'decompose-composite-char' ('char-to-string')
+*** 'outline-visible' ('outline-invisible-p')
+*** 'internal-find-face' ('facep')
+*** 'internal-get-face' ('facep' and 'check-face')
+*** 'frame-update-faces' (not needed)
+*** 'frame-update-face-colors' ('frame-set-background-mode')
+*** 'x-frob-font-weight' and 'x-frob-font-slant' ('make-face-*' functions)
+*** 'x-make-font-bold' and 'x-make-font-demibold' ('make-face-bold')
+*** 'x-make-font-italic' and 'x-make-font-oblique' ('make-face-italic')
+*** 'x-make-font-bold-italic' ('make-face-bold-italic')
+*** 'x-make-font-unbold' ('make-face-unbold')
+*** 'x-make-font-unitalic' ('make-face-unitalic')
+*** 'mldrag-drag-mode-line' ('mouse-drag-mode-line')
+*** 'mldrag-drag-vertical-line' ('mouse-drag-vertical-line')
+*** 'iswitchb-default-keybindings' ('iswitchb-mode')
+*** 'char-bytes' (== 1)
+*** 'isearch-return-char' ('isearch-printing-char')
+*** 'make-local-hook' (not needed)
+*** 'set-screen-height' ('set-frame-height')
+*** 'set-screen-width' ('set-frame-width')
** The following obsolete variables and varaliases have been removed
(the appropriate new variable is given in parentheses):
-*** `checkdoc-minor-keymap' (`checkdoc-minor-mode-map')
-*** `vc-header-alist' (`vc-BACKEND-header')
-*** `directory-sep-char' (== ?/)
-*** `font-lock-defaults-alist' (`font-lock-defaults')
-*** `e' (`float-e').
+*** 'checkdoc-minor-keymap' ('checkdoc-minor-mode-map')
+*** 'vc-header-alist' ('vc-BACKEND-header')
+*** 'directory-sep-char' (== ?/)
+*** 'font-lock-defaults-alist' ('font-lock-defaults')
+*** 'e' ('float-e').
** The following obsolete files were removed:
sc.el, x-menu.el, rnews.el, rnewspost.el
** The format of the finder-inf.el file has changed, since the Finder
mechanism is now based on the package system. The variable
-`finder-package-info' is replaced by `package--builtins' and
-`finder-keywords-hash'.
+'finder-package-info' is replaced by 'package--builtins' and
+'finder-keywords-hash'.
-** When generating autoloads, `update-directory-autoloads' no longer
-assumes every inspected file is in your `load-path'. It instead
-generates relative names according to the current `load-path'.
+** When generating autoloads, 'update-directory-autoloads' no longer
+assumes every inspected file is in your 'load-path'. It instead
+generates relative names according to the current 'load-path'.
* Lisp Changes in Emacs 24.1
** Code can now use lexical scoping by default instead of dynamic scoping.
-The `lexical-binding' variable enables lexical scoping for local
+The 'lexical-binding' variable enables lexical scoping for local
variables. It is typically set via a file-local variable in the first
line of the file, in which case it applies to all the code in that
file.
-*** `eval' takes a new optional argument `lexical' to choose the new lexical
+*** 'eval' takes a new optional argument 'lexical' to choose the new lexical
binding instead of the old dynamic binding mode.
*** Lexically scoped interpreted functions are represented with a new form
of function value which looks like (closure ENV ARGS &rest BODY).
-*** New macro `letrec' to define recursive local functions.
+*** New macro 'letrec' to define recursive local functions.
-*** `defvar' and `defconst' now mark the variable as special (dynamic).
-So do `defcustom' and other forms that call `defvar' as a subroutine.
+*** 'defvar' and 'defconst' now mark the variable as special (dynamic).
+So do 'defcustom' and other forms that call 'defvar' as a subroutine.
-*** New function `special-variable-p' to check whether a variable is
+*** New function 'special-variable-p' to check whether a variable is
declared as dynamically bound.
*** The form ((lambda ...) ...) is deprecated.
@@ -3457,10 +3457,10 @@ their code. See the ERT info manual for details.
** Changes for bidirectional display and editing
-*** New function `current-bidi-paragraph-direction'.
+*** New function 'current-bidi-paragraph-direction'.
This returns the base direction of the paragraph at point.
-*** New function `bidi-string-mark-left-to-right'.
+*** New function 'bidi-string-mark-left-to-right'.
Given a string containing characters from right-to-left scripts, this
function returns another string which can be safely inserted into a
buffer, such that any following text will be always displayed to the
@@ -3478,43 +3478,43 @@ Functions are provided to return the parent, siblings or child windows
of any window including internal windows (windows not associated with a
buffer) in the window tree.
-**** New function `window-valid-p' gives non-nil for live and internal
+**** New function 'window-valid-p' gives non-nil for live and internal
windows.
**** Window manipulation can deal with internal windows.
-Many window handling functions like `split-window', `delete-window', or
-`delete-other-windows' as well as the window resizing functions can now
+Many window handling functions like 'split-window', 'delete-window', or
+'delete-other-windows' as well as the window resizing functions can now
act on any window including internal ones.
*** window-total-height/-width vs window-body-height/-width.
-The function `window-height' has been renamed to `window-total-height'
-and `window-width' has been renamed to `window-body-width'. The old
-names are provided as aliases. Two new functions `window-total-width'
-and `window-body-height' are provided.
+The function 'window-height' has been renamed to 'window-total-height'
+and 'window-width' has been renamed to 'window-body-width'. The old
+names are provided as aliases. Two new functions 'window-total-width'
+and 'window-body-height' are provided.
*** Window parameters specific to window handling functions.
For each window you can specify a parameter to override the default
-behavior of a number of functions like `split-window', `delete-window'
-and `delete-other-windows'. The variable `ignore-window-parameters'
+behavior of a number of functions like 'split-window', 'delete-window'
+and 'delete-other-windows'. The variable 'ignore-window-parameters'
allows to ignore processing such parameters.
-*** New semantics of third argument of `split-window'.
-The third argument of `split-window' has been renamed to SIDE and can be
+*** New semantics of third argument of 'split-window'.
+The third argument of 'split-window' has been renamed to SIDE and can be
set to any of the values 'below, 'right, 'above, or 'left to make the
new window appear on the corresponding side of the window that shall be
-split. Any other value of SIDE will cause `split-window' to split the
+split. Any other value of SIDE will cause 'split-window' to split the
window into two side-by-side windows as before.
*** Window resizing functions.
-A new standard function for resizing windows called `window-resize' has
+A new standard function for resizing windows called 'window-resize' has
been introduced. This and all other functions for resizing windows no
longer delete any windows when they become too small.
*** Deleting the selected window now selects the most recently selected
live window on that frame instead.
-*** `adjust-window-trailing-edge' adjustments.
-`adjust-window-trailing-edge' can now deal with fixed-size windows and
+*** 'adjust-window-trailing-edge' adjustments.
+'adjust-window-trailing-edge' can now deal with fixed-size windows and
is able to resize other windows if a window adjacent to the trailing
edge cannot be shrunk any more. This makes its behavior more similar to
that of Emacs 21 without compromising, however, its inability to delete
@@ -3527,272 +3527,272 @@ shown in that window with its previous window-start and window-point
positions. This also means that the same buffer may be automatically
shown twice even if it already appears in another window.
-*** `switch-to-buffer' has a new optional argument FORCE-SAME-WINDOW,
+*** 'switch-to-buffer' has a new optional argument FORCE-SAME-WINDOW,
which if non-nil requires the buffer to be displayed in the currently
selected window, signaling an error otherwise. If nil, another window
can be used, e.g. if the selected one is strongly dedicated.
-*** `split-window-vertically' and `split-window-horizontally' renamed
-to `split-window-below' and `split-window-right' respectively.
+*** 'split-window-vertically' and 'split-window-horizontally' renamed
+to 'split-window-below' and 'split-window-right' respectively.
The old names are kept as aliases.
*** Display actions
-**** The second arg to `display-buffer' and `pop-to-buffer' is now
+**** The second arg to 'display-buffer' and 'pop-to-buffer' is now
named ACTION, and takes a display action of the same form as
-`display-buffer-base-action' (see Changes, above). A non-nil,
+'display-buffer-base-action' (see Changes, above). A non-nil,
non-list value is treated specially, as the old meaning.
-**** New variable `display-buffer-overriding-action'.
+**** New variable 'display-buffer-overriding-action'.
-**** The procedure of `display-buffer' etc. to choose a window is
-determined by combining `display-buffer-overriding-action',
-`display-buffer-alist', the ACTION arg, `display-buffer-base-action',
-and `display-buffer-fallback-action'. The second and fourth of these
+**** The procedure of 'display-buffer' etc. to choose a window is
+determined by combining 'display-buffer-overriding-action',
+'display-buffer-alist', the ACTION arg, 'display-buffer-base-action',
+and 'display-buffer-fallback-action'. The second and fourth of these
are user-customizable variables.
-See the docstring of `display-buffer' for details.
+See the docstring of 'display-buffer' for details.
-*** New functions `window-state-get' and `window-state-put'.
+*** New functions 'window-state-get' and 'window-state-put'.
These functions allow to save and restore the state of an arbitrary
frame or window as an Elisp object.
** Completion
-*** New variable `completion-extra-properties' used to specify extra
+*** New variable 'completion-extra-properties' used to specify extra
properties of the current completion:
- :annotation-function, same as the old completion-annotate-function.
- :exit-function, function to call after completion took place.
-*** Functions on `completion-at-point-functions' can return any of the
-properties valid for `completion-extra-properties'.
+*** Functions on 'completion-at-point-functions' can return any of the
+properties valid for 'completion-extra-properties'.
-*** `completion-annotate-function' is obsolete.
+*** 'completion-annotate-function' is obsolete.
-*** New `metadata' method for completion tables. The metadata thus returned
-can specify various details of the data returned by `all-completions':
-- `category' is the kind of objects returned (e.g., `buffer', `file', ...),
+*** New 'metadata' method for completion tables. The metadata thus returned
+can specify various details of the data returned by 'all-completions':
+- 'category' is the kind of objects returned (e.g., 'buffer', 'file', ...),
used to select a style in completion-category-overrides.
-- `annotation-function' to add annotations in *Completions*.
-- `display-sort-function' to specify how to sort entries in *Completions*.
-- `cycle-sort-function' to specify how to sort entries when cycling.
+- 'annotation-function' to add annotations in *Completions*.
+- 'display-sort-function' to specify how to sort entries in *Completions*.
+- 'cycle-sort-function' to specify how to sort entries when cycling.
-*** `minibuffer-local-filename-must-match-map' is not used any more.
-Instead, the bindings in `minibuffer-local-filename-completion-map'
-are combined with `minibuffer-local-must-match-map'.
+*** 'minibuffer-local-filename-must-match-map' is not used any more.
+Instead, the bindings in 'minibuffer-local-filename-completion-map'
+are combined with 'minibuffer-local-must-match-map'.
-*** New variable `completing-read-function' allows overriding the
-behavior of `completing-read'.
+*** New variable 'completing-read-function' allows overriding the
+behavior of 'completing-read'.
-** `glyphless-char-display' can now distinguish between graphical and
+** 'glyphless-char-display' can now distinguish between graphical and
text terminal display, via a char-table entry that is a cons cell.
-** `pre-command-hook'/`post-command-hook' are not reset to nil on error.
+** 'pre-command-hook'/'post-command-hook' are not reset to nil on error.
Instead, the offending function is removed.
** New hook types
-*** New function `run-hook-wrapped' for running an abnormal hook by
+*** New function 'run-hook-wrapped' for running an abnormal hook by
passing the hook functions as arguments to a "wrapping" function.
-Like `run-hook-with-args-until-success', it stops at the first
+Like 'run-hook-with-args-until-success', it stops at the first
non-nil return value.
-*** New macro `with-wrapper-hook' for running an abnormal hook as a
+*** New macro 'with-wrapper-hook' for running an abnormal hook as a
set of "wrapping" filters, similar to around advice.
(A version of this macro was actually added in Emacs 23.2 but was not
advertised at the time.)
** Debugger changes
-*** New macro `condition-case-unless-debug'.
+*** New macro 'condition-case-unless-debug'.
(This was actually added in Emacs 23.1 as condition-case-no-debug, but
not advertised)
-*** The macro `with-demoted-errors'.
+*** The macro 'with-demoted-errors'.
It was also added in Emacs 23.1, but not advertised.
-*** Variable `stack-trace-on-error' removed.
+*** Variable 'stack-trace-on-error' removed.
*** The debugger can now "continue" from an error, which means it will
jump to the error handler as if the debugger had not been invoked
instead of jumping all the way to the top-level.
-*** Set `debug-on-event' to enter the debugger on events like SIGUSR1.
-This can be useful when `inhibit-quit' is set.
+*** Set 'debug-on-event' to enter the debugger on events like SIGUSR1.
+This can be useful when 'inhibit-quit' is set.
-** The new function `server-eval-at' allows evaluation of Lisp forms on
+** The new function 'server-eval-at' allows evaluation of Lisp forms on
named Emacs server instances.
-** `call-process' and `call-process-region' allow a `(:file "file")' spec
+** 'call-process' and 'call-process-region' allow a '(:file "file")' spec
to redirect STDOUT to a file.
-** The function `format-time-string' now supports the %N directive,
+** The function 'format-time-string' now supports the %N directive,
for higher-resolution time stamps.
** New input reading functions
-*** New function `read-char-choice' reads a restricted set of
+*** New function 'read-char-choice' reads a restricted set of
characters, discarding any inputs not inside the set.
-*** The command `read-color' now requires a match for a color name
+*** The command 'read-color' now requires a match for a color name
or RGB triplet, instead of signaling an error if the user provides
invalid input.
-**** `facemenu-read-color' is now an alias for `read-color'.
+**** 'facemenu-read-color' is now an alias for 'read-color'.
-** `image-library-alist' is renamed to `dynamic-library-alist'.
+** 'image-library-alist' is renamed to 'dynamic-library-alist'.
The variable is now used to load all kind of supported dynamic libraries,
not just image libraries. The previous name is still available as an
obsolete alias.
** Syntax parsing changes
-*** New variable `syntax-propertize-function'.
-This replaces `font-lock-syntactic-keywords' which is now obsolete.
+*** New variable 'syntax-propertize-function'.
+This replaces 'font-lock-syntactic-keywords' which is now obsolete.
This allows syntax-table properties to be set independently from font-lock:
-just call syntax-propertize to make sure the text is propertized.
+just call 'syntax-propertize' to make sure the text is propertized.
Together with this new variable come a new hook
-syntax-propertize-extend-region-functions, as well as two helper functions:
-syntax-propertize-via-font-lock to reuse old font-lock-syntactic-keywords
-as-is; and syntax-propertize-rules which provides a new way to specify
+'syntax-propertize-extend-region-functions', as well as two helper functions:
+'syntax-propertize-via-font-lock' to reuse old 'font-lock-syntactic-keywords'
+as-is; and 'syntax-propertize-rules' which provides a new way to specify
syntactic rules.
*** Syntax tables support a new "comment style c" additionally to style b.
-** New hook `post-self-insert-hook', run after `self-insert-command'.
+** New hook 'post-self-insert-hook', run after 'self-insert-command'.
** frame-local variables cannot be let-bound any more.
** Major and minor mode changes
-*** `set-auto-mode' now respects mode: local variables at the end of files,
+*** 'set-auto-mode' now respects mode: local variables at the end of files,
as well as those in the -*- line.
-*** `prog-mode' is a new major mode from which programming modes
+*** 'prog-mode' is a new major mode from which programming modes
should be derived.
-**** `prog-mode-hook' can be used to enable features for programming
-modes, e.g. (add-hook 'prog-mode-hook 'flyspell-prog-mode) to enable
+**** 'prog-mode-hook' can be used to enable features for programming
+modes, e.g. (add-hook 'prog-mode-hook #'flyspell-prog-mode) to enable
on-the-fly spell checking for comments and strings.
-*** New hook `change-major-mode-after-body-hook', run by
-`run-mode-hooks' just before any other mode hooks.
+*** New hook 'change-major-mode-after-body-hook', run by
+'run-mode-hooks' just before any other mode hooks.
*** Enabled globalized minor modes can be disabled in specific major modes.
If the global mode is global-FOO-mode, then run (FOO-mode -1) in the
major mode's hook, where FOO-mode toggles the mode on a per-buffer basis.
-*** `define-minor-mode' accepts new keywords :variable, :after-hook.
+*** 'define-minor-mode' accepts new keywords :variable, :after-hook.
** File-handling changes
-*** `delete-file' and `delete-directory' now accept optional arg TRASH.
-Trashing is performed if TRASH and `delete-by-moving-to-trash' are
+*** 'delete-file' and 'delete-directory' now accept optional arg TRASH.
+Trashing is performed if TRASH and 'delete-by-moving-to-trash' are
both non-nil. Interactively, TRASH defaults to t, unless a prefix
argument is supplied (see Trash changes, above).
-*** New file predicates: `file-equal-p', `file-in-directory-p'.
+*** New file predicates: 'file-equal-p', 'file-in-directory-p'.
-*** New function `file-size-human-readable'.
+*** New function 'file-size-human-readable'.
** Tool-bars can display separators.
Tool-bar separators are handled like menu separators in menu-bar maps,
-i.e. via menu entries of the form `(menu-item "--")'.
+i.e. via menu entries of the form '(menu-item "--")'.
** Image API
*** Animated images support (currently animated gifs only).
-**** `image-animated-p' returns non-nil if an image can be animated.
+**** 'image-animated-p' returns non-nil if an image can be animated.
-**** `image-animate' animates a supplied image spec.
+**** 'image-animate' animates a supplied image spec.
-**** `image-animate-timer' returns the timer object for an image that
+**** 'image-animate-timer' returns the timer object for an image that
is being animated.
-*** `image-extension-data' has been renamed to `image-metadata'.
+*** 'image-extension-data' has been renamed to 'image-metadata'.
The old name is an obsolete alias to the new one.
*** Image mode can view any image type that ImageMagick supports.
This requires Emacs to be built with ImageMagick support.
-**** New function `imagemagick-types', defined if ImageMagick support
+**** New function 'imagemagick-types', defined if ImageMagick support
is enabled, returns a list of image file extensions that your
ImageMagick installation supports.
-**** New function `imagemagick-register-types' enables ImageMagick
-image types in Image mode and in `create-image' and other helper
+**** New function 'imagemagick-register-types' enables ImageMagick
+image types in Image mode and in 'create-image' and other helper
functions.
-**** New option `imagemagick-types-inhibit' excludes certain
-ImageMagick image types from `imagemagick-register-types'.
+**** New option 'imagemagick-types-inhibit' excludes certain
+ImageMagick image types from 'imagemagick-register-types'.
**** With ImageMagick support, there are extra Image mode commands to
-resize and rotate images: `image-transform-fit-to-height',
-`image-transform-fit-to-width', `image-transform-set-rotation', and
-`image-transform-set-scale'.
+resize and rotate images: 'image-transform-fit-to-height',
+'image-transform-fit-to-width', 'image-transform-set-rotation', and
+'image-transform-set-scale'.
-** `compose-mail' now accepts an optional 8th arg, RETURN-ACTION, and
+** 'compose-mail' now accepts an optional 8th arg, RETURN-ACTION, and
passes it to the mail user agent function. This argument specifies an
action for returning to the caller after finishing with the mail. For
example, this is used by Rmail to optionally delete a mail window.
** XML and HTML parsing
If Emacs is compiled with libxml2 support, there are two new
-functions: `libxml-parse-html-region' (which parses "real world" HTML)
-and `libxml-parse-xml-region' (which parses XML). Both return an
+functions: 'libxml-parse-html-region' (which parses "real world" HTML)
+and 'libxml-parse-xml-region' (which parses XML). Both return an
Emacs Lisp parse tree.
** Networking and encryption changes
-*** `open-network-stream' can now be used to open an encrypted stream.
-It now accepts an optional `:type' parameter for initiating a TLS
+*** 'open-network-stream' can now be used to open an encrypted stream.
+It now accepts an optional ':type' parameter for initiating a TLS
connection, directly or via STARTTLS. To do STARTTLS, additional
-parameters (`:end-of-command', `:success', `:capabilities-command')
+parameters (':end-of-command', ':success', ':capabilities-command')
must also be supplied.
*** New library gnutls.el.
-The new function `gnutls-available-p' returns non-nil if Emacs is
+The new function 'gnutls-available-p' returns non-nil if Emacs is
built with GnuTLS support. The main entry points are
-`open-gnutls-stream' and `gnutls-negotiate'. It's easiest to use
-these functions through `open-network-stream', because that can
+'open-gnutls-stream' and 'gnutls-negotiate'. It's easiest to use
+these functions through 'open-network-stream', because that can
upgrade connections through STARTTLS opportunistically or use plain
-SSL, depending on your needs. For debugging, set `gnutls-log-level'
+SSL, depending on your needs. For debugging, set 'gnutls-log-level'
greater than 0.
-*** New primitive `secure-hash' that supports many secure hash algorithms:
+*** New primitive 'secure-hash' that supports many secure hash algorithms:
md5, sha1, sha2, sha224, sha256, sha384, and sha512. The lisp library
-sha1.el has been removed. The `sha1' feature is provided by default.
+sha1.el has been removed. The 'sha1' feature is provided by default.
** Isearch
-*** New hook `isearch-update-post-hook' that runs in `isearch-update'.
+*** New hook 'isearch-update-post-hook' that runs in 'isearch-update'.
** Progress reporters can now "spin".
-The MIN-VALUE and MAX-VALUE arguments of `make-progress-reporter' can
+The MIN-VALUE and MAX-VALUE arguments of 'make-progress-reporter' can
now be nil, or omitted. This makes a "non-numeric" reporter. Each
-time you call `progress-reporter-update' on that progress reporter,
+time you call 'progress-reporter-update' on that progress reporter,
with a nil or omitted VALUE argument, the reporter message is
displayed with a "spinning bar".
-** New variable `revert-buffer-in-progress-p' is true while a buffer is
-being reverted, even if the buffer has a local `revert-buffer-function'.
+** New variable 'revert-buffer-in-progress-p' is true while a buffer is
+being reverted, even if the buffer has a local 'revert-buffer-function'.
-** New variables `delayed-warnings-list' and `delayed-warnings-hook'.
+** New variables 'delayed-warnings-list' and 'delayed-warnings-hook'.
If delayed-warnings-list is non-nil, the command loop calls
-`delayed-warnings-hook' after `post-command-hook'. At present, this
+'delayed-warnings-hook' after 'post-command-hook'. At present, this
is only used by Emacs on some platforms to display warnings during
startup, which might otherwise not be noticed. This uses the
-functions `display-delayed-warnings' and `collapse-delayed-warnings'.
+functions 'display-delayed-warnings' and 'collapse-delayed-warnings'.
-** rx.el has a new `group-n' construct for explicitly numbered groups.
+** rx.el has a new 'group-n' construct for explicitly numbered groups.
-** New function `make-composed-keymap' that constructs a new keymap
+** New function 'make-composed-keymap' that constructs a new keymap
from multiple input maps. You can use this to make a keymap that
inherits from multiple maps, eg:
- (set-keymap-parent newmap (make-composed-keymap othermap parent))
+ (set-keymap-parent newmap (make-composed-keymap othermap parent))
-** New function `string-prefix-p'.
+** New function 'string-prefix-p'.
(This was actually added in Emacs 23.2 but was not advertised at the time.)
** New reader macro ## that stands for the empty symbol.
@@ -3800,22 +3800,22 @@ This means that the empty symbol can now be read back. Also, #: by itself
(when not immediately followed by a possible symbol character) stands for
an empty uninterned symbol.
-** New math functions `isnan', `copysign', `frexp', `ldexp'.
+** New math functions 'isnan', 'copysign', 'frexp', 'ldexp'.
** The following functions and variables are obsolete:
-*** `tooltip-use-echo-area' is obsolete.
+*** 'tooltip-use-echo-area' is obsolete.
Rather than setting this to t, disable Tooltip mode instead.
*** buffer-substring-filters is obsolete.
-Use `filter-buffer-substring-functions' instead.
+Use 'filter-buffer-substring-functions' instead.
-*** `byte-compile-disable-print-circle' is obsolete.
+*** 'byte-compile-disable-print-circle' is obsolete.
-*** `deferred-action-list' and `deferred-action-function' are obsolete.
-Use `post-command-hook' instead.
+*** 'deferred-action-list' and 'deferred-action-function' are obsolete.
+Use 'post-command-hook' instead.
-*** `font-lock-maximum-size' is obsolete.
+*** 'font-lock-maximum-size' is obsolete.
* Changes in Emacs 24.1 on Non-Free Operating Systems
@@ -3833,9 +3833,9 @@ and also when HOME is set to C:\ by default.
*** --lib for general library linkage, works with the USER_LIBS build variable.
-** New make target `dist' to create binary distribution for MS Windows.
+** New make target 'dist' to create binary distribution for MS Windows.
-** The Lisp function `w32-default-color-map' is now obsolete.
+** The Lisp function 'w32-default-color-map' is now obsolete.
(It is only used internally in the Emacs C code.)
** Customize ns-auto-hide-menu-bar to have the menu-bar hidden, but
diff --git a/etc/NEWS.25 b/etc/NEWS.25
index 21fcd052dce..d1e43e0538e 100644
--- a/etc/NEWS.25
+++ b/etc/NEWS.25
@@ -550,8 +550,8 @@ When you invoke 'shell' interactively, the '*shell*' buffer will now
display in a new window. However, you can customize this behavior via
the 'display-buffer-alist' variable. For example, to get
the old behavior -- '*shell*' buffer displays in current window -- use
-(add-to-list 'display-buffer-alist
- '("^\\*shell\\*$" . (display-buffer-same-window))).
+ (add-to-list 'display-buffer-alist
+ '("\\`\\*shell\\*\\'" . (display-buffer-same-window))).
** EIEIO
*** The ':protection' slot option is not obeyed any more.
@@ -1264,7 +1264,7 @@ SWITCH-BUFFER to 'completion-table-dynamic'.
** window-configurations no longer record the buffers' marks.
-** 'inhibit-modification-hooks' now also inhibits lock-file checks, as
+** 'inhibit-modification-hooks' now also inhibits 'lock-file' checks, as
well as active region handling.
** 'deactivate-mark' is now buffer-local.
diff --git a/etc/NEWS.26 b/etc/NEWS.26
index a78baaea5f8..50a711a0d14 100644
--- a/etc/NEWS.26
+++ b/etc/NEWS.26
@@ -736,7 +736,7 @@ keep previous behavior.
** html2text is now marked obsolete.
-** smerge-refine-regions can refine regions in separate buffers.
+** 'smerge-refine-regions' can refine regions in separate buffers.
** Info menu and index completion uses substring completion by default.
This can be customized via the 'info-menu' category in
@@ -1506,7 +1506,7 @@ supported by the GnuTLS library used by Emacs.
** Emacs now supports records for user-defined types, via the new
functions 'make-record', 'record', and 'recordp'. Records are now
-used internally to represent cl-defstruct and defclass instances, for
+used internally to represent 'cl-defstruct' and 'defclass' instances, for
example.
If your program defines new record types, you should use
@@ -1798,11 +1798,11 @@ suitable for use in 'display-buffer-alist'. For example, to avoid
creating a new window when opening man pages when there's already one,
use
-(add-to-list 'display-buffer-alist
- '("\\`\\*Man .*\\*\\'" .
- (display-buffer-reuse-mode-window
- (inhibit-same-window . nil)
- (mode . Man-mode))))
+ (add-to-list 'display-buffer-alist
+ '("\\`\\*Man .*\\*\\'" .
+ (display-buffer-reuse-mode-window
+ (inhibit-same-window . nil)
+ (mode . Man-mode))))
*** New window parameter 'no-delete-other-windows' prevents that
its window gets deleted by 'delete-other-windows'.
diff --git a/etc/NEWS.27 b/etc/NEWS.27
index 6e116533c5d..f67a8c70d4f 100644
--- a/etc/NEWS.27
+++ b/etc/NEWS.27
@@ -233,8 +233,8 @@ into the init file when Emacs was started. This call can now safely
be removed. Alternatively, if you want to ensure that your init file
is still compatible with earlier versions of Emacs, change it to:
-(when (< emacs-major-version 27)
- (package-initialize))
+ (when (< emacs-major-version 27)
+ (package-initialize))
However, if your init file changes the values of 'package-load-list'
or 'package-user-dir', or sets 'package-enable-at-startup' to nil then
@@ -1761,7 +1761,7 @@ error.
It can be used to set any buffer as the next one to be used by
'next-error' and 'previous-error'.
-** nxml-mode
+** 'nxml-mode'
*** The default value of 'nxml-sexp-element-flag' is now t.
This means that pressing 'C-M-SPACE' now selects the entire tree by
@@ -2285,7 +2285,7 @@ Unqualified host name: (was none), now %q
Login name: was %u, now %l
User's full name: was %U, now %L
-Merely having '(add-hook 'before-save-hook 'time-stamp)' in your
+Merely having '(add-hook 'before-save-hook #'time-stamp)' in your
Emacs init file does not expose you to this change. However,
if you set 'time-stamp-format' or 'time-stamp-pattern' with a
file-local variable, you may need to update the value.
@@ -2400,7 +2400,7 @@ expansion to backtrace buffers produced by the Lisp debugger, Edebug
and ERT. See the node "(elisp) Backtraces" in the Elisp manual for
documentation of the new mode and its commands.
-** so-long.el helps to mitigate performance problems with long lines.
+** 'so-long' helps to mitigate performance problems with long lines.
When 'global-so-long-mode' has been enabled, visiting a file with very
long lines will (subject to configuration) cause the user's preferred
'so-long-action' to be automatically invoked (by default, the buffer's
@@ -2599,8 +2599,8 @@ available by scrolling with the meta modifier key.
To get the old behavior back, customize the user option
'mouse-wheel-scroll-amount', or add the following to your init file:
-(customize-set-variable 'mouse-wheel-scroll-amount
- '(5 ((shift) . 1) ((control) . nil)))
+ (customize-set-variable 'mouse-wheel-scroll-amount
+ '(5 ((shift) . 1) ((control) . nil)))
By default, the font size will be changed in the window that the mouse
pointer is over. To change this behavior, you can customize the user
diff --git a/etc/NEWS.28 b/etc/NEWS.28
index 5b8a431ec83..136084e419f 100644
--- a/etc/NEWS.28
+++ b/etc/NEWS.28
@@ -1677,7 +1677,7 @@ and variables.
*** Lisp mode now uses 'common-lisp-indent-function'.
To revert to the previous behavior,
-'(setq lisp-indent-function 'lisp-indent-function)' from 'lisp-mode-hook'.
+'(setq lisp-indent-function #'lisp-indent-function)' from 'lisp-mode-hook'.
** Change Logs and VC
@@ -2826,7 +2826,7 @@ different timezone causing a difference in the date.
*** 'mspools-show' is now autoloaded.
-*** Loading dunnet.el in batch mode doesn't start the game any more.
+*** Loading 'dunnet' in batch mode doesn't start the game any more.
Instead you need to do "emacs --batch -f dunnet" to start the game in
batch mode.
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index 924e1effa71..6624f747c87 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -568,12 +568,6 @@ This can happen with CVS versions 1.12.8 and 1.12.9. Upgrade to CVS
** Miscellaneous problems
-*** Editing files with very long lines is slow.
-
-For example, simply moving through a file that contains hundreds of
-thousands of characters per line is slow, and consumes a lot of CPU.
-This is a known limitation of Emacs with no solution at this time.
-
*** Display artifacts on GUI frames on X-based systems.
This is known to be caused by using double-buffering (which is enabled
@@ -776,14 +770,6 @@ cause files to be downloaded to the local computer when they are
accessed (which could take some time, and Emacs functions accessing
the file will wait for that), avoiding the errors.
-*** ps-print commands fail to find prologue files ps-prin*.ps.
-
-This can happen if you use an old version of X-Symbol package: it
-defines compatibility functions which trick ps-print into thinking it
-runs in XEmacs, and look for the prologue files in a wrong directory.
-
-The solution is to upgrade X-Symbol to a later version.
-
*** On systems with shared libraries you might encounter run-time errors
from the dynamic linker telling you that it is unable to find some
shared libraries, for instance those for Xaw3d or image support.
@@ -1365,6 +1351,17 @@ command:
** Window-manager and toolkit-related problems
+*** Emacs built with GTK+ displays giant tool bar icons in some cases
+
+This is because some icon themes (such as the KDE Breeze icon theme)
+have several incorrectly sized icons, which also causes the toolbar to
+expand uncontrollably. The fix is to switch to a different icon
+theme, or to use Emacs's own toolbar icons by placing:
+
+ (setq x-gtk-stock-map nil)
+
+in your early-init.el.
+
*** Emacs built with GTK+ toolkit produces corrupted display on HiDPI screen
This can happen if you set GDK_SCALE=2 in the environment or in your
@@ -2332,8 +2329,23 @@ terminals display them as 1-column glyphs. Again, this causes cursor
addressing to get out of sync and eventually messes up the display.
One possible workaround for problems caused by character composition
-is to turn off 'auto-composition-mode' on Kitty terminals.
+is to turn off 'auto-composition-mode' on Kitty terminals, e.g. by
+customizing the 'auto-composition-mode' variable to have as value a
+string that the 'tty-type' function returns on those terminals.
+*** Display artifacts on the Alacritty text terminal
+
+This terminal is known to cause problems with Emoji sequences: when
+displaying them, the Emacs text-mode frame could show gaps and other
+visual artifacts.
+
+The solution is to disable 'auto-composition-mode' on these
+terminals, for example, like this:
+
+ (setq auto-composition-mode "alacritty")
+
+This disables 'auto-composition-mode' on frames that display on
+terminals of this type.
* Runtime problems specific to individual Unix variants
@@ -3137,6 +3149,17 @@ file; for example:
* Runtime problems specific to PGTK
+** Giant tool bar icons are displayed in some cases
+
+This is because some icon themes (such as the KDE Breeze icon theme)
+have several incorrectly sized icons, which also causes the toolbar to
+expand uncontrollably. The fix is to switch to a different icon
+theme, or to use Emacs's own toolbar icons by placing:
+
+ (setq x-gtk-stock-map nil)
+
+in your early-init.el.
+
** Some modifier keys doesn't work if Emacs is started in a systemd unit file.
Environment variables may be different if there is a difference in the
@@ -3412,14 +3435,6 @@ The fix is to install a newer version of ncurses, such as version 4.2.
Bootstrapping (compiling the .el files) is normally only necessary
with development builds, since the .elc files are pre-compiled in releases.
-*** "No rule to make target" with Ubuntu 8.04 make 3.81-3build1
-
-Compiling the lisp files fails at random places, complaining:
-"No rule to make target '/path/to/some/lisp.elc'".
-The causes of this problem are not understood. Using GNU make 3.81 compiled
-from source, rather than the Ubuntu version, worked.
-See <URL:https://debbugs.gnu.org/327>, <URL:https://debbugs.gnu.org/821>.
-
** Dumping
*** Segfault during 'make'
@@ -3538,21 +3553,21 @@ as a macro. If the definition (in both unex*.c and malloc.c) is wrong,
it can cause problems like this. You might be able to find the correct
value in the man page for a.out(5).
-* 'make check' failures
-
-** emacs-module-tests fail on Ubuntu 16.04
-
-This is due to a bug in GCC that was fixed in 2015; see
-<https://lists.gnu.org/r/emacs-devel/2018-09/msg00548.html>.
-You can work around the problem by using a later version of GCC or of
-Ubuntu, or by configuring without modules.
-
* Problems on legacy systems
This section covers bugs reported on very old hardware or software.
If you are using hardware and an operating system shipped after 2000,
it is unlikely you will see any of these.
+** GNU/Linux
+
+*** Ubuntu 8.04 make 3.81-3build1: "No rule to make target"
+Compiling the lisp files fails at random places, complaining:
+"No rule to make target '/path/to/some/lisp.elc'".
+The causes of this problem are not understood. Using GNU make 3.81 compiled
+from source, rather than the Ubuntu version, worked.
+See <URL:https://debbugs.gnu.org/327>, <URL:https://debbugs.gnu.org/821>.
+
** Solaris
*** Problem with remote X server on Suns.
diff --git a/etc/TODO b/etc/TODO
index 5c55a8b9992..772fbf71911 100644
--- a/etc/TODO
+++ b/etc/TODO
@@ -130,11 +130,6 @@ See also ESR's proposal for a BROWSER environment variable
** In Custom buffers, put the option that turns a mode on or off first
This should use a heuristic of some kind?
-** Define recompute-arg and recompute-arg-if for fix_command to use
-See rms message of 11 Dec 05 in
-https://lists.gnu.org/r/emacs-pretest-bug/2005-12/msg00165.html,
-and the rest of that discussion.
-
** In Emacs Info, examples of using Customize should be clickable
They should create Custom buffers when clicked.
@@ -801,7 +796,7 @@ artist, ansi-color, array, calculator, cdl, cmuscheme, completion,
delim-col, dirtrack, double, echistory, elide-head, easymenu, expand,
flow-ctrl, format [format-alist], generic/generic-x [various modes],
kermit, log-edit, makesum, midnight [other than in Kill Buffer node],
-mouse-copy [?], mouse-drag, mouse-sel, net-utils, rcompile, snmp-mode
+mouse-copy [?], mouse-drag, mouse-sel, net-utils, snmp-mode
[?], soundex [should be interactive?], strokes [start from the web
page], talk, thingatpt [interactive functions?], type-break, vcursor,
xscheme, zone-mode [?], mlconvert [?], iso-cvt, feedmail [?],
@@ -1713,17 +1708,8 @@ apparently loses under Solaris, at least. [fx has mostly done this.]
(Obsolete, since gmalloc.c is nowadays only used on MS-DOS.)
-** Rewrite make-docfile to be clean and maintainable
-It might be better to replace with Lisp the part of make-docfile that
-produces the etc/DOC file by scanning *.el files, for example by
-reusing the code in the byte compiler or in autoload.el that already
-scans *.el files.
-https://lists.gnu.org/r/emacs-devel/2012-06/msg00037.html
-https://lists.gnu.org/r/emacs-devel/2021-05/msg00235.html
-
** Eliminate the etc/DOC file altogether
-As an alternative to the previous item, we could try and eliminate the
-DOC file altogether. See
+We could try and eliminate the DOC file altogether. See
https://lists.gnu.org/r/emacs-devel/2021-05/msg00237.html
** Add an inferior-comint-minor-mode
@@ -1755,6 +1741,19 @@ for vc-rcs-update-changelog.
A two-char comment-starter whose two chars are symbol constituents will
not be noticed if it appears within a word.
+** Multi-pointer X does not work very well
+Emacs is reasonably usable under a multi-pointer X (MPX) environment,
+if you turn off tooltips and mouse highlight, and don't use anything
+that calls `mouse-position'. Otherwise, tooltips are shown next to
+the wrong pointer, mouse highlight simply goes haywire, and
+`mouse-position' returns information for the wrong pointer.
+
+This could be easily fixed in principle, but I cannot find a stable
+enough environment under which the fix can be tested.
+
+The MPX code has not been tested under X toolkit or GTK+ 2.x builds
+and is not expected to work there.
+
This file is part of GNU Emacs.
diff --git a/etc/emacs_lldb.py b/etc/emacs_lldb.py
index b8530915f81..880a8353417 100644
--- a/etc/emacs_lldb.py
+++ b/etc/emacs_lldb.py
@@ -75,15 +75,24 @@ class Lisp_Object:
# Object construction/initialization.
def __init__(self, lisp_obj):
- self.frame = lisp_obj.GetFrame()
self.lisp_obj = lisp_obj
- self.unsigned = lisp_obj.GetValueAsUnsigned()
+ self.frame = lisp_obj.GetFrame()
self.lisp_type = None
self.pvec_type = None
self.value = None
+ self.init_unsigned()
self.init_lisp_types()
self.init_values()
+ def init_unsigned(self):
+ if self.lisp_obj.GetNumChildren() != 0:
+ # Lisp_Object is actually a struct.
+ lisp_word = self.lisp_obj.GetValueForExpressionPath(".i")
+ self.unsigned = lisp_word.GetValueAsUnsigned()
+ else:
+ self.unsigned = self.lisp_obj.GetValueAsUnsigned()
+ pass
+
# Initialize self.lisp_type to the C Lisp_Type enumerator of the
# Lisp_Object, as a string. Initialize self.pvec_type likewise to
# the pvec_type enumerator if the object is a vector-like, as a
@@ -193,7 +202,7 @@ def xdebug_print(debugger, command, result, internal_dict):
########################################################################
def type_summary_Lisp_Object(obj, internal_dict):
- return "-> " + Lisp_Object(obj).summary()
+ return Lisp_Object(obj).summary()
########################################################################
@@ -222,17 +231,22 @@ def define_command (debugger, function):
# and deleted in a similar way.
def define_type_summary(debugger, regex, function):
python_function = __name__ + "." + function.__name__
- debugger.HandleCommand(f"type summary add "
+ debugger.HandleCommand(f"type summary add --expand "
f"--cascade true "
f"--category Emacs "
- f'--regex "{regex}" '
- f"--python-function {python_function}")
+ f"--python-function {python_function} "
+ + regex)
+
+# Enable a given category of type summary providers.
+def enable_type_category(debugger, category):
+ debugger.HandleCommand(f"type category enable {category}")
# This function is called by LLDB to initialize the module.
def __lldb_init_module(debugger, internal_dict):
define_command(debugger, xbacktrace)
define_command(debugger, xdebug_print)
define_type_summary(debugger, "Lisp_Object", type_summary_Lisp_Object)
+ enable_type_category(debugger, "Emacs")
print('Emacs debugging support has been installed.')
# end.
diff --git a/etc/publicsuffix.txt b/etc/publicsuffix.txt
index 18cb313a321..b5a89c65ccd 100644
--- a/etc/publicsuffix.txt
+++ b/etc/publicsuffix.txt
@@ -7130,7 +7130,7 @@ org.zw
// newGTLDs
-// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-06-14T15:15:19Z
+// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-07-28T15:14:54Z
// This list is auto-generated, don't edit it manually.
// aaa : 2015-02-26 American Automobile Association, Inc.
aaa
@@ -8020,7 +8020,7 @@ dvag
// dvr : 2016-05-26 DISH Technologies L.L.C.
dvr
-// earth : 2014-12-04 Interlink Co., Ltd.
+// earth : 2014-12-04 Interlink Systems Innovation Institute K.K.
earth
// eat : 2014-01-23 Charleston Road Registry Inc.
@@ -8779,7 +8779,7 @@ lanxess
// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated
lasalle
-// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico
+// lat : 2014-10-16 XYZ.COM LLC
lat
// latino : 2015-07-30 Dish DBS Corporation
@@ -9034,7 +9034,7 @@ mobile
// moda : 2013-11-07 Dog Beach, LLC
moda
-// moe : 2013-11-13 Interlink Co., Ltd.
+// moe : 2013-11-13 Interlink Systems Innovation Institute K.K.
moe
// moi : 2014-12-18 Amazon Registry Services, Inc.
diff --git a/etc/themes/modus-operandi-theme.el b/etc/themes/modus-operandi-theme.el
index 646504636f0..20af99df941 100644
--- a/etc/themes/modus-operandi-theme.el
+++ b/etc/themes/modus-operandi-theme.el
@@ -3,8 +3,10 @@
;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
;; Author: Protesilaos Stavrou <info@protesilaos.com>
+;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht>
;; URL: https://git.sr.ht/~protesilaos/modus-themes
-;; Version: 2.4.1
+;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes
+;; Version: 2.5.0
;; Package-Requires: ((emacs "27.1"))
;; Keywords: faces, theme, accessibility
diff --git a/etc/themes/modus-themes.el b/etc/themes/modus-themes.el
index c543e7ec431..e64a11b74f5 100644
--- a/etc/themes/modus-themes.el
+++ b/etc/themes/modus-themes.el
@@ -3,9 +3,10 @@
;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
;; Author: Protesilaos Stavrou <info@protesilaos.com>
+;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht>
;; URL: https://git.sr.ht/~protesilaos/modus-themes
-;; Mailing list: https://lists.sr.ht/~protesilaos/modus-themes
-;; Version: 2.4.1
+;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes
+;; Version: 2.5.0
;; Package-Requires: ((emacs "27.1"))
;; Keywords: faces, theme, accessibility
@@ -108,7 +109,7 @@ cover the blue-cyan-magenta side of the spectrum."
:prefix "modus-themes-"
:tag "Modus Themes Faces")
-(defvar modus-themes--version "2.5.0-dev"
+(defvar modus-themes--version "2.5.0"
"Current version of the Modus themes.
The version either is the last tagged release, such as '2.4.0',
@@ -954,7 +955,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-special-cold nil
- "Combines the 'special cold' background and foreground values.
+ "Combines the special cold background and foreground values.
This is intended for cases when a neutral gray background is not
suitable and where a combination of more saturated colors would
not be appropriate.
@@ -963,7 +964,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-special-mild nil
- "Combines the 'special mild' background and foreground values.
+ "Combines the special mild background and foreground values.
This is intended for cases when a neutral gray background is not
suitable and where a combination of more saturated colors would
not be appropriate.
@@ -972,7 +973,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-special-warm nil
- "Combines the 'special warm' background and foreground values.
+ "Combines the special warm background and foreground values.
This is intended for cases when a neutral gray background is not
suitable and where a combination of more saturated colors would
not be appropriate.
@@ -981,7 +982,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-special-calm nil
- "Combines the 'special calm' background and foreground values.
+ "Combines the special calm background and foreground values.
This is intended for cases when a neutral gray background is not
suitable and where a combination of more saturated colors would
not be appropriate.
@@ -990,7 +991,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-diff-added nil
- "Combines green colors for the 'added' state in diffs.
+ "Combines green colors for the added state in diffs.
The applied colors are contingent on the value assigned to
`modus-themes-diffs'.
@@ -998,7 +999,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-diff-changed nil
- "Combines yellow colors for the 'changed' state in diffs.
+ "Combines yellow colors for the changed state in diffs.
The applied colors are contingent on the value assigned to
`modus-themes-diffs'.
@@ -1006,7 +1007,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-diff-removed nil
- "Combines red colors for the 'removed' state in diffs.
+ "Combines red colors for the removed state in diffs.
The applied colors are contingent on the value assigned to
`modus-themes-diffs'.
@@ -1014,7 +1015,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-diff-refine-added nil
- "Combines green colors for word-wise 'added' state in diffs.
+ "Combines green colors for word-wise added state in diffs.
The applied colors are contingent on the value assigned to
`modus-themes-diffs'.
@@ -1022,7 +1023,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-diff-refine-changed nil
- "Combines yellow colors for word-wise 'changed' state in diffs.
+ "Combines yellow colors for word-wise changed state in diffs.
The applied colors are contingent on the value assigned to
`modus-themes-diffs'.
@@ -1030,7 +1031,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-diff-refine-removed nil
- "Combines red colors for word-wise 'removed' state in diffs.
+ "Combines red colors for word-wise removed state in diffs.
The applied colors are contingent on the value assigned to
`modus-themes-diffs'.
@@ -1038,7 +1039,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-diff-focus-added nil
- "Combines green colors for the focused 'added' state in diffs.
+ "Combines green colors for the focused added state in diffs.
The applied colors are contingent on the value assigned to
`modus-themes-diffs'.
@@ -1046,7 +1047,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-diff-focus-changed nil
- "Combines yellow colors for the focused 'changed' state in.
+ "Combines yellow colors for the focused changed state in diffs.
The applied colors are contingent on the value assigned to
`modus-themes-diffs'.
@@ -1054,7 +1055,7 @@ The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
(defface modus-themes-diff-focus-removed nil
- "Combines red colors for the focused 'removed' state in diffs.
+ "Combines red colors for the focused removed state in diffs.
The applied colors are contingent on the value assigned to
`modus-themes-diffs'.
@@ -1102,6 +1103,14 @@ This is intended for use in modes such as Dired, Ibuffer, Proced.
The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces)
+(defface modus-themes-heading-0 nil
+ "General purpose face for use as the document's title.
+The exact attributes assigned to this face are contingent on the
+values assigned to the `modus-themes-headings' variable.
+
+The actual styling of the face is done by `modus-themes-faces'."
+ :group 'modus-themes-faces)
+
(defface modus-themes-heading-1 nil
"General purpose face for use in headings level 1.
The exact attributes assigned to this face are contingent on the
@@ -1426,7 +1435,7 @@ By default, customizing a theme-related user option through the
Custom interfaces or with `customize-set-variable' will not
reload the currently active Modus theme.
-Enable this behavior by setting this variable to nil."
+Enable this behaviour by setting this variable to nil."
:group 'modus-themes
:package-version '(modus-themes . "1.5.0")
:version "28.1"
@@ -1459,7 +1468,7 @@ For form, see `modus-themes-operandi-colors'."
:type '(alist :key-type symbol :value-type color)
:set #'modus-themes--set-option
:initialize #'custom-initialize-default
- :link '(info-link "(modus-themes) Override colors (DIY)"))
+ :link '(info-link "(modus-themes) Override colors"))
(defcustom modus-themes-vivendi-color-overrides nil
"Override colors in the Modus Vivendi palette.
@@ -1471,7 +1480,7 @@ For form, see `modus-themes-vivendi-colors'."
:type '(alist :key-type symbol :value-type color)
:set #'modus-themes--set-option
:initialize #'custom-initialize-default
- :link '(info-link "(modus-themes) Override colors (DIY)"))
+ :link '(info-link "(modus-themes) Override colors"))
;; The byte compiler complains when a defcustom isn't a top level form
(let* ((names (mapcar (lambda (pair)
@@ -1576,14 +1585,19 @@ speaking, is not limited to mouse usage."
This is a helper variable intended for internal use.")
(defcustom modus-themes-headings nil
- "Heading styles with optional list of values for levels 1-8.
+ "Heading styles with optional list of values for levels 0-8.
This is an alist that accepts a (key . list-of-values)
combination. The key is either a number, representing the
-heading's level or t, which pertains to the fallback style. The
-list of values covers symbols that refer to properties, as
-described below. Here is a sample, followed by a presentation of
-all available properties:
+heading's level (0-8) or t, which pertains to the fallback style.
+
+Level 0 is a special heading: it is used for what counts as a
+document title or equivalent, such as the #+title construct we
+find in Org files. Levels 1-8 are regular headings.
+
+The list of values covers symbols that refer to properties, as
+described below. Here is a complete sample, followed by a
+presentation of all available properties:
(setq modus-themes-headings
(quote ((1 . (background overline variable-pitch 1.5))
@@ -1668,12 +1682,12 @@ For Org users, the extent of the heading depends on the variable
and `background' properties. Depending on the version of Org,
there may be others, such as `org-fontify-done-headline'."
:group 'modus-themes
- :package-version '(modus-themes . "2.3.0")
+ :package-version '(modus-themes . "2.5.0")
:version "29.1"
:type `(alist
:options ,(mapcar (lambda (el)
(list el modus-themes--headings-choice))
- '(1 2 3 4 5 6 7 8 t))
+ '(0 1 2 3 4 5 6 7 8 t))
:key-type symbol
:value-type ,modus-themes--headings-choice)
:set #'modus-themes--set-option
@@ -1827,6 +1841,7 @@ value are passed as a symbol. Those are:
yellow, green, blue, in tinted and shaded versions. They cover
the full set of information provided by the `org-habit'
consistency graph.
+
- `simplified' is like the default except that it removes the
dichotomy between current and future variants by applying
uniform color-coded values. It applies a total of four colors:
@@ -1835,15 +1850,17 @@ value are passed as a symbol. Those are:
the default. The intent is to shift focus towards the
distinction between the four states of a habit task, rather
than each state's present/future outlook.
+
- `traffic-light' further reduces the available colors to red,
yellow, and green. As in `simplified', present and future
- variants appear uniformly, but differently from it, the 'clear'
+ variants appear uniformly, but differently from it, the CLEAR
state is rendered in a green hue, instead of the original blue.
This is meant to capture the use-case where a habit task being
- \"too early\" is less important than it being \"too late\".
- The difference between ready and clear states is attenuated by
+ too early is less important than it being too late. The
+ difference between READY and CLEAR states is attenuated by
painting both of them using shades of green. This option thus
highlights the alert and overdue states.
+
- When `modus-themes-deuteranopia' is non-nil the exact style of
the habit graph adapts to the needs of users with red-green
color deficiency by substituting every instance of green with
@@ -2060,7 +2077,7 @@ active mode line. The inactive mode lines remain two-dimensional
and are toned down a bit, relative to the default style.
The `moody' property optimizes the mode line for use with the
-library of the same name (hereinafter referred to as 'Moody').
+library of the same name (hereinafter referred to as Moody).
In practice, it removes the box effect and replaces it with
underline and overline properties. It also tones down the
inactive mode lines. Despite its intended purpose, this option
@@ -2253,7 +2270,7 @@ follows (order is not significant):
The `popup' key takes the same values as `selection'.
-Apart from specfying each key separately, a fallback list is
+Apart from specifying each key separately, a fallback list is
accepted. This is only useful when the desired aesthetic is the
same across all keys that are not explicitly referenced. For
example, this:
@@ -3113,10 +3130,10 @@ theme's fallback text color."
(defun modus-themes--paren (normalbg intensebg)
"Conditional use of intense colors for matching parentheses.
-NORMALBG should be the special palette color 'bg-paren-match' or
+NORMALBG should be the special palette color bg-paren-match or
something similar. INTENSEBG must be easier to discern next to
other backgrounds, such as the special palette color
-'bg-paren-match-intense'."
+bg-paren-match-intense."
(let ((properties (modus-themes--list-or-warn 'modus-themes-paren-match)))
(list :inherit
(if (memq 'bold properties)
@@ -3197,7 +3214,7 @@ an alternative to the default value."
((and (memq 'alt-syntax properties)
(memq 'yellow-comments properties)
(not (memq 'green-strings properties)))
- (or faint-yellow yellow))
+ yellow)
((memq 'yellow-comments properties)
yellow)
((memq 'faint properties)
@@ -3382,8 +3399,8 @@ clearly distinguishes past, present, future tasks."
(defun modus-themes--agenda-habit (default traffic simple &optional default-d traffic-d simple-d)
"Specify background values for `modus-themes-org-agenda' habits.
DEFAULT is the original foregrounc color. TRAFFIC is to be used
-when the 'traffic-light' style is applied, while SIMPLE
-corresponds to the 'simplified style'.
+when the traffic-light style is applied, while SIMPLE corresponds
+to the simplified style.
Optional DEFAULT-D, TRAFFIC-D, SIMPLE-D are alternatives to the
main colors, meant for dopia when `modus-themes-deuteranopia' is
@@ -3880,32 +3897,44 @@ pressed button style, else the released button."
;;;; Utilities for DIY users
-;;;;; List colors (a respin of M-x list-colors-display)
+;;;;; List colors (a variant of M-x list-colors-display)
-(defun modus-themes--list-colors-render (buffer palette)
- "Render colors in BUFFER from PALETTE.
+(defun modus-themes--list-colors-render (buffer theme &rest _)
+ "Render colors in BUFFER from THEME.
Routine for `modus-themes-list-colors'."
- (with-help-window buffer
- (with-current-buffer standard-output
- (erase-buffer)
- ;; We need this to properly render the first line.
- (insert " ")
- (dolist (cell palette)
- (let* ((name (car cell))
- (color (cdr cell))
- (fg (readable-foreground-color color))
- (pad (make-string 5 ?\s)))
- (let ((old-point (point)))
- (insert (format "%s %s" color pad))
- (put-text-property old-point (point) 'face `( :foreground ,color)))
- (let ((old-point (point)))
- (insert (format " %s %s %s\n" color pad name))
- (put-text-property old-point (point)
- 'face `( :background ,color
- :foreground ,fg
- :extend t)))
- ;; We need this to properly render the last line.
- (insert " "))))))
+ (let ((palette (seq-uniq (modus-themes--palette theme)
+ (lambda (x y)
+ (eq (car x) (car y)))))
+ (current-buffer buffer)
+ (current-theme theme))
+ (with-help-window buffer
+ (with-current-buffer standard-output
+ (erase-buffer)
+ (when (<= (display-color-cells) 256)
+ (insert (concat "Your display terminal may not render all color previews!\n"
+ "It seems to only support <= 256 colors.\n\n"))
+ (put-text-property (point-min) (point) 'face 'warning))
+ ;; We need this to properly render the first line.
+ (insert " ")
+ (dolist (cell palette)
+ (let* ((name (car cell))
+ (color (cdr cell))
+ (fg (readable-foreground-color color))
+ (pad (make-string 5 ?\s)))
+ (let ((old-point (point)))
+ (insert (format "%s %s" color pad))
+ (put-text-property old-point (point) 'face `( :foreground ,color)))
+ (let ((old-point (point)))
+ (insert (format " %s %s %s\n" color pad name))
+ (put-text-property old-point (point)
+ 'face `( :background ,color
+ :foreground ,fg
+ :extend t)))
+ ;; We need this to properly render the last line.
+ (insert " ")))
+ (setq-local revert-buffer-function
+ (lambda (_ignore-auto _noconfirm)
+ (modus-themes--list-colors-render current-buffer current-theme)))))))
(defvar modus-themes--list-colors-prompt-history '()
"Minibuffer history for `modus-themes--list-colors-prompt'.")
@@ -3921,15 +3950,10 @@ Helper function for `modus-themes-list-colors'."
(defun modus-themes-list-colors (theme)
"Preview palette of the Modus THEME of choice."
- (interactive
- (list (intern (modus-themes--list-colors-prompt))))
- (let ((palette (pcase theme
- ('modus-operandi modus-themes-operandi-colors)
- ('modus-vivendi modus-themes-vivendi-colors)
- (_ (user-error "`%s' is not a Modus theme" theme)))))
- (modus-themes--list-colors-render
- (format "*%s-list-colors*" theme)
- palette)))
+ (interactive (list (intern (modus-themes--list-colors-prompt))))
+ (modus-themes--list-colors-render
+ (format "*%s-list-colors*" theme)
+ theme))
(defun modus-themes-list-colors-current ()
"Call `modus-themes-list-colors' for the current Modus theme."
@@ -4209,6 +4233,10 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(modus-themes-mark-symbol ((,class :inherit bold :foreground ,blue-alt)))
;;;;; heading levels
;; styles for regular headings used in Org, Markdown, Info, etc.
+ `(modus-themes-heading-0
+ ((,class ,@(modus-themes--heading
+ 0 cyan-alt-other blue-alt
+ cyan-nuanced-bg bg-alt bg-region))))
`(modus-themes-heading-1
((,class ,@(modus-themes--heading
1 fg-main magenta-alt-other
@@ -4265,12 +4293,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
((,class ,@(modus-themes--markup magenta-alt magenta-intense bg-alt
bg-special-faint-calm))))
;;;;; search
- `(modus-themes-search-success ((,class :inherit ,@(modus-themes--deuteran
- 'modus-themes-intense-blue
- 'modus-themes-intense-green))))
- `(modus-themes-search-success-lazy ((,class :inherit ,@(modus-themes--deuteran
- 'modus-themes-special-mild
- 'modus-themes-refine-cyan))))
+ `(modus-themes-search-success ((,class :inherit modus-themes-intense-yellow)))
+ `(modus-themes-search-success-lazy ((,class :inherit modus-themes-subtle-cyan)))
`(modus-themes-search-success-modeline ((,class :foreground ,@(modus-themes--deuteran
blue-active
green-active))))
@@ -4330,7 +4354,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
cyan-alt-other blue-alt-other fg-alt
cyan-nuanced-bg blue-refine-bg fg-main
bg-alt bg-active))))
- `(modus-themes-reset-hard ((,class :inherit (fixed-pitch modus-themes-reset-soft))))
+ `(modus-themes-reset-hard ((,class :inherit (fixed-pitch modus-themes-reset-soft)
+ :family ,(face-attribute 'default :family))))
`(modus-themes-reset-soft ((,class :background ,bg-main :foreground ,fg-main
:weight normal :slant normal :strike-through nil
:box nil :underline nil :overline nil :extend nil)))
@@ -4350,6 +4375,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(comint-highlight-input ((,class :inherit bold)))
`(comint-highlight-prompt ((,class :inherit modus-themes-prompt)))
`(confusingly-reordered ((,class :inherit modus-themes-lang-error)))
+ `(edmacro-label ((,class :inherit bold :foreground ,cyan)))
`(elisp-shorthand-font-lock-face ((,class :inherit font-lock-variable-name-face)))
`(error ((,class :inherit bold :foreground ,red)))
`(escape-glyph ((,class :foreground ,fg-escape-char-construct)))
@@ -4369,8 +4395,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(mm-command-output ((,class :foreground ,red-alt-other)))
`(mm-uu-extract ((,class :background ,bg-dim :foreground ,fg-special-mild)))
`(next-error ((,class :inherit modus-themes-subtle-red :extend t)))
- `(pgtk-im-0 ((,class :inherit modus-themes-fringe-blue :underline t)))
- `(rectangle-preview ((,class :background ,bg-special-faint-warm :foreground ,fg-special-warm)))
+ `(pgtk-im-0 ((,class :inherit modus-themes-refine-cyan)))
+ `(rectangle-preview ((,class :inherit modus-themes-special-warm)))
`(region ((,class ,@(modus-themes--region bg-region fg-main
bg-hl-alt-intense bg-region-accent
bg-region-accent-subtle))))
@@ -4477,8 +4503,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(anzu-match-3 ((,class :inherit modus-themes-subtle-yellow)))
`(anzu-mode-line ((,class :inherit (bold modus-themes-search-success-modeline))))
`(anzu-mode-line-no-match ((,class :inherit bold :foreground ,red-active)))
- `(anzu-replace-highlight ((,class :inherit modus-themes-refine-yellow :underline t)))
- `(anzu-replace-to ((,class :inherit (modus-themes-search-success bold))))
+ `(anzu-replace-highlight ((,class :inherit modus-themes-refine-red :underline t)))
+ `(anzu-replace-to ((,class :inherit modus-themes-search-success)))
;;;;; apropos
`(apropos-button ((,class :foreground ,magenta-alt-other)))
`(apropos-function-button ((,class :foreground ,magenta)))
@@ -4631,18 +4657,6 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(calibredb-mark-face ((,class :inherit modus-themes-mark-sel)))
`(calibredb-size-face (( )))
`(calibredb-tag-face ((,class :foreground ,magenta-alt-faint)))
-;;;;; centaur-tabs
- `(centaur-tabs-active-bar-face ((,class :background ,blue-active)))
- `(centaur-tabs-close-mouse-face ((,class :inherit bold :foreground ,red-active :underline t)))
- `(centaur-tabs-close-selected ((,class :inherit centaur-tabs-selected)))
- `(centaur-tabs-close-unselected ((,class :inherit centaur-tabs-unselected)))
- `(centaur-tabs-modified-marker-selected ((,class :inherit centaur-tabs-selected)))
- `(centaur-tabs-modified-marker-unselected ((,class :inherit centaur-tabs-unselected)))
- `(centaur-tabs-default ((,class :background ,bg-main)))
- `(centaur-tabs-selected ((,class :inherit modus-themes-tab-active)))
- `(centaur-tabs-selected-modified ((,class :inherit (italic centaur-tabs-selected))))
- `(centaur-tabs-unselected ((,class :inherit modus-themes-tab-inactive)))
- `(centaur-tabs-unselected-modified ((,class :inherit (italic centaur-tabs-unselected))))
;;;;; cfrs
`(cfrs-border-color ((,class :background ,fg-window-divider-inner)))
;;;;; change-log and log-view (`vc-print-log' and `vc-print-root-log')
@@ -4737,7 +4751,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(company-tooltip-scrollbar-thumb ((,class :background ,fg-active)))
`(company-tooltip-scrollbar-track ((,class :background ,bg-active)))
`(company-tooltip-search ((,class :inherit (modus-themes-search-success-lazy bold))))
- `(company-tooltip-search-selection ((,class :inherit (modus-themes-search-success bold) :underline t)))
+ `(company-tooltip-search-selection ((,class :inherit modus-themes-search-success :underline t)))
`(company-tooltip-selection ((,class :inherit modus-themes-completion-selected-popup)))
;;;;; company-posframe
`(company-posframe-active-backend-name ((,class :inherit bold :background ,bg-active :foreground ,blue-active)))
@@ -4815,11 +4829,9 @@ by virtue of calling either of `modus-themes-load-operandi' and
;;;;; csv-mode
`(csv-separator-face ((,class :foreground ,red-intense)))
;;;;; ctrlf
- `(ctrlf-highlight-active ((,class :inherit (modus-themes-search-success bold))))
+ `(ctrlf-highlight-active ((,class :inherit modus-themes-search-success)))
`(ctrlf-highlight-line ((,class :inherit modus-themes-hl-line)))
`(ctrlf-highlight-passive ((,class :inherit modus-themes-search-success-lazy)))
-;;;;; cursor-flash
- `(cursor-flash-face ((,class :inherit modus-themes-intense-blue)))
;;;;; custom (M-x customize)
`(custom-button ((,class :inherit modus-themes-box-button)))
`(custom-button-mouse ((,class :inherit (highlight custom-button))))
@@ -4852,12 +4864,6 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(dap-ui-sessions-stack-frame-face ((,class :inherit bold :foreground ,magenta-alt)))
`(dap-ui-sessions-terminated-active-face ((,class :inherit bold :foreground ,fg-alt)))
`(dap-ui-sessions-terminated-face ((,class :inherit shadow)))
-;;;;; dashboard (emacs-dashboard)
- `(dashboard-banner-logo-title ((,class :inherit bold :foreground ,fg-special-cold)))
- `(dashboard-footer ((,class :inherit bold :foreground ,fg-special-mild)))
- `(dashboard-heading ((,class :inherit bold :foreground ,fg-special-warm)))
- `(dashboard-navigator ((,class :foreground ,cyan-alt-other)))
- `(dashboard-text-banner ((,class :foreground ,fg-dim)))
;;;;; deadgrep
`(deadgrep-filename-face ((,class :inherit bold :foreground ,fg-special-cold)))
`(deadgrep-match-face ((,class :inherit modus-themes-special-calm)))
@@ -4878,13 +4884,15 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(debbugs-gnu-stale-5 ((,class :foreground ,red-alt)))
`(debbugs-gnu-tagged ((,class :foreground ,magenta-alt)))
;;;;; deft
- `(deft-filter-string-error-face ((,class :inherit modus-themes-refine-red)))
- `(deft-filter-string-face ((,class :foreground ,green-intense)))
- `(deft-header-face ((,class :inherit bold :foreground ,fg-special-warm)))
- `(deft-separator-face ((,class :inherit shadow)))
+ `(deft-filter-string-face ((,class :inherit bold :foreground ,blue)))
+ `(deft-header-face ((,class :foreground ,fg-special-warm)))
+ `(deft-separator-face ((,class :foreground "gray50")))
`(deft-summary-face ((,class :inherit (shadow modus-themes-slant))))
- `(deft-time-face ((,class :foreground ,fg-special-cold)))
- `(deft-title-face ((,class :inherit bold :foreground ,fg-main)))
+ `(deft-time-face ((,class :foreground ,cyan)))
+ `(deft-title-face ((,class :inherit bold)))
+;;;;; denote
+ `(denote-faces-date ((,class :foreground ,cyan)))
+ `(denote-faces-keywords ((,class :inherit modus-themes-bold :foreground ,magenta-alt)))
;;;;; devdocs
`(devdocs-code-block ((,class :inherit modus-themes-fixed-pitch :background ,bg-dim :extend t)))
;;;;; dictionary
@@ -4962,7 +4970,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(dired-git-branch-else ((,class :inherit bold :foreground ,magenta-alt)))
`(dired-git-branch-master ((,class :inherit bold :foreground ,magenta-alt-other)))
;;;;; dired-git-info
- `(dgi-commit-message-face ((,class :foreground ,fg-special-mild)))
+ `(dgi-commit-message-face ((,class :foreground ,cyan-alt-other)))
;;;;; dired-narrow
`(dired-narrow-blink ((,class :inherit (modus-themes-subtle-cyan bold))))
;;;;; dired-subtree
@@ -5072,11 +5080,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(doom-modeline-unread-number ((,class :inherit italic :foreground ,fg-active)))
`(doom-modeline-urgent ((,class :inherit bold :foreground ,red-active)))
`(doom-modeline-warning ((,class :inherit bold :foreground ,yellow-active)))
-;;;;; dynamic-ruler
- `(dynamic-ruler-negative-face ((,class :inherit modus-themes-intense-neutral)))
- `(dynamic-ruler-positive-face ((,class :inherit modus-themes-intense-yellow)))
;;;;; easy-jekyll
- `(easy-jekyll-help-face ((,class :background ,bg-dim :foreground ,cyan-alt-other)))
+ `(easy-jekyll-help-face ((,class :background ,bg-dim :foreground ,blue-alt-other)))
;;;;; ebdb
`(ebdb-address-default ((,class :foreground ,fg-special-calm)))
`(ebdb-defunct ((,class :inherit shadow)))
@@ -5318,7 +5323,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(evil-ex-lazy-highlight ((,class :inherit modus-themes-search-success-lazy)))
`(evil-ex-search ((,class :inherit modus-themes-search-success)))
`(evil-ex-substitute-matches ((,class :inherit modus-themes-refine-yellow :underline t)))
- `(evil-ex-substitute-replacement ((,class :inherit (modus-themes-search-success bold))))
+ `(evil-ex-substitute-replacement ((,class :inherit modus-themes-search-success)))
;;;;; evil-goggles
`(evil-goggles-change-face ((,class :inherit modus-themes-refine-yellow)))
`(evil-goggles-commentary-face ((,class :inherit (modus-themes-subtle-neutral modus-themes-slant))))
@@ -5403,13 +5408,6 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(flx-highlight-face ((,class :inherit modus-themes-completion-match-0)))
;;;;; freeze-it
`(freeze-it-show ((,class :background ,bg-dim :foreground ,fg-special-warm)))
-;;;;; frog-menu
- `(frog-menu-action-keybinding-face ((,class :inherit modus-themes-key-binding)))
- `(frog-menu-actions-face ((,class :foreground ,magenta)))
- `(frog-menu-border ((,class :background ,bg-active)))
- `(frog-menu-candidates-face ((,class :foreground ,fg-main)))
- `(frog-menu-posframe-background-face ((,class :background ,bg-dim)))
- `(frog-menu-prompt-face ((,class :foreground ,cyan)))
;;;;; focus
`(focus-unfocused ((,class :foreground ,fg-unfocused)))
;;;;; fold-this
@@ -5467,7 +5465,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
blue-alt blue-alt-faint))))
`(font-lock-warning-face ((,class :inherit modus-themes-bold
,@(modus-themes--syntax-foreground
- yellow-active yellow-alt-faint))))
+ yellow yellow-alt-faint))))
;;;;; forge
`(forge-post-author ((,class :inherit bold :foreground ,fg-main)))
`(forge-post-date ((,class :foreground ,fg-special-cold)))
@@ -5715,18 +5713,20 @@ by virtue of calling either of `modus-themes-load-operandi' and
;;;;; helpful
`(helpful-heading ((,class :inherit modus-themes-heading-1)))
;;;;; highlight region or ad-hoc regexp
- `(hi-aquamarine ((,class :background ,cyan-subtle-bg :foreground ,fg-main)))
- `(hi-black-b ((,class :inherit bold :background ,fg-main :foreground ,bg-main)))
- `(hi-black-hb ((,class :inherit bold :background ,fg-alt :foreground ,bg-main)))
- `(hi-blue ((,class :background ,blue-subtle-bg :foreground ,fg-main)))
+ ;; HACK 2022-06-23: The :inverse-video prevents hl-line-mode from
+ ;; overriding the background. Such an override really defeats the
+ ;; purpose of setting those highlights.
+ `(hi-aquamarine ((,class :background ,bg-main :foreground ,cyan :inverse-video t)))
+ `(hi-black-b ((,class :inverse-video t)))
+ `(hi-black-hb ((,class :background ,bg-main :foreground ,fg-alt :inverse-video t)))
+ `(hi-blue ((,class :background ,bg-main :foreground ,blue-alt :inverse-video t)))
`(hi-blue-b ((,class :inherit (bold hi-blue))))
- `(hi-green ((,class :background ,green-subtle-bg :foreground ,fg-main)))
+ `(hi-green ((,class :background ,bg-main :foreground ,green :inverse-video t)))
`(hi-green-b ((,class :inherit (bold hi-green))))
- `(hi-pink ((,class :background ,magenta-subtle-bg :foreground ,fg-main)))
- `(hi-pink-b ((,class :inherit (bold hi-pink))))
- `(hi-red-b ((,class :inherit bold :background ,red-intense-bg :foreground ,fg-main)))
- `(hi-salmon ((,class :background ,red-subtle-bg :foreground ,fg-main)))
- `(hi-yellow ((,class :background ,yellow-subtle-bg :foreground ,fg-main)))
+ `(hi-pink ((,class :background ,bg-main :foreground ,magenta :inverse-video t)))
+ `(hi-red-b ((,class :inherit bold :background ,bg-main :foreground ,red :inverse-video t)))
+ `(hi-salmon ((,class :background ,bg-main :foreground ,red-alt-faint :inverse-video t)))
+ `(hi-yellow ((,class :background ,bg-main :foreground ,yellow-alt :inverse-video t)))
`(highlight ((,class ,@(if modus-themes-intense-mouseovers
(list :background blue-intense-bg :foreground fg-main)
(list :background cyan-subtle-bg :foreground fg-main)))))
@@ -5740,7 +5740,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
;;;;; highlight-numbers
`(highlight-numbers-number ((,class :foreground ,blue-alt-other)))
;;;;; highlight-thing
- `(highlight-thing ((,class :background ,bg-alt :foreground ,cyan)))
+ `(highlight-thing ((,class :inherit modus-themes-special-calm)))
;;;;; hl-defined
`(hdefd-functions ((,class :foreground ,blue)))
`(hdefd-undefined ((,class :foreground ,red-alt)))
@@ -5805,6 +5805,26 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(info-title-2 ((,class :inherit modus-themes-heading-2)))
`(info-title-3 ((,class :inherit modus-themes-heading-3)))
`(info-title-4 ((,class :inherit modus-themes-heading-4)))
+;;;;; info+ (info-plus)
+ `(info-command-ref-item ((,class :inherit font-lock-function-name-face)))
+ `(info-constant-ref-item ((,class :inherit font-lock-constant-face)))
+ `(info-custom-delimited ((,class :inherit modus-themes-markup-verbatim)))
+ `(info-double-quoted-name ((,class :inherit font-lock-string-face)))
+ `(info-file (( )))
+ `(info-function-ref-item ((,class :inherit font-lock-function-name-face)))
+ `(info-glossary-word ((,class :inherit modus-themes-box-button)))
+ `(info-indented-text (( )))
+ `(info-isolated-backquote (( )))
+ `(info-isolated-quote (( )))
+ `(info-macro-ref-item ((,class :inherit font-lock-keyword-face)))
+ `(info-menu ((,class :inherit bold)))
+ `(info-quoted-name ((,class :inherit modus-themes-markup-verbatim)))
+ `(info-reference-item ((,class :inherit bold)))
+ `(info-special-form-ref-item ((,class :inherit warning)))
+ `(info-string ((,class :inherit font-lock-string-face)))
+ `(info-syntax-class-item ((,class :inherit modus-themes-markup-code)))
+ `(info-user-option-ref-item ((,class :inherit font-lock-variable-name-face)))
+ `(info-variable-ref-item ((,class :inherit font-lock-variable-name-face)))
;;;;; info-colors
`(info-colors-lisp-code-block ((,class :inherit modus-themes-fixed-pitch)))
`(info-colors-ref-item-command ((,class :inherit font-lock-function-name-face)))
@@ -5834,13 +5854,13 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(ioccur-regexp-face ((,class :inherit (modus-themes-intense-magenta bold))))
`(ioccur-title-face ((,class :inherit modus-themes-pseudo-header :foreground ,fg-special-cold)))
;;;;; isearch, occur, and the like
- `(isearch ((,class :inherit (modus-themes-search-success bold))))
+ `(isearch ((,class :inherit modus-themes-search-success)))
`(isearch-fail ((,class :inherit modus-themes-refine-red)))
`(isearch-group-1 ((,class :inherit modus-themes-refine-blue)))
`(isearch-group-2 ((,class :inherit modus-themes-refine-magenta)))
`(lazy-highlight ((,class :inherit modus-themes-search-success-lazy)))
`(match ((,class :inherit modus-themes-special-calm)))
- `(query-replace ((,class :inherit (modus-themes-intense-yellow bold))))
+ `(query-replace ((,class :inherit modus-themes-intense-red)))
;;;;; ivy
`(ivy-action ((,class :inherit modus-themes-key-binding)))
`(ivy-confirm-face ((,class :inherit success)))
@@ -5921,12 +5941,14 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(ledger-font-payee-pending-face ((,class :foreground ,yellow)))
`(ledger-font-payee-uncleared-face ((,class :foreground ,red-alt-other)))
`(ledger-font-xact-highlight-face ((,class :background ,bg-hl-alt)))
+;;;;; leerzeichen
+ `(leerzeichen ((,class :background ,bg-whitespace :foreground ,fg-whitespace)))
;;;;; line numbers (display-line-numbers-mode and global variant)
;; Here we cannot inherit `modus-themes-fixed-pitch'. We need to
;; fall back to `default' otherwise line numbers do not scale when
;; using `text-scale-adjust'.
`(line-number
- ((,class :inherit ,(if modus-themes-mixed-fonts 'fixed-pitch 'default)
+ ((,class :inherit ,(if modus-themes-mixed-fonts '(fixed-pitch default) 'default)
,@(modus-themes--line-numbers
fg-alt bg-dim
fg-unfocused))))
@@ -6120,8 +6142,9 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(makefile-makepp-perl ((,class :background ,cyan-nuanced-bg)))
`(makefile-space ((,class :background ,magenta-nuanced-bg)))
;;;;; man
- `(Man-overstrike ((,class :inherit bold :foreground ,fg-special-calm)))
+ `(Man-overstrike ((,class :inherit bold :foreground ,magenta-alt)))
`(Man-reverse ((,class :inherit modus-themes-subtle-magenta)))
+ `(Man-underline ((,class :foreground ,cyan-alt-other :underline t)))
;;;;; marginalia
`(marginalia-archive ((,class :foreground ,cyan-alt-other)))
`(marginalia-char ((,class :foreground ,magenta)))
@@ -6235,8 +6258,6 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(markup-title-4-face ((,class :inherit modus-themes-heading-5)))
`(markup-title-5-face ((,class :inherit modus-themes-heading-6)))
`(markup-verbatim-face ((,class :inherit modus-themes-fixed-pitch :background ,bg-alt)))
-;;;;; mct
- `(mct-highlight-candidate ((,class :inherit modus-themes-completion-selected)))
;;;;; mentor
`(mentor-download-message ((,class :foreground ,fg-special-warm)))
`(mentor-download-name ((,class :foreground ,fg-special-cold)))
@@ -6450,14 +6471,12 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(org-agenda-column-dateline ((,class :background ,bg-alt)))
`(org-agenda-current-time ((,class :foreground ,blue-alt-other-faint)))
`(org-agenda-date ((,class ,@(modus-themes--agenda-date cyan fg-main))))
- `(org-agenda-date-today ((,class ,@(modus-themes--agenda-date cyan fg-main
- nil nil
- bg-inactive t t))))
- `(org-agenda-date-weekend ((,class ,@(modus-themes--agenda-date cyan-alt-other-faint fg-alt
- cyan fg-main))))
- `(org-agenda-date-weekend-today ((,class ,@(modus-themes--agenda-date cyan-alt-other-faint fg-alt
- cyan fg-main
- bg-inactive t t))))
+ `(org-agenda-date-today
+ ((,class ,@(modus-themes--agenda-date cyan fg-main nil nil bg-special-cold t t))))
+ `(org-agenda-date-weekend
+ ((,class ,@(modus-themes--agenda-date cyan-alt-other-faint fg-alt cyan fg-main))))
+ `(org-agenda-date-weekend-today
+ ((,class ,@(modus-themes--agenda-date cyan-alt-other-faint fg-alt cyan fg-main bg-special-cold t t))))
`(org-agenda-diary ((,class :inherit org-agenda-calendar-sexp)))
`(org-agenda-dimmed-todo-face ((,class :inherit shadow)))
`(org-agenda-done ((,class :inherit modus-themes-grue-nuanced)))
@@ -6491,7 +6510,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(org-dispatcher-highlight ((,class :inherit (bold modus-themes-mark-alt))))
`(org-document-info ((,class :foreground ,fg-special-cold)))
`(org-document-info-keyword ((,class :inherit (shadow modus-themes-fixed-pitch))))
- `(org-document-title ((,class :inherit modus-themes-heading-1 :background ,bg-main :overline nil :foreground ,fg-special-cold)))
+ `(org-document-title ((,class :inherit modus-themes-heading-0)))
`(org-done ((,class :inherit modus-themes-grue)))
`(org-drawer ((,class :inherit (shadow modus-themes-fixed-pitch))))
`(org-ellipsis (())) ; inherits from the heading's color
@@ -6589,8 +6608,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(org-journal-calendar-scheduled-face ((,class :inherit modus-themes-slant :foreground ,red-alt-other)))
`(org-journal-highlight ((,class :foreground ,magenta-alt)))
;;;;; org-noter
- `(org-noter-no-notes-exist-face ((,class :inherit bold :foreground ,red-active)))
- `(org-noter-notes-exist-face ((,class :inherit bold :foreground ,green-active)))
+ `(org-noter-no-notes-exist-face ((,class :inherit error)))
+ `(org-noter-notes-exist-face ((,class :inherit success)))
;;;;; org-pomodoro
`(org-pomodoro-mode-line ((,class :foreground ,red-active)))
`(org-pomodoro-mode-line-break ((,class :foreground ,cyan-active)))
@@ -6613,9 +6632,6 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(org-table-sticky-header-face ((,class :inherit modus-themes-special-cold)))
;;;;; org-tree-slide
`(org-tree-slide-header-overlay-face ((,class :inherit org-document-title)))
-;;;;; org-treescope
- `(org-treescope-faces--markerinternal-midday ((,class :inherit modus-themes-intense-blue)))
- `(org-treescope-faces--markerinternal-range ((,class :inherit modus-themes-special-mild)))
;;;;; origami
`(origami-fold-header-face ((,class :background ,bg-dim :foreground ,fg-dim :box t)))
`(origami-fold-replacement-face ((,class :background ,bg-alt :foreground ,fg-alt)))
@@ -6632,19 +6648,19 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(outline-minor-0 (()))
;;;;; package (M-x list-packages)
`(package-description ((,class :foreground ,fg-special-cold)))
- `(package-help-section-name ((,class :inherit bold :foreground ,magenta-alt-other)))
+ `(package-help-section-name ((,class :inherit bold :foreground ,cyan)))
`(package-name ((,class :inherit button)))
- `(package-status-avail-obso ((,class :inherit bold :foreground ,red)))
- `(package-status-available ((,class :foreground ,fg-special-mild)))
+ `(package-status-available ((,class :foreground ,cyan-alt-other)))
+ `(package-status-avail-obso ((,class :inherit error)))
`(package-status-built-in ((,class :foreground ,magenta)))
`(package-status-dependency ((,class :foreground ,magenta-alt-other)))
`(package-status-disabled ((,class :inherit modus-themes-subtle-red)))
`(package-status-external ((,class :foreground ,cyan-alt-other)))
`(package-status-held ((,class :foreground ,yellow-alt)))
- `(package-status-incompat ((,class :inherit bold :foreground ,yellow)))
+ `(package-status-incompat ((,class :inherit warning)))
`(package-status-installed ((,class :foreground ,fg-special-warm)))
- `(package-status-new ((,class :inherit bold :foreground ,green)))
- `(package-status-unsigned ((,class :inherit bold :foreground ,red-alt)))
+ `(package-status-new ((,class :inherit success)))
+ `(package-status-unsigned ((,class :inherit error)))
;;;;; page-break-lines
`(page-break-lines ((,class :inherit default :foreground ,fg-window-divider-outer)))
;;;;; pandoc-mode
@@ -6653,19 +6669,6 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(pandoc-directive-braces-face ((,class :foreground ,blue-alt-other)))
`(pandoc-directive-contents-face ((,class :foreground ,cyan-alt-other)))
`(pandoc-directive-type-face ((,class :foreground ,magenta)))
-;;;;; paradox
- `(paradox-archive-face ((,class :foreground ,fg-special-mild)))
- `(paradox-comment-face ((,class :inherit font-lock-comment-face)))
- `(paradox-commit-tag-face ((,class :inherit modus-themes-refine-magenta :box t)))
- `(paradox-description-face ((,class :foreground ,fg-special-cold)))
- `(paradox-description-face-multiline ((,class :foreground ,fg-special-cold)))
- `(paradox-download-face ((,class :inherit modus-themes-bold :foreground ,blue-alt-other)))
- `(paradox-highlight-face ((,class :inherit modus-themes-bold :foreground ,cyan-alt-other)))
- `(paradox-homepage-button-face ((,class :foreground ,magenta-alt-other :underline t)))
- `(paradox-mode-line-face ((,class :inherit bold :foreground ,cyan-active)))
- `(paradox-name-face ((,class :foreground ,blue :underline t)))
- `(paradox-star-face ((,class :foreground ,magenta)))
- `(paradox-starred-face ((,class :foreground ,magenta-alt)))
;;;;; paren-face
`(parenthesis ((,class :foreground ,fg-unfocused)))
;;;;; pass
@@ -6695,7 +6698,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(pomidor-work-face ((,class :inherit modus-themes-grue)))
;;;;; popup
`(popup-face ((,class :background ,bg-alt :foreground ,fg-main)))
- `(popup-isearch-match ((,class :inherit (modus-themes-search-success bold))))
+ `(popup-isearch-match ((,class :inherit modus-themes-search-success)))
`(popup-menu-mouse-face ((,class :inherit highlight)))
`(popup-menu-selection-face ((,class :inherit modus-themes-completion-selected-popup)))
`(popup-scroll-bar-background-face ((,class :background ,bg-active)))
@@ -6703,12 +6706,12 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(popup-summary-face ((,class :background ,bg-active :foreground ,fg-inactive)))
`(popup-tip-face ((,class :inherit modus-themes-refine-yellow)))
;;;;; powerline
- `(powerline-active0 ((,class :background ,blue-faint :foreground ,bg-main)))
- `(powerline-active1 ((,class :background ,blue-nuanced-bg :foreground ,blue-nuanced-fg)))
- `(powerline-active2 ((,class :background ,bg-active :foreground ,fg-active)))
- `(powerline-inactive0 ((,class :background ,bg-special-cold :foreground ,fg-special-cold)))
- `(powerline-inactive1 ((,class :background ,bg-dim :foreground ,fg-inactive)))
- `(powerline-inactive2 ((,class :background ,bg-inactive :foreground ,fg-inactive)))
+ `(powerline-active0 ((,class :background ,fg-unfocused :foreground ,bg-main)))
+ `(powerline-active1 ((,class :inherit mode-line-active)))
+ `(powerline-active2 ((,class :inherit mode-line-inactive)))
+ `(powerline-inactive0 ((,class :background ,bg-active :foreground ,fg-alt)))
+ `(powerline-inactive1 ((,class :background ,bg-main :foreground ,fg-alt)))
+ `(powerline-inactive2 ((,class :inherit mode-line-inactive)))
;;;;; powerline-evil
`(powerline-evil-base-face ((,class :background ,fg-main :foreground ,bg-main)))
`(powerline-evil-emacs-face ((,class :inherit modus-themes-active-magenta)))
@@ -6834,10 +6837,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
;;;;; selectrum
`(selectrum-current-candidate ((,class :inherit modus-themes-completion-selected)))
`(selectrum-mouse-highlight ((,class :inherit highlight)))
- `(selectrum-quick-keys-highlight
- ((,class :inherit modus-themes-refine-red)))
- `(selectrum-quick-keys-match
- ((,class :inherit (bold modus-themes-search-success))))
+ `(selectrum-quick-keys-highlight ((,class :inherit bold :background ,bg-char-0)))
+ `(selectrum-quick-keys-match ((,class :inherit bold :background ,bg-char-1)))
;;;;; selectrum-prescient
`(selectrum-prescient-primary-highlight ((,class :inherit modus-themes-completion-match-0)))
`(selectrum-prescient-secondary-highlight ((,class :inherit modus-themes-completion-match-1)))
@@ -6854,8 +6855,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(semantic-tag-boundary-face ((,class :overline ,blue-intense)))
`(semantic-unmatched-syntax-face ((,class :underline ,fg-lang-error)))
;;;;; sesman
- `(sesman-browser-button-face ((,class :foreground ,blue-alt-other :underline t)))
- `(sesman-browser-highligh-face ((,class :inherit modus-themes-subtle-blue)))
+ `(sesman-browser-button-face ((,class :inherit button)))
+ `(sesman-browser-highligh-face ((,class :inherit highlight)))
`(sesman-buffer-face ((,class :foreground ,magenta)))
`(sesman-directory-face ((,class :inherit bold :foreground ,blue)))
`(sesman-project-face ((,class :inherit bold :foreground ,magenta-alt-other)))
@@ -6986,7 +6987,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(speedbar-button-face ((,class :inherit button)))
`(speedbar-directory-face ((,class :inherit bold :foreground ,blue)))
`(speedbar-file-face ((,class :foreground ,fg-main)))
- `(speedbar-highlight-face ((,class :inherit modus-themes-subtle-blue)))
+ `(speedbar-highlight-face ((,class :inherit highlight)))
`(speedbar-selected-face ((,class :inherit bold :foreground ,cyan)))
`(speedbar-separator-face ((,class :inherit modus-themes-intense-neutral)))
`(speedbar-tag-face ((,class :foreground ,yellow-alt-other)))
@@ -7047,14 +7048,14 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(symbol-overlay-face-8 ((,class :inherit modus-themes-refine-cyan)))
;;;;; syslog-mode
`(syslog-debug ((,class :inherit bold :foreground ,cyan-alt-other)))
- `(syslog-error ((,class :inherit bold :foreground ,red)))
+ `(syslog-error ((,class :inherit error)))
`(syslog-file ((,class :inherit bold :foreground ,fg-special-cold)))
`(syslog-hide ((,class :background ,bg-main :foreground ,fg-main)))
`(syslog-hour ((,class :inherit bold :foreground ,magenta-alt-other)))
- `(syslog-info ((,class :inherit bold :foreground ,blue-alt-other)))
+ `(syslog-info ((,class :inherit success)))
`(syslog-ip ((,class :inherit bold :foreground ,fg-special-mild :underline t)))
`(syslog-su ((,class :inherit bold :foreground ,red-alt)))
- `(syslog-warn ((,class :inherit bold :foreground ,yellow)))
+ `(syslog-warn ((,class :inherit warning)))
;;;;; tab-bar-groups
`(tab-bar-groups-tab-1 ((,class :inherit modus-themes-ui-variable-pitch :foreground ,blue-tab)))
`(tab-bar-groups-tab-2 ((,class :inherit modus-themes-ui-variable-pitch :foreground ,red-tab)))
@@ -7427,8 +7428,9 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(writegood-weasels-face ((,class :inherit modus-themes-lang-error)))
;;;;; woman
`(woman-addition ((,class :foreground ,magenta-alt-other)))
- `(woman-bold ((,class :inherit bold :foreground ,fg-special-calm)))
- `(woman-unknown ((,class :foreground ,cyan)))
+ `(woman-bold ((,class :inherit bold :foreground ,magenta-alt)))
+ `(woman-italic ((,class :inherit italic :foreground ,cyan)))
+ `(woman-unknown ((,class :foreground ,green-alt)))
;;;;; xah-elisp-mode
`(xah-elisp-at-symbol ((,class :inherit font-lock-warning-face)))
`(xah-elisp-cap-variable ((,class :inherit font-lock-preprocessor-face)))
@@ -7465,6 +7467,10 @@ by virtue of calling either of `modus-themes-load-operandi' and
;;;; awesome-tray
`(awesome-tray-mode-line-active-color ,blue)
`(awesome-tray-mode-line-inactive-color ,bg-active)
+;;;; chart
+ `(chart-face-color-list
+ '( ,red-graph-0-bg ,green-graph-0-bg ,yellow-graph-0-bg ,blue-graph-0-bg ,magenta-graph-0-bg ,cyan-graph-0-bg
+ ,red-graph-1-bg ,green-graph-1-bg ,yellow-graph-1-bg ,blue-graph-1-bg ,magenta-graph-1-bg ,cyan-graph-1-bg))
;;;; exwm
`(exwm-floating-border-color ,fg-window-divider-inner)
;;;; flymake fringe indicators
@@ -7504,29 +7510,6 @@ by virtue of calling either of `modus-themes-load-operandi' and
;;;; pdf-tools
`(pdf-view-midnight-colors
'(,fg-main . ,bg-dim))
-;;;; vc-annotate (C-x v g)
- `(vc-annotate-background nil)
- `(vc-annotate-background-mode nil)
- `(vc-annotate-color-map
- '((20 . ,red)
- (40 . ,magenta)
- (60 . ,magenta-alt)
- (80 . ,red-alt)
- (100 . ,yellow)
- (120 . ,yellow-alt)
- (140 . ,fg-special-warm)
- (160 . ,fg-special-mild)
- (180 . ,green)
- (200 . ,green-alt)
- (220 . ,cyan-alt-other)
- (240 . ,cyan-alt)
- (260 . ,cyan)
- (280 . ,fg-special-cold)
- (300 . ,blue)
- (320 . ,blue-alt)
- (340 . ,blue-alt-other)
- (360 . ,magenta-alt-other)))
- `(vc-annotate-very-old-color nil)
;;;; wid-edit
`(widget-link-prefix ,(if (memq 'all-buttons modus-themes-box-buttons)
" "
diff --git a/etc/themes/modus-vivendi-theme.el b/etc/themes/modus-vivendi-theme.el
index fe52aefc84d..f2c916ef30a 100644
--- a/etc/themes/modus-vivendi-theme.el
+++ b/etc/themes/modus-vivendi-theme.el
@@ -3,8 +3,10 @@
;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
;; Author: Protesilaos Stavrou <info@protesilaos.com>
+;; Maintainer: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht>
;; URL: https://git.sr.ht/~protesilaos/modus-themes
-;; Version: 2.4.1
+;; Mailing-List: https://lists.sr.ht/~protesilaos/modus-themes
+;; Version: 2.5.0
;; Package-Requires: ((emacs "27.1"))
;; Keywords: faces, theme, accessibility
diff --git a/lib-src/Makefile.in b/lib-src/Makefile.in
index 0453b935068..cf4659fc2c1 100644
--- a/lib-src/Makefile.in
+++ b/lib-src/Makefile.in
@@ -210,11 +210,13 @@ HAVE_SECCOMP=@HAVE_SECCOMP@
HAVE_LIBSECCOMP=@HAVE_LIBSECCOMP@
LIBSECCOMP_LIBS=@LIBSECCOMP_LIBS@
LIBSECCOMP_CFLAGS=@LIBSECCOMP_CFLAGS@
+SIZEOF_LONG=@SIZEOF_LONG@
# Currently, we can only generate seccomp filter files for x86-64.
ifeq ($(HAVE_SECCOMP),yes)
ifeq ($(HAVE_LIBSECCOMP),yes)
ifeq ($(shell uname -m),x86_64)
+ifeq ($(SIZEOF_LONG),8)
# We require SECCOMP_RET_KILL_PROCESS, which is only available in
# Linux 4.14 and later.
ifeq ($(shell { echo 4.14; uname -r | cut -d . -f 1-2; } | \
@@ -225,6 +227,7 @@ endif
endif
endif
endif
+endif
ifeq ($(SECCOMP_FILTER),1)
DONT_INSTALL += seccomp-filter$(EXEEXT)
diff --git a/lib-src/etags.c b/lib-src/etags.c
index ef112579264..ed8a2184649 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -87,14 +87,6 @@ University of California, as described above. */
#include <config.h>
-/* WIN32_NATIVE is for XEmacs.
- MSDOS, WINDOWSNT, DOS_NT are for Emacs. */
-#ifdef WIN32_NATIVE
-# undef MSDOS
-# undef WINDOWSNT
-# define WINDOWSNT
-#endif /* WIN32_NATIVE */
-
#ifdef MSDOS
# undef MSDOS
# define MSDOS true
diff --git a/lib-src/make-docfile.c b/lib-src/make-docfile.c
index 908d73f5253..b5beffce19a 100644
--- a/lib-src/make-docfile.c
+++ b/lib-src/make-docfile.c
@@ -19,8 +19,8 @@ You should have received a copy of the GNU General Public License
along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
-/* The arguments given to this program are all the C and some Lisp source files
- of GNU Emacs. .el and .c files are allowed.
+/* The arguments given to this program are all the C files
+ of GNU Emacs. .c files are allowed.
A .o file can also be specified; the .c file it was made from is used.
This helps the makefile pass the correct list of files.
Option -d DIR means change to DIR before looking for files.
@@ -66,7 +66,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#endif /* not DOS_NT */
static void scan_file (char *filename);
-static void scan_lisp_file (const char *filename, const char *mode);
static void scan_c_file (char *filename, const char *mode);
static void scan_c_stream (FILE *infile);
static void start_globals (void);
@@ -236,14 +235,9 @@ put_filename (char *filename)
static void
scan_file (char *filename)
{
- ptrdiff_t len = strlen (filename);
-
if (!generate_globals)
put_filename (filename);
- if (len > 3 && !strcmp (filename + len - 3, ".el"))
- scan_lisp_file (filename, "r");
- else
- scan_c_file (filename, "r");
+ scan_c_file (filename, "r");
}
static void
@@ -1221,352 +1215,4 @@ scan_c_stream (FILE *infile)
fatal ("read error");
}
-/* Read a file of Lisp source code.
- Looks for
- (defun NAME ARGS DOCSTRING ...)
- (defmacro NAME ARGS DOCSTRING ...)
- (defsubst NAME ARGS DOCSTRING ...)
- (autoload (quote NAME) FILE DOCSTRING ...)
- (defvar NAME VALUE DOCSTRING)
- (defconst NAME VALUE DOCSTRING)
- (fset (quote NAME) (make-byte-code ... DOCSTRING ...))
- (fset (quote NAME) #[... DOCSTRING ...])
- (defalias (quote NAME) #[... DOCSTRING ...])
- (custom-declare-variable (quote NAME) VALUE DOCSTRING ...)
- starting in column zero.
- (quote NAME) may appear as 'NAME as well.
-
- We also look for #@LENGTH CONTENTS^_ at the beginning of the line.
- When we find that, we save it for the following defining-form,
- and we use that instead of reading a doc string within that defining-form.
-
- For defvar, defconst, and fset we skip to the docstring with a kludgy
- formatting convention: all docstrings must appear on the same line as the
- initial open-paren (the one in column zero) and must contain a backslash
- and a newline immediately after the initial double-quote. No newlines
- must appear between the beginning of the form and the first double-quote.
- For defun, defmacro, and autoload, we know how to skip over the
- arglist, but the doc string must still have a backslash and newline
- immediately after the double quote.
- The only source files that follow this convention are autoload-generated
- files like loaddefs.el;
- The NAME and DOCSTRING are output.
- NAME is preceded by `F' for a function or `V' for a variable.
- An entry is output only if DOCSTRING has \ newline just after the opening ".
- */
-
-static void
-skip_white (FILE *infile)
-{
- int c;
- do
- c = getc (infile);
- while (c_isspace (c));
-
- ungetc (c, infile);
-}
-
-static void
-read_lisp_symbol (FILE *infile, char *buffer)
-{
- int c;
- char *fillp = buffer;
-
- skip_white (infile);
- while (true)
- {
- c = getc (infile);
- if (c == '\\')
- {
- c = getc (infile);
- if (c < 0)
- return;
- *fillp++ = c;
- }
- else if (c_isspace (c) || c == '(' || c == ')' || c < 0)
- {
- ungetc (c, infile);
- *fillp = 0;
- break;
- }
- else
- *fillp++ = c;
- }
-
- if (! buffer[0])
- fprintf (stderr, "## expected a symbol, got '%c'\n", c);
-
- skip_white (infile);
-}
-
-static bool
-search_lisp_doc_at_eol (FILE *infile)
-{
- int c = 0, c1 = 0, c2 = 0;
-
- /* Skip until the end of line; remember two previous chars. */
- while (c != '\n' && c != '\r' && c != EOF)
- {
- c2 = c1;
- c1 = c;
- c = getc (infile);
- }
-
- /* If two previous characters were " and \,
- this is a doc string. Otherwise, there is none. */
- if (c2 != '"' || c1 != '\\')
- {
-#ifdef DEBUG
- fprintf (stderr, "## non-docstring found\n");
-#endif
- ungetc (c, infile);
- return false;
- }
- return true;
-}
-
-static void
-scan_lisp_file (const char *filename, const char *mode)
-{
- FILE *infile;
- int c;
-
- if (generate_globals)
- fatal ("scanning lisp file when -g specified");
-
- infile = fopen (filename, mode);
- if (infile == NULL)
- {
- perror (filename);
- exit (EXIT_FAILURE);
- }
-
- c = '\n';
- while (!feof (infile))
- {
- char buffer[BUFSIZ];
- char type;
-
- /* If not at end of line, skip till we get to one. */
- if (c != '\n' && c != '\r')
- {
- c = getc (infile);
- continue;
- }
- /* Skip the line break. */
- while (c == '\n' || c == '\r')
- c = getc (infile);
-
- if (c != '(')
- continue;
-
- read_lisp_symbol (infile, buffer);
-
- if (! strcmp (buffer, "defun")
- || ! strcmp (buffer, "defmacro")
- || ! strcmp (buffer, "defsubst"))
- {
- type = 'F';
- read_lisp_symbol (infile, buffer);
-
- /* Skip the arguments: either "nil" or a list in parens. */
-
- c = getc (infile);
- if (c == 'n') /* nil */
- {
- if ((c = getc (infile)) != 'i'
- || (c = getc (infile)) != 'l')
- {
- fprintf (stderr, "## unparsable arglist in %s (%s)\n",
- buffer, filename);
- continue;
- }
- }
- else if (c != '(')
- {
- fprintf (stderr, "## unparsable arglist in %s (%s)\n",
- buffer, filename);
- continue;
- }
- else
- while (! (c == ')' || c < 0))
- c = getc (infile);
- skip_white (infile);
-
- /* If the next three characters aren't `dquote bslash newline'
- then we're not reading a docstring.
- */
- if ((c = getc (infile)) != '"'
- || (c = getc (infile)) != '\\'
- || ((c = getc (infile)) != '\n' && c != '\r'))
- {
-#ifdef DEBUG
- fprintf (stderr, "## non-docstring in %s (%s)\n",
- buffer, filename);
-#endif
- continue;
- }
- }
-
- else if (! strcmp (buffer, "defvar")
- || ! strcmp (buffer, "defconst")
- || ! strcmp (buffer, "defcustom"))
- {
- type = 'V';
- read_lisp_symbol (infile, buffer);
-
- if (!search_lisp_doc_at_eol (infile))
- continue;
- }
-
- else if (! strcmp (buffer, "custom-declare-variable")
- || ! strcmp (buffer, "defvaralias")
- )
- {
- type = 'V';
-
- c = getc (infile);
- if (c == '\'')
- read_lisp_symbol (infile, buffer);
- else
- {
- if (c != '(')
- {
- fprintf (stderr,
- "## unparsable name in custom-declare-variable in %s\n",
- filename);
- continue;
- }
- read_lisp_symbol (infile, buffer);
- if (strcmp (buffer, "quote"))
- {
- fprintf (stderr,
- "## unparsable name in custom-declare-variable in %s\n",
- filename);
- continue;
- }
- read_lisp_symbol (infile, buffer);
- c = getc (infile);
- if (c != ')')
- {
- fprintf (stderr,
- "## unparsable quoted name in custom-declare-variable in %s\n",
- filename);
- continue;
- }
- }
-
- if (!search_lisp_doc_at_eol (infile))
- continue;
- }
-
- else if (! strcmp (buffer, "fset") || ! strcmp (buffer, "defalias"))
- {
- type = 'F';
-
- c = getc (infile);
- if (c == '\'')
- read_lisp_symbol (infile, buffer);
- else
- {
- if (c != '(')
- {
- fprintf (stderr, "## unparsable name in fset in %s\n",
- filename);
- continue;
- }
- read_lisp_symbol (infile, buffer);
- if (strcmp (buffer, "quote"))
- {
- fprintf (stderr, "## unparsable name in fset in %s\n",
- filename);
- continue;
- }
- read_lisp_symbol (infile, buffer);
- c = getc (infile);
- if (c != ')')
- {
- fprintf (stderr,
- "## unparsable quoted name in fset in %s\n",
- filename);
- continue;
- }
- }
-
- if (!search_lisp_doc_at_eol (infile))
- continue;
- }
-
- else if (! strcmp (buffer, "autoload"))
- {
- type = 'F';
- c = getc (infile);
- if (c == '\'')
- read_lisp_symbol (infile, buffer);
- else
- {
- if (c != '(')
- {
- fprintf (stderr, "## unparsable name in autoload in %s\n",
- filename);
- continue;
- }
- read_lisp_symbol (infile, buffer);
- if (strcmp (buffer, "quote"))
- {
- fprintf (stderr, "## unparsable name in autoload in %s\n",
- filename);
- continue;
- }
- read_lisp_symbol (infile, buffer);
- c = getc (infile);
- if (c != ')')
- {
- fprintf (stderr,
- "## unparsable quoted name in autoload in %s\n",
- filename);
- continue;
- }
- }
- skip_white (infile);
- c = getc (infile);
- if (c != '\"')
- {
- fprintf (stderr, "## autoload of %s unparsable (%s)\n",
- buffer, filename);
- continue;
- }
- read_c_string_or_comment (infile, 0, false, 0);
-
- if (!search_lisp_doc_at_eol (infile))
- continue;
- }
-
-#ifdef DEBUG
- else if (! strcmp (buffer, "if")
- || ! strcmp (buffer, "byte-code"))
- continue;
-#endif
-
- else
- {
-#ifdef DEBUG
- fprintf (stderr, "## unrecognized top-level form, %s (%s)\n",
- buffer, filename);
-#endif
- continue;
- }
-
- /* At this point, we should gobble a doc string from the input file.
- The opening quote (and leading backslash-newline)
- have already been read. */
-
- printf ("\037%c%s\n", type, buffer);
- read_c_string_or_comment (infile, 1, false, 0);
- }
- if (ferror (infile) || fclose (infile) != 0)
- fatal ("%s: read error", filename);
-}
-
-
/* make-docfile.c ends here */
diff --git a/lisp/ChangeLog.12 b/lisp/ChangeLog.12
index c45c8ae7351..a89e5155106 100644
--- a/lisp/ChangeLog.12
+++ b/lisp/ChangeLog.12
@@ -14359,7 +14359,7 @@
* ldefs-boot.el: Likewise.
* textmodes/bibtex.el (bibtex-validate-globally): Fix typo in a
- message text: "Duplicat" => "Duplicate".
+ message text.
2006-01-06 Sven Joachim <svenjoac@gmx.de> (tiny change)
diff --git a/lisp/ChangeLog.5 b/lisp/ChangeLog.5
index 4c54f148c18..b7b8b892db4 100644
--- a/lisp/ChangeLog.5
+++ b/lisp/ChangeLog.5
@@ -8998,7 +8998,7 @@
* startup.el (inhibit-startup-echo-area-message): Doc fix.
- * avoid.el (mouse-avoidance-threshold): Renamed from ...threshhold.
+ * avoid.el (mouse-avoidance-threshold): Fix typo in name.
1994-06-13 Richard Stallman (rms@albert.gnu.ai.mit.edu)
@@ -9010,7 +9010,7 @@
* startup.el (inhibit-startup-echo-area-message): Doc fix.
- * avoid.el (mouse-avoidance-threshold): Renamed from ...threshhold.
+ * avoid.el (mouse-avoidance-threshold): Fix typo in name.
* simple.el (end-of-buffer): Recenter overlay lists.
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 9516f2fc364..c73a623cce9 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -123,10 +123,10 @@ SUBDIRS_FINDER = $(filter-out ${srcdir}/leim%,${SUBDIRS_ALMOST})
## All subdirectories in which we might want to create subdirs.el.
SUBDIRS_SUBDIRS = $(filter-out ${srcdir}/cedet% ${srcdir}/leim%,${SUBDIRS})
-# cus-load and finder-inf are not explicitly requested by anything, so
-# we add them here to make sure they get built.
+# cus-load, finder-inf and autoloads are not explicitly requested by
+# anything, so we add them here to make sure they get built.
all: compile-main $(lisp)/cus-load.el $(lisp)/finder-inf.el generate-ja-dic \
- org-manuals
+ org-manuals autoloads
PHONY_EXTRAS =
.PHONY: all custom-deps finder-data autoloads update-subdirs $(PHONY_EXTRAS) \
@@ -171,52 +171,42 @@ org-manuals: main-first
## Comments on loaddefs generation:
-# loaddefs depends on gen-lisp for two reasons:
-# 1) In ../src, the emacs target depends on loaddefs but not on eg leim-list.
-# So having leim as a dependency of loaddefs (via gen-lisp) ensures leim-list
+# loaddefs depends on gen-lisp because in ../src, the emacs target
+# depends on loaddefs, but not on, for instance, leim-list. So having
+# leim as a dependency of loaddefs (via gen-lisp) ensures leim-list
# gets created before the final emacs is dumped. Having leim
-# dependencies in ../src as well would create a parallel race condition.
+# dependencies in ../src as well would create a parallel race
+# condition.
#
-# FIXME: 2) is no longer correct, so perhaps we could add unidata to
-# gen-lisp now?
+# FIXME: Is the following true any more?
#
-# 2) Files that are marked no-update-autoloads still get recorded in loaddefs.
-# So those files should be generated before we make autoloads, if we
-# don't want a successive make autoloads to change the output file.
-# Said changes are trivial (only comments in the "files without autoloads"
-# section), but still can be annoying. Of course, if generated lisp files
-# do contain autoloads, it is essential they be built before make autoloads.
-# (Also, if a generated file is not written atomically, it is possible that
-# in a parallel build, make autoloads could read a partial version of it.)
-#
-# We'd really like to add "make -C ../admin/unidata all" to gen-lisp
-# because of 2) above, but it causes a race condition in parallel
-# builds because ../src also runs that rule. Given the limitations of
-# recursive make, the only way to fix that would be to remove unidata
-# from ../src rules, but that doesn't seem possible due to the various
-# non-trivial dependencies.
-
-# We make $(lisp)/loaddefs.el a dependency of .PHONY to cause Make to
-# ignore its time stamp. That's because the real dependencies of
-# loaddefs.el aren't known to Make, they are implemented in
-# loaddefs-generate--emacs-batch.
-
-autoloads .PHONY: $(lisp)/loaddefs.el
-$(lisp)/loaddefs.el: gen-lisp $(LOADDEFS) $(lisp)/emacs-lisp/loaddefs-gen.elc
+# We'd really like to add "make -C ../admin/unidata all" to gen-lisp,
+# but it causes a race condition in parallel builds because ../src
+# also runs that rule. Given the limitations of recursive make, the
+# only way to fix that would be to remove unidata from ../src rules,
+# but that doesn't seem possible due to the various non-trivial
+# dependencies.
+
+# The real dependencies of loaddefs.el aren't known to Make, they are
+# implemented in loaddefs-generate--emacs-batch, so autoloads is an
+# "all" dependency. "leim" isn't really a dependency here, but we
+# need leim-list.el at about the same time, so ensure that it's
+# generated, too.
+autoloads: $(lisp)/emacs-lisp/loaddefs-gen.elc gen-lisp
$(AM_V_GEN)$(emacs) \
-l $(lisp)/emacs-lisp/loaddefs-gen.elc \
-f loaddefs-generate--emacs-batch ${SUBDIRS_ALMOST}
-# autoloads only runs when loaddefs.el is nonexistent, although it
-# generates a number of different files. Provide a force option to enable
-# regeneration of all these files.
+# autoloads always runs, but only updates when there's something new.
+# Provide a force option to enable regeneration of all loaddefs files.
.PHONY: autoloads-force
autoloads-force:
rm -f $(lisp)/loaddefs.el
$(MAKE) autoloads
ldefs-boot.el: autoloads-force
- cp $(lisp)/loaddefs.el $(lisp)/ldefs-boot.el
+ sed '/^;; Local Variables:/a ;; no-byte-compile: t'\
+ < $(lisp)/loaddefs.el > $(lisp)/ldefs-boot.el
# This is required by the bootstrap-emacs target in ../src/Makefile, so
# we know that if we have an emacs executable, we also have a subdirs.el.
@@ -362,7 +352,11 @@ endif
# Compile all the Elisp files that need it. Beware: it approximates
# 'no-byte-compile', so watch out for false-positives!
-compile-main: gen-lisp compile-clean main-first
+
+# The "autoloads" target has to run first, because it may generate new
+# loaddefs files. But don't depend on it, because that might trigger
+# unnecessary rebuilds.
+compile-main: gen-lisp compile-clean main-first | autoloads
@(cd $(lisp) && \
els=`echo "${SUBDIRS_REL} " | sed -e 's|/\./|/|g' -e 's|/\. | |g' -e 's| |/*.el |g'`; \
for el in $$els; do \
@@ -470,7 +464,7 @@ bootstrap-clean:
rm -f $(AUTOGENEL)
distclean:
- -rm -f ./Makefile $(lisp)/loaddefs.el
+ -rm -f ./Makefile $(lisp)/loaddefs.el $(lisp)/loaddefs.elc
maintainer-clean: distclean bootstrap-clean
rm -f TAGS
diff --git a/lisp/allout.el b/lisp/allout.el
index e07bac4ef99..8e303a8a02f 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -394,9 +394,8 @@ else allout's special hanging-indent maintaining auto-fill function,
;;;_ = allout-use-hanging-indents
(defcustom allout-use-hanging-indents t
"If non-nil, topic body text auto-indent defaults to indent of the header.
-Ie, it is indented to be just past the header prefix. This is
-relevant mostly for use with `indented-text-mode', or other situations
-where auto-fill occurs."
+I.e., it is indented to be just past the header prefix. This is
+relevant mostly for situations where auto-fill occurs."
:type 'boolean
:group 'allout)
(make-variable-buffer-local 'allout-use-hanging-indents)
@@ -1700,7 +1699,7 @@ the HOT-SPOT Operation section.
Misc commands:
-------------
-M-x outlineify-sticky Activate outline mode for current buffer,
+\\[allout-outlinify-sticky] Activate outline mode for current buffer,
and establish a default file-var setting
for `allout-layout'.
\\[allout-mark-topic] `allout-mark-topic'
@@ -6185,19 +6184,18 @@ save. See `allout-encrypt-unencrypted-on-saves' for more info."
;;;_ #9 miscellaneous
;;;_ : Mode:
-;;;_ > outlineify-sticky ()
-;; outlinify-sticky is correct spelling; provide this alias for sticklers:
+;;;_ > allout-outlinify-sticky ()
;;;###autoload
-(defalias 'outlinify-sticky #'outlineify-sticky)
+(define-obsolete-function-alias 'outlinify-sticky #'allout-outlinify-sticky "29.1")
;;;###autoload
-(defun outlineify-sticky (&optional _arg)
+(define-obsolete-function-alias 'outlineify-sticky #'allout-outlinify-sticky "29.1")
+;;;###autoload
+(defun allout-outlinify-sticky (&optional _arg)
"Activate outline mode and establish file var so it is started subsequently.
See `allout-layout' and customization of `allout-auto-activation'
for details on preparing Emacs for automatic allout activation."
-
(interactive "P")
-
(if (allout-mode-p) (allout-mode)) ; deactivate so we can re-activate...
(allout-mode)
diff --git a/lisp/apropos.el b/lisp/apropos.el
index 0b84f9fa63b..624c29cb410 100644
--- a/lisp/apropos.el
+++ b/lisp/apropos.el
@@ -1,7 +1,6 @@
;;; apropos.el --- apropos commands for users and programmers -*- lexical-binding: t -*-
-;; Copyright (C) 1989, 1994-1995, 2001-2022 Free Software Foundation,
-;; Inc.
+;; Copyright (C) 1989-2022 Free Software Foundation, Inc.
;; Author: Joe Wells <jbw@bigbird.bu.edu>
;; Daniel Pfeiffer <occitan@esperanto.org> (rewrite)
@@ -218,7 +217,7 @@ before `apropos-mode' makes it buffer-local.")
(define-button-type 'apropos-symbol
'face 'apropos-symbol
- 'help-echo "mouse-2, RET: Display more help on this symbol"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this symbol"
'follow-link t
'action #'apropos-symbol-button-display-help)
@@ -232,7 +231,7 @@ before `apropos-mode' makes it buffer-local.")
'apropos-label "Function"
'apropos-short-label "f"
'face 'apropos-function-button
- 'help-echo "mouse-2, RET: Display more help on this function"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this function"
'follow-link t
'action (lambda (button)
(describe-function (button-get button 'apropos-symbol))))
@@ -241,7 +240,7 @@ before `apropos-mode' makes it buffer-local.")
'apropos-label "Macro"
'apropos-short-label "m"
'face 'apropos-function-button
- 'help-echo "mouse-2, RET: Display more help on this macro"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this macro"
'follow-link t
'action (lambda (button)
(describe-function (button-get button 'apropos-symbol))))
@@ -250,7 +249,7 @@ before `apropos-mode' makes it buffer-local.")
'apropos-label "Command"
'apropos-short-label "c"
'face 'apropos-function-button
- 'help-echo "mouse-2, RET: Display more help on this command"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this command"
'follow-link t
'action (lambda (button)
(describe-function (button-get button 'apropos-symbol))))
@@ -264,7 +263,7 @@ before `apropos-mode' makes it buffer-local.")
'apropos-label "Variable"
'apropos-short-label "v"
'face 'apropos-variable-button
- 'help-echo "mouse-2, RET: Display more help on this variable"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this variable"
'follow-link t
'action (lambda (button)
(describe-variable (button-get button 'apropos-symbol))))
@@ -273,7 +272,7 @@ before `apropos-mode' makes it buffer-local.")
'apropos-label "User option"
'apropos-short-label "o"
'face 'apropos-user-option-button
- 'help-echo "mouse-2, RET: Display more help on this user option"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this user option"
'follow-link t
'action (lambda (button)
(describe-variable (button-get button 'apropos-symbol))))
@@ -282,7 +281,7 @@ before `apropos-mode' makes it buffer-local.")
'apropos-label "Face"
'apropos-short-label "F"
'face 'apropos-button
- 'help-echo "mouse-2, RET: Display more help on this face"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this face"
'follow-link t
'action (lambda (button)
(describe-face (button-get button 'apropos-symbol))))
@@ -291,7 +290,7 @@ before `apropos-mode' makes it buffer-local.")
'apropos-label "Group"
'apropos-short-label "g"
'face 'apropos-misc-button
- 'help-echo "mouse-2, RET: Display more help on this group"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this group"
'follow-link t
'action (lambda (button)
(customize-group-other-window
@@ -301,7 +300,7 @@ before `apropos-mode' makes it buffer-local.")
'apropos-label "Widget"
'apropos-short-label "w"
'face 'apropos-misc-button
- 'help-echo "mouse-2, RET: Display more help on this widget"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this widget"
'follow-link t
'action (lambda (button)
(widget-browse-other-window (button-get button 'apropos-symbol))))
@@ -310,13 +309,13 @@ before `apropos-mode' makes it buffer-local.")
'apropos-label "Properties"
'apropos-short-label "p"
'face 'apropos-misc-button
- 'help-echo "mouse-2, RET: Display more help on this plist"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this plist"
'follow-link t
'action (lambda (button)
(apropos-describe-plist (button-get button 'apropos-symbol))))
(define-button-type 'apropos-library
- 'help-echo "mouse-2, RET: Display more help on this library"
+ 'help-echo "\\`mouse-2', \\`RET': Display more help on this library"
'follow-link t
'action (lambda (button)
(apropos-library (button-get button 'apropos-symbol))))
@@ -909,41 +908,39 @@ Returns list of symbols and documentation found."
(apropos-parse-pattern pattern t)
(or do-all (setq do-all apropos-do-all))
(setq apropos-accumulator () apropos-files-scanned ())
- (let ((standard-input (get-buffer-create " apropos-temp"))
- (apropos-sort-by-scores apropos-documentation-sort-by-scores)
- f v sf sv)
- (unwind-protect
- (with-current-buffer standard-input
- (apropos-documentation-check-doc-file)
- (if do-all
- (mapatoms
- (lambda (symbol)
- (setq f (apropos-safe-documentation symbol)
- v (get symbol 'variable-documentation))
- (if (integerp v) (setq v nil))
- (setq f (apropos-documentation-internal f)
- v (apropos-documentation-internal v))
- (setq sf (apropos-score-doc f)
- sv (apropos-score-doc v))
- (if (or f v)
- (if (setq apropos-item
- (cdr (assq symbol apropos-accumulator)))
- (progn
- (if f
- (progn
- (setcar (nthcdr 1 apropos-item) f)
- (setcar apropos-item (+ (car apropos-item) sf))))
- (if v
- (progn
- (setcar (nthcdr 2 apropos-item) v)
- (setcar apropos-item (+ (car apropos-item) sv)))))
- (setq apropos-accumulator
- (cons (list symbol
- (+ (apropos-score-symbol symbol 2) sf sv)
- f v)
- apropos-accumulator)))))))
- (apropos-print nil "\n----------------\n" nil t))
- (kill-buffer standard-input))))
+ (with-temp-buffer
+ (let ((standard-input (current-buffer))
+ (apropos-sort-by-scores apropos-documentation-sort-by-scores)
+ f v sf sv)
+ (apropos-documentation-check-doc-file)
+ (if do-all
+ (mapatoms
+ (lambda (symbol)
+ (setq f (apropos-safe-documentation symbol)
+ v (get symbol 'variable-documentation))
+ (if (integerp v) (setq v nil))
+ (setq f (apropos-documentation-internal f)
+ v (apropos-documentation-internal v))
+ (setq sf (apropos-score-doc f)
+ sv (apropos-score-doc v))
+ (if (or f v)
+ (if (setq apropos-item
+ (cdr (assq symbol apropos-accumulator)))
+ (progn
+ (if f
+ (progn
+ (setcar (nthcdr 1 apropos-item) f)
+ (setcar apropos-item (+ (car apropos-item) sf))))
+ (if v
+ (progn
+ (setcar (nthcdr 2 apropos-item) v)
+ (setcar apropos-item (+ (car apropos-item) sv)))))
+ (setq apropos-accumulator
+ (cons (list symbol
+ (+ (apropos-score-symbol symbol 2) sf sv)
+ f v)
+ apropos-accumulator)))))))
+ (apropos-print nil "\n----------------\n" nil t))))
(defun apropos-value-internal (predicate symbol function)
@@ -1334,14 +1331,14 @@ as a heading."
(defun apropos-follow ()
"Invokes any button at point, otherwise invokes the nearest label button."
- (interactive)
+ (interactive nil apropos-mode)
(button-activate
(or (apropos-next-label-button (line-beginning-position))
(error "There is nothing to follow here"))))
(defun apropos-next-symbol ()
"Move cursor down to the next symbol in an `apropos-mode' buffer."
- (interactive)
+ (interactive nil apropos-mode)
(forward-line)
(while (and (not (eq (face-at-point) 'apropos-symbol))
(< (point) (point-max)))
@@ -1349,7 +1346,7 @@ as a heading."
(defun apropos-previous-symbol ()
"Move cursor back to the last symbol in an `apropos-mode' buffer."
- (interactive)
+ (interactive nil apropos-mode)
(forward-line -1)
(while (and (not (eq (face-at-point) 'apropos-symbol))
(> (point) (point-min)))
diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el
index c52f2a44322..632ae578523 100644
--- a/lisp/arc-mode.el
+++ b/lisp/arc-mode.el
@@ -1073,22 +1073,31 @@ NEW-NAME."
(user-error "Can't copy a list of files to a single file"))
(save-excursion
(dolist (file files)
- (let ((write-to (if (file-directory-p new-name)
- (expand-file-name file new-name)
- new-name)))
+ (let* ((write-to (if (file-directory-p new-name)
+ (expand-file-name file new-name)
+ new-name))
+ (write-to-dir (file-name-directory write-to)))
(when (and (file-exists-p write-to)
(not (yes-or-no-p (format "%s already exists; overwrite? "
write-to))))
(user-error "Not overwriting %s" write-to))
+ (unless (file-directory-p write-to-dir)
+ (make-directory write-to-dir t))
(archive-goto-file file)
(let* ((descr (archive-get-descr))
(archive (buffer-file-name))
(extractor (archive-name "extract"))
- (ename (archive--file-desc-ext-file-name descr)))
- (with-temp-buffer
- (set-buffer-multibyte nil)
- (archive--extract-file extractor archive ename)
- (write-region (point-min) (point-max) write-to)))))))
+ (ename (archive--file-desc-ext-file-name descr))
+ ;; If the archive is remote, we have to copy it to a
+ ;; local file first to make extraction work.
+ (copy (archive-maybe-copy archive)))
+ (unwind-protect
+ (with-temp-buffer
+ (set-buffer-multibyte nil)
+ (archive--extract-file extractor copy ename)
+ (write-region (point-min) (point-max) write-to))
+ (unless (equal copy archive)
+ (delete-file copy))))))))
(defun archive-extract (&optional other-window-p event)
"In archive mode, extract this entry of the archive into its own buffer."
@@ -1318,6 +1327,8 @@ NEW-NAME."
;;; Section: IO stuff
(defun archive-write-file-member ()
+ (unless (buffer-live-p archive-superior-buffer)
+ (error "The archive buffer no longer exists; can't save"))
(save-excursion
(save-restriction
(message "Updating archive...")
diff --git a/lisp/array.el b/lisp/array.el
index 08c5ff45ddd..aed93ffb65b 100644
--- a/lisp/array.el
+++ b/lisp/array.el
@@ -103,7 +103,7 @@ Set them to the optional arguments A-ROW and A-COLUMN if those are supplied."
(defun array-update-buffer-position ()
"Set `array-buffer-line' and `array-buffer-column' to their current values."
- (setq array-buffer-line (current-line)
+ (setq array-buffer-line (array-current-line)
array-buffer-column (current-column)))
@@ -113,7 +113,7 @@ Set them to the optional arguments A-ROW and A-COLUMN if those are supplied."
(defun array-what-position ()
"Display the row and column in which the cursor is positioned."
(interactive)
- (let ((array-buffer-line (current-line))
+ (let ((array-buffer-line (array-current-line))
(array-buffer-column (current-column)))
(message "Array row: %s Array column: %s"
(prin1-to-string (array-current-row))
@@ -147,13 +147,13 @@ Set them to the optional arguments A-ROW and A-COLUMN if those are supplied."
;;; Internal movement functions.
(defun array-beginning-of-field (&optional go-there)
- "Return the column of the beginning of the current field.
+ "Return the column of the beginning of the current field.
Optional argument GO-THERE, if non-nil, means go there too."
- ;; Requires that array-buffer-column be current.
- (let ((goal-column (- array-buffer-column (% array-buffer-column array-field-width))))
- (if go-there
- (move-to-column-untabify goal-column)
- goal-column)))
+ ;; Requires that array-buffer-column be current.
+ (let ((goal-column (- array-buffer-column (% array-buffer-column array-field-width))))
+ (if go-there
+ (array-move-to-column-untabify goal-column)
+ goal-column)))
(defun array-end-of-field (&optional go-there)
"Return the column of the end of the current array field.
@@ -162,7 +162,7 @@ If optional argument GO-THERE is non-nil, go there too."
(let ((goal-column (+ (- array-buffer-column (% array-buffer-column array-field-width))
array-field-width)))
(if go-there
- (move-to-column-untabify goal-column)
+ (array-move-to-column-untabify goal-column)
goal-column)))
(defun array-move-to-cell (a-row a-column)
@@ -174,7 +174,7 @@ Leave point at the beginning of the field and return the new buffer column."
(goal-column (* array-field-width (% (1- a-column) array-columns-per-line))))
(goto-char (point-min))
(forward-line goal-line)
- (move-to-column-untabify goal-column)))
+ (array-move-to-column-untabify goal-column)))
(defun array-move-to-row (a-row)
"Move to array row A-ROW preserving the current array column.
@@ -184,7 +184,7 @@ Leave point at the beginning of the field and return the new array row."
(% array-buffer-line array-lines-per-row)))
(goal-column (- array-buffer-column (% array-buffer-column array-field-width))))
(forward-line (- goal-line array-buffer-line))
- (move-to-column-untabify goal-column)
+ (array-move-to-column-untabify goal-column)
a-row))
(defun array-move-to-column (a-column)
@@ -196,7 +196,7 @@ Leave point at the beginning of the field and return the new array column."
(floor (1- a-column) array-columns-per-line)))
(goal-column (* array-field-width (% (1- a-column) array-columns-per-line))))
(forward-line (- goal-line array-buffer-line))
- (move-to-column-untabify goal-column)
+ (array-move-to-column-untabify goal-column)
a-column))
(defun array-move-one-row (sign)
@@ -214,7 +214,7 @@ If requested to move beyond the array bounds, signal an error."
(t
(progn
(forward-line (* sign array-lines-per-row))
- (move-to-column-untabify goal-column)
+ (array-move-to-column-untabify goal-column)
(+ array-row sign))))))
(defun array-move-one-column (sign)
@@ -233,15 +233,15 @@ If requested to move beyond the array bounds, signal an error."
;; Going backward from first column on the line.
((and (= sign -1) (= 1 (% array-column array-columns-per-line)))
(forward-line -1)
- (move-to-column-untabify
+ (array-move-to-column-untabify
(* array-field-width (1- array-columns-per-line))))
;; Going forward from last column on the line.
((and (= sign 1) (zerop (% array-column array-columns-per-line)))
(forward-line 1))
;; Somewhere in the middle of the line.
(t
- (move-to-column-untabify (+ (array-beginning-of-field)
- (* array-field-width sign)))))
+ (array-move-to-column-untabify (+ (array-beginning-of-field)
+ (* array-field-width sign)))))
(+ array-column sign)))))
(defun array-normalize-cursor ()
@@ -281,15 +281,15 @@ If necessary, scroll horizontally to keep the cursor in view."
"Move down one array row, staying in the current array column.
If optional ARG is given, move down ARG array rows."
(interactive "p")
- (let ((array-buffer-line (current-line))
+ (let ((array-buffer-line (array-current-line))
(array-buffer-column (current-column)))
(if (= (abs arg) 1)
(array-move-one-row arg)
(array-move-to-row
- (limit-index (+ (or (array-current-row)
- (error "Cursor is not in an array cell"))
- arg)
- array-max-row))))
+ (array--limit-index (+ (or (array-current-row)
+ (error "Cursor is not in an array cell"))
+ arg)
+ array-max-row))))
(array-normalize-cursor))
(defun array-previous-row (&optional arg)
@@ -303,15 +303,15 @@ If optional ARG is given, move up ARG array rows."
If optional ARG is given, move forward ARG array columns.
If necessary, keep the cursor in the window by scrolling right or left."
(interactive "p")
- (let ((array-buffer-line (current-line))
+ (let ((array-buffer-line (array-current-line))
(array-buffer-column (current-column)))
(if (= (abs arg) 1)
(array-move-one-column arg)
(array-move-to-column
- (limit-index (+ (or (array-current-column)
- (error "Cursor is not in an array cell"))
- arg)
- array-max-column))))
+ (array--limit-index (+ (or (array-current-column)
+ (error "Cursor is not in an array cell"))
+ arg)
+ array-max-column))))
(array-normalize-cursor))
(defun array-backward-column (&optional arg)
@@ -325,8 +325,8 @@ If necessary, keep the cursor in the window by scrolling right or left."
"Go to array row A-ROW and array column A-COLUMN."
(interactive "nArray row: \nnArray column: ")
(array-move-to-cell
- (limit-index a-row array-max-row)
- (limit-index a-column array-max-column))
+ (array--limit-index a-row array-max-row)
+ (array--limit-index a-column array-max-column))
(array-normalize-cursor))
@@ -417,7 +417,7 @@ Leave point at the beginning of the field."
"Copy the current field one array row down.
If optional ARG is given, copy down through ARG array rows."
(interactive "p")
- (let* ((array-buffer-line (current-line))
+ (let* ((array-buffer-line (array-current-line))
(array-buffer-column (current-column))
(array-row (or (array-current-row)
(error "Cursor is not in a valid array cell")))
@@ -425,7 +425,7 @@ If optional ARG is given, copy down through ARG array rows."
(if (= (abs arg) 1)
(array-copy-once-vertically arg)
(array-copy-to-row
- (limit-index (+ array-row arg) array-max-row))))
+ (array--limit-index (+ array-row arg) array-max-row))))
(array-normalize-cursor))
(defun array-copy-up (&optional arg)
@@ -438,7 +438,7 @@ If optional ARG is given, copy up through ARG array rows."
"Copy the current field one array column to the right.
If optional ARG is given, copy through ARG array columns to the right."
(interactive "p")
- (let* ((array-buffer-line (current-line))
+ (let* ((array-buffer-line (array-current-line))
(array-buffer-column (current-column))
(array-column (or (array-current-column)
(error "Cursor is not in a valid array cell")))
@@ -446,7 +446,7 @@ If optional ARG is given, copy through ARG array columns to the right."
(if (= (abs arg) 1)
(array-copy-once-horizontally arg)
(array-copy-to-column
- (limit-index (+ array-column arg) array-max-column))))
+ (array--limit-index (+ array-column arg) array-max-column))))
(array-normalize-cursor))
(defun array-copy-backward (&optional arg)
@@ -473,7 +473,7 @@ If optional ARG is given, copy through ARG array columns to the right."
(if (= (abs arg) 1)
(array-copy-once-horizontally arg)
(array-copy-to-column
- (limit-index (+ array-column arg) array-max-column))))))
+ (array--limit-index (+ array-column arg) array-max-column))))))
(message "Working...done")
(array-move-to-row array-row)
(array-normalize-cursor))
@@ -506,7 +506,7 @@ If optional ARG is given, copy through ARG rows down."
(forward-line 1)
(point))))
(this-row array-row)
- (goal-row (limit-index (+ this-row arg) array-max-row))
+ (goal-row (array--limit-index (+ this-row arg) array-max-row))
(num (- goal-row this-row))
(count (abs num))
(sign (if (not (zerop count)) (/ num count))))
@@ -700,13 +700,13 @@ of `array-rows-numbered'."
(floor (1- temp-max-column) new-columns-per-line))
(newlines-added 0))
(while (< newlines-removed newlines-to-be-removed)
- (move-to-column-untabify
+ (array-move-to-column-untabify
(* (1+ newlines-removed) old-line-length))
(kill-line 1)
(setq newlines-removed (1+ newlines-removed)))
(beginning-of-line)
(while (< newlines-added newlines-to-be-added)
- (move-to-column-untabify (* old-field-width new-columns-per-line))
+ (array-move-to-column-untabify (* old-field-width new-columns-per-line))
(newline)
(setq newlines-added (1+ newlines-added)))
(forward-line 1))))
@@ -735,16 +735,16 @@ of `array-rows-numbered'."
;;; Utilities.
-(defun limit-index (index limit)
+(defun array--limit-index (index limit)
(cond ((< index 1) 1)
((> index limit) limit)
(t index)))
-(defun current-line ()
+(defun array-current-line ()
"Return the current buffer line at point. The first line is 0."
(count-lines (point-min) (line-beginning-position)))
-(defun move-to-column-untabify (column)
+(defun array-move-to-column-untabify (column)
"Move to COLUMN on the current line, untabifying if necessary.
Return COLUMN."
(or (and (= column (move-to-column column))
@@ -753,10 +753,10 @@ Return COLUMN."
(if array-respect-tabs
(error "There is a TAB character in the way")
(progn
- (untabify-backward)
+ (array--untabify-backward)
(move-to-column column)))))
-(defun untabify-backward ()
+(defun array--untabify-backward ()
"Untabify the preceding TAB."
(save-excursion
(let ((start (point)))
@@ -885,7 +885,10 @@ Entering array mode calls the function `array-mode-hook'."
(setq-local truncate-lines t)
(setq overwrite-mode 'overwrite-mode-textual))
-
+(define-obsolete-function-alias 'limit-index #'array--limit-index "29.1")
+(define-obsolete-function-alias 'current-line #'array-current-line "29.1")
+(define-obsolete-function-alias 'move-to-column-untabify #'array-move-to-column-untabify "29.1")
+(define-obsolete-function-alias 'untabify-backward #'array--untabify-backward "29.1")
(provide 'array)
diff --git a/lisp/auth-source.el b/lisp/auth-source.el
index 12da2c3d73d..f198362f106 100644
--- a/lisp/auth-source.el
+++ b/lisp/auth-source.el
@@ -909,10 +909,17 @@ Remove trailing \": \"."
(defun auth-source--aget (alist key)
(cdr (assoc key alist)))
+;;;###autoload
+(defun auth-source-netrc-parse-all (file)
+ "Parse FILE and return all entries."
+ (auth-source-netrc-parse :file file :allow-null t))
+
;; (auth-source-netrc-parse :file "~/.authinfo.gpg")
(cl-defun auth-source-netrc-parse (&key file max host user port require
- &allow-other-keys)
- "Parse FILE and return a list of all entries in the file.
+ allow-null &allow-other-keys)
+ "Parse FILE and return a list of matching entries in the file.
+If ALLOW-NULL, allow nil values of HOST, USER and PORT to match.
+
Note that the MAX parameter is used so we can exit the parse early."
(if (listp file)
;; We got already parsed contents; just return it.
@@ -925,27 +932,33 @@ Note that the MAX parameter is used so we can exit the parse early."
(cached (cdr-safe (assoc file auth-source-netrc-cache)))
(cached-mtime (plist-get cached :mtime))
(cached-secrets (plist-get cached :secret))
- (check (lambda(alist)
+ (check (lambda (alist)
(and alist
- (auth-source-search-collection
- host
- (or
- (auth-source--aget alist "machine")
- (auth-source--aget alist "host")
- t))
- (auth-source-search-collection
- user
- (or
- (auth-source--aget alist "login")
- (auth-source--aget alist "account")
- (auth-source--aget alist "user")
- t))
- (auth-source-search-collection
- port
- (or
- (auth-source--aget alist "port")
- (auth-source--aget alist "protocol")
- t))
+ (or
+ (and allow-null (null host))
+ (auth-source-search-collection
+ host
+ (or
+ (auth-source--aget alist "machine")
+ (auth-source--aget alist "host")
+ t)))
+ (or
+ (and allow-null (null user))
+ (auth-source-search-collection
+ user
+ (or
+ (auth-source--aget alist "login")
+ (auth-source--aget alist "account")
+ (auth-source--aget alist "user")
+ t)))
+ (or
+ (and allow-null (null port))
+ (auth-source-search-collection
+ port
+ (or
+ (auth-source--aget alist "port")
+ (auth-source--aget alist "protocol")
+ t)))
(or
;; the required list of keys is nil, or
(null require)
@@ -957,7 +970,8 @@ Note that the MAX parameter is used so we can exit the parse early."
result)
(if (and (functionp cached-secrets)
- (equal cached-mtime
+ (time-equal-p
+ cached-mtime
(file-attribute-modification-time
(file-attributes file))))
(progn
@@ -1622,7 +1636,7 @@ authentication tokens:
(not (string-match label item)))
collect item)))
;; TODO: respect max in `secrets-search-items', not after the fact
- (items (butlast items (- (length items) max)))
+ (items (take max items))
;; convert the item name to a full plist
(items (mapcar (lambda (item)
(append
@@ -2080,7 +2094,7 @@ entries for git.gnus.org:
search-keys)))
(items (plstore-find store search-spec))
(item-names (mapcar #'car items))
- (items (butlast items (- (length items) max)))
+ (items (take max items))
;; convert the item to a full plist
(items (mapcar (lambda (item)
(let* ((plist (copy-tree (cdr item)))
diff --git a/lisp/battery.el b/lisp/battery.el
index 3cff3167a6c..93f4070e4bc 100644
--- a/lisp/battery.el
+++ b/lisp/battery.el
@@ -255,14 +255,14 @@ of the following information may or may not be available:
For instance, to play an alarm when the battery power dips below
10%, you could use a function like the following:
-(defvar my-prev-battery nil)
-(defun my-battery-alarm (data)
- (when (and my-prev-battery
- (equal (alist-get ?L data) \"off-line\")
- (< (string-to-number (alist-get ?p data)) 10)
- (>= (string-to-number (alist-get ?p my-prev-battery)) 10))
- (play-sound-file \"~/alarm.wav\" 5))
- (setq my-prev-battery data))"
+ (defvar my-prev-battery nil)
+ (defun my-battery-alarm (data)
+ (when (and my-prev-battery
+ (equal (alist-get ?L data) \"off-line\")
+ (< (string-to-number (alist-get ?p data)) 10)
+ (>= (string-to-number (alist-get ?p my-prev-battery)) 10))
+ (play-sound-file \"~/alarm.wav\" 5))
+ (setq my-prev-battery data))"
:version "29.1"
:type '(repeat function))
diff --git a/lisp/bindings.el b/lisp/bindings.el
index 14ab69b8f02..2e321282742 100644
--- a/lisp/bindings.el
+++ b/lisp/bindings.el
@@ -517,31 +517,31 @@ mouse-1: Display Line and Column Mode Menu")
'help-echo "Size indication mode\n\
mouse-1: Display Line and Column Mode Menu")))
(line-number-mode
- ((column-number-mode
- (column-number-indicator-zero-based
- (10
- (:propertize
- mode-line-position-column-line-format
- display (min-width (10.0))
- ,@mode-line-position--column-line-properties))
- (10
- (:propertize
- (:eval (string-replace
- "%c" "%C" (car mode-line-position-column-line-format)))
- display (min-width (10.0))
- ,@mode-line-position--column-line-properties)))
- (6
+ (column-number-mode
+ (column-number-indicator-zero-based
+ (10
(:propertize
- mode-line-position-line-format
- display (min-width (6.0))
- ,@mode-line-position--column-line-properties))))
+ mode-line-position-column-line-format
+ display (min-width (10.0))
+ ,@mode-line-position--column-line-properties))
+ (10
+ (:propertize
+ (:eval (string-replace
+ "%c" "%C" (car mode-line-position-column-line-format)))
+ display (min-width (10.0))
+ ,@mode-line-position--column-line-properties)))
+ (6
+ (:propertize
+ mode-line-position-line-format
+ display (min-width (6.0))
+ ,@mode-line-position--column-line-properties)))
(column-number-mode
(column-number-indicator-zero-based
(6
(:propertize
mode-line-position-column-format
display (min-width (6.0))
- (,@mode-line-position--column-line-properties)))
+ ,@mode-line-position--column-line-properties))
(6
(:propertize
(:eval (string-replace
@@ -966,14 +966,13 @@ if `inhibit-field-text-motion' is non-nil."
(backward-word n)
(forward-word n)))
-(defvar narrow-map (make-sparse-keymap)
- "Keymap for narrowing commands.")
+(defvar-keymap narrow-map
+ :doc "Keymap for narrowing commands."
+ "n" #'narrow-to-region
+ "w" #'widen
+ "g" #'goto-line-relative)
(define-key ctl-x-map "n" narrow-map)
-(define-key narrow-map "n" 'narrow-to-region)
-(define-key narrow-map "w" 'widen)
-(define-key narrow-map "g" 'goto-line-relative)
-
;; Quitting
(define-key global-map "\e\e\e" 'keyboard-escape-quit)
(define-key global-map "\C-g" 'keyboard-quit)
@@ -1009,11 +1008,9 @@ if `inhibit-field-text-motion' is non-nil."
;; Richard said that we should not use C-x <uppercase letter> and I have
;; no idea whereas to bind it. Any suggestion welcome. -stef
;; (define-key ctl-x-map "U" 'undo-only)
-(defvar undo-repeat-map
- (let ((map (make-sparse-keymap)))
- (define-key map "u" 'undo)
- map)
- "Keymap to repeat undo key sequences \\`C-x u u'. Used in `repeat-mode'.")
+(defvar-keymap undo-repeat-map
+ :doc "Keymap to repeat undo key sequences \\`C-x u u'. Used in `repeat-mode'."
+ "u" #'undo)
(put 'undo 'repeat-map 'undo-repeat-map)
(define-key global-map '[(control ??)] 'undo-redo)
@@ -1084,8 +1081,6 @@ if `inhibit-field-text-motion' is non-nil."
(define-key global-map "\C-y" 'yank)
(define-key esc-map "y" 'yank-pop)
-;; (define-key ctl-x-map "a" 'append-to-buffer)
-
(define-key global-map "\C-@" 'set-mark-command)
;; Many people are used to typing C-SPC and getting C-@.
(define-key global-map [?\C- ] 'set-mark-command)
@@ -1104,44 +1099,41 @@ if `inhibit-field-text-motion' is non-nil."
(define-key ctl-x-map "`" 'next-error)
-(defvar next-error-repeat-map
- (let ((map (make-sparse-keymap)))
- (define-key map "n" 'next-error)
- (define-key map "\M-n" 'next-error)
- (define-key map "p" 'previous-error)
- (define-key map "\M-p" 'previous-error)
- map)
- "Keymap to repeat `next-error' key sequences. Used in `repeat-mode'.")
+(defvar-keymap next-error-repeat-map
+ :doc "Keymap to repeat `next-error' key sequences. Used in `repeat-mode'."
+ "n" #'next-error
+ "M-n" #'next-error
+ "p" #'previous-error
+ "M-p" #'previous-error)
(put 'next-error 'repeat-map 'next-error-repeat-map)
(put 'previous-error 'repeat-map 'next-error-repeat-map)
-(defvar goto-map (make-sparse-keymap)
- "Keymap for navigation commands.")
+(defvar-keymap goto-map
+ :doc "Keymap for navigation commands."
+ "c" #'goto-char
+ "g" #'goto-line
+ "M-g" #'goto-line
+ "n" #'next-error
+ "M-n" #'next-error
+ "p" #'previous-error
+ "M-p" #'previous-error
+ "TAB" #'move-to-column
+ "i" #'imenu)
(define-key esc-map "g" goto-map)
-(define-key goto-map "c" 'goto-char)
-(define-key goto-map "g" 'goto-line)
-(define-key goto-map "\M-g" 'goto-line)
-(define-key goto-map "n" 'next-error)
-(define-key goto-map "\M-n" 'next-error)
-(define-key goto-map "p" 'previous-error)
-(define-key goto-map "\M-p" 'previous-error)
-(define-key goto-map "\t" 'move-to-column)
-(define-key goto-map "i" 'imenu)
-
-(defvar search-map (make-sparse-keymap)
- "Keymap for search related commands.")
+(defvar-keymap search-map
+ :doc "Keymap for search related commands."
+ "o" #'occur
+ "M-w" #'eww-search-words
+ "h r" #'highlight-regexp
+ "h p" #'highlight-phrase
+ "h l" #'highlight-lines-matching-regexp
+ "h ." #'highlight-symbol-at-point
+ "h u" #'unhighlight-regexp
+ "h f" #'hi-lock-find-patterns
+ "h w" #'hi-lock-write-interactive-patterns)
(define-key esc-map "s" search-map)
-(define-key search-map "o" 'occur)
-(define-key search-map "\M-w" 'eww-search-words)
-(define-key search-map "hr" 'highlight-regexp)
-(define-key search-map "hp" 'highlight-phrase)
-(define-key search-map "hl" 'highlight-lines-matching-regexp)
-(define-key search-map "h." 'highlight-symbol-at-point)
-(define-key search-map "hu" 'unhighlight-regexp)
-(define-key search-map "hf" 'hi-lock-find-patterns)
-(define-key search-map "hw" 'hi-lock-write-interactive-patterns)
(put 'highlight-regexp :advertised-binding [?\M-s ?h ?r])
(put 'highlight-phrase :advertised-binding [?\M-s ?h ?p])
(put 'highlight-lines-matching-regexp :advertised-binding [?\M-s ?h ?l])
@@ -1375,7 +1367,7 @@ if `inhibit-field-text-motion' is non-nil."
(defalias 'mode-specific-command-prefix (make-sparse-keymap))
(defvar mode-specific-map (symbol-function 'mode-specific-command-prefix)
- "Keymap for characters following C-c.")
+ "Keymap for characters following \\`C-c'.")
(define-key global-map "\C-c" 'mode-specific-command-prefix)
(global-set-key [M-right] 'right-word)
@@ -1431,31 +1423,29 @@ if `inhibit-field-text-motion' is non-nil."
(define-key ctl-x-5-map "m" 'compose-mail-other-frame)
-(defvar ctl-x-r-map
- (let ((map (make-sparse-keymap)))
- (define-key map "c" 'clear-rectangle)
- (define-key map "k" 'kill-rectangle)
- (define-key map "d" 'delete-rectangle)
- (define-key map "y" 'yank-rectangle)
- (define-key map "o" 'open-rectangle)
- (define-key map "t" 'string-rectangle)
- (define-key map "N" 'rectangle-number-lines)
- (define-key map "\M-w" 'copy-rectangle-as-kill)
- (define-key map "\C-@" 'point-to-register)
- (define-key map [?\C-\ ] 'point-to-register)
- (define-key map " " 'point-to-register)
- (define-key map "j" 'jump-to-register)
- (define-key map "s" 'copy-to-register)
- (define-key map "x" 'copy-to-register)
- (define-key map "i" 'insert-register)
- (define-key map "g" 'insert-register)
- (define-key map "r" 'copy-rectangle-to-register)
- (define-key map "n" 'number-to-register)
- (define-key map "+" 'increment-register)
- (define-key map "w" 'window-configuration-to-register)
- (define-key map "f" 'frameset-to-register)
- map)
- "Keymap for subcommands of C-x r.")
+(defvar-keymap ctl-x-r-map
+ :doc "Keymap for subcommands of \\`C-x r'."
+ "c" #'clear-rectangle
+ "k" #'kill-rectangle
+ "d" #'delete-rectangle
+ "y" #'yank-rectangle
+ "o" #'open-rectangle
+ "t" #'string-rectangle
+ "N" #'rectangle-number-lines
+ "M-w" #'copy-rectangle-as-kill
+ "C-@" #'point-to-register
+ "C-SPC" #'point-to-register
+ "SPC" #'point-to-register
+ "j" #'jump-to-register
+ "s" #'copy-to-register
+ "x" #'copy-to-register
+ "i" #'insert-register
+ "g" #'insert-register
+ "r" #'copy-rectangle-to-register
+ "n" #'number-to-register
+ "+" #'increment-register
+ "w" #'window-configuration-to-register
+ "f" #'frameset-to-register)
(define-key ctl-x-map "r" ctl-x-r-map)
(define-key esc-map "q" 'fill-paragraph)
@@ -1472,12 +1462,10 @@ if `inhibit-field-text-motion' is non-nil."
(define-key ctl-x-map "[" 'backward-page)
(define-key ctl-x-map "]" 'forward-page)
-(defvar page-navigation-repeat-map
- (let ((map (make-sparse-keymap)))
- (define-key map "]" #'forward-page)
- (define-key map "[" #'backward-page)
- map)
- "Keymap to repeat page navigation key sequences. Used in `repeat-mode'.")
+(defvar-keymap page-navigation-repeat-map
+ :doc "Keymap to repeat page navigation key sequences. Used in `repeat-mode'."
+ "]" #'forward-page
+ "[" #'backward-page)
(put 'forward-page 'repeat-map 'page-navigation-repeat-map)
(put 'backward-page 'repeat-map 'page-navigation-repeat-map)
@@ -1485,26 +1473,20 @@ if `inhibit-field-text-motion' is non-nil."
(define-key ctl-x-map "\C-p" 'mark-page)
(define-key ctl-x-map "l" 'count-lines-page)
(define-key ctl-x-map "np" 'narrow-to-page)
-;; (define-key ctl-x-map "p" 'narrow-to-page)
-(defvar abbrev-map (make-sparse-keymap)
- "Keymap for abbrev commands.")
+(defvar-keymap abbrev-map
+ :doc "Keymap for abbrev commands."
+ "l" #'add-mode-abbrev
+ "C-a" #'add-mode-abbrev
+ "g" #'add-global-abbrev
+ "+" #'add-mode-abbrev
+ "i g" #'inverse-add-global-abbrev
+ "i l" #'inverse-add-mode-abbrev
+ "-" #'inverse-add-global-abbrev
+ "e" #'expand-abbrev
+ "'" #'expand-abbrev)
(define-key ctl-x-map "a" abbrev-map)
-(define-key abbrev-map "l" 'add-mode-abbrev)
-(define-key abbrev-map "\C-a" 'add-mode-abbrev)
-(define-key abbrev-map "g" 'add-global-abbrev)
-(define-key abbrev-map "+" 'add-mode-abbrev)
-(define-key abbrev-map "ig" 'inverse-add-global-abbrev)
-(define-key abbrev-map "il" 'inverse-add-mode-abbrev)
-;; (define-key abbrev-map "\C-h" 'inverse-add-global-abbrev)
-(define-key abbrev-map "-" 'inverse-add-global-abbrev)
-(define-key abbrev-map "e" 'expand-abbrev)
-(define-key abbrev-map "'" 'expand-abbrev)
-;; (define-key ctl-x-map "\C-a" 'add-mode-abbrev)
-;; (define-key ctl-x-map "+" 'add-global-abbrev)
-;; (define-key ctl-x-map "\C-h" 'inverse-add-mode-abbrev)
-;; (define-key ctl-x-map "-" 'inverse-add-global-abbrev)
(define-key esc-map "'" 'abbrev-prefix-mark)
(define-key ctl-x-map "'" 'expand-abbrev)
(define-key ctl-x-map "\C-b" 'list-buffers)
@@ -1514,17 +1496,15 @@ if `inhibit-field-text-motion' is non-nil."
(define-key ctl-x-map "z" 'repeat)
-(defvar ctl-x-x-map
- (let ((map (make-sparse-keymap)))
- (define-key map "f" #'font-lock-update)
- (define-key map "g" #'revert-buffer-quick)
- (define-key map "r" #'rename-buffer)
- (define-key map "u" #'rename-uniquely)
- (define-key map "n" #'clone-buffer)
- (define-key map "i" #'insert-buffer)
- (define-key map "t" #'toggle-truncate-lines)
- map)
- "Keymap for subcommands of C-x x.")
+(defvar-keymap ctl-x-x-map
+ :doc "Keymap for subcommands of \\`C-x x'."
+ "f" #'font-lock-update
+ "g" #'revert-buffer-quick
+ "r" #'rename-buffer
+ "u" #'rename-uniquely
+ "n" #'clone-buffer
+ "i" #'insert-buffer
+ "t" #'toggle-truncate-lines)
(define-key ctl-x-map "x" ctl-x-x-map)
(define-key esc-map "\C-l" 'reposition-window)
diff --git a/lisp/bookmark.el b/lisp/bookmark.el
index b2130557dcc..db2063f4eac 100644
--- a/lisp/bookmark.el
+++ b/lisp/bookmark.el
@@ -35,6 +35,7 @@
(require 'pp)
(require 'tabulated-list)
(require 'text-property-search)
+(require 'fringe) ; for builds --without-x
(eval-when-compile (require 'cl-lib))
;;; Misc comments:
@@ -181,10 +182,25 @@ A non-nil value may result in truncated bookmark names."
"Time before `bookmark-bmenu-search' updates the display."
:type 'number)
-(defcustom bookmark-set-fringe-mark t
- "Whether to set a fringe mark at bookmarked lines."
- :type 'boolean
- :version "28.1")
+(define-fringe-bitmap 'bookmark-mark
+ [#b01111110
+ #b01111110
+ #b01111110
+ #b01111110
+ #b01111110
+ #b01111110
+ #b01100110
+ #b01000010])
+
+(define-obsolete-variable-alias 'bookmark-set-fringe-mark
+ 'bookmark-fringe-mark "29.1")
+
+(defcustom bookmark-fringe-mark 'bookmark-mark
+ "The fringe bitmap to mark bookmarked lines with.
+If nil, don't display a mark on the fringe."
+ :type '(choice (const nil) fringe-bitmap)
+ :set #'fringe-custom-set-bitmap
+ :version "29.1")
;; FIXME: No longer used. Should be declared obsolete or removed.
(defface bookmark-menu-heading
@@ -201,10 +217,10 @@ A non-nil value may result in truncated bookmark names."
:foreground "LightGray")
(((class color)
(background light))
- :background "White" :foreground "DarkOrange1")
+ :foreground "DarkOrange1" :distant-foreground "DarkOrange3")
(((class color)
(background dark))
- :background "Black" :foreground "DarkOrange1"))
+ :foreground "DarkOrange1" :distant-foreground "Orange1"))
"Face used to highlight current line."
:version "28.1")
@@ -482,12 +498,9 @@ In other words, return all information but the name."
(defvar bookmark-history nil
"The history list for bookmark functions.")
-(define-fringe-bitmap 'bookmark-fringe-mark
- "\x3c\x7e\xff\xff\xff\xff\x7e\x3c")
-
(defun bookmark--set-fringe-mark ()
"Apply a colorized overlay to the bookmarked location.
-See user option `bookmark-set-fringe-mark'."
+See user option `bookmark-fringe-mark'."
(let ((bm (make-overlay (point-at-bol) (1+ (point-at-bol)))))
(overlay-put bm 'category 'bookmark)
(overlay-put bm 'evaporate t)
@@ -499,7 +512,7 @@ See user option `bookmark-set-fringe-mark'."
(defun bookmark--remove-fringe-mark (bm)
"Remove a bookmark's colorized overlay.
BM is a bookmark as returned from function `bookmark-get-bookmark'.
-See user option `bookmark-set-fringe'."
+See user option `bookmark-fringe-mark'."
(let ((filename (cdr (assq 'filename bm)))
(pos (cdr (assq 'position bm)))
overlays found temp)
@@ -615,7 +628,7 @@ old one."
;; no prefix arg means just overwrite old bookmark.
(let ((bm (bookmark-get-bookmark stripped-name)))
;; First clean up if previously location was fontified.
- (when bookmark-set-fringe-mark
+ (when bookmark-fringe-mark
(bookmark--remove-fringe-mark bm))
;; Modify using the new (NAME . ALIST) format.
(setcdr bm alist))
@@ -931,7 +944,7 @@ still there, in order, if the topmost one is ever deleted."
;; Ask for an annotation buffer for this bookmark
(when bookmark-use-annotations
(bookmark-edit-annotation str))
- (when bookmark-set-fringe-mark
+ (when bookmark-fringe-mark
(bookmark--set-fringe-mark))))
(setq bookmark-yank-point nil)
(setq bookmark-current-buffer nil)))
@@ -966,7 +979,7 @@ it removes only the first instance of a bookmark with that name from
the list of bookmarks.)"
(interactive (list nil current-prefix-arg))
(let ((prompt
- (if no-overwrite "Append bookmark named" "Set bookmark named")))
+ (if no-overwrite "Add bookmark named" "Set bookmark named")))
(bookmark-set-internal prompt name (if no-overwrite 'push 'overwrite))))
;;;###autoload
@@ -1172,7 +1185,7 @@ it to the name of the bookmark currently being set, advancing
(defun bookmark--watch-file-already-queried-p (new-mtime)
;; Don't ask repeatedly if user already said "no" to reloading a
;; file with this mtime:
- (prog1 (equal new-mtime bookmark--watch-already-asked-mtime)
+ (prog1 (time-equal-p new-mtime bookmark--watch-already-asked-mtime)
(setq bookmark--watch-already-asked-mtime new-mtime)))
(defun bookmark-maybe-load-default-file ()
@@ -1185,7 +1198,7 @@ it to the name of the bookmark currently being set, advancing
(let ((new-mtime (nth 5 (file-attributes
(car bookmark-bookmarks-timestamp))))
(old-mtime (cdr bookmark-bookmarks-timestamp)))
- (and (not (equal new-mtime old-mtime))
+ (and (not (time-equal-p new-mtime old-mtime))
(not (bookmark--watch-file-already-queried-p new-mtime))
(or (eq 'silent bookmark-watch-bookmark-file)
(yes-or-no-p
@@ -1213,7 +1226,7 @@ and then show any annotations for this bookmark."
(if win (set-window-point win (point))))
;; FIXME: we used to only run bookmark-after-jump-hook in
;; `bookmark-jump' itself, but in none of the other commands.
- (when bookmark-set-fringe-mark
+ (when bookmark-fringe-mark
(let ((overlays (overlays-in (point-at-bol) (1+ (point-at-bol))))
temp found)
(while (and (not found) (setq temp (pop overlays)))
diff --git a/lisp/bs.el b/lisp/bs.el
index 00d8326115e..aabc2dc5583 100644
--- a/lisp/bs.el
+++ b/lisp/bs.el
@@ -487,7 +487,7 @@ Used internally, only.")
"DEL" #'bs-unmark-previous
">" #'scroll-right
"<" #'scroll-left
- "?" #'bs-help
+ "?" #'describe-mode
"<mouse-2>" #'bs-mouse-select
"<mouse-3>" #'bs-mouse-select-other-frame)
@@ -612,12 +612,12 @@ Used from `window-size-change-functions'."
\\<bs-mode-map>
Aside from two header lines each line describes one buffer.
Move to a line representing the buffer you want to edit and select
-buffer by \\[bs-select] or SPC. Abort buffer list with \\[bs-kill].
+buffer by \\[bs-select] or \\`SPC'. Abort buffer list with \\[bs-kill].
There are many key commands similar to `Buffer-menu-mode' for
manipulating the buffer list and buffers.
For faster navigation each digit key is a digit argument.
-\\[bs-select] or SPACE -- select current line's buffer and other marked buffers.
+\\[bs-select] or \\`SPC' -- select current line's buffer and other marked buffers.
\\[bs-select-in-one-window] -- select current's line buffer in one \
window, and delete other
windows in the same frame.
@@ -655,7 +655,7 @@ apply it.
\\[bs-kill] -- leave Buffer Selection Menu without a selection.
\\[bs-refresh] -- refresh Buffer Selection Menu.
-\\[bs-help] -- display this help text."
+\\[describe-mode] -- display this help text."
(buffer-disable-undo)
(setq buffer-read-only t
truncate-lines t
@@ -1121,7 +1121,8 @@ configuration."
(defun bs-help ()
"Help for `bs-show'."
- (interactive)
+ (declare (obsolete describe-mode "29.1"))
+ (interactive nil bs-mode)
(describe-function 'bs-mode))
(defun bs-next-config-aux (start-name list)
@@ -1484,7 +1485,7 @@ manipulating the buffer list and the buffers themselves.
User can move with [up] or [down], select a buffer
by \\[bs-select] or [SPC]\n
Type \\[bs-kill] to leave Buffer Selection Menu without a selection.
-Type \\[bs-help] after invocation to get help on commands available.
+Type \\[describe-mode] after invocation to get help on commands available.
With prefix argument ARG show a different buffer list. Function
`bs--configuration-name-for-prefix-arg' determine accordingly
name of buffer configuration."
diff --git a/lisp/button.el b/lisp/button.el
index 80b73033d68..21047ad5541 100644
--- a/lisp/button.el
+++ b/lisp/button.el
@@ -623,12 +623,15 @@ itself will be used instead as the function argument.
If HELP-ECHO, use that as the `help-echo' property.
Also see `buttonize-region'."
- (apply #'propertize string
- (button--properties callback data help-echo)))
+ (let ((string
+ (apply #'propertize string
+ (button--properties callback data help-echo))))
+ ;; Add the face to the end so that it can be overridden.
+ (add-face-text-property 0 (length string) 'button t string)
+ string))
(defun button--properties (callback data help-echo)
- (list 'face 'button
- 'font-lock-face 'button
+ (list 'font-lock-face 'button
'mouse-face 'highlight
'help-echo help-echo
'button t
@@ -647,7 +650,8 @@ itself will be used instead as the function argument.
If HELP-ECHO, use that as the `help-echo' property.
Also see `buttonize'."
- (add-text-properties start end (button--properties callback data help-echo)))
+ (add-text-properties start end (button--properties callback data help-echo))
+ (add-face-text-property start end 'button t))
(provide 'button)
diff --git a/lisp/calc/calc-vec.el b/lisp/calc/calc-vec.el
index 3b8629b797d..8d99f62a9ba 100644
--- a/lisp/calc/calc-vec.el
+++ b/lisp/calc/calc-vec.el
@@ -647,9 +647,7 @@
(defun calcFunc-rhead (vec)
(if (and (Math-vectorp vec)
(cdr vec))
- (let ((vec (copy-sequence vec)))
- (setcdr (nthcdr (- (length vec) 2) vec) nil)
- vec)
+ (butlast vec)
(calc-record-why 'vectorp vec)
(list 'calcFunc-rhead vec)))
diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el
index 254c703ee22..6c21430b1b3 100644
--- a/lisp/calc/calc.el
+++ b/lisp/calc/calc.el
@@ -1959,12 +1959,8 @@ See calc-keypad for details."
(or n (setq n 1))
(or m (setq m 1))
(calc-check-stack (+ n m -1))
- (and (> n 0)
- (let ((top (copy-sequence (nthcdr (+ m calc-stack-top -1)
- calc-stack))))
- (setcdr (nthcdr (1- n) top) nil)
- (nreverse
- (mapcar (lambda (x) (calc-get-stack-element x sel-mode)) top)))))
+ (nreverse (mapcar (lambda (x) (calc-get-stack-element x sel-mode))
+ (take n (nthcdr (+ m calc-stack-top -1) calc-stack)))))
(defun calc-top-list-n (&optional n m sel-mode)
(mapcar #'math-check-complete
@@ -2291,9 +2287,7 @@ the United States."
((and (null n)
(eq (car-safe top) 'incomplete)
(> (length top) (if (eq (nth 1 top) 'intv) 3 2)))
- (calc-pop-push-list 1 (let ((tt (copy-sequence top)))
- (setcdr (nthcdr (- (length tt) 2) tt) nil)
- (list tt))))
+ (calc-pop-push-list 1 (list (butlast top))))
((< nn 0)
(if (and calc-any-selections
(calc-top-selected 1 (- nn)))
diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el
index 084d2d7d55e..98e91aaa75e 100644
--- a/lisp/calendar/diary-lib.el
+++ b/lisp/calendar/diary-lib.el
@@ -2465,8 +2465,8 @@ Fontify the region between BEG and END, quietly unless VERBOSE is non-nil."
(setq end (line-beginning-position 2)))
(font-lock-default-fontify-region beg end verbose))
-(defvar diary-fancy-overriding-map (make-sparse-keymap)
- "Keymap overriding minor-mode maps in `diary-fancy-display-mode'.")
+(defvar-keymap diary-fancy-overriding-map
+ :doc "Keymap overriding minor-mode maps in `diary-fancy-display-mode'.")
(define-derived-mode diary-fancy-display-mode special-mode
"Diary"
diff --git a/lisp/calendar/time-date.el b/lisp/calendar/time-date.el
index d1afd8ce95a..bbdcaa4db4e 100644
--- a/lisp/calendar/time-date.el
+++ b/lisp/calendar/time-date.el
@@ -171,15 +171,21 @@ If DATE lacks timezone information, GMT is assumed."
(error "Invalid date: %s" date)))))))))
;;;###autoload
-(defalias 'time-to-seconds 'float-time)
+(defalias 'time-to-seconds #'float-time)
;;;###autoload
-(defalias 'seconds-to-time 'time-convert)
+(defun seconds-to-time (seconds)
+ "Convert SECONDS to a proper time, like `current-time' would."
+ ;; FIXME: Should we (declare (obsolete time-convert "27.1")) ?
+ (time-convert seconds 'list))
;;;###autoload
(defun days-to-time (days)
"Convert DAYS into a time value."
- (let ((time (time-convert (* 86400 days))))
+ ;; FIXME: We should likely just pass `t' to `time-convert'.
+ ;; All uses I could find in Emacs, GNU ELPA, and NonGNU ELPA can handle
+ ;; any valid time representation as return value.
+ (let ((time (time-convert (* 86400 days) 'list)))
;; Traditionally, this returned a two-element list if DAYS was an integer.
;; Keep that tradition if time-convert outputs timestamps in list form.
(if (and (integerp days) (consp (cdr time)))
@@ -196,7 +202,7 @@ TIME should be either a time value or a date-time string."
(time-subtract nil time))
;;;###autoload
-(define-obsolete-function-alias 'subtract-time 'time-subtract "26.1")
+(define-obsolete-function-alias 'subtract-time #'time-subtract "26.1")
;;;###autoload
(defun date-to-day (date)
@@ -256,10 +262,10 @@ Returns a floating point number."
;;;###autoload
(defun safe-date-to-time (date)
"Parse a string DATE that represents a date-time and return a time value.
-If DATE is malformed, return a time value of zeros."
+If DATE is malformed, return a time value of zero."
(condition-case ()
(date-to-time date)
- (error '(0 0))))
+ (error 0)))
;;;###autoload
diff --git a/lisp/calendar/timeclock.el b/lisp/calendar/timeclock.el
index 7bdaf7ceff6..6b6cc517a20 100644
--- a/lisp/calendar/timeclock.el
+++ b/lisp/calendar/timeclock.el
@@ -1247,7 +1247,7 @@ HTML-P is non-nil, HTML markup is added."
(time-out (vector (list t) (list t) (list t) (list t) (list t)))
(breaks (vector (list t) (list t) (list t) (list t) (list t)))
(workday (vector (list t) (list t) (list t) (list t) (list t)))
- (lengths (vector '(0 0) thirty-days-ago three-months-ago
+ (lengths (vector 0 thirty-days-ago three-months-ago
six-months-ago one-year-ago)))
;; collect statistics from complete timelog
(dolist (day day-list)
diff --git a/lisp/cedet/cedet.el b/lisp/cedet/cedet.el
index e6befb10e91..c33ac850722 100644
--- a/lisp/cedet/cedet.el
+++ b/lisp/cedet/cedet.el
@@ -25,15 +25,12 @@
;;; Commentary:
;;; Code:
-;;
-;; This file depends on the major components of CEDET, so that you can
-;; load them all by doing (require 'cedet). This is mostly for
-;; compatibility with the upstream, stand-alone CEDET distribution.
(declare-function inversion-find-version "inversion")
(defconst cedet-version "2.0"
"Current version of CEDET.")
+(make-obsolete-variable 'cedet-version 'emacs-version "29.1")
(defconst cedet-packages
`(
@@ -45,6 +42,7 @@
(ede "1.2" nil "ede" )
)
"Table of CEDET packages to install.")
+(make-obsolete-variable 'cedet-packages 'package-built-in-p "29.1")
(defvar cedet-menu-map ;(make-sparse-keymap "CEDET menu")
(let ((map (make-sparse-keymap "CEDET menu")))
diff --git a/lisp/cedet/ede.el b/lisp/cedet/ede.el
index 4ea14e33c5d..e6bfd0b1e85 100644
--- a/lisp/cedet/ede.el
+++ b/lisp/cedet/ede.el
@@ -1,10 +1,10 @@
;;; ede.el --- Emacs Development Environment gloss -*- lexical-binding: t; -*-
-;; Copyright (C) 1998-2005, 2007-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1998-2022 Free Software Foundation, Inc.
;; Author: Eric M. Ludlam <zappo@gnu.org>
;; Keywords: project, make
-;; Version: 1.2
+;; Version: 2.0
;; This file is part of GNU Emacs.
@@ -39,6 +39,8 @@
;;
;; (global-ede-mode t)
+;;; Code:
+
(require 'cedet)
(require 'cl-lib)
(require 'eieio)
@@ -66,10 +68,11 @@
(defconst ede-version "2.0"
"Current version of the Emacs EDE.")
+(make-obsolete-variable 'ede-version 'emacs-version "29.1")
-;;; Code:
(defun ede-version ()
"Display the current running version of EDE."
+ (declare (obsolete emacs-version "29.1"))
(interactive) (message "EDE %s" ede-version))
(defgroup ede nil
diff --git a/lisp/cedet/ede/auto.el b/lisp/cedet/ede/auto.el
index 7af9987de17..7e3cac616fd 100644
--- a/lisp/cedet/ede/auto.el
+++ b/lisp/cedet/ede/auto.el
@@ -234,6 +234,7 @@ type is required and the load function used.")
(display-buffer b)
))
+;;;###autoload
(defun ede-add-project-autoload (projauto &optional flag)
"Add PROJAUTO, an EDE autoload definition to `ede-project-class-files'.
Optional argument FLAG indicates how this autoload should be
diff --git a/lisp/cedet/ede/base.el b/lisp/cedet/ede/base.el
index 9d23909d62e..9182fcd5ac9 100644
--- a/lisp/cedet/ede/base.el
+++ b/lisp/cedet/ede/base.el
@@ -141,7 +141,7 @@ For some project types, this will be the file that stores the project configurat
In other projects types, this file is merely a unique identifier to this type of project.")
(rootproject ; :initarg - no initarg, don't save this slot!
:initform nil
- :type (or null ede-project-placeholder-child)
+ :type (or null ede-project-placeholder)
:documentation "Pointer to our root project.")
)
"Placeholder object for projects not loaded into memory.
@@ -171,7 +171,7 @@ For Automake based projects, each directory is treated as a project.")
:label "Local Targets"
:group (targets)
:documentation "List of top level targets in this project.")
- (locate-obj :type (or null ede-locate-base-child)
+ (locate-obj :type (or null ede-locate-base)
:documentation
"A locate object to use as a backup to `ede-expand-filename'.")
(tool-cache :initarg :tool-cache
@@ -204,7 +204,7 @@ This is a URL to be sent to a web site for documentation.")
:group name
:documentation
"A directory where web pages can be found by Emacs.
-For remote locations use a path compatible with ange-ftp or EFS.
+For remote locations use a path compatible with ange-ftp.
You can also use TRAMP for use with rcp & scp.")
(web-site-file :initarg :web-site-file
:initform ""
@@ -214,7 +214,7 @@ You can also use TRAMP for use with rcp & scp.")
:documentation
"A file which contains the website for this project.
This file can be relative to slot `web-site-directory'.
-This can be a local file, use ange-ftp, EFS, or TRAMP.")
+This can be a local file, use ange-ftp or TRAMP.")
(ftp-site :initarg :ftp-site
:initform ""
:type string
diff --git a/lisp/cedet/ede/config.el b/lisp/cedet/ede/config.el
index 529b96f2b00..8c4f52647bc 100644
--- a/lisp/cedet/ede/config.el
+++ b/lisp/cedet/ede/config.el
@@ -65,7 +65,7 @@
(defclass ede-extra-config (eieio-persistent)
((extension :initform ".ede")
(file-header-line :initform ";; EDE Project Configuration")
- (project :type ede-project-with-config-child
+ (project :type ede-project-with-config
:documentation
"The project this config is bound to.")
(ignored-file :initform nil
@@ -102,7 +102,7 @@ initialize the :file slot of the persistent baseclass.")
:documentation
"The class of the configuration used by this project.")
(config :initform nil
- :type (or null ede-extra-config-child)
+ :type (or null ede-extra-config)
:documentation
"The configuration object for this project.")
)
diff --git a/lisp/cedet/ede/custom.el b/lisp/cedet/ede/custom.el
index 2d4f408e961..0854c8cc47f 100644
--- a/lisp/cedet/ede/custom.el
+++ b/lisp/cedet/ede/custom.el
@@ -35,7 +35,9 @@
(require 'ede)
(eval-when-compile (require 'eieio-custom))
-(defvar eieio-ede-old-variables nil
+(define-obsolete-variable-alias 'ede-eieio-old-variables
+ 'eieio-ede-old-variables "29.1")
+(defvar ede-eieio-old-variables nil
"The old variables for a project.")
;;; Customization Commands
@@ -50,7 +52,7 @@
(let* ((ov (oref (ede-current-project) local-variables))
(cp (ede-current-project)))
(ede-customize cp)
- (setq-local eieio-ede-old-variables ov)))
+ (setq-local ede-eieio-old-variables ov)))
;;;###autoload
(defalias 'customize-project #'ede-customize-project)
@@ -178,9 +180,9 @@ OBJ is the target object to customize."
;; These hooks are used when finishing up a customization.
(cl-defmethod eieio-done-customizing ((proj ede-project))
"Call this when a user finishes customizing PROJ."
- (let ((ov eieio-ede-old-variables)
+ (let ((ov ede-eieio-old-variables)
(nv (oref proj local-variables)))
- (setq eieio-ede-old-variables nil)
+ (setq ede-eieio-old-variables nil)
(while ov
(if (not (assoc (car (car ov)) nv))
(save-excursion
diff --git a/lisp/cedet/ede/emacs.el b/lisp/cedet/ede/emacs.el
index cbe766cedb6..c83e6873679 100644
--- a/lisp/cedet/ede/emacs.el
+++ b/lisp/cedet/ede/emacs.el
@@ -80,7 +80,6 @@ ROOTPROJ is nil, since there is only one project."
;; Doesn't already exist, so let's make one.
(let* ((vertuple (ede-emacs-version dir)))
(ede-emacs-project
- (car vertuple)
:name (car vertuple)
:version (cdr vertuple)
:directory (file-name-as-directory dir)
diff --git a/lisp/cedet/ede/files.el b/lisp/cedet/ede/files.el
index b8acb192c17..e44ddea32f6 100644
--- a/lisp/cedet/ede/files.el
+++ b/lisp/cedet/ede/files.el
@@ -340,7 +340,7 @@ Optional FORCE means to ignore the hash of known directories."
;;
;; These utilities will identify the "toplevel" of a project.
;;
-;; NOTE: These two -toplevel- functions return a directory even though
+;; NOTE: This -toplevel- function returns a directory even though
;; the function name implies a project.
(defun ede-toplevel-project (dir)
@@ -365,8 +365,6 @@ If DIR is not part of a project, return nil."
(t nil))))
-(defalias 'ede-toplevel-project-or-nil #'ede-toplevel-project)
-
;;; DIRECTORY CONVERSION STUFF
;;
(cl-defmethod ede-convert-path ((this ede-project) path)
@@ -535,6 +533,7 @@ Argument DIR is the directory to trim upwards."
nil
fnd)))
+(define-obsolete-function-alias 'ede-toplevel-project-or-nil #'ede-toplevel-project "29.1")
(provide 'ede/files)
diff --git a/lisp/cedet/ede/speedbar.el b/lisp/cedet/ede/speedbar.el
index f99a1d114b1..604b660344c 100644
--- a/lisp/cedet/ede/speedbar.el
+++ b/lisp/cedet/ede/speedbar.el
@@ -62,7 +62,7 @@
(defvar ede-speedbar-menu
'([ "Compile" ede-speedbar-compile-line t]
[ "Compile Project" ede-speedbar-compile-project
- (ede-project-child-p (speedbar-line-token)) ]
+ (cl-typep (speedbar-line-token) 'ede-project) ]
"---"
[ "Edit File/Tag" speedbar-edit-line
(not (eieio-object-p (speedbar-line-token)))]
@@ -79,7 +79,7 @@
(eieio-object-p (speedbar-line-token)) ]
[ "Edit Project File" ede-speedbar-edit-projectfile t]
[ "Make Distribution" ede-speedbar-make-distribution
- (ede-project-child-p (speedbar-line-token)) ]
+ (cl-typep (speedbar-line-token) 'ede-project) ]
)
"Menu part in easymenu format used in speedbar while browsing objects.")
diff --git a/lisp/cedet/ede/system.el b/lisp/cedet/ede/system.el
index 2da16b37d72..b4fc95c6073 100644
--- a/lisp/cedet/ede/system.el
+++ b/lisp/cedet/ede/system.el
@@ -133,7 +133,7 @@ Download tramp, and use /r:machine: for names on remote sites w/out FTP access."
(defun ede-vc-project-directory ()
"Run `vc-dir' on the current project."
(interactive)
- (let ((top (ede-toplevel-project-or-nil default-directory)))
+ (let ((top (ede-toplevel-project default-directory)))
(vc-dir top nil)))
(provide 'ede/system)
diff --git a/lisp/cedet/semantic.el b/lisp/cedet/semantic.el
index 78002dd8abc..3166279de40 100644
--- a/lisp/cedet/semantic.el
+++ b/lisp/cedet/semantic.el
@@ -34,6 +34,8 @@
;; menu). To enable it at startup, put (semantic-mode 1) in your init
;; file.
+;;; Code:
+
(require 'cedet)
(require 'semantic/tag)
(require 'semantic/lex)
@@ -41,6 +43,7 @@
(defvar semantic-version "2.2"
"Current version of Semantic.")
+(make-obsolete-variable 'semantic-version 'emacs-version "29.1")
(declare-function inversion-test "inversion")
(declare-function semanticdb-load-ebrowse-caches "semantic/db-ebrowse")
@@ -73,9 +76,6 @@ introduced."
(require 'semantic/fw)
-;;; Code:
-;;
-
;;; Variables and Configuration
;;
(defvar-local semantic--parse-table nil
diff --git a/lisp/cedet/semantic/bovine.el b/lisp/cedet/semantic/bovine.el
index 1e52b1f8504..a6cf8d89a4f 100644
--- a/lisp/cedet/semantic/bovine.el
+++ b/lisp/cedet/semantic/bovine.el
@@ -143,14 +143,14 @@ list of semantic tokens found."
cvl nil ;re-init the collected value list.
lte (car matchlist) ;Get the local matchlist entry.
)
- (if (or (byte-code-function-p (car lte))
+ (if (or (compiled-function-p (car lte))
(listp (car lte)))
;; In this case, we have an EMPTY match! Make
;; stuff up.
(setq cvl (list nil))))
(while (and lte
- (not (byte-code-function-p (car lte)))
+ (not (compiled-function-p (car lte)))
(not (listp (car lte))))
;; GRAMMAR SOURCE DEBUGGING!
diff --git a/lisp/cedet/semantic/complete.el b/lisp/cedet/semantic/complete.el
index 6a09adca32d..dc270603a0c 100644
--- a/lisp/cedet/semantic/complete.el
+++ b/lisp/cedet/semantic/complete.el
@@ -311,11 +311,43 @@ HISTORY is a symbol representing a variable to story the history in."
(defvar semantic-complete-current-matched-tag nil
"Variable used to pass the tags being matched to the prompt.")
-;; semantic-displayer-focus-abstract-child-p is part of the
-;; semantic-displayer-focus-abstract class, defined later in this
-;; file.
-(declare-function semantic-displayer-focus-abstract-child-p "semantic/complete"
- t t)
+
+
+;; Abstract baseclass for any displayer which supports focus
+
+(defclass semantic-displayer-abstract ()
+ ((table :type (or null semanticdb-find-result-with-nil)
+ :initform nil
+ :protection :protected
+ :documentation "List of tags this displayer is showing.")
+ (last-prefix :type string
+ :protection :protected
+ :documentation "Prefix associated with slot `table'.")
+ )
+ "Abstract displayer baseclass.
+Manages the display of some number of tags.
+Provides the basics for a displayer, including interacting with
+a collector, and tracking tables of completion to display."
+ :abstract t)
+
+(defclass semantic-displayer-focus-abstract (semantic-displayer-abstract)
+ ((focus :type number
+ :protection :protected
+ :documentation "A tag index from `table' which has focus.
+Multiple calls to the display function can choose to focus on a
+given tag, by highlighting its location.")
+ (find-file-focus
+ :allocation :class
+ :initform nil
+ :documentation
+ "Non-nil if focusing requires a tag's buffer be in memory.")
+ )
+ "Abstract displayer supporting `focus'.
+A displayer which has the ability to focus in on one tag.
+Focusing is a way of differentiating among multiple tags
+which have the same name."
+ :abstract t)
+
(defun semantic-complete-current-match ()
"Calculate a match from the current completion environment.
@@ -346,7 +378,7 @@ Return value can be:
((setq matchlist (semantic-collector-current-exact-match collector))
(if (= (semanticdb-find-result-length matchlist) 1)
(setq answer (semanticdb-find-result-nth-in-buffer matchlist 0))
- (if (semantic-displayer-focus-abstract-child-p displayer)
+ (if (cl-typep displayer 'semantic-displayer-focus-abstract)
;; For focusing displayers, we can claim this is
;; not unique. Multiple focuses can choose the correct
;; one.
@@ -1011,20 +1043,14 @@ Output must be in semanticdb Find result format."
(oref obj last-prefix)))
(completionlist
(cond ((or same-prefix-p
- (and last-prefix (eq (compare-strings
- last-prefix 0 nil
- prefix 0 (length last-prefix))
- t)))
+ (and last-prefix (string-prefix-p last-prefix prefix t)))
;; We have the same prefix, or last-prefix is a
;; substring of the of new prefix, in which case we are
;; refining our symbol so just re-use cache.
(oref obj last-all-completions))
((and last-prefix
(> (length prefix) 1)
- (eq (compare-strings
- prefix 0 nil
- last-prefix 0 (length prefix))
- t))
+ (string-prefix-p prefix last-prefix t))
;; The new prefix is a substring of the old
;; prefix, and it's longer than one character.
;; Perform a full search to pull in additional
@@ -1307,21 +1333,6 @@ Uses semanticdb for searching all tags in the current project."
;; * semantic-displayer-scroll-request
;; * semantic-displayer-focus-request
-(defclass semantic-displayer-abstract ()
- ((table :type (or null semanticdb-find-result-with-nil)
- :initform nil
- :protection :protected
- :documentation "List of tags this displayer is showing.")
- (last-prefix :type string
- :protection :protected
- :documentation "Prefix associated with slot `table'.")
- )
- "Abstract displayer baseclass.
-Manages the display of some number of tags.
-Provides the basics for a displayer, including interacting with
-a collector, and tracking tables of completion to display."
- :abstract t)
-
(define-obsolete-function-alias 'semantic-displayor-cleanup
#'semantic-displayer-cleanup "27.1")
(cl-defmethod semantic-displayer-cleanup ((_obj semantic-displayer-abstract))
@@ -1413,24 +1424,7 @@ to click on the items to aid in completion.")
)
)
-;;; Abstract baseclass for any displayer which supports focus
-(defclass semantic-displayer-focus-abstract (semantic-displayer-abstract)
- ((focus :type number
- :protection :protected
- :documentation "A tag index from `table' which has focus.
-Multiple calls to the display function can choose to focus on a
-given tag, by highlighting its location.")
- (find-file-focus
- :allocation :class
- :initform nil
- :documentation
- "Non-nil if focusing requires a tag's buffer be in memory.")
- )
- "Abstract displayer supporting `focus'.
-A displayer which has the ability to focus in on one tag.
-Focusing is a way of differentiating among multiple tags
-which have the same name."
- :abstract t)
+;;; Methods for any displayer which supports focus
(define-obsolete-function-alias 'semantic-displayor-next-action
#'semantic-displayer-next-action "27.1")
@@ -1638,8 +1632,10 @@ This will not happen if you directly set this variable via `setq'."
:set (lambda (sym var)
(set-default sym var)
(when (boundp 'x-max-tooltip-size)
- (setcdr x-max-tooltip-size (max (1+ var) (cdr x-max-tooltip-size))))))
-
+ (if (not (consp x-max-tooltip-size))
+ (setq x-max-tooltip-size '(80 . 40)))
+ (setcdr x-max-tooltip-size
+ (max (1+ var) (cdr x-max-tooltip-size))))))
(defclass semantic-displayer-tooltip (semantic-displayer-traditional)
((mode :initarg :mode
diff --git a/lisp/cedet/semantic/db-file.el b/lisp/cedet/semantic/db-file.el
index d00ab47ce69..e2c9d618ba2 100644
--- a/lisp/cedet/semantic/db-file.el
+++ b/lisp/cedet/semantic/db-file.el
@@ -29,7 +29,7 @@
(require 'cedet-files)
(require 'data-debug)
-(defvar semanticdb-file-version semantic-version
+(defvar semanticdb-file-version "2.2"
"Version of semanticdb we are writing files to disk with.")
(defvar semanticdb-file-incompatible-version "1.4"
"Version of semanticdb we are not reverse compatible with.")
diff --git a/lisp/cedet/semantic/db-typecache.el b/lisp/cedet/semantic/db-typecache.el
index 38caac2292c..efc1ab2c5f9 100644
--- a/lisp/cedet/semantic/db-typecache.el
+++ b/lisp/cedet/semantic/db-typecache.el
@@ -362,7 +362,7 @@ a master list."
;; don't include ourselves in this crazy list.
(when (and i (not (eq i table))
;; @todo - This eieio fcn can be slow! Do I need it?
- ;; (semanticdb-table-child-p i)
+ ;; (cl-typep i 'semanticdb-table)
)
(setq incstream
(semanticdb-typecache-merge-streams
diff --git a/lisp/cedet/semantic/db.el b/lisp/cedet/semantic/db.el
index 82785ec6d2e..ff62f53d3cf 100644
--- a/lisp/cedet/semantic/db.el
+++ b/lisp/cedet/semantic/db.el
@@ -115,11 +115,13 @@ for a new table not associated with a buffer."
"Return a nil, meaning abstract table OBJ is not in a buffer."
nil)
-(cl-defmethod semanticdb-get-buffer ((_obj semanticdb-abstract-table))
- "Return a buffer associated with OBJ.
+(cl-defgeneric semanticdb-get-buffer (_obj)
+ "Return a buffer associated with semanticdb table OBJ.
If the buffer is not in memory, load it with `find-file-noselect'."
nil)
+;; FIXME: Should we merge `semanticdb-get-buffer' and
+;; `semantic-tag-parent-buffer'?
;; This generic method allows for sloppier coding. Many
;; functions treat "table" as something that could be a buffer,
;; file name, or other. This makes use of table more robust.
@@ -271,6 +273,9 @@ For C/C++, the C preprocessor macros can be saved here.")
)
"A single table of tags derived from file.")
+(cl-defmethod semantic-tag-parent-buffer ((parent semanticdb-table))
+ (semanticdb-get-buffer parent)) ;FIXME: η-redex!
+
(cl-defmethod semanticdb-in-buffer-p ((obj semanticdb-table))
"Return a buffer associated with OBJ.
If the buffer is in memory, return that buffer."
@@ -609,7 +614,7 @@ The file associated with OBJ does not need to be in a buffer."
(or (not (slot-boundp obj 'tags))
;; (not (oref obj tags)) --> not needed anymore?
(/= (or (oref obj fsize) 0) actualsize)
- (not (equal (oref obj lastmodtime) actualmod))
+ (not (time-equal-p (oref obj lastmodtime) actualmod))
)
))))
diff --git a/lisp/cedet/semantic/tag-file.el b/lisp/cedet/semantic/tag-file.el
index 7a80bccb533..a5220f622ab 100644
--- a/lisp/cedet/semantic/tag-file.el
+++ b/lisp/cedet/semantic/tag-file.el
@@ -28,8 +28,6 @@
(require 'semantic/tag)
(defvar ede-minor-mode)
-(declare-function semanticdb-table-child-p "semantic/db" t t)
-(declare-function semanticdb-get-buffer "semantic/db")
(declare-function semantic-dependency-find-file-on-path "semantic/dep")
(declare-function ede-toplevel "ede/base")
@@ -37,68 +35,66 @@
;;; Location a TAG came from.
;;
+
+(cl-defgeneric semantic-tag-parent-buffer (parent)
+ "Return the buffer in which a tag can be found, knowing its PARENT."
+ (cond ((and (semantic-tag-p parent) (semantic-tag-in-buffer-p parent))
+ ;; We have a parent with a buffer, then go there.
+ (semantic-tag-buffer parent))
+ ((and (semantic-tag-p parent) (semantic-tag-file-name parent))
+ ;; The parent only has a file-name, then
+ ;; find that file, and switch to that buffer.
+ (find-file-noselect (semantic-tag-file-name parent)))))
+
;;;###autoload
-(define-overloadable-function semantic-go-to-tag (tag &optional parent)
+(defun semantic-go-to-tag (tag &optional parent)
"Go to the location of TAG.
TAG may be a stripped element, in which case PARENT specifies a
parent tag that has position information.
PARENT can also be a `semanticdb-table' object."
- (:override
- (save-match-data
+ (save-match-data
+ (set-buffer
(cond ((semantic-tag-in-buffer-p tag)
;; We have a linked tag, go to that buffer.
- (set-buffer (semantic-tag-buffer tag)))
+ (semantic-tag-buffer tag))
((semantic-tag-file-name tag)
;; If it didn't have a buffer, but does have a file
;; name, then we need to get to that file so the tag
;; location is made accurate.
- (set-buffer (find-file-noselect (semantic-tag-file-name tag))))
- ((and parent (semantic-tag-p parent) (semantic-tag-in-buffer-p parent))
- ;; The tag had nothing useful, but we have a parent with
- ;; a buffer, then go there.
- (set-buffer (semantic-tag-buffer parent)))
- ((and parent (semantic-tag-p parent) (semantic-tag-file-name parent))
- ;; Tag had nothing, and the parent only has a file-name, then
- ;; find that file, and switch to that buffer.
- (set-buffer (find-file-noselect (semantic-tag-file-name parent))))
- ((and parent (featurep 'semantic/db)
- (semanticdb-table-child-p parent))
- (set-buffer (semanticdb-get-buffer parent)))
- (t
- ;; Well, just assume things are in the current buffer.
- nil
- )))
- ;; We should be in the correct buffer now, try and figure out
- ;; where the tag is.
- (cond ((semantic-tag-with-position-p tag)
- ;; If it's a number, go there
- (goto-char (semantic-tag-start tag)))
- ((semantic-tag-with-position-p parent)
- ;; Otherwise, it's a trimmed vector, such as a parameter,
- ;; or a structure part. If there is a parent, we can use it
- ;; as a bounds for searching.
- (goto-char (semantic-tag-start parent))
- ;; Here we make an assumption that the text returned by
- ;; the parser and concocted by us actually exists
- ;; in the buffer.
- (re-search-forward (semantic-tag-name tag)
- (semantic-tag-end parent)
- t))
- ((semantic-tag-get-attribute tag :line)
- ;; The tag has a line number in it. Go there.
- (goto-char (point-min))
- (forward-line (1- (semantic-tag-get-attribute tag :line))))
- ((and (semantic-tag-p parent) (semantic-tag-get-attribute parent :line))
- ;; The tag has a line number in it. Go there.
- (goto-char (point-min))
- (forward-line (1- (semantic-tag-get-attribute parent :line)))
- (re-search-forward (semantic-tag-name tag) nil t))
- (t
- ;; Take a guess that the tag has a unique name, and just
- ;; search for it from the beginning of the buffer.
- (goto-char (point-min))
- (re-search-forward (semantic-tag-name tag) nil t)))
- )
+ (find-file-noselect (semantic-tag-file-name tag)))
+ ((and parent (semantic-tag-parent-buffer parent)))
+ ;; Well, just assume things are in the current buffer.
+ (t (current-buffer)))))
+ ;; We should be in the correct buffer now, try and figure out
+ ;; where the tag is.
+ (cond ((semantic-tag-with-position-p tag)
+ ;; If it's a number, go there
+ (goto-char (semantic-tag-start tag)))
+ ((semantic-tag-with-position-p parent)
+ ;; Otherwise, it's a trimmed vector, such as a parameter,
+ ;; or a structure part. If there is a parent, we can use it
+ ;; as a bounds for searching.
+ (goto-char (semantic-tag-start parent))
+ ;; Here we make an assumption that the text returned by
+ ;; the parser and concocted by us actually exists
+ ;; in the buffer.
+ (re-search-forward (semantic-tag-name tag)
+ (semantic-tag-end parent)
+ t))
+ ((semantic-tag-get-attribute tag :line)
+ ;; The tag has a line number in it. Go there.
+ (goto-char (point-min))
+ (forward-line (1- (semantic-tag-get-attribute tag :line))))
+ ((and (semantic-tag-p parent) (semantic-tag-get-attribute parent :line))
+ ;; The tag has a line number in it. Go there.
+ (goto-char (point-min))
+ (forward-line (1- (semantic-tag-get-attribute parent :line)))
+ (re-search-forward (semantic-tag-name tag) nil t))
+ (t
+ ;; Take a guess that the tag has a unique name, and just
+ ;; search for it from the beginning of the buffer.
+ (goto-char (point-min))
+ (re-search-forward (semantic-tag-name tag) nil t)))
)
;;; Dependencies
diff --git a/lisp/cedet/semantic/util.el b/lisp/cedet/semantic/util.el
index 69a7c8f59ca..24f71a2dcc1 100644
--- a/lisp/cedet/semantic/util.el
+++ b/lisp/cedet/semantic/util.el
@@ -77,7 +77,6 @@ If FILE is not loaded, and semanticdb is not available, find the file
(with-current-buffer (find-file-noselect file)
(semantic-fetch-tags))))))
-(declare-function semanticdb-abstract-table-child-p "semantic/db" (obj) t)
(declare-function semanticdb-refresh-table "semantic/db")
(declare-function semanticdb-get-tags "semantic/db" (arg &rest args) t)
(declare-function semanticdb-find-results-p "semantic/db-find" (resultp))
@@ -115,8 +114,6 @@ buffer, or a filename. If SOMETHING is nil return nil."
(require 'semantic/db-mode)
(semanticdb-minor-mode-p)
(progn
- (declare-function semanticdb-abstract-table--eieio-childp
- "semantic/db")
(cl-typep something 'semanticdb-abstract-table)))
(semanticdb-refresh-table something)
(semanticdb-get-tags something))
diff --git a/lisp/cedet/semantic/wisent/comp.el b/lisp/cedet/semantic/wisent/comp.el
index ba67d250604..e24f6128a68 100644
--- a/lisp/cedet/semantic/wisent/comp.el
+++ b/lisp/cedet/semantic/wisent/comp.el
@@ -38,6 +38,7 @@
;;; Code:
(require 'semantic/wisent)
(eval-when-compile (require 'cl-lib))
+(require 'subr-x) ; `string-pad'
;;;; -------------------
;;;; Misc. useful things
@@ -80,18 +81,13 @@
`(dlet ,(wisent-context-bindings name)
,@body))
-;; Other utilities
-
(defsubst wisent-pad-string (s n &optional left)
"Fill string S with spaces.
Return a new string of at least N characters. Insert spaces on right.
If optional LEFT is non-nil insert spaces on left."
- (let ((i (length s)))
- (if (< i n)
- (if left
- (concat (make-string (- n i) ?\ ) s)
- (concat s (make-string (- n i) ?\ )))
- s)))
+ (declare (obsolete string-pad "29.1"))
+ (string-pad s n nil left))
+
;;;; ------------------------
;;;; Environment dependencies
@@ -704,7 +700,7 @@ S must be a vector of integers."
(setq i 1)
(while (<= i nrules)
(unless (aref ruseful i)
- (wisent-log "#%s " (wisent-pad-string (format "%d" i) 4))
+ (wisent-log "#%s " (string-pad (format "%d" i) 4))
(wisent-log "%s:" (wisent-tag (aref rlhs i)))
(setq r (aref rrhs i))
(while (natnump (aref ritem r))
@@ -2298,7 +2294,7 @@ there are any reduce/reduce conflicts."
;; Don't print rules disabled in `wisent-reduce-grammar-tables'.
(when (aref ruseful i)
(wisent-log " %s %s ->"
- (wisent-pad-string (number-to-string i) 6)
+ (string-pad (number-to-string i) 6)
(wisent-tag (aref rlhs i)))
(setq r (aref rrhs i))
(if (> (aref ritem r) 0)
diff --git a/lisp/cedet/semantic/wisent/python.el b/lisp/cedet/semantic/wisent/python.el
index 941efbbbef3..6b2833ef448 100644
--- a/lisp/cedet/semantic/wisent/python.el
+++ b/lisp/cedet/semantic/wisent/python.el
@@ -1,6 +1,6 @@
;;; wisent-python.el --- Semantic support for Python -*- lexical-binding: t; -*-
-;; Copyright (C) 2002, 2004, 2006-2022 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2022 Free Software Foundation, Inc.
;; Author: Richard Kim <emacs18@gmail.com>
;; Created: June 2002
@@ -27,9 +27,7 @@
;;; Code:
-;; Try to load python support, but fail silently since it is only used
-;; for optional functionality
-(require 'python nil t)
+(require 'python)
(require 'semantic/wisent)
(require 'semantic/wisent/python-wy)
diff --git a/lisp/cedet/srecode.el b/lisp/cedet/srecode.el
index 7c054d4c100..9691f906a4c 100644
--- a/lisp/cedet/srecode.el
+++ b/lisp/cedet/srecode.el
@@ -37,14 +37,16 @@
;;
;; See the srecode manual for specific details.
+;;; Code:
+
(require 'eieio)
(require 'mode-local)
(load "srecode/loaddefs" nil 'nomessage)
(defvar srecode-version "1.2"
"Current version of the Semantic Recoder.")
+(make-obsolete-variable 'srecode-version 'emacs-version "29.1")
-;;; Code:
(defgroup srecode nil
"Semantic Recoder."
:group 'extensions
diff --git a/lisp/cedet/srecode/compile.el b/lisp/cedet/srecode/compile.el
index 37c83be8112..bed74861ca0 100644
--- a/lisp/cedet/srecode/compile.el
+++ b/lisp/cedet/srecode/compile.el
@@ -38,9 +38,6 @@
(require 'srecode/table)
(require 'srecode/dictionary)
-(declare-function srecode-template-inserter-newline-child-p "srecode/insert"
- t t)
-
;;; Code:
;;; Template Class
@@ -378,8 +375,11 @@ It is hard if the previous inserter is a newline object."
(while (and comp (stringp (car comp)))
(setq comp (cdr comp)))
(or (not comp)
- (progn (require 'srecode/insert)
- (srecode-template-inserter-newline-child-p (car comp)))))
+ (srecord-compile-inserter-newline-p (car comp))))
+
+(cl-defgeneric srecord-compile-inserter-newline-p (_obj)
+ "Non-nil if OBJ is a newline inserter object."
+ nil)
(defun srecode-compile-split-code (tag str STATE
&optional end-name)
diff --git a/lisp/cedet/srecode/insert.el b/lisp/cedet/srecode/insert.el
index 8dd5d251576..c0260c62a91 100644
--- a/lisp/cedet/srecode/insert.el
+++ b/lisp/cedet/srecode/insert.el
@@ -319,6 +319,10 @@ by themselves.")
Specify the :indent argument to enable automatic indentation when newlines
occur in your template.")
+(cl-defmethod srecord-compile-inserter-newline-p
+ ((_ srecode-template-inserter-newline))
+ t)
+
(cl-defmethod srecode-insert-method ((sti srecode-template-inserter-newline)
dictionary)
"Insert the STI inserter."
diff --git a/lisp/cedet/srecode/table.el b/lisp/cedet/srecode/table.el
index 3dfbb9d58b1..f77898f9065 100644
--- a/lisp/cedet/srecode/table.el
+++ b/lisp/cedet/srecode/table.el
@@ -200,13 +200,13 @@ INIT are the initialization parameters for the new template table."
;; go front-to-back, the highest priority items are put
;; into the search table first, allowing lower priority items
;; to be the items found in the search table.
- (object-sort-list mt 'modetables (lambda (a b)
- (> (oref a priority)
- (oref b priority))))
+ (srecode-object-sort-list mt 'modetables (lambda (a b)
+ (> (oref a priority)
+ (oref b priority))))
;; Return it.
new))
-(defun object-sort-list (object slot predicate)
+(defun srecode-object-sort-list (object slot predicate)
"Sort the items in OBJECT's SLOT.
Use PREDICATE is the same as for the `sort' function."
(when (slot-boundp object slot)
@@ -284,6 +284,8 @@ Use PREDICATE is the same as for the `sort' function."
(setq temp (cdr temp))))
)
+(define-obsolete-function-alias 'object-sort-list
+ #'srecode-object-sort-list "29.1")
(provide 'srecode/table)
diff --git a/lisp/comint.el b/lisp/comint.el
index d52623c00ae..3ed04f098c7 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -905,6 +905,12 @@ series of processes in the same Comint buffer. The hook
"Return non-nil if STR contains non-whitespace syntax."
(not (string-match "\\`\\s *\\'" str)))
+(defcustom comint-delete-old-input t
+ "When non-nil, delete old input on inserting previous input with \\<comint-mode-map>\\[comint-insert-input]."
+ :type 'boolean
+ :group 'comint
+ :version "29.1")
+
(defun comint-insert-input (event)
"In a Comint buffer, set the current input to the previous input at point.
If there is no previous input at point, run the command specified
@@ -936,10 +942,11 @@ by the global keymap (usually `mouse-yank-at-click')."
;; Otherwise, insert the previous input.
(goto-char (point-max))
;; First delete any old unsent input at the end
- (delete-region
- (or (marker-position comint-accum-marker)
- (process-mark (get-buffer-process (current-buffer))))
- (point))
+ (when comint-delete-old-input
+ (delete-region
+ (or (marker-position comint-accum-marker)
+ (process-mark (get-buffer-process (current-buffer))))
+ (point)))
;; Insert the input at point
(insert input)))))
diff --git a/lisp/cus-dep.el b/lisp/cus-dep.el
index 47d2cac3be1..bb07a0694a1 100644
--- a/lisp/cus-dep.el
+++ b/lisp/cus-dep.el
@@ -37,7 +37,7 @@
ldefs-boot\\|cus-load\\|finder-inf\\|esh-groups\\|subdirs\\)\\.el$\\)"
"Regexp matching file names not to scan for `custom-make-dependencies'.")
-(require 'autoload)
+(require 'loaddefs-gen)
;; Hack workaround for bug#14384.
;; Define defcustom-mh as an alias for defcustom, etc.
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index 50dce5ee285..d5bae8f66f8 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -139,6 +139,7 @@
(require 'cus-face)
(require 'wid-edit)
+(require 'icons)
(defvar custom-versions-load-alist) ; from cus-load
(defvar recentf-exclude) ; from recentf.el
@@ -4285,6 +4286,27 @@ restoring it to the state of a face that has never been customized."
(widget-put widget :args args)
widget))
+;;; The `fringe-bitmap' Widget.
+
+(defvar widget-fringe-bitmap-prompt-value-history nil
+ "History of input to `widget-fringe-bitmap-prompt-value'.")
+
+(define-widget 'fringe-bitmap 'symbol
+ "A Lisp fringe bitmap name."
+ :format "%v"
+ :tag "Fringe bitmap"
+ :match (lambda (_widget value) (fringe-bitmap-p value))
+ :completions (apply-partially #'completion-table-with-predicate
+ obarray #'fringe-bitmap-p 'strict)
+ :prompt-match 'fringe-bitmap-p
+ :prompt-history 'widget-face-prompt-value-history
+ :validate (lambda (widget)
+ (unless (fringe-bitmap-p (widget-value widget))
+ (widget-put widget
+ :error (format "Invalid fringe bitmap: %S"
+ (widget-value widget)))
+ widget)))
+
;;; The `custom-group-link' Widget.
(define-widget 'custom-group-link 'link
@@ -4849,7 +4871,8 @@ if only the first line of the docstring is shown."))
(print-escape-control-characters t))
(atomic-change-group
(custom-save-variables)
- (custom-save-faces)))
+ (custom-save-faces)
+ (custom-save-icons)))
(let ((file-precious-flag t))
(save-buffer))
(if old-buffer
@@ -5290,6 +5313,294 @@ if that value is non-nil."
(put 'Custom-mode 'mode-class 'special)
+;; Icons.
+
+(define-widget 'custom-icon 'custom
+ "A widget for displaying an icon.
+The following properties have special meanings for this widget:
+
+:hidden-states should be a list of widget states for which the
+ widget's initial contents are to be hidden.
+
+:custom-form should be a symbol describing how to display and
+ edit the variable---either `edit' (using edit widgets),
+ `lisp' (as a Lisp sexp), or `mismatch' (should not happen);
+ if nil, use the return value of `custom-variable-default-form'.
+
+:shown-value, if non-nil, should be a list whose `car' is the
+ variable value to display in place of the current value.
+
+:custom-style describes the widget interface style; nil is the
+ default style, while `simple' means a simpler interface that
+ inhibits the magic custom-state widget."
+ :format "%v"
+ :help-echo "Alter or reset this icon."
+ :documentation-property #'icon-documentation
+ :custom-category 'option
+ :custom-state nil
+ :custom-form nil
+ :value-create 'custom-icon-value-create
+ :hidden-states '(standard)
+ :custom-set 'custom-icon-set
+ :custom-reset-current 'custom-redraw
+ :custom-reset-saved 'custom-variable-reset-saved)
+
+(defun custom-icon-value-create (widget)
+ "Here is where you edit the icon's specification."
+ (custom-load-widget widget)
+ (unless (widget-get widget :custom-form)
+ (widget-put widget :custom-form custom-variable-default-form))
+ (let* ((buttons (widget-get widget :buttons))
+ (children (widget-get widget :children))
+ (form (widget-get widget :custom-form))
+ (symbol (widget-get widget :value))
+ (tag (widget-get widget :tag))
+ (type '(repeat
+ (list (choice (const :tag "Images" image)
+ (const :tag "Colorful Emojis" emoji)
+ (const :tag "Monochrome Symbols" symbol)
+ (const :tag "Text Only" text))
+ (repeat string)
+ plist)))
+ (prefix (widget-get widget :custom-prefix))
+ (last (widget-get widget :custom-last))
+ (style (widget-get widget :custom-style))
+ (value (let ((shown-value (widget-get widget :shown-value)))
+ (cond (shown-value
+ (car shown-value))
+ (t (icon-complete-spec symbol nil t)))))
+ (state (or (widget-get widget :custom-state)
+ (if (memq (custom-icon-state symbol value)
+ (widget-get widget :hidden-states))
+ 'hidden))))
+
+ ;; Transform the spec into something that agrees with the type.
+ (setq value
+ (mapcar
+ (lambda (elem)
+ (list (car elem)
+ (icon-spec-values elem)
+ (icon-spec-keywords elem)))
+ value))
+
+ ;; Now we can create the child widget.
+ (cond ((eq custom-buffer-style 'tree)
+ (insert prefix (if last " `--- " " |--- "))
+ (push (widget-create-child-and-convert
+ widget 'custom-browse-variable-tag)
+ buttons)
+ (insert " " tag "\n")
+ (widget-put widget :buttons buttons))
+ ((eq state 'hidden)
+ ;; Indicate hidden value.
+ (push (widget-create-child-and-convert
+ widget 'custom-visibility
+ :help-echo "Show the value of this option."
+ :on-glyph "down"
+ :on "Hide"
+ :off-glyph "right"
+ :off "Show Value"
+ :action 'custom-toggle-hide-icon
+ nil)
+ buttons)
+ (insert " ")
+ (push (widget-create-child-and-convert
+ widget 'item
+ :format "%{%t%} "
+ :sample-face 'custom-variable-tag
+ :tag tag
+ :parent widget)
+ buttons))
+ (t
+ ;; Edit mode.
+ (push (widget-create-child-and-convert
+ widget 'custom-visibility
+ :help-echo "Hide or show this option."
+ :on "Hide"
+ :off "Show"
+ :on-glyph "down"
+ :off-glyph "right"
+ :action 'custom-toggle-hide-icon
+ t)
+ buttons)
+ (insert " ")
+ (let* ((format (widget-get type :format))
+ tag-format)
+ (unless (string-match ":\\s-?" format)
+ (error "Bad format"))
+ (setq tag-format (substring format 0 (match-end 0)))
+ (push (widget-create-child-and-convert
+ widget 'item
+ :format tag-format
+ :action 'custom-tag-action
+ :help-echo "Change specs of this face."
+ :mouse-down-action 'custom-tag-mouse-down-action
+ :button-face 'custom-variable-button
+ :sample-face 'custom-variable-tag
+ :tag tag)
+ buttons)
+ (push (widget-create-child-and-convert
+ widget type
+ :value value)
+ children))))
+ (unless (eq custom-buffer-style 'tree)
+ (unless (eq (preceding-char) ?\n)
+ (widget-insert "\n"))
+ ;; Create the magic button.
+ (unless (eq style 'simple)
+ (let ((magic (widget-create-child-and-convert
+ widget 'custom-magic nil)))
+ (widget-put widget :custom-magic magic)
+ (push magic buttons)))
+ (widget-put widget :buttons buttons)
+ ;; Insert documentation.
+ (widget-put widget :documentation-indent 3)
+ (unless (and (eq style 'simple)
+ (eq state 'hidden))
+ (widget-add-documentation-string-button
+ widget :visibility-widget 'custom-visibility))
+
+ ;; Update the rest of the properties.
+ (widget-put widget :custom-form form)
+ (widget-put widget :children children)
+ ;; Now update the state.
+ (if (eq state 'hidden)
+ (widget-put widget :custom-state state)
+ (custom-icon-state-set widget))
+ ;; See also.
+ (unless (eq state 'hidden)
+ (when (eq (widget-get widget :custom-level) 1)
+ (custom-add-parent-links widget))
+ (custom-add-see-also widget)))))
+
+(defun custom-toggle-hide-icon (visibility-widget &rest _ignore)
+ "Toggle the visibility of a `custom-icon' parent widget.
+By default, this signals an error if the parent has unsaved
+changes."
+ (let ((widget (widget-get visibility-widget :parent)))
+ (unless (eq (widget-type widget) 'custom-icon)
+ (error "Invalid widget type"))
+ (custom-load-widget widget)
+ (let ((state (widget-get widget :custom-state)))
+ (if (eq state 'hidden)
+ (widget-put widget :custom-state 'unknown)
+ ;; In normal interface, widget can't be hidden if modified.
+ (when (memq state '(invalid modified set))
+ (error "There are unsaved changes"))
+ (widget-put widget :custom-state 'hidden))
+ (custom-redraw widget)
+ (widget-setup))))
+
+(defun custom--icons-widget-value (widget)
+ ;; Transform back to the real format.
+ (mapcar
+ (lambda (elem)
+ (cons (nth 0 elem)
+ (append (nth 1 elem) (nth 2 elem))))
+ (widget-value widget)))
+
+(defun custom-icon-set (widget)
+ "Set the current spec for the icon being edited by WIDGET."
+ (let* ((state (widget-get widget :custom-state))
+ (child (car (widget-get widget :children)))
+ (symbol (widget-value widget))
+ val)
+ (when (eq state 'hidden)
+ (user-error "Cannot update hidden icon"))
+
+ (setq val (custom--icons-widget-value child))
+ (unless (equal val (icon-complete-spec symbol))
+ (custom-variable-backup-value widget))
+ (custom-push-theme 'theme-icon symbol 'user 'set val)
+ (custom-redraw-magic widget)))
+
+;;;###autoload
+(defun customize-icon (icon)
+ "Customize ICON."
+ (interactive
+ (let* ((v (symbol-at-point))
+ (default (and (iconp v) (symbol-name v)))
+ val)
+ (setq val (completing-read (format-prompt "Customize icon" default)
+ obarray 'iconp t nil nil default))
+ (list (if (equal val "")
+ (if (symbolp v) v nil)
+ (intern val)))))
+ (unless icon
+ (error "No icon specified"))
+ (custom-buffer-create (list (list icon 'custom-icon))
+ (format "*Customize Icon: %s*"
+ (custom-unlispify-tag-name icon))))
+
+(defun custom-icon-state-set (widget &optional state)
+ "Set the state of WIDGET to STATE."
+ (let ((value (custom--icons-widget-value
+ (car (widget-get widget :children)))))
+ (widget-put
+ widget :custom-state
+ (or state
+ (custom-icon-state (widget-value widget) value)))))
+
+;;; FIXME -- more work is needed here. We don't properly
+;;; differentiate between `saved' and `set'.
+(defun custom-icon-state (symbol value)
+ "Return the state of customize icon SYMBOL for VALUE.
+Possible return values are `standard', `saved', `set', `themed',
+and `changed'."
+ (cond
+ ((equal (icon-complete-spec symbol t t) value)
+ 'standard)
+ ((equal (icon-complete-spec symbol nil t) value)
+ (if (eq (caar (get symbol 'theme-icon)) 'user)
+ 'set
+ 'themed))
+ (t 'changed)))
+
+(defun custom-theme-set-icons (theme &rest specs)
+ "Apply a list of icon specs associated with THEME.
+THEME should be a symbol, and SPECS are icon name/spec pairs.
+See `define-icon' for details."
+ (custom-check-theme theme)
+ (pcase-dolist (`(,icon ,spec) specs)
+ (custom-push-theme 'theme-icon icon theme 'set spec)))
+
+;;;###autoload
+(defun custom-set-icons (&rest args)
+ "Install user customizations of icon specs specified in ARGS.
+These settings are registered as theme `user'.
+The arguments should each be a list of the form:
+
+ (SYMBOL EXP)
+
+This stores EXP (without evaluating it) as the saved spec for SYMBOL."
+ (apply #'custom-theme-set-icons 'user args))
+
+;;;###autoload
+(defun custom-save-icons ()
+ "Save all customized icons in `custom-file'."
+ (let ((values nil))
+ (mapatoms
+ (lambda (symbol)
+ (let ((value (car-safe (get symbol 'theme-icon))))
+ (when (eq (car value) 'user)
+ (push (list symbol (cadr value)) values)))))
+ (save-excursion
+ (custom-save-delete 'custom-set-icons)
+ (when values
+ (ensure-empty-lines)
+ (insert "(custom-set-icons
+ ;; custom-set-icons was added by Custom.
+ ;; If you edit it by hand, you could mess it up, so be careful.
+ ;; Your init file should contain only one such instance.
+ ;; If there is more than one, they won't work right.\n")
+ (dolist (value (sort values (lambda (s1 s2)
+ (string< (car s1) (car s2)))))
+ (unless (bolp)
+ (insert "\n"))
+ (insert " '")
+ (prin1 value (current-buffer)))
+ (insert ")\n")))))
+
(provide 'cus-edit)
;;; cus-edit.el ends here
diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index df919fd7155..0e1cb4589da 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -834,7 +834,10 @@ since it could result in memory overflow and make Emacs crash."
(x-scroll-event-delta-factor mouse float "29.1")
(x-gtk-use-native-input keyboard boolean "29.1")
(x-dnd-disable-motif-drag dnd boolean "29.1")
- (x-auto-preserve-selections x boolean "29.1")
+ (x-auto-preserve-selections x
+ (choice (const :tag "Always preserve selections" t)
+ (repeat symbol))
+ "29.1")
;; xselect.c
(x-select-enable-clipboard-manager killing boolean "24.1")
;; xsettings.c
diff --git a/lisp/custom.el b/lisp/custom.el
index bbbe70c5ea8..96dfb37d862 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -910,7 +910,7 @@ symbol `set', then VALUE is the value to use. If it is the symbol
`reset', then SYMBOL will be removed from THEME (VALUE is ignored).
See `custom-known-themes' for a list of known themes."
- (unless (memq prop '(theme-value theme-face))
+ (unless (memq prop '(theme-value theme-face theme-icon))
(error "Unknown theme property"))
(let* ((old (get symbol prop))
(setting (assq theme old)) ; '(theme value)
@@ -1692,6 +1692,7 @@ Each of the arguments ARGS has this form:
(VARIABLE IGNORED)
This means reset VARIABLE. (The argument IGNORED is ignored)."
+ (declare (obsolete nil "29.1"))
(apply #'custom-theme-reset-variables 'user args))
(defun custom-add-choice (variable choice)
diff --git a/lisp/descr-text.el b/lisp/descr-text.el
index 16971aa6611..7fad031add6 100644
--- a/lisp/descr-text.el
+++ b/lisp/descr-text.el
@@ -655,7 +655,9 @@ The character information includes:
("file code"
,@(if multibyte-p
(let* ((coding buffer-file-coding-system)
- (encoded (encode-coding-char char coding charset)))
+ (encoded
+ (and coding
+ (encode-coding-char char coding charset))))
(if encoded
(list (encoded-string-description encoded coding)
(format "(encoded by coding system %S)"
diff --git a/lisp/desktop.el b/lisp/desktop.el
index 850d2a86efa..ef73bc596df 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -701,7 +701,7 @@ DIRNAME omitted or nil means use `desktop-dirname'."
-4))))
;; We should err on the safe side here: if any of the
;; executables is something like "emacs-nox" or "emacs-42.1"
- ;; or "gemacs" or "xemacs", let's recognize them as well.
+ ;; or "gemacs", let's recognize them as well.
(and (string-match-p "emacs" proc-cmd)
(string-match-p "emacs" my-cmd))))))
@@ -791,7 +791,10 @@ if different)."
;; ----------------------------------------------------------------------------
(unless noninteractive
- (add-hook 'kill-emacs-query-functions #'desktop-kill))
+ (add-hook 'kill-emacs-query-functions #'desktop-kill)
+ ;; Certain things should be done even if
+ ;; `kill-emacs-query-functions' are not called.
+ (add-hook 'kill-emacs-hook #'desktop--on-kill))
(defun desktop-kill ()
"If `desktop-save-mode' is non-nil, do what `desktop-save' says to do.
@@ -818,12 +821,15 @@ is nil, ask the user where to save the desktop."
(file-error
(unless (yes-or-no-p "Error while saving the desktop. Ignore? ")
(signal (car err) (cdr err))))))
+ (desktop--on-kill)
+ t)
+
+(defun desktop--on-kill ()
;; If we own it, we don't anymore.
(when (eq (emacs-pid) (desktop-owner))
;; Allow exiting Emacs even if we can't delete the desktop file.
(ignore-error 'file-error
- (desktop-release-lock)))
- t)
+ (desktop-release-lock))))
;; ----------------------------------------------------------------------------
(defun desktop-list* (&rest args)
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index b9f33036e31..7ff3e333515 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -760,7 +760,7 @@ with a prefix argument."
(defvar dired-aux-files)
-(defun minibuffer-default-add-dired-shell-commands ()
+(defun dired-minibuffer-default-add-shell-commands ()
"Return a list of all commands associated with current dired files.
This function is used to add all related commands retrieved by `mailcap'
to the end of the list of defaults just after the default value."
@@ -787,7 +787,7 @@ offer a smarter default choice of shell command."
(lambda ()
(setq-local dired-aux-files files)
(setq-local minibuffer-default-add-function
- #'minibuffer-default-add-dired-shell-commands))
+ #'dired-minibuffer-default-add-shell-commands))
(setq prompt (format prompt (dired-mark-prompt arg files)))
(if (functionp 'dired-guess-shell-command)
(dired-mark-pop-up nil 'shell files
@@ -882,7 +882,7 @@ In a noninteractive call (from Lisp code), you must specify
the list of file names explicitly with the FILE-LIST argument, which
can be produced by `dired-get-marked-files', for example.
-`dired-guess-shell-alist-default' and
+If `dired-x' is loaded, `dired-guess-shell-alist-default' and
`dired-guess-shell-alist-user' are consulted when the user is
prompted for the shell command to use interactively.
@@ -3058,7 +3058,7 @@ Optional third arg LIMIT (>= 1) is a limit to the length of the
resulting list.
Thus, if SEP is a regexp that only matches itself,
- (mapconcat #'identity (dired-split SEP STRING) SEP)
+ (mapconcat #\\='identity (dired-split SEP STRING) SEP)
is always equal to STRING."
(declare (obsolete split-string "29.1"))
@@ -3529,6 +3529,9 @@ in the Dired buffer."
(setq model (vc-checkout-model backend only-files-list))))
(list backend files only-files-list state model)))
+(define-obsolete-function-alias 'minibuffer-default-add-dired-shell-commands
+ #'dired-minibuffer-default-add-shell-commands "29.1")
+
(provide 'dired-aux)
diff --git a/lisp/dired.el b/lisp/dired.el
index 43563d969f1..10813e56dff 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -775,19 +775,20 @@ of the region if `dired-mark-region' is non-nil. Otherwise, operate
on the whole buffer.
Return value is the number of files marked, or nil if none were marked."
- `(let ((inhibit-read-only t) count
+ `(let ((msg ,msg)
+ (inhibit-read-only t) count
(use-region-p (dired-mark--region-use-p))
(beg (dired-mark--region-beginning))
(end (dired-mark--region-end)))
(save-excursion
(setq count 0)
- (when ,msg
+ (when msg
(message "%s %ss%s%s..."
(cond ((eq dired-marker-char ?\s) "Unmarking")
((eq dired-del-marker dired-marker-char)
"Flagging")
(t "Marking"))
- ,msg
+ msg
(if (eq dired-del-marker dired-marker-char)
" for deletion"
"")
@@ -802,9 +803,9 @@ Return value is the number of files marked, or nil if none were marked."
(insert dired-marker-char)
(setq count (1+ count))))
(forward-line 1))
- (when ,msg (message "%s %s%s %s%s%s"
+ (when msg (message "%s %s%s %s%s%s"
count
- ,msg
+ msg
(dired-plural-s count)
(if (eq dired-marker-char ?\s) "un" "")
(if (eq dired-marker-char dired-del-marker)
@@ -1140,7 +1141,8 @@ If DIRNAME is already in a Dired buffer, that buffer is used without refresh."
(modtime (visited-file-modtime)))
(or (eq modtime 0)
(not (eq (file-attribute-type attributes) t))
- (equal (file-attribute-modification-time attributes) modtime)))))
+ (time-equal-p (file-attribute-modification-time attributes)
+ modtime)))))
(defvar auto-revert-remote-files)
@@ -2964,10 +2966,11 @@ See options: `dired-hide-details-hide-symlink-targets' and
;; approximate ("anywhere on the line is fine").
;; FIXME: This also removes other invisible properties!
(save-excursion
- (remove-list-of-text-properties
- (progn (goto-char start) (line-end-position))
- (progn (goto-char end) (line-end-position))
- '(invisible))))
+ (let ((inhibit-read-only t))
+ (remove-list-of-text-properties
+ (progn (goto-char start) (line-end-position))
+ (progn (goto-char end) (line-end-position))
+ '(invisible)))))
;;; Functions for finding the file name in a dired buffer line
@@ -3072,7 +3075,11 @@ If EOL, it should be an position to use instead of
(defun dired-copy-filename-as-kill (&optional arg)
"Copy names of marked (or next ARG) files into the kill ring.
-The names are separated by a space.
+If there are several names, they will be separated by a space,
+and file names that have spaces or quote characters in them will
+be quoted (with double quotes). (When there's a single file, no
+quoting is done.)
+
With a zero prefix arg, use the absolute file name of each marked file.
With \\[universal-argument], use the file name relative to the Dired buffer's
`default-directory'. (This still may contain slashes if in a subdirectory.)
@@ -3082,19 +3089,26 @@ prefix arg and marked files are ignored in this case.
You can then feed the file name(s) to other commands with \\[yank]."
(interactive "P")
- (let ((string
- (or (dired-get-subdir)
- (mapconcat #'identity
- (if arg
- (cond ((zerop (prefix-numeric-value arg))
- (dired-get-marked-files))
- ((consp arg)
- (dired-get-marked-files t))
- (t
- (dired-get-marked-files
- 'no-dir (prefix-numeric-value arg))))
- (dired-get-marked-files 'no-dir))
- " "))))
+ (let* ((files
+ (or (ensure-list (dired-get-subdir))
+ (if arg
+ (cond ((zerop (prefix-numeric-value arg))
+ (dired-get-marked-files))
+ ((consp arg)
+ (dired-get-marked-files t))
+ (t
+ (dired-get-marked-files
+ 'no-dir (prefix-numeric-value arg))))
+ (dired-get-marked-files 'no-dir))))
+ (string
+ (if (length= files 1)
+ (car files)
+ (mapconcat (lambda (file)
+ (if (string-match-p "[ \"']" file)
+ (format "%S" file)
+ file))
+ files
+ " "))))
(unless (string= string "")
(if (eq last-command 'kill-region)
(kill-append string nil)
diff --git a/lisp/edmacro.el b/lisp/edmacro.el
index bdc50c5885a..efffab9b30b 100644
--- a/lisp/edmacro.el
+++ b/lisp/edmacro.el
@@ -251,6 +251,7 @@ If VERBOSE is `1', put everything on one line. If VERBOSE is omitted
or nil, use a compact 80-column format."
(and macro (symbolp macro) (setq macro (symbol-function macro)))
(edmacro-format-keys (or macro last-kbd-macro) verbose))
+
;;; Commands for *Edit Macro* buffer.
@@ -446,6 +447,7 @@ doubt, use whitespace."
(interactive)
(error "This mode can be enabled only by `edit-kbd-macro'"))
(put 'edmacro-mode 'mode-class 'special)
+
;;; Formatting a keyboard macro as human-readable text.
@@ -637,12 +639,8 @@ This function assumes that the events can be stored in a string."
(defun edmacro-fix-menu-commands (macro &optional noerror)
(if (vectorp macro)
(let (result)
- ;; Not preloaded in without-x builds.
+ ;; Not preloaded in a --without-x build.
(require 'mwheel)
- (defvar mouse-wheel-down-event)
- (defvar mouse-wheel-left-event)
- (defvar mouse-wheel-right-event)
- (defvar mouse-wheel-up-event)
;; Make a list of the elements.
(setq macro (append macro nil))
(dolist (ev macro)
@@ -669,6 +667,7 @@ This function assumes that the events can be stored in a string."
;; Reverse them again and make them back into a vector.
(vconcat (nreverse result)))
macro))
+
;;; Parsing a human-readable keyboard macro.
diff --git a/lisp/electric.el b/lisp/electric.el
index 0cf3a299cfa..f2ff837333f 100644
--- a/lisp/electric.el
+++ b/lisp/electric.el
@@ -540,6 +540,16 @@ closing double quote otherwise."
:version "26.1"
:type 'boolean :safe #'booleanp :group 'electricity)
+(defcustom electric-quote-replace-consecutive t
+ "Non-nil means to replace a pair of single quotes with a double quote.
+Two single quotes are replaced by the corresponding double quote
+when the second quote of the pair is entered (i.e. by typing ` or
+') by default. If nil, the single quotes are not altered."
+ :version "29.1"
+ :type 'boolean
+ :safe #'booleanp
+ :group 'electricity)
+
(defvar electric-quote-inhibit-functions ()
"List of functions that should inhibit electric quoting.
When the variable `electric-quote-mode' is non-nil, Emacs will
@@ -592,7 +602,9 @@ This requotes when a quoting key is typed."
(memq (char-syntax (char-before))
'(?\s ?\())))
(setq backtick ?\')))
- (cond ((search-backward (string q< backtick) (- (point) 2) t)
+ (cond ((and electric-quote-replace-consecutive
+ (search-backward
+ (string q< backtick) (- (point) 2) t))
(replace-match (string q<<))
(when (and electric-pair-mode
(eq (cdr-safe
@@ -606,7 +618,8 @@ This requotes when a quoting key is typed."
((search-backward "\"" (1- (point)) t)
(replace-match (string q<<))
(setq last-command-event q<<)))
- (cond ((search-backward (string q> ?') (- (point) 2) t)
+ (cond ((and electric-quote-replace-consecutive
+ (search-backward (string q> ?') (- (point) 2) t))
(replace-match (string q>>))
(setq last-command-event q>>))
((search-backward "'" (1- (point)) t)
@@ -627,7 +640,7 @@ and text paragraphs, and these are selectively controlled with
`electric-quote-paragraph'.
Customize `electric-quote-chars' to use characters other than the
-ones listed here.
+ones listed here. Also see `electric-quote-replace-consecutive'.
This is a global minor mode. To toggle the mode in a single buffer,
use `electric-quote-local-mode'."
diff --git a/lisp/emacs-lisp/advice.el b/lisp/emacs-lisp/advice.el
index 86a42b208e7..d383650f4e5 100644
--- a/lisp/emacs-lisp/advice.el
+++ b/lisp/emacs-lisp/advice.el
@@ -1,6 +1,6 @@
;;; advice.el --- An overloading mechanism for Emacs Lisp functions -*- lexical-binding: t -*-
-;; Copyright (C) 1993-1994, 2000-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1993-2022 Free Software Foundation, Inc.
;; Author: Hans Chalupsky <hans@cs.buffalo.edu>
;; Maintainer: emacs-devel@gnu.org
@@ -23,12 +23,6 @@
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-;; LCD Archive Entry:
-;; advice|Hans Chalupsky|hans@cs.buffalo.edu|
-;; Overloading mechanism for Emacs Lisp functions|
-;; 1994/08/05 03:42:04|2.14|~/packages/advice.el.Z|
-
-
;;; Commentary:
;; Advice is documented in the Emacs Lisp Manual.
@@ -1060,9 +1054,9 @@
;; (print "Let's clean up now!"))
;; foo
;;
-;; Now `foo's advice is byte-compiled:
+;; Now `foo's advice is compiled:
;;
-;; (byte-code-function-p 'ad-Advice-foo)
+;; (compiled-function-p 'ad-Advice-foo)
;; t
;;
;; (foo 3)
@@ -1304,7 +1298,7 @@
;; constructed during preactivation was used, even though we did not specify
;; the `compile' flag:
;;
-;; (byte-code-function-p 'ad-Advice-fum)
+;; (compiled-function-p 'ad-Advice-fum)
;; t
;;
;; (fum 2)
@@ -1335,7 +1329,7 @@
;;
;; A new uncompiled advised definition got constructed:
;;
-;; (byte-code-function-p 'ad-Advice-fum)
+;; (compiled-function-p 'ad-Advice-fum)
;; nil
;;
;; (fum 2)
@@ -1586,8 +1580,6 @@
:link '(custom-manual "(elisp)Advising Functions")
:group 'lisp)
-(defconst ad-version "2.14")
-
;;;###autoload
(defcustom ad-redefinition-action 'warn
"Defines what to do with redefinitions during Advice de/activation.
@@ -2124,9 +2116,9 @@ the cache-id will clear the cache."
(defsubst ad-compiled-p (definition)
"Return non-nil if DEFINITION is a compiled byte-code object."
- (or (byte-code-function-p definition)
- (and (macrop definition)
- (byte-code-function-p (ad-lambdafy definition)))))
+ (or (compiled-function-p definition)
+ (and (macrop definition)
+ (compiled-function-p (ad-lambdafy definition)))))
(defsubst ad-compiled-code (compiled-definition)
"Return the byte-code object of a COMPILED-DEFINITION."
@@ -3256,6 +3248,9 @@ Use only in REAL emergencies."
(message "Oops! Left over advised function %S" function)
(ad-pop-advised-function function)))
+(defconst ad-version "2.14")
+(make-obsolete-variable 'ad-version 'emacs-version "29.1")
+
(provide 'advice)
;;; advice.el ends here
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index a24a5044562..bbe8135f04a 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -722,35 +722,83 @@ for speeding up processing.")
;; something not EQ to its argument if and ONLY if it has made a change.
;; This implies that you cannot simply destructively modify the list;
;; you must return something not EQ to it if you make an optimization.
-;;
-;; It is now safe to optimize code such that it introduces new bindings.
-(defsubst byte-compile-trueconstp (form)
+(defsubst byte-opt--bool-value-form (form)
+ "The form in FORM that yields its boolean value, possibly FORM itself."
+ (while (let ((head (car-safe form)))
+ (cond ((memq head '( progn inline save-excursion save-restriction
+ save-current-buffer))
+ (setq form (car (last form)))
+ t)
+ ((memq head '(let let* setq setcar setcdr))
+ (setq form (car (last (cddr form))))
+ t)
+ ((memq head '( prog1 unwind-protect copy-sequence identity
+ reverse nreverse sort))
+ (setq form (nth 1 form))
+ t)
+ ((eq head 'mapc)
+ (setq form (nth 2 form))
+ t))))
+ form)
+
+(defun byte-compile-trueconstp (form)
"Return non-nil if FORM always evaluates to a non-nil value."
- (while (eq (car-safe form) 'progn)
- (setq form (car (last (cdr form)))))
+ (setq form (byte-opt--bool-value-form form))
(cond ((consp form)
- (pcase (car form)
- ('quote (cadr form))
- ;; Can't use recursion in a defsubst.
- ;; (`progn (byte-compile-trueconstp (car (last (cdr form)))))
- ))
+ (let ((head (car form)))
+ ;; FIXME: Lots of other expressions are statically non-nil.
+ (cond ((memq head '(quote function)) (cadr form))
+ ((eq head 'list) (cdr form))
+ ((memq head
+ ;; FIXME: Replace this list with a function property?
+ '( length safe-length cons lambda
+ string make-string format concat
+ substring substring-no-properties string-replace
+ replace-regexp-in-string symbol-name make-symbol
+ mapconcat
+ vector make-vector vconcat make-record record
+ regexp-quote regexp-opt
+ buffer-string buffer-substring
+ buffer-substring-no-properties
+ current-buffer buffer-size
+ point point-min point-max
+ following-char preceding-char max-char
+ + - * / % 1+ 1- min max abs
+ logand logior lorxor lognot ash
+ number-to-string string-to-number
+ int-to-string char-to-string prin1-to-string
+ byte-to-string string-to-vector string-to-char
+ always))
+ t)
+ ((eq head 'if)
+ (and (byte-compile-trueconstp (nth 2 form))
+ (byte-compile-trueconstp (car (last (cdddr form))))))
+ ((memq head '(not null))
+ (byte-compile-nilconstp (cadr form)))
+ ((eq head 'or)
+ (and (cdr form)
+ (byte-compile-trueconstp (car (last (cdr form)))))))))
((not (symbolp form)))
((eq form t))
((keywordp form))))
-(defsubst byte-compile-nilconstp (form)
+(defun byte-compile-nilconstp (form)
"Return non-nil if FORM always evaluates to a nil value."
- (while (eq (car-safe form) 'progn)
- (setq form (car (last (cdr form)))))
- (cond ((consp form)
- (pcase (car form)
- ('quote (null (cadr form)))
- ;; Can't use recursion in a defsubst.
- ;; (`progn (byte-compile-nilconstp (car (last (cdr form)))))
- ))
- ((not (symbolp form)) nil)
- ((null form))))
+ (setq form (byte-opt--bool-value-form form))
+ (or (not form) ; assume (quote nil) always being normalised to nil
+ (and (consp form)
+ (let ((head (car form)))
+ ;; FIXME: There are many other expressions that are statically nil.
+ (cond ((memq head '(while ignore)) t)
+ ((eq head 'if)
+ (and (byte-compile-nilconstp (nth 2 form))
+ (byte-compile-nilconstp (car (last (cdddr form))))))
+ ((memq head '(not null))
+ (byte-compile-trueconstp (cadr form)))
+ ((eq head 'and)
+ (and (cdr form)
+ (byte-compile-nilconstp (car (last (cdr form)))))))))))
;; If the function is being called with constant integer args,
;; evaluate as much as possible at compile-time. This optimizer
@@ -921,7 +969,7 @@ for speeding up processing.")
(defun byte-optimize--fixnump (o)
"Return whether O is guaranteed to be a fixnum in all Emacsen.
See Info node `(elisp) Integer Basics'."
- (and (fixnump o) (<= -536870912 o 536870911)))
+ (and (integerp o) (<= -536870912 o 536870911)))
(defun byte-optimize-equal (form)
;; Replace `equal' or `eql' with `eq' if at least one arg is a
@@ -1077,35 +1125,91 @@ See Info node `(elisp) Integer Basics'."
(nth 1 form)))
(defun byte-optimize-and (form)
- ;; Simplify if less than 2 args.
- ;; if there is a literal nil in the args to `and', throw it and following
- ;; forms away, and surround the `and' with (progn ... nil).
- (cond ((null (cdr form)))
- ((memq nil form)
- (list 'progn
- (byte-optimize-and
- (prog1 (setq form (copy-sequence form))
- (while (nth 1 form)
- (setq form (cdr form)))
- (setcdr form nil)))
- nil))
- ((null (cdr (cdr form)))
- (nth 1 form))
- ((byte-optimize-constant-args form))))
+ (let ((seq nil)
+ (new-args nil)
+ (nil-result nil)
+ (args (cdr form)))
+ (while
+ (and args
+ (let ((arg (car args)))
+ (cond
+ (seq ; previous arg was always-true
+ (push arg seq)
+ (unless (and (cdr args) (byte-compile-trueconstp arg))
+ (push `(progn . ,(nreverse seq)) new-args)
+ (setq seq nil))
+ t)
+ ((and (cdr args) (byte-compile-trueconstp arg))
+ ;; Always-true arg: evaluate unconditionally.
+ (push arg seq)
+ t)
+ ((and arg (not (byte-compile-nilconstp arg)))
+ (push arg new-args)
+ t)
+ (t
+ ;; Throw away the remaining args; this one is always false.
+ (setq nil-result t)
+ (when arg
+ (push arg new-args)) ; keep possible side-effects
+ nil))))
+ (setq args (cdr args)))
+
+ (setq new-args (nreverse new-args))
+ (if (equal new-args (cdr form))
+ ;; Input is unchanged: keep original form, and don't represent
+ ;; a nil result explicitly because that would lead to infinite
+ ;; growth when the optimiser is iterated.
+ (setq nil-result nil)
+ (setq form (cons (car form) new-args)))
+
+ (let ((new-form
+ (pcase form
+ ;; (and (progn ... X) ...) -> (progn ... (and X ...))
+ (`(,head (progn . ,forms) . ,rest)
+ `(progn ,@(butlast forms) (,head ,(car (last forms)) . ,rest)))
+ (`(,_) t) ; (and) -> t
+ (`(,_ ,arg) arg) ; (and X) -> X
+ (_ (byte-optimize-constant-args form)))))
+ (if nil-result
+ `(progn ,new-form nil)
+ new-form))))
(defun byte-optimize-or (form)
- ;; Throw away nil's, and simplify if less than 2 args.
- ;; If there is a literal non-nil constant in the args to `or', throw away all
- ;; following forms.
- (setq form (remq nil form))
- (let ((rest form))
- (while (cdr (setq rest (cdr rest)))
- (if (byte-compile-trueconstp (car rest))
- (setq form (copy-sequence form)
- rest (setcdr (memq (car rest) form) nil))))
- (if (cdr (cdr form))
- (byte-optimize-constant-args form)
- (nth 1 form))))
+ (let ((seq nil)
+ (new-args nil)
+ (args (remq nil (cdr form)))) ; Discard nil arguments.
+ (while
+ (and args
+ (let ((arg (car args)))
+ (cond
+ (seq ; previous arg was always-false
+ (push arg seq)
+ (unless (and (cdr args) (byte-compile-nilconstp arg))
+ (push `(progn . ,(nreverse seq)) new-args)
+ (setq seq nil))
+ t)
+ ((and (cdr args) (byte-compile-nilconstp arg))
+ ;; Always-false arg: evaluate unconditionally.
+ (push arg seq)
+ t)
+ (t
+ (push arg new-args)
+ ;; If this arg is always true, throw away the remaining args.
+ (not (byte-compile-trueconstp arg))))))
+ (setq args (cdr args)))
+
+ (setq new-args (nreverse new-args))
+ ;; Keep original form unless the arguments changed.
+ (unless (equal new-args (cdr form))
+ (setq form (cons (car form) new-args)))
+
+ (pcase form
+ ;; (or (progn ... X) ...) -> (progn ... (or X ...))
+ (`(,head (progn . ,forms) . ,rest)
+ `(progn ,@(butlast forms) (,head ,(car (last forms)) . ,rest)))
+ (`(,_) nil) ; (or) -> nil
+ (`(,_ ,arg) arg) ; (or X) -> X
+ (_ (byte-optimize-constant-args form)))))
(defun byte-optimize-cond (form)
;; if any clauses have a literal nil as their test, throw them away.
@@ -1142,55 +1246,82 @@ See Info node `(elisp) Integer Basics'."
(and clauses form)))
form))
+(defsubst byte-opt--negate (form)
+ "Negate FORM, avoiding double negation if already negated."
+ (if (and (consp form) (memq (car form) '(not null)))
+ (cadr form)
+ `(not ,form)))
+
(defun byte-optimize-if (form)
- ;; (if (progn <insts> <test>) <rest>) ==> (progn <insts> (if <test> <rest>))
- ;; (if <true-constant> <then> <else...>) ==> <then>
- ;; (if <false-constant> <then> <else...>) ==> (progn <else...>)
- ;; (if <test> nil <else...>) ==> (if (not <test>) (progn <else...>))
- ;; (if <test> <then> nil) ==> (if <test> <then>)
- (let ((clause (nth 1 form)))
- (cond ((and (eq (car-safe clause) 'progn)
- (proper-list-p clause))
- (if (null (cddr clause))
- ;; A trivial `progn'.
- (byte-optimize-if `(,(car form) ,(cadr clause) ,@(nthcdr 2 form)))
- (nconc (butlast clause)
- (list
- (byte-optimize-if
- `(,(car form) ,(car (last clause)) ,@(nthcdr 2 form)))))))
- ((byte-compile-trueconstp clause)
- `(progn ,clause ,(nth 2 form)))
- ((byte-compile-nilconstp clause)
- `(progn ,clause ,@(nthcdr 3 form)))
- ((nth 2 form)
- (if (equal '(nil) (nthcdr 3 form))
- (list (car form) clause (nth 2 form))
- form))
- ((or (nth 3 form) (nthcdr 4 form))
- (list (car form)
- ;; Don't make a double negative;
- ;; instead, take away the one that is there.
- (if (and (consp clause) (memq (car clause) '(not null))
- (= (length clause) 2)) ; (not xxxx) or (not (xxxx))
- (nth 1 clause)
- (list 'not clause))
- (if (nthcdr 4 form)
- (cons 'progn (nthcdr 3 form))
- (nth 3 form))))
- (t
- (list 'progn clause nil)))))
+ (let ((condition (nth 1 form))
+ (then (nth 2 form))
+ (else (nthcdr 3 form)))
+ (cond
+ ;; (if (progn ... X) ...) -> (progn ... (if X ...))
+ ((eq (car-safe condition) 'progn)
+ (nconc (butlast condition)
+ (list
+ (byte-optimize-if
+ `(,(car form) ,(car (last condition)) ,@(nthcdr 2 form))))))
+ ;; (if TRUE THEN ...) -> (progn TRUE THEN)
+ ((byte-compile-trueconstp condition)
+ `(progn ,condition ,then))
+ ;; (if FALSE THEN ELSE...) -> (progn FALSE ELSE...)
+ ((byte-compile-nilconstp condition)
+ (if else
+ `(progn ,condition ,@else)
+ condition))
+ ;; (if X nil t) -> (not X)
+ ((and (eq then nil) (eq else '(t)))
+ `(not ,condition))
+ ;; (if X t [nil]) -> (not (not X))
+ ((and (eq then t) (or (null else) (eq else '(nil))))
+ `(not ,(byte-opt--negate condition)))
+ ;; (if VAR VAR X...) -> (or VAR (progn X...))
+ ((and (symbolp condition) (eq condition then))
+ `(or ,then ,(if (cdr else)
+ `(progn . ,else)
+ (car else))))
+ ;; (if X THEN nil) -> (if X THEN)
+ (then
+ (if (equal else '(nil))
+ (list (car form) condition then)
+ form))
+ ;; (if X nil ELSE...) -> (if (not X) (progn ELSE...))
+ ((or (car else) (cdr else))
+ (list (car form) (byte-opt--negate condition)
+ (if (cdr else)
+ `(progn . ,else)
+ (car else))))
+ ;; (if X nil nil) -> (progn X nil)
+ (t
+ (list 'progn condition nil)))))
(defun byte-optimize-while (form)
+ ;; FIXME: This check does not belong here, move!
(when (< (length form) 2)
(byte-compile-warn-x form "too few arguments for `while'"))
- (if (nth 1 form)
- form))
+ (let ((condition (nth 1 form)))
+ (if (byte-compile-nilconstp condition)
+ condition
+ form)))
+
+(defun byte-optimize-not (form)
+ (and (= (length form) 2)
+ (let ((arg (nth 1 form)))
+ (cond ((null arg) t)
+ ((macroexp-const-p arg) nil)
+ ((byte-compile-nilconstp arg) `(progn ,arg t))
+ ((byte-compile-trueconstp arg) `(progn ,arg nil))
+ (t form)))))
(put 'and 'byte-optimizer #'byte-optimize-and)
(put 'or 'byte-optimizer #'byte-optimize-or)
(put 'cond 'byte-optimizer #'byte-optimize-cond)
(put 'if 'byte-optimizer #'byte-optimize-if)
(put 'while 'byte-optimizer #'byte-optimize-while)
+(put 'not 'byte-optimizer #'byte-optimize-not)
+(put 'null 'byte-optimizer #'byte-optimize-not)
;; byte-compile-negation-optimizer lives in bytecomp.el
(put '/= 'byte-optimizer #'byte-compile-negation-optimizer)
@@ -1207,25 +1338,26 @@ See Info node `(elisp) Integer Basics'."
form)))
(defun byte-optimize-apply (form)
- ;; If the last arg is a literal constant, turn this into a funcall.
- ;; The funcall optimizer can then transform (funcall 'foo ...) -> (foo ...).
- (if (= (length form) 2)
- ;; single-argument `apply' is not worth optimizing (bug#40968)
- form
- (let ((fn (nth 1 form))
- (last (nth (1- (length form)) form))) ; I think this really is fastest
- (or (if (or (null last)
- (eq (car-safe last) 'quote))
- (if (listp (nth 1 last))
- (let ((butlast (nreverse (cdr (reverse (cdr (cdr form)))))))
- (nconc (list 'funcall fn) butlast
- (mapcar (lambda (x) (list 'quote x)) (nth 1 last))))
+ (let ((len (length form)))
+ (if (>= len 2)
+ (let ((fn (nth 1 form))
+ (last (nth (1- len) form)))
+ (cond
+ ;; (apply F ... '(X Y ...)) -> (funcall F ... 'X 'Y ...)
+ ((or (null last)
+ (eq (car-safe last) 'quote))
+ (let ((last-value (nth 1 last)))
+ (if (listp last-value)
+ `(funcall ,fn ,@(butlast (cddr form))
+ ,@(mapcar (lambda (x) (list 'quote x)) last-value))
(byte-compile-warn-x
- last
- "last arg to apply can't be a literal atom: `%s'"
- last)
- nil))
- form))))
+ last "last arg to apply can't be a literal atom: `%s'" last)
+ nil)))
+ ;; (apply F ... (list X Y ...)) -> (funcall F ... X Y ...)
+ ((eq (car-safe last) 'list)
+ `(funcall ,fn ,@(butlast (cddr form)) ,@(cdr last)))
+ (t form)))
+ form)))
(put 'funcall 'byte-optimizer #'byte-optimize-funcall)
(put 'apply 'byte-optimizer #'byte-optimize-apply)
@@ -1281,11 +1413,97 @@ See Info node `(elisp) Integer Basics'."
(put 'cons 'byte-optimizer #'byte-optimize-cons)
(defun byte-optimize-cons (form)
- ;; (cons X nil) => (list X)
- (if (and (= (safe-length form) 3)
- (null (nth 2 form)))
- `(list ,(nth 1 form))
- form))
+ (let ((tail (nth 2 form)))
+ (cond
+ ;; (cons X nil) => (list X)
+ ((null tail) `(list ,(nth 1 form)))
+ ;; (cons X (list YS...)) -> (list X YS...)
+ ((and (consp tail) (eq (car tail) 'list))
+ `(,(car tail) ,(nth 1 form) . ,(cdr tail)))
+ (t form))))
+
+(put 'list 'byte-optimizer #'byte-optimize-list)
+(defun byte-optimize-list (form)
+ ;; (list) -> nil
+ (and (cdr form) form))
+
+(put 'append 'byte-optimizer #'byte-optimize-append)
+(defun byte-optimize-append (form)
+ ;; There is (probably) too much code relying on `append' to return a
+ ;; new list for us to do full constant-folding; these transformations
+ ;; preserve the allocation semantics.
+ (and (cdr form) ; (append) -> nil
+ (named-let loop ((args (cdr form)) (newargs nil))
+ (let ((arg (car args))
+ (prev (car newargs)))
+ (cond
+ ;; Flatten nested `append' forms.
+ ((and (consp arg) (eq (car arg) 'append))
+ (loop (append (cdr arg) (cdr args)) newargs))
+
+ ;; Merge consecutive `list' forms.
+ ((and (consp arg) (eq (car arg) 'list)
+ newargs (consp prev) (eq (car prev) 'list))
+ (loop (cons (cons (car prev) (append (cdr prev) (cdr arg)))
+ (cdr args))
+ (cdr newargs)))
+
+ ;; non-terminal arg
+ ((cdr args)
+ (cond
+ ((macroexp-const-p arg)
+ ;; constant arg
+ (let ((val (eval arg)))
+ (cond
+ ;; Elide empty arguments (nil, empty string, etc).
+ ((zerop (length val))
+ (loop (cdr args) newargs))
+ ;; Merge consecutive constants.
+ ((and newargs (macroexp-const-p prev))
+ (loop (cdr args)
+ (cons
+ (list 'quote
+ (append (eval prev) val nil))
+ (cdr newargs))))
+ (t (loop (cdr args) (cons arg newargs))))))
+
+ ;; (list CONSTANTS...) -> '(CONSTANTS...)
+ ((and (consp arg) (eq (car arg) 'list)
+ (not (memq nil (mapcar #'macroexp-const-p (cdr arg)))))
+ (loop (cons (list 'quote (eval arg)) (cdr args)) newargs))
+
+ (t (loop (cdr args) (cons arg newargs)))))
+
+ ;; At this point, `arg' is the last (tail) argument.
+
+ ;; (append X) -> X
+ ((null newargs) arg)
+
+ ;; (append (list Xs...) nil) -> (list Xs...)
+ ((and (null arg)
+ newargs (null (cdr newargs))
+ (consp prev) (eq (car prev) 'list))
+ prev)
+
+ ;; (append '(X) Y) -> (cons 'X Y)
+ ;; (append (list X) Y) -> (cons X Y)
+ ((and newargs (null (cdr newargs))
+ (consp prev)
+ (cond ((eq (car prev) 'quote)
+ (and (consp (cadr prev))
+ (= (length (cadr prev)) 1)))
+ ((eq (car prev) 'list)
+ (= (length (cdr prev)) 1))))
+ (list 'cons (if (eq (car prev) 'quote)
+ (macroexp-quote (caadr prev))
+ (cadr prev))
+ arg))
+
+ (t
+ (let ((new-form (cons 'append (nreverse (cons arg newargs)))))
+ (if (equal new-form form)
+ form
+ new-form))))))))
;; Fixme: delete-char -> delete-region (byte-coded)
@@ -1365,15 +1583,14 @@ See Info node `(elisp) Integer Basics'."
radians-to-degrees rassq rassoc read-from-string regexp-opt
regexp-quote region-beginning region-end reverse round
sin sqrt string string< string= string-equal string-lessp
- string> string-greaterp string-empty-p
- string-prefix-p string-suffix-p string-blank-p
+ string> string-greaterp string-empty-p string-blank-p
string-search string-to-char
string-to-number string-to-syntax substring
sxhash sxhash-equal sxhash-eq sxhash-eql
symbol-function symbol-name symbol-plist symbol-value string-make-unibyte
string-make-multibyte string-as-multibyte string-as-unibyte
string-to-multibyte
- tan time-convert truncate
+ take tan time-convert truncate
unibyte-char-to-multibyte upcase user-full-name
user-login-name user-original-login-name custom-variable-p
vconcat
@@ -1386,7 +1603,7 @@ See Info node `(elisp) Integer Basics'."
window-next-buffers window-next-sibling window-new-normal
window-new-total window-normal-size window-parameter window-parameters
window-parent window-pixel-edges window-point window-prev-buffers
- window-prev-sibling window-redisplay-end-trigger window-scroll-bars
+ window-prev-sibling window-scroll-bars
window-start window-text-height window-top-child window-top-line
window-total-height window-total-width window-use-time window-vscroll
window-width zerop))
@@ -1414,7 +1631,7 @@ See Info node `(elisp) Integer Basics'."
natnump nlistp not null number-or-marker-p numberp
one-window-p overlayp
point point-marker point-min point-max preceding-char primary-charset
- processp
+ processp proper-list-p
recent-keys recursion-depth
safe-length selected-frame selected-window sequencep
standard-case-table standard-syntax-table stringp subrp symbolp
@@ -1459,7 +1676,7 @@ See Info node `(elisp) Integer Basics'."
floor ceiling round truncate
ffloor fceiling fround ftruncate
string= string-equal string< string-lessp string> string-greaterp
- string-empty-p string-blank-p string-prefix-p string-suffix-p
+ string-empty-p string-blank-p
string-search
consp atom listp nlistp proper-list-p
sequencep arrayp vectorp stringp bool-vector-p hash-table-p
@@ -1474,7 +1691,7 @@ See Info node `(elisp) Integer Basics'."
;; arguments. This is pure enough for the purposes of
;; constant folding, but not necessarily for all kinds of
;; code motion.
- car cdr car-safe cdr-safe nth nthcdr last
+ car cdr car-safe cdr-safe nth nthcdr last take
equal
length safe-length
memq memql member
@@ -1662,10 +1879,10 @@ See Info node `(elisp) Integer Basics'."
byte-goto-if-not-nil-else-pop))
(defconst byte-after-unbind-ops
- '(byte-constant byte-dup
+ '(byte-constant byte-dup byte-stack-ref byte-stack-set byte-discard
byte-symbolp byte-consp byte-stringp byte-listp byte-numberp byte-integerp
byte-eq byte-not
- byte-cons byte-list1 byte-list2 ; byte-list3 byte-list4
+ byte-cons byte-list1 byte-list2 byte-list3 byte-list4 byte-listN
byte-interactive-p)
;; How about other side-effect-free-ops? Is it safe to move an
;; error invocation (such as from nth) out of an unwind-protect?
@@ -1677,7 +1894,8 @@ See Info node `(elisp) Integer Basics'."
(defconst byte-compile-side-effect-and-error-free-ops
'(byte-constant byte-dup byte-symbolp byte-consp byte-stringp byte-listp
byte-integerp byte-numberp byte-eq byte-equal byte-not byte-car-safe
- byte-cdr-safe byte-cons byte-list1 byte-list2 byte-point byte-point-max
+ byte-cdr-safe byte-cons byte-list1 byte-list2 byte-list3 byte-list4
+ byte-listN byte-point byte-point-max
byte-point-min byte-following-char byte-preceding-char
byte-current-column byte-eolp byte-eobp byte-bolp byte-bobp
byte-current-buffer byte-stack-ref))
@@ -2028,13 +2246,15 @@ If FOR-EFFECT is non-nil, the return value is assumed to be of no importance."
(setcar (cdr rest) lap0)
(setq keep-going t))
;;
- ;; varbind-X unbind-N --> discard unbind-(N-1)
- ;; save-excursion unbind-N --> unbind-(N-1)
- ;; save-restriction unbind-N --> unbind-(N-1)
+ ;; varbind-X unbind-N --> discard unbind-(N-1)
+ ;; save-excursion unbind-N --> unbind-(N-1)
+ ;; save-restriction unbind-N --> unbind-(N-1)
+ ;; save-current-buffer unbind-N --> unbind-(N-1)
;;
((and (eq 'byte-unbind (car lap1))
(memq (car lap0) '(byte-varbind byte-save-excursion
- byte-save-restriction))
+ byte-save-restriction
+ byte-save-current-buffer))
(< 0 (cdr lap1)))
(if (zerop (setcdr lap1 (1- (cdr lap1))))
(delq lap1 rest))
@@ -2390,8 +2610,7 @@ If FOR-EFFECT is non-nil, the return value is assumed to be of no importance."
;; itself, compile some of its most used recursive functions (at load time).
;;
(eval-when-compile
- (or (byte-code-function-p (symbol-function 'byte-optimize-form))
- (subr-native-elisp-p (symbol-function 'byte-optimize-form))
+ (or (compiled-function-p (symbol-function 'byte-optimize-form))
(assq 'byte-code (symbol-function 'byte-optimize-form))
(let ((byte-optimize nil)
(byte-compile-warnings nil))
diff --git a/lisp/emacs-lisp/byte-run.el b/lisp/emacs-lisp/byte-run.el
index dd90bcf4d82..4a2860cd43d 100644
--- a/lisp/emacs-lisp/byte-run.el
+++ b/lisp/emacs-lisp/byte-run.el
@@ -236,6 +236,20 @@ The return value of this function is not used."
(list 'function-put (list 'quote f)
''command-modes (list 'quote val))))
+(defalias 'byte-run--set-interactive-args
+ #'(lambda (f args &rest val)
+ (setq args (remove '&optional (remove '&rest args)))
+ (list 'function-put (list 'quote f)
+ ''interactive-args
+ (list
+ 'quote
+ (mapcar
+ (lambda (elem)
+ (cons
+ (seq-position args (car elem))
+ (cadr elem)))
+ val)))))
+
;; Add any new entries to info node `(elisp)Declare Form'.
(defvar defun-declarations-alist
(list
@@ -255,7 +269,8 @@ If `error-free', drop calls even if `byte-compile-delete-errors' is nil.")
(list 'indent #'byte-run--set-indent)
(list 'speed #'byte-run--set-speed)
(list 'completion #'byte-run--set-completion)
- (list 'modes #'byte-run--set-modes))
+ (list 'modes #'byte-run--set-modes)
+ (list 'interactive-args #'byte-run--set-interactive-args))
"List associating function properties to their macro expansion.
Each element of the list takes the form (PROP FUN) where FUN is
a function. For each (PROP . VALUES) in a function's declaration,
@@ -672,7 +687,7 @@ types. The types that can be suppressed with this macro are
`suspicious'.
For the `mapcar' case, only the `mapcar' function can be used in
-the symbol list. For `suspicious', only `set-buffer' can be used."
+the symbol list. For `suspicious', only `set-buffer' and `lsh' can be used."
;; Note: during compilation, this definition is overridden by the one in
;; byte-compile-initial-macro-environment.
(declare (debug (sexp body)) (indent 1))
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 86681cf4dd4..907015eb48e 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -846,6 +846,8 @@ the unwind-action")
(byte-defop 178 -1 byte-stack-set) ; Stack offset in following one byte.
(byte-defop 179 -1 byte-stack-set2) ; Stack offset in following two bytes.
+;; unused: 180-181
+
;; If (following one byte & 0x80) == 0
;; discard (following one byte & 0x7F) stack entries
;; else
@@ -1393,7 +1395,7 @@ when printing the error message."
(or (symbolp (symbol-function fn))
(consp (symbol-function fn))
(and (not macro-p)
- (byte-code-function-p (symbol-function fn)))))
+ (compiled-function-p (symbol-function fn)))))
(setq fn (symbol-function fn)))
(let ((advertised (gethash (if (and (symbolp fn) (fboundp fn))
;; Could be a subr.
@@ -1405,7 +1407,7 @@ when printing the error message."
(if macro-p
`(macro lambda ,advertised)
`(lambda ,advertised)))
- ((and (not macro-p) (byte-code-function-p fn)) fn)
+ ((and (not macro-p) (compiled-function-p fn)) fn)
((not (consp fn)) nil)
((eq 'macro (car fn)) (cdr fn))
(macro-p nil)
@@ -1758,7 +1760,7 @@ It is too wide if it has any lines longer than the largest of
kind name col))
;; There's a "naked" ' character before a symbol/list, so it
;; should probably be quoted with \=.
- (when (string-match-p "\\( \"\\|[ \t]\\|^\\)'[a-z(]" docs)
+ (when (string-match-p "\\( [\"#]\\|[ \t]\\|^\\)'[a-z(]" docs)
(byte-compile-warn-x
name "%s%sdocstring has wrong usage of unescaped single quotes (use \\= or different quoting)"
kind name))
@@ -2077,7 +2079,6 @@ value is `no-byte-compile'.
See also `emacs-lisp-byte-compile-and-load'."
(declare (advertised-calling-convention (filename) "28.1"))
-;; (interactive "fByte compile file: \nP")
(interactive
(let ((file buffer-file-name)
(file-dir nil))
@@ -2403,8 +2404,8 @@ Call from the source buffer."
(defun byte-compile-output-file-form (form)
;; Write the given form to the output buffer, being careful of docstrings
- ;; in defvar, defvaralias, defconst, autoload and
- ;; custom-declare-variable because make-docfile is so amazingly stupid.
+ ;; (for `byte-compile-dynamic-docstrings') in defvar, defvaralias,
+ ;; defconst, autoload, and custom-declare-variable.
;; defalias calls are output directly by byte-compile-file-form-defmumble;
;; it does not pay to first build the defalias in defmumble and then parse
;; it here.
@@ -2450,21 +2451,9 @@ list that represents a doc string reference.
(let (position
(print-symbols-bare t)) ; Possibly redundant binding.
;; Insert the doc string, and make it a comment with #@LENGTH.
- (and (>= (nth 1 info) 0)
- dynamic-docstrings
- (progn
- ;; Make the doc string start at beginning of line
- ;; for make-docfile's sake.
- (insert "\n")
- (setq position
- (byte-compile-output-as-comment
- (nth (nth 1 info) form) nil))
- ;; If the doc string starts with * (a user variable),
- ;; negate POSITION.
- (if (and (stringp (nth (nth 1 info) form))
- (> (length (nth (nth 1 info) form)) 0)
- (eq (aref (nth (nth 1 info) form) 0) ?*))
- (setq position (- position)))))
+ (when (and (>= (nth 1 info) 0) dynamic-docstrings)
+ (setq position (byte-compile-output-as-comment
+ (nth (nth 1 info) form) nil)))
(let ((print-continuous-numbering t)
print-number-table
@@ -2591,8 +2580,8 @@ list that represents a doc string reference.
(t
(byte-compile-keep-pending form)))))
-;; Functions and variables with doc strings must be output separately,
-;; so make-docfile can recognize them. Most other things can be output
+;; Functions and variables with doc strings must be output specially,
+;; for `byte-compile-dynamic-docstrings'. Most other things can be output
;; as byte-code.
(put 'autoload 'byte-hunk-handler 'byte-compile-file-form-autoload)
@@ -2957,11 +2946,11 @@ If FORM is a lambda or a macro, byte-compile it as a function."
(setq fun (cdr fun)))
(prog1
(cond
- ;; Up until Emacs-24.1, byte-compile silently did nothing when asked to
- ;; compile something invalid. So let's tune down the complaint from an
- ;; error to a simple message for the known case where signaling an error
- ;; causes problems.
- ((byte-code-function-p fun)
+ ;; Up until Emacs-24.1, byte-compile silently did nothing
+ ;; when asked to compile something invalid. So let's tone
+ ;; down the complaint from an error to a simple message for
+ ;; the known case where signaling an error causes problems.
+ ((compiled-function-p fun)
(message "Function %s is already compiled"
(if (symbolp form) form "provided"))
fun)
@@ -3538,7 +3527,7 @@ lambda-expression."
(byte-compile-out-tag endtag)))
(defun byte-compile-unfold-bcf (form)
- "Inline call to byte-code-functions."
+ "Inline call to byte-code function."
(let* ((byte-compile-bound-variables byte-compile-bound-variables)
(fun (car form))
(fargs (aref fun 0))
@@ -3759,7 +3748,6 @@ If it is nil, then the handler is \"byte-compile-SYMBOL.\""
(put 'byte-insertN 'byte-opcode-invert 'insert)
(byte-defop-compiler point 0)
-;;(byte-defop-compiler mark 0) ;; obsolete
(byte-defop-compiler point-max 0)
(byte-defop-compiler point-min 0)
(byte-defop-compiler following-char 0)
@@ -3770,8 +3758,6 @@ If it is nil, then the handler is \"byte-compile-SYMBOL.\""
(byte-defop-compiler bolp 0)
(byte-defop-compiler bobp 0)
(byte-defop-compiler current-buffer 0)
-;;(byte-defop-compiler read-char 0) ;; obsolete
-;; (byte-defop-compiler interactive-p 0) ;; Obsolete.
(byte-defop-compiler widen 0)
(byte-defop-compiler end-of-line 0-1)
(byte-defop-compiler forward-char 0-1)
@@ -3792,7 +3778,6 @@ If it is nil, then the handler is \"byte-compile-SYMBOL.\""
(byte-defop-compiler goto-char 1)
(byte-defop-compiler char-after 0-1)
(byte-defop-compiler set-buffer 1)
-;;(byte-defop-compiler set-mark 1) ;; obsolete
(byte-defop-compiler forward-word 0-1)
(byte-defop-compiler char-syntax 1)
(byte-defop-compiler nreverse 1)
@@ -3845,7 +3830,6 @@ If it is nil, then the handler is \"byte-compile-SYMBOL.\""
(byte-defop-compiler (+ byte-plus) byte-compile-variadic-numeric)
(byte-defop-compiler (* byte-mult) byte-compile-variadic-numeric)
-;;####(byte-defop-compiler move-to-column 1)
(byte-defop-compiler-1 interactive byte-compile-noop)
@@ -4800,8 +4784,6 @@ binding slots have been popped."
(byte-defop-compiler-1 save-excursion)
(byte-defop-compiler-1 save-current-buffer)
(byte-defop-compiler-1 save-restriction)
-;; (byte-defop-compiler-1 save-window-excursion) ;Obsolete: now a macro.
-;; (byte-defop-compiler-1 with-output-to-temp-buffer) ;Obsolete: now a macro.
(defun byte-compile-catch (form)
(byte-compile-form (car (cdr form)))
@@ -4998,7 +4980,7 @@ binding slots have been popped."
;;
;; FIXME: we also use this hunk-handler to implement the function's
;; dynamic docstring feature (via byte-compile-file-form-defmumble).
- ;; We should actually implement it (more elegantly) in
+ ;; We should probably actually implement it (more elegantly) in
;; byte-compile-lambda so it applies to all lambdas. We did it here
;; so the resulting .elc format was recognizable by make-docfile,
;; but since then we stopped using DOC for the docstrings of
@@ -5272,11 +5254,13 @@ invoked interactively."
((not (consp f))
"<malformed function>")
((eq 'macro (car f))
- (if (or (byte-code-function-p (cdr f))
+ (if (or (compiled-function-p (cdr f))
+ ;; FIXME: Can this still happen?
(assq 'byte-code (cdr (cdr (cdr f)))))
" <compiled macro>"
" <macro>"))
((assq 'byte-code (cdr (cdr f)))
+ ;; FIXME: Can this still happen?
"<compiled lambda>")
((eq 'lambda (car f))
"<function>")
@@ -5525,9 +5509,7 @@ and corresponding effects."
;; itself, compile some of its most used recursive functions (at load time).
;;
(eval-when-compile
- (or (byte-code-function-p (symbol-function 'byte-compile-form))
- (subr-native-elisp-p (symbol-function 'byte-compile-form))
- (assq 'byte-code (symbol-function 'byte-compile-form))
+ (or (compiled-function-p (symbol-function 'byte-compile-form))
(let ((byte-optimize nil) ; do it fast
(byte-compile-warnings nil))
(mapc (lambda (x)
diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index 716b236d3ab..ac6cbb53a56 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -63,7 +63,7 @@
(eval-when-compile (require 'cl-generic))
;;; Code:
-(defvar chart-mode-map (make-sparse-keymap) "Keymap used in chart mode.")
+(defvar-keymap chart-mode-map :doc "Keymap used in chart mode.")
(defvar-local chart-local-object nil
"Local variable containing the locally displayed chart object.")
diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el
index 611f32e23c6..04ead562f2f 100644
--- a/lisp/emacs-lisp/checkdoc.el
+++ b/lisp/emacs-lisp/checkdoc.el
@@ -1,6 +1,6 @@
;;; checkdoc.el --- check documentation strings for style requirements -*- lexical-binding:t -*-
-;; Copyright (C) 1997-1998, 2001-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1997-2022 Free Software Foundation, Inc.
;; Author: Eric M. Ludlam <zappo@gnu.org>
;; Old-Version: 0.6.2
@@ -248,7 +248,7 @@ with these words enabled."
;;;###autoload(put 'checkdoc-spellcheck-documentation-flag 'safe-local-variable #'booleanp)
(defvar checkdoc-ispell-lisp-words
- '("alist" "emacs" "etags" "keymap" "paren" "regexp" "sexp" "xemacs")
+ '("alist" "emacs" "etags" "keymap" "paren" "regexp" "sexp")
"List of words that are correct when spell-checking Lisp documentation.")
;;;###autoload(put 'checkdoc-ispell-list-words 'safe-local-variable #'checkdoc-list-of-strings-p)
@@ -1357,23 +1357,6 @@ checking of documentation strings.
checkdoc-common-verbs-wrong-voice "\\|")
"\\)\\>"))))
-;; Profiler says this is not yet faster than just calling assoc
-;;(defun checkdoc-word-in-alist-vector (word vector)
-;; "Check to see if WORD is in the car of an element of VECTOR.
-;;VECTOR must be sorted. The CDR should be a replacement. Since the
-;;word list is getting bigger, it is time for a quick bisecting search."
-;; (let ((max (length vector)) (min 0) i
-;; (found nil) (fw nil))
-;; (setq i (/ max 2))
-;; (while (and (not found) (/= min max))
-;; (setq fw (car (aref vector i)))
-;; (cond ((string= word fw) (setq found (cdr (aref vector i))))
-;; ((string< word fw) (setq max i))
-;; (t (setq min i)))
-;; (setq i (/ (+ max min) 2))
-;; )
-;; found))
-
;;; Checking engines
;;
(defun checkdoc-this-string-valid (&optional take-notes)
@@ -2360,8 +2343,6 @@ News agents may remove it"
;;; Comment checking engine
;;
-(defvar generate-autoload-cookie)
-
(defun checkdoc-file-comments-engine ()
"Return a message list if this file does not match the Emacs standard.
This checks for style only, such as the first line, Commentary:,
@@ -2862,8 +2843,6 @@ function called to create the messages."
(custom-add-option 'emacs-lisp-mode-hook 'checkdoc-minor-mode)
-;; Obsolete
-
(define-obsolete-function-alias 'checkdoc-run-hooks
#'run-hook-with-args-until-success "28.1")
(defvar checkdoc-version "0.6.2"
diff --git a/lisp/emacs-lisp/cl-extra.el b/lisp/emacs-lisp/cl-extra.el
index 8e38df43c87..607810ee141 100644
--- a/lisp/emacs-lisp/cl-extra.el
+++ b/lisp/emacs-lisp/cl-extra.el
@@ -71,8 +71,7 @@ numbers of different types (float vs. integer), and also compares
strings case-insensitively."
(cond ((eq x y) t)
((stringp x)
- (and (stringp y) (= (length x) (length y))
- (eq (compare-strings x nil nil y nil nil t) t)))
+ (and (stringp y) (string-equal-ignore-case x y)))
((numberp x)
(and (numberp y) (= x y)))
((consp x)
diff --git a/lisp/emacs-lisp/cl-lib.el b/lisp/emacs-lisp/cl-lib.el
index 3f40ab07605..a54fa21fa96 100644
--- a/lisp/emacs-lisp/cl-lib.el
+++ b/lisp/emacs-lisp/cl-lib.el
@@ -372,8 +372,8 @@ SEQ, this is like `mapcar'. With several, it is like the Common Lisp
(cl--defalias 'cl-second 'cadr)
(cl--defalias 'cl-rest 'cdr)
-(cl--defalias 'cl-third 'cl-caddr "Return the third element of the list X.")
-(cl--defalias 'cl-fourth 'cl-cadddr "Return the fourth element of the list X.")
+(cl--defalias 'cl-third #'caddr "Return the third element of the list X.")
+(cl--defalias 'cl-fourth #'cadddr "Return the fourth element of the list X.")
(defsubst cl-fifth (x)
"Return the fifth element of the list X."
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index 6646167b92b..80ca43c902a 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -527,7 +527,7 @@ its argument list allows full Common Lisp conventions."
(while (and (eq (car args) '&aux) (pop args))
(while (and args (not (memq (car args) cl--lambda-list-keywords)))
(if (consp (car args))
- (if (and cl--bind-enquote (cl-cadar args))
+ (if (and cl--bind-enquote (cadar args))
(cl--do-arglist (caar args)
`',(cadr (pop args)))
(cl--do-arglist (caar args) (cadr (pop args))))
@@ -612,7 +612,7 @@ its argument list allows full Common Lisp conventions."
(if (eq ?_ (aref name 0))
(setq name (substring name 1)))
(intern (format ":%s" name)))))
- (varg (if (consp (car arg)) (cl-cadar arg) (car arg)))
+ (varg (if (consp (car arg)) (cadar arg) (car arg)))
(def (if (cdr arg) (cadr arg)
;; The ordering between those two or clauses is
;; irrelevant, since in practice only one of the two
@@ -1339,7 +1339,7 @@ For more details, see Info node `(cl)Loop Facility'.
(temp-idx
(if (eq (car cl--loop-args) 'using)
(if (and (= (length (cadr cl--loop-args)) 2)
- (eq (cl-caadr cl--loop-args) 'index))
+ (eq (caadr cl--loop-args) 'index))
(cadr (cl--pop2 cl--loop-args))
(error "Bad `using' clause"))
(make-symbol "--cl-idx--"))))
@@ -1370,8 +1370,8 @@ For more details, see Info node `(cl)Loop Facility'.
(other
(if (eq (car cl--loop-args) 'using)
(if (and (= (length (cadr cl--loop-args)) 2)
- (memq (cl-caadr cl--loop-args) hash-types)
- (not (eq (cl-caadr cl--loop-args) word)))
+ (memq (caadr cl--loop-args) hash-types)
+ (not (eq (caadr cl--loop-args) word)))
(cadr (cl--pop2 cl--loop-args))
(error "Bad `using' clause"))
(make-symbol "--cl-var--"))))
@@ -1433,8 +1433,8 @@ For more details, see Info node `(cl)Loop Facility'.
(other
(if (eq (car cl--loop-args) 'using)
(if (and (= (length (cadr cl--loop-args)) 2)
- (memq (cl-caadr cl--loop-args) key-types)
- (not (eq (cl-caadr cl--loop-args) word)))
+ (memq (caadr cl--loop-args) key-types)
+ (not (eq (caadr cl--loop-args) word)))
(cadr (cl--pop2 cl--loop-args))
(error "Bad `using' clause"))
(make-symbol "--cl-var--"))))
@@ -1656,7 +1656,7 @@ If BODY is `setq', then use SPECS for assignments rather than for bindings."
(let ((temps nil) (new nil))
(when par
(let ((p specs))
- (while (and p (or (symbolp (car-safe (car p))) (null (cl-cadar p))))
+ (while (and p (or (symbolp (car-safe (car p))) (null (cadar p))))
(setq p (cdr p)))
(when p
(setq par nil)
@@ -1731,7 +1731,7 @@ such that COMBO is equivalent to (and . CLAUSES)."
(setq clauses (cons (nconc (butlast (car clauses))
(if (eq (car-safe (cadr clauses))
'progn)
- (cl-cdadr clauses)
+ (cdadr clauses)
(list (cadr clauses))))
(cddr clauses)))
;; A final (progn ,@A t) is moved outside of the `and'.
@@ -2559,12 +2559,13 @@ values. For compatibility, (cl-values A B C) is a synonym for (list A B C).
(push x macro-declarations-alist)
(push x defun-declarations-alist)))
+;;;###cl-autoload
(defun cl--optimize (f _args &rest qualities)
"Serve `cl-optimize' in function declarations.
Example:
-(defun foo (x)
- (declare (cl-optimize (speed 3) (safety 0)))
- x)"
+ (defun foo (x)
+ (declare (cl-optimize (speed 3) (safety 0)))
+ x)"
;; FIXME this should make use of `cl--declare-stack' but I suspect
;; this mechanism should be reviewed first.
(cl-loop for (qly val) in qualities
@@ -2612,7 +2613,7 @@ Example:
((and (eq (car-safe spec) 'warn) (boundp 'byte-compile-warnings))
(while (setq spec (cdr spec))
(if (consp (car spec))
- (if (eq (cl-cadar spec) 0)
+ (if (eq (cadar spec) 0)
(byte-compile-disable-warning (caar spec))
(byte-compile-enable-warning (caar spec)))))))
nil)
@@ -3092,9 +3093,9 @@ To see the documentation for a defined struct type, use
(t `(and (consp cl-x)
(memq (nth ,pos cl-x) ,tag-symbol))))))
pred-check (and pred-form (> safety 0)
- (if (and (eq (cl-caadr pred-form) 'vectorp)
+ (if (and (eq (caadr pred-form) 'vectorp)
(= safety 1))
- (cons 'and (cl-cdddr pred-form))
+ (cons 'and (cdddr pred-form))
`(,predicate cl-x))))
(when pred-form
(push `(,defsym ,predicate (cl-x)
@@ -3335,6 +3336,7 @@ the form NAME which is a shorthand for (NAME NAME)."
:around #'cl--pcase-mutually-exclusive-p))
+;;;###cl-autoload
(defun cl-struct-sequence-type (struct-type)
"Return the sequence used to build STRUCT-TYPE.
STRUCT-TYPE is a symbol naming a struct type. Return values are
@@ -3374,6 +3376,7 @@ slots skipped by :initial-offset may appear in the list."
(define-error 'cl-struct-unknown-slot "struct has no slot")
+;;;###cl-autoload
(defun cl-struct-slot-offset (struct-type slot-name)
"Return the offset of slot SLOT-NAME in STRUCT-TYPE.
The returned zero-based slot index is relative to the start of
@@ -3408,7 +3411,7 @@ Of course, we really can't know that for sure, so it's just a heuristic."
(character . natnump)
(char-table . char-table-p)
(command . commandp)
- (compiled-function . byte-code-function-p)
+ (compiled-function . compiled-function-p)
(hash-table . hash-table-p)
(cons . consp)
(fixnum . fixnump)
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 9a635a47763..5ee10fcbca2 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -4293,6 +4293,8 @@ of (commands) to run simultaneously."
(defun native-compile-prune-cache ()
"Remove .eln files that aren't applicable to the current Emacs invocation."
(interactive)
+ (unless (featurep 'native-compile)
+ (user-error "This Emacs isn't built with native-compile support"))
(dolist (dir native-comp-eln-load-path)
;; If a directory is non absolute it is assumed to be relative to
;; `invocation-directory'.
diff --git a/lisp/emacs-lisp/derived.el b/lisp/emacs-lisp/derived.el
index 8912eb10cc5..260fc3bf470 100644
--- a/lisp/emacs-lisp/derived.el
+++ b/lisp/emacs-lisp/derived.el
@@ -1,10 +1,9 @@
;;; derived.el --- allow inheritance of major modes -*- lexical-binding: t; -*-
;; (formerly mode-clone.el)
-;; Copyright (C) 1993-1994, 1999, 2001-2022 Free Software Foundation,
-;; Inc.
+;; Copyright (C) 1993-2022 Free Software Foundation, Inc.
-;; Author: David Megginson (dmeggins@aix1.uottawa.ca)
+;; Author: David Megginson <dmeggins@aix1.uottawa.ca>
;; Maintainer: emacs-devel@gnu.org
;; Keywords: extensions
;; Package: emacs
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 1a1d58d6e36..dff16df0029 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -864,7 +864,7 @@ marker. The needed data will then come from property
(defun edebug-read-special (stream)
"Read from STREAM a Lisp object beginning with #.
-Turn #'thing into (function thing) and handle the read syntax for
+Turn #\\='thing into (function thing) and handle the read syntax for
circular objects. Let `read' read everything else."
(catch 'return
(forward-char 1)
diff --git a/lisp/emacs-lisp/eieio-base.el b/lisp/emacs-lisp/eieio-base.el
index 4c702deaa95..ef02216411d 100644
--- a/lisp/emacs-lisp/eieio-base.el
+++ b/lisp/emacs-lisp/eieio-base.el
@@ -281,32 +281,26 @@ being pedantic."
(unless class
(warn "`eieio-persistent-read' called without specifying a class"))
(when class (cl-check-type class class))
- (let ((ret nil)
- (buffstr nil))
- (unwind-protect
- (progn
- (with-current-buffer (get-buffer-create " *tmp eieio read*")
- (insert-file-contents filename nil nil nil t)
- (goto-char (point-min))
- (setq buffstr (buffer-string)))
- ;; Do the read in the buffer the read was initialized from
- ;; so that any initialize-instance calls that depend on
- ;; the current buffer will work.
- (setq ret (read buffstr))
- (when (not (child-of-class-p (car ret) 'eieio-persistent))
- (error
- "Invalid object: %s is not a subclass of `eieio-persistent'"
- (car ret)))
- (when (and class
- (not (or (eq (car ret) class) ; same class
- (and allow-subclass ; subclass
- (child-of-class-p (car ret) class)))))
- (error
- "Invalid object: %s is not an object of class %s nor a subclass"
- (car ret) class))
- (setq ret (eieio-persistent-make-instance (car ret) (cdr ret)))
- (oset ret file filename))
- (kill-buffer " *tmp eieio read*"))
+ (let* ((buffstr (with-temp-buffer
+ (insert-file-contents filename)
+ (buffer-string)))
+ ;; Do the read in the buffer the read was initialized from
+ ;; so that any initialize-instance calls that depend on
+ ;; the current buffer will work.
+ (ret (read buffstr)))
+ (when (not (child-of-class-p (car ret) 'eieio-persistent))
+ (error
+ "Invalid object: %s is not a subclass of `eieio-persistent'"
+ (car ret)))
+ (when (and class
+ (not (or (eq (car ret) class) ; same class
+ (and allow-subclass ; subclass
+ (child-of-class-p (car ret) class)))))
+ (error
+ "Invalid object: %s is not an object of class %s nor a subclass"
+ (car ret) class))
+ (setq ret (eieio-persistent-make-instance (car ret) (cdr ret)))
+ (oset ret file filename)
ret))
(cl-defgeneric eieio-persistent-make-instance (objclass inputlist)
diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el
index 565eaf2d733..984166b593a 100644
--- a/lisp/emacs-lisp/eieio.el
+++ b/lisp/emacs-lisp/eieio.el
@@ -689,6 +689,7 @@ This class is not stored in the `parent' slot of a class vector."
(define-obsolete-function-alias 'standard-class
#'eieio-default-superclass "26.1")
+;;;###autoload
(cl-defgeneric make-instance (class &rest initargs)
"Make a new instance of CLASS based on INITARGS.
For example:
diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el
index b08a268c90f..6fd89a690dc 100644
--- a/lisp/emacs-lisp/eldoc.el
+++ b/lisp/emacs-lisp/eldoc.el
@@ -5,7 +5,7 @@
;; Author: Noah Friedman <friedman@splode.com>
;; Keywords: extensions
;; Created: 1995-10-06
-;; Version: 1.12.0
+;; Version: 1.13.0
;; Package-Requires: ((emacs "26.3"))
;; This is a GNU ELPA :core package. Avoid functionality that is not
@@ -381,7 +381,6 @@ Also store it in `eldoc-last-message' and return that value."
(defun eldoc-display-message-no-interference-p ()
"Return nil if displaying a message would cause interference."
(not (or executing-kbd-macro
- (bound-and-true-p edebug-active)
;; The following configuration shows "Matches..." in the
;; echo area when point is after a closing bracket, which
;; conflicts with eldoc.
@@ -491,9 +490,9 @@ If INTERACTIVE, display it. Else, return said buffer."
(setq-local eldoc--doc-buffer-docs docs)
(let ((inhibit-read-only t)
(things-reported-on))
- (erase-buffer) (setq buffer-read-only t)
+ (special-mode)
+ (erase-buffer)
(setq-local nobreak-char-display nil)
- (local-set-key "q" 'quit-window)
(cl-loop for (docs . rest) on docs
for (this-doc . plist) = docs
for thing = (plist-get plist :thing)
@@ -551,12 +550,13 @@ Helper for `eldoc-display-in-echo-area'."
(defun eldoc--echo-area-prefer-doc-buffer-p (truncatedp)
"Tell if display in the echo area should be skipped.
Helper for `eldoc-display-in-echo-area'. If TRUNCATEDP the
-documentation to potentially appear in the echo are is truncated."
+documentation to potentially appear in the echo area is
+known to be truncated."
(and (or (eq eldoc-echo-area-prefer-doc-buffer t)
(and truncatedp
(eq eldoc-echo-area-prefer-doc-buffer
'maybe)))
- (get-buffer-window eldoc--doc-buffer 'visible)))
+ (get-buffer-window eldoc--doc-buffer t)))
(defun eldoc-display-in-echo-area (docs _interactive)
"Display DOCS in echo area.
@@ -629,8 +629,7 @@ Honor `eldoc-echo-area-use-multiline-p' and
"Display DOCS in a dedicated buffer.
If INTERACTIVE is t, also display the buffer."
(eldoc--format-doc-buffer docs)
- (when interactive
- (eldoc-doc-buffer)))
+ (when interactive (eldoc-doc-buffer t)))
(defun eldoc-documentation-default ()
"Show first doc string for item at point.
diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el
index 49b54c2d00f..047b0069bb9 100644
--- a/lisp/emacs-lisp/ert.el
+++ b/lisp/emacs-lisp/ert.el
@@ -1692,7 +1692,7 @@ test packages depend on each other, it might be helpful.")
(string-match-p "^Running 0 tests" logfile-contents))
(insert (format " <testsuite id=\"%s\" name=\"%s\" tests=\"1\" errors=\"1\" failures=\"0\" skipped=\"0\" time=\"0\" timestamp=\"%s\">\n"
id test-report
- (ert--format-time-iso8601 (current-time))))
+ (ert--format-time-iso8601 nil)))
(insert (format " <testcase name=\"Test report missing %s\" status=\"error\" time=\"0\">\n"
(file-name-nondirectory test-report)))
(insert (format " <error message=\"Test report missing %s\" type=\"error\">\n"
@@ -1813,8 +1813,7 @@ Ran \\([0-9]+\\) tests, \\([0-9]+\\) results as expected\
(unless (or (null tests) (zerop high))
(message "\nLONG-RUNNING TESTS")
(message "------------------")
- (setq tests (sort tests (lambda (x y) (> (car x) (car y)))))
- (when (< high (length tests)) (setcdr (nthcdr (1- high) tests) nil))
+ (setq tests (ntake high (sort tests (lambda (x y) (> (car x) (car y))))))
(message "%s" (mapconcat #'cdr tests "\n")))
;; More details on hydra and emba, where the logs are harder to get to.
(when (and (or (getenv "EMACS_HYDRA_CI") (getenv "EMACS_EMBA_CI"))
diff --git a/lisp/emacs-lisp/helper.el b/lisp/emacs-lisp/helper.el
index 654dbbc5fef..10bb2973253 100644
--- a/lisp/emacs-lisp/helper.el
+++ b/lisp/emacs-lisp/helper.el
@@ -131,7 +131,6 @@
(defun Helper-describe-bindings ()
"Describe local key bindings of current mode."
(interactive)
- (message "Making binding list...")
(save-window-excursion (describe-bindings))
(Helper-help-scroller))
diff --git a/lisp/emacs-lisp/icons.el b/lisp/emacs-lisp/icons.el
new file mode 100644
index 00000000000..277b285c2ef
--- /dev/null
+++ b/lisp/emacs-lisp/icons.el
@@ -0,0 +1,265 @@
+;;; icons.el --- Handling icons -*- lexical-binding:t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author: Lars Ingebrigtsen <larsi@gnus.org>
+;; Keywords: icons buttons
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'cl-lib)
+
+(defface icon
+ '((t :underline nil))
+ "Face for buttons."
+ :version "29.1"
+ :group 'customize)
+
+(defface icon-button
+ '((((type x w32 ns haiku pgtk) (class color))
+ :inherit icon
+ :box (:line-width (3 . -1) :color "#404040" :style flat-button)
+ :background "#808080"
+ :foreground "black"))
+ "Face for buttons."
+ :version "29.1"
+ :group 'customize)
+
+(defcustom icon-preference '(image emoji symbol text)
+ "List of icon types to use, in order of preference.
+Emacs will choose the icon of the highest preference possible
+on the current display, and \"degrade\" gracefully to an icon
+type that's available."
+ :version "29.1"
+ :group 'customize
+ :type '(repeat (choice (const :tag "Images" image)
+ (const :tag "Colorful Emojis" emoji)
+ (const :tag "Monochrome Symbols" symbol)
+ (const :tag "Text Only" text))))
+
+(defmacro define-icon (name parent specification documentation &rest keywords)
+ "Define an icon identified by NAME.
+If non-nil, inherit the specification from PARENT. Entries from
+SPECIFICATION will override inherited specifications.
+
+SPECIFICATION is an alist of entries where the first element is
+the type, and the rest are icons of that type. Valid types are
+`image', `emoji', `symbol' and `text'.
+
+KEYWORDS specify additional information. Valid keywords are:
+
+`:version': The first Emacs version to include this icon; this is
+mandatory.
+
+`:group': The customization group the icon belongs in; this is
+inferred if not present.
+
+`:help-echo': Informational text that explains what happens if
+the icon is used as a button and you click it."
+ (declare (indent 2))
+ (unless (symbolp name)
+ (error "NAME must be a symbol: %S" name))
+ (unless (plist-get keywords :version)
+ (error "There must be a :version keyword in `define-icon'"))
+ `(icons--register ',name ',parent ,specification ,documentation
+ ',keywords))
+
+(defun icons--register (name parent spec doc keywords)
+ (put name 'icon--properties (list parent spec doc keywords))
+ (custom-add-to-group
+ (or (plist-get keywords :group)
+ (custom-current-group))
+ name 'custom-icon))
+
+(defun icon-spec-keywords (spec)
+ (seq-drop-while (lambda (e) (not (keywordp e))) (cdr spec)))
+
+(defun icon-spec-values (spec)
+ (seq-take-while (lambda (e) (not (keywordp e))) (cdr spec)))
+
+(defun iconp (object)
+ "Return nil if OBJECT is not an icon.
+If OBJECT is an icon, return the icon properties."
+ (get object 'icon--properties))
+
+(defun icon-documentation (icon)
+ "Return the documentation for ICON."
+ (let ((props (iconp icon)))
+ (unless props
+ (user-error "%s is not a valid icon" icon))
+ (nth 2 props)))
+
+(defun icons--spec (icon)
+ (nth 1 (iconp icon)))
+
+(defun icons--copy-spec (spec)
+ (mapcar #'copy-sequence spec))
+
+(defun icon-complete-spec (icon &optional inhibit-theme inhibit-inheritance)
+ "Return the merged spec for ICON."
+ (pcase-let ((`(,parent ,spec _ _) (iconp icon)))
+ ;; We destructively modify `spec' when merging, so copy it.
+ (setq spec (icons--copy-spec spec))
+ ;; Let the Customize theme override.
+ (unless inhibit-theme
+ (when-let ((theme-spec (cadr (car (get icon 'theme-icon)))))
+ (setq spec (icons--merge-spec (icons--copy-spec theme-spec) spec))))
+ ;; Inherit from the parent spec (recursively).
+ (unless inhibit-inheritance
+ (while parent
+ (let ((parent-props (get parent 'icon--properties)))
+ (when parent-props
+ (setq spec (icons--merge-spec spec (cadr parent-props))))
+ (setq parent (car parent-props)))))
+ spec))
+
+(defun icon-string (name)
+ "Return a string suitable for display in the current buffer for icon NAME."
+ (let ((props (iconp name)))
+ (unless props
+ (user-error "%s is not a valid icon" name))
+ (pcase-let ((`(_ ,spec _ ,keywords) props))
+ (setq spec (icon-complete-spec name))
+ ;; We now have a full spec, so check the intersection of what
+ ;; the user wants and what this Emacs is capable of showing.
+ (let ((icon-string
+ (catch 'found
+ (dolist (type icon-preference)
+ (let* ((type-spec (assq type spec))
+ ;; Find the keywords at the end of the section
+ ;; (if any).
+ (type-keywords (icon-spec-keywords type-spec)))
+ ;; Go through all the variations in this section
+ ;; and return the first one we can display.
+ (dolist (icon (icon-spec-values type-spec))
+ (when-let ((result
+ (icons--create type icon type-keywords)))
+ (throw 'found
+ (if-let ((face (plist-get type-keywords :face)))
+ (propertize result 'face face)
+ result)))))))))
+ (unless icon-string
+ (error "Couldn't find any way to display the %s icon" name))
+ (when-let ((help (plist-get keywords :help-echo)))
+ (setq icon-string (propertize icon-string 'help-echo help)))
+ (propertize icon-string 'rear-nonsticky t)))))
+
+(defun icon-elements (name)
+ "Return the elements of icon NAME.
+The elements are represented as a plist where the keys are
+`string', `face' and `display'. The `image' element is only
+present if the icon is represented by an image."
+ (let ((string (icon-string name)))
+ (list 'face (get-text-property 0 'face string)
+ 'image (get-text-property 0 'display string)
+ 'string (substring-no-properties string))))
+
+(defun icons--merge-spec (merged parent-spec)
+ (dolist (elem parent-spec)
+ (let ((current (assq (car elem) merged)))
+ (if (not current)
+ ;; Just add the entry.
+ (push elem merged)
+ ;; See if there are any keywords to inherit.
+ (let ((parent-keywords (icon-spec-keywords elem))
+ (current-keywords (icon-spec-keywords current)))
+ (while parent-keywords
+ (unless (plist-get (car parent-keywords) current-keywords)
+ (nconc current (take 2 parent-keywords))
+ (setq parent-keywords (cddr parent-keywords))))))))
+ merged)
+
+(cl-defmethod icons--create ((_type (eql 'image)) icon keywords)
+ (let ((file (if (file-name-absolute-p icon)
+ icon
+ (image-search-load-path icon))))
+ (and (display-images-p)
+ (image-supported-file-p file)
+ (propertize
+ " " 'display
+ (if-let ((height (plist-get keywords :height)))
+ (create-image file
+ nil nil
+ :height (if (eq height 'line)
+ (window-default-line-height)
+ height)
+ :scale 1)
+ (create-image file))))))
+
+(cl-defmethod icons--create ((_type (eql 'emoji)) icon _keywords)
+ (when-let ((font (and (display-multi-font-p)
+ ;; FIXME: This is not enough for ensuring
+ ;; display of color Emoji.
+ (car (internal-char-font nil ?🟠)))))
+ (and (font-has-char-p font (aref icon 0))
+ icon)))
+
+(cl-defmethod icons--create ((_type (eql 'symbol)) icon _keywords)
+ (and (cl-every #'char-displayable-p icon)
+ icon))
+
+(cl-defmethod icons--create ((_type (eql 'text)) icon _keywords)
+ icon)
+
+(define-icon button nil
+ '((image :face icon-button)
+ (emoji "🔵" :face icon)
+ (symbol "●" :face icon-button)
+ (text "button" :face icon-button))
+ "Base icon for buttons."
+ :version "29.1")
+
+;;;###autoload
+(defun describe-icon (icon)
+ "Pop to a buffer to describe ICON."
+ (interactive
+ (list (intern (completing-read "Describe icon: " obarray 'iconp t))))
+ (let ((help-buffer-under-preparation t))
+ (help-setup-xref (list #'describe-icon icon)
+ (called-interactively-p 'interactive))
+ (with-help-window (help-buffer)
+ (with-current-buffer standard-output
+ (insert "Icon: " (symbol-name icon) "\n\n")
+ (insert "Documentation:\n"
+ (substitute-command-keys (icon-documentation icon)))
+ (ensure-empty-lines)
+ (let ((spec (icon-complete-spec icon))
+ (plain (icon-complete-spec icon t t)))
+ (insert "Specification including inheritance and theming:\n")
+ (icons--describe-spec spec)
+ (unless (equal spec plain)
+ (insert "\nSpecification not including inheritance and theming:\n")
+ (icons--describe-spec plain)))))))
+
+(defun icons--describe-spec (spec)
+ (dolist (elem spec)
+ (let ((type (car elem))
+ (values (icon-spec-values elem))
+ (keywords (icon-spec-keywords elem)))
+ (when (or values keywords)
+ (insert (format "\nType: %s\n" type))
+ (dolist (value values)
+ (insert (format " %s\n" value)))
+ (while keywords
+ (insert (format " %s: %s\n" (pop keywords) (pop keywords))))))))
+
+(provide 'icons)
+
+;;; icons.el ends here
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index c906ee6e31d..c56a9660e7c 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -728,30 +728,67 @@ font-lock keywords will not be case sensitive."
len))))
(defun lisp-current-defun-name ()
- "Return the name of the defun at point, or nil."
+ "Return the name of the defun at point.
+If there is no defun at point, return the first symbol from the
+top-level form. If there is no top-level form, return nil.
+
+(\"defun\" here means \"form that defines something\", and is
+decided heuristically.)"
(save-excursion
- (let ((location (point)))
+ (let ((location (point))
+ name)
;; If we are now precisely at the beginning of a defun, make sure
;; beginning-of-defun finds that one rather than the previous one.
- (or (eobp) (forward-char 1))
+ (unless (eobp)
+ (forward-char 1))
(beginning-of-defun)
;; Make sure we are really inside the defun found, not after it.
- (when (and (looking-at "\\s(")
- (progn (end-of-defun)
- (< location (point)))
- (progn (forward-sexp -1)
- (>= location (point))))
- (if (looking-at "\\s(")
- (forward-char 1))
- ;; Skip the defining construct name, typically "defun" or
+ (when (and (looking-at "(")
+ (progn
+ (end-of-defun)
+ (< location (point)))
+ (progn
+ (forward-sexp -1)
+ (>= location (point))))
+ (when (looking-at "(")
+ (forward-char 1))
+ ;; Read the defining construct name, typically "defun" or
;; "defvar".
- (forward-sexp 1)
- ;; The second element is usually a symbol being defined. If it
- ;; is not, use the first symbol in it.
- (skip-chars-forward " \t\n'(")
- (buffer-substring-no-properties (point)
- (progn (forward-sexp 1)
- (point)))))))
+ (let ((symbol (ignore-errors (read (current-buffer)))))
+ (when (and symbol (not (symbolp symbol)))
+ (setq symbol nil))
+ ;; If there's an edebug spec, use that to determine what the
+ ;; name is.
+ (when symbol
+ (let ((spec (or (get symbol 'edebug-form-spec)
+ (and (eq (get symbol 'lisp-indent-function) 'defun)
+ (get 'defun 'edebug-form-spec)))))
+ (save-excursion
+ (when (and (eq (car-safe spec) '&define)
+ (memq 'name spec))
+ (pop spec)
+ (while (and spec (not name))
+ (let ((candidate (ignore-errors (read (current-buffer)))))
+ (when (eq (pop spec) 'name)
+ (when (and (consp candidate)
+ (symbolp (car (delete 'quote candidate))))
+ (setq candidate (car (delete 'quote candidate))))
+ (setq name candidate
+ spec nil))))))))
+ ;; We didn't have an edebug spec (or couldn't find the
+ ;; name). If the symbol starts with \"def\", then it's
+ ;; likely that the next symbol is the name.
+ (when (and (not name)
+ (string-match-p "\\(\\`\\|-\\)def" (symbol-name symbol)))
+ (when-let ((candidate (ignore-errors (read (current-buffer)))))
+ (cond
+ ((symbolp candidate)
+ (setq name candidate))
+ ((and (consp candidate)
+ (symbolp (car (delete 'quote candidate))))
+ (setq name (car (delete 'quote candidate)))))))
+ (when-let ((result (or name symbol)))
+ (and (symbolp result) (symbol-name result))))))))
(defvar-keymap lisp-mode-shared-map
:doc "Keymap for commands shared by all sorts of Lisp modes."
diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el
index 4b85414943a..acae1a0b0a9 100644
--- a/lisp/emacs-lisp/lisp.el
+++ b/lisp/emacs-lisp/lisp.el
@@ -507,6 +507,11 @@ It is called with no argument, right after calling `beginning-of-defun-raw'.
So the function can assume that point is at the beginning of the defun body.
It should move point to the first position after the defun.")
+(defvar end-of-defun-moves-to-eol t
+ "Whether `end-of-defun' moves to eol before doing anything else.
+Set this to nil if this movement adversely affects the buffer's
+major mode's decisions about context.")
+
(defun buffer-end (arg)
"Return the \"far end\" position of the buffer, in direction ARG.
If ARG is positive, that's the end of the buffer.
@@ -538,7 +543,9 @@ report errors as appropriate for this kind of usage."
(push-mark))
(if (or (null arg) (= arg 0)) (setq arg 1))
(let ((pos (point))
- (beg (progn (end-of-line 1) (beginning-of-defun-raw 1) (point)))
+ (beg (progn (when end-of-defun-moves-to-eol
+ (end-of-line 1))
+ (beginning-of-defun-raw 1) (point)))
(skip (lambda ()
;; When comparing point against pos, we want to consider that
;; if point was right after the end of the function, it's
diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el
index 8a50b777da1..8413373e5d4 100644
--- a/lisp/emacs-lisp/loaddefs-gen.el
+++ b/lisp/emacs-lisp/loaddefs-gen.el
@@ -50,17 +50,27 @@ prefix, that will not be registered. But all other prefixes will
be included.")
(put 'autoload-compute-prefixes 'safe-local-variable #'booleanp)
+(defvar no-update-autoloads nil
+ "File local variable to prevent scanning this file for autoload cookies.")
+
(defvar autoload-ignored-definitions
'("define-obsolete-function-alias"
"define-obsolete-variable-alias"
- "define-category" "define-key"
+ "define-category"
+ "define-key" "define-key-after" "define-keymap"
"defgroup" "defface" "defadvice"
"def-edebug-spec"
;; Hmm... this is getting ugly:
"define-widget"
"define-erc-module"
"define-erc-response-handler"
- "defun-rcirc-command")
+ "defun-rcirc-command"
+ "define-short-documentation-group"
+ "def-edebug-elem-spec"
+ "defvar-mode-local"
+ "defcustom-mode-local-semantic-dependency-system-include-path"
+ "define-ibuffer-column"
+ "define-ibuffer-sorter")
"List of strings naming definitions to ignore for prefixes.
More specifically those definitions will not be considered for the
`register-definition-prefixes' call.")
@@ -117,6 +127,15 @@ scanning for autoloads and will be in the `load-path'."
(substring name 0 (match-beginning 0))
name)))
+(defun loaddefs-generate--shorten-autoload (form)
+ "Remove optional nil elements from an `autoload' form."
+ (take (max (- (length form)
+ (seq-position (reverse form) nil
+ (lambda (e1 e2)
+ (not (eq e1 e2)))))
+ 3)
+ form))
+
(defun loaddefs-generate--make-autoload (form file &optional expansion)
"Turn FORM into an autoload or defvar for source file FILE.
Returns nil if FORM is not a special autoload form (i.e. a function definition
@@ -155,8 +174,8 @@ expression, in which case we want to handle forms differently."
;; Add the usage form at the end where describe-function-1
;; can recover it.
(when (consp args) (setq doc (help-add-fundoc-usage doc args)))
- ;; (message "autoload of %S" (nth 1 form))
- `(autoload ,(nth 1 form) ,file ,doc ,interactive ,type)))
+ (loaddefs-generate--shorten-autoload
+ `(autoload ,(nth 1 form) ,file ,doc ,interactive ,type))))
((and expansion (memq car '(progn prog1)))
(let ((end (memq :autoload-end form)))
@@ -174,7 +193,8 @@ expression, in which case we want to handle forms differently."
define-globalized-minor-mode defun defmacro
easy-mmode-define-minor-mode define-minor-mode
define-inline cl-defun cl-defmacro cl-defgeneric
- cl-defstruct pcase-defmacro iter-defun cl-iter-defun))
+ cl-defstruct pcase-defmacro iter-defun cl-iter-defun
+ transient-define-prefix))
(macrop car)
(setq expand (let ((load-true-file-name file)
(load-file-name file))
@@ -209,22 +229,23 @@ expression, in which case we want to handle forms differently."
;; can recover it.
(when (listp args) (setq doc (help-add-fundoc-usage doc args)))
;; `define-generic-mode' quotes the name, so take care of that
- `(autoload ,(if (listp name) name (list 'quote name))
- ,file ,doc
- ,(or (and (memq car '(define-skeleton define-derived-mode
- define-generic-mode
- easy-mmode-define-global-mode
- define-global-minor-mode
- define-globalized-minor-mode
- easy-mmode-define-minor-mode
- define-minor-mode))
- t)
- (and (eq (car-safe (car body)) 'interactive)
- ;; List of modes or just t.
- (or (if (nthcdr 1 (car body))
- (list 'quote (nthcdr 1 (car body)))
- t))))
- ,(if macrop ''macro nil))))
+ (loaddefs-generate--shorten-autoload
+ `(autoload ,(if (listp name) name (list 'quote name))
+ ,file ,doc
+ ,(or (and (memq car '(define-skeleton define-derived-mode
+ define-generic-mode
+ easy-mmode-define-global-mode
+ define-global-minor-mode
+ define-globalized-minor-mode
+ easy-mmode-define-minor-mode
+ define-minor-mode))
+ t)
+ (and (eq (car-safe (car body)) 'interactive)
+ ;; List of modes or just t.
+ (or (if (nthcdr 1 (car body))
+ (list 'quote (nthcdr 1 (car body)))
+ t))))
+ ,(if macrop ''macro nil)))))
;; For defclass forms, use `eieio-defclass-autoload'.
((eq car 'defclass)
@@ -446,7 +467,7 @@ don't include."
(let ((prefs nil))
;; Avoid (defvar <foo>) by requiring a trailing space.
(while (re-search-forward
- "^(\\(def[^ ]+\\) ['(]*\\([^' ()\"\n]+\\)[\n \t]" nil t)
+ "^(\\(def[^ \t\n]+\\)[ \t\n]+['(]*\\([^' ()\"\n]+\\)[\n \t]" nil t)
(unless (member (match-string 1) autoload-ignored-definitions)
(let ((name (match-string-no-properties 2)))
(when (save-excursion
@@ -458,7 +479,7 @@ don't include."
(push name prefs)))))
(loaddefs-generate--make-prefixes prefs load-name)))
-(defun loaddefs-generate--rubric (file &optional type feature)
+(defun loaddefs-generate--rubric (file &optional type feature compile)
"Return a string giving the appropriate autoload rubric for FILE.
TYPE (default \"autoloads\") is a string stating the type of
information contained in FILE. TYPE \"package\" acts like the default,
@@ -466,7 +487,9 @@ but adds an extra line to the output to modify `load-path'.
If FEATURE is non-nil, FILE will provide a feature. FEATURE may
be a string naming the feature, otherwise it will be based on
-FILE's name."
+FILE's name.
+
+If COMPILE, don't include a \"don't compile\" cookie."
(let ((lp (and (equal type "package") (setq type "autoloads"))))
(with-temp-buffer
(generate-lisp-file-heading
@@ -480,30 +503,10 @@ FILE's name."
(insert " \n;;; End of scraped data\n\n")
(generate-lisp-file-trailer
file :provide (and (stringp feature) feature)
+ :compile compile
:inhibit-provide (not feature))
(buffer-string))))
-(defun loaddefs-generate--insert-section-header (outbuf autoloads
- load-name file time)
- "Insert into buffer OUTBUF the section-header line for FILE.
-The header line lists the file name, its \"load name\", its autoloads,
-and the time the FILE was last updated (the time is inserted only
-if `autoload-timestamps' is non-nil, otherwise a fixed fake time is inserted)."
- (insert "\f\n;;;### ")
- (prin1 `(autoloads ,autoloads ,load-name ,file ,time)
- outbuf)
- (terpri outbuf)
- ;; Break that line at spaces, to avoid very long lines.
- ;; Make each sub-line into a comment.
- (with-current-buffer outbuf
- (save-excursion
- (forward-line -1)
- (while (not (eolp))
- (move-to-column 64)
- (skip-chars-forward "^ \n")
- (or (eolp)
- (insert "\n" ";;;;;; "))))))
-
;;;###autoload
(defun loaddefs-generate (dir output-file &optional excluded-files
extra-data include-package-version
@@ -516,15 +519,21 @@ binds `generated-autoload-file' as a file-local variable, write
its autoloads into the specified file instead.
The function does NOT recursively descend into subdirectories of the
-directory or directories specified.
+directory or directories specified by DIRS.
-If EXTRA-DATA, include this string at the start of the generated
-file. This will also force generation of OUTPUT-FILE even if
-there are no autoloads to put into the file.
+Optional argument EXCLUDED-FILES, if non-nil, should be a list of
+files, such as preloaded files, whose autoloads should not be written
+to OUTPUT-FILE.
-If INCLUDE-PACKAGE-VERSION, include package version data.
+If EXTRA-DATA is non-nil, it should be a string; include that string
+at the beginning of the generated file. This will also force the
+generation of OUTPUT-FILE even if there are no autoloads to put into
+that file.
-If GENERATE-FULL, don't update, but regenerate all the loaddefs files."
+If INCLUDE-PACKAGE-VERSION is non-nil, include package version data.
+
+If GENERATE-FULL is non-nil, regenerate all the loaddefs files anew,
+instead of just updating them with the new/changed autoloads."
(let* ((files-re (let ((tmp nil))
(dolist (suf (get-load-suffixes))
;; We don't use module-file-suffix below because
@@ -542,6 +551,11 @@ If GENERATE-FULL, don't update, but regenerate all the loaddefs files."
(updating (and (file-exists-p output-file) (not generate-full)))
(defs nil))
+ ;; Allow the excluded files to be relative.
+ (setq excluded-files
+ (mapcar (lambda (file) (expand-file-name file dir))
+ excluded-files))
+
;; Collect all the autoload data.
(let ((progress (make-progress-reporter
(byte-compile-info
@@ -556,16 +570,15 @@ If GENERATE-FULL, don't update, but regenerate all the loaddefs files."
(time-less-p output-time
(file-attribute-modification-time
(file-attributes file))))
- (setq defs (nconc
- (loaddefs-generate--parse-file
- file output-file
- ;; We only want the package name from the
- ;; excluded files.
- (and include-package-version
- (if (member (expand-file-name file) excluded-files)
- 'only
- t)))
- defs))))
+ ;; If we're scanning for package versions, we want to look
+ ;; at the file even if it's excluded.
+ (let* ((excluded (member (expand-file-name file dir) excluded-files))
+ (package-data
+ (and include-package-version (if excluded 'only t))))
+ (when (or package-data (not excluded))
+ (setq defs (nconc (loaddefs-generate--parse-file
+ file output-file package-data)
+ defs))))))
(progress-reporter-done progress))
;; If we have no autoloads data, but we have EXTRA-DATA, then
@@ -580,15 +593,18 @@ If GENERATE-FULL, don't update, but regenerate all the loaddefs files."
;; We have some data, so generate the loaddef files. First
;; group per output file.
(dolist (fdefs (seq-group-by #'car defs))
- (let ((loaddefs-file (car fdefs)))
+ (let ((loaddefs-file (car fdefs))
+ hash)
(with-temp-buffer
(if (and updating (file-exists-p loaddefs-file))
(insert-file-contents loaddefs-file)
- (insert (loaddefs-generate--rubric loaddefs-file nil t))
+ (insert (loaddefs-generate--rubric
+ loaddefs-file nil t include-package-version))
(search-backward "\f")
(when extra-data
(insert extra-data)
(ensure-empty-lines 1)))
+ (setq hash (buffer-hash))
;; Then group by source file (and sort alphabetically).
(dolist (section (sort (seq-group-by #'cadr (cdr fdefs))
(lambda (e1 e2)
@@ -625,23 +641,26 @@ If GENERATE-FULL, don't update, but regenerate all the loaddefs files."
(loaddefs-generate--print-form def))
(unless (bolp)
(insert "\n")))))
- (write-region (point-min) (point-max) loaddefs-file nil 'silent)
- (byte-compile-info (file-relative-name loaddefs-file lisp-directory)
- t "GEN")))))))
+ ;; Only write the file if we actually made a change.
+ (unless (equal (buffer-hash) hash)
+ (write-region (point-min) (point-max) loaddefs-file nil 'silent)
+ (byte-compile-info
+ (file-relative-name loaddefs-file lisp-directory) t "GEN"))))))))
(defun loaddefs-generate--print-form (def)
- "Print DEF in the way make-docfile.c expects it."
+ "Print DEF in a format that makes sense for version control."
(if (or (not (consp def))
(not (symbolp (car def)))
(memq (car def) '( make-obsolete
define-obsolete-function-alias))
(not (stringp (nth 3 def))))
(prin1 def (current-buffer) t)
- ;; The salient point here is that we have to have the doc string
- ;; that starts with a backslash and a newline, and there mustn't
- ;; be any newlines before that. So -- typically
- ;; (defvar foo 'value "\
- ;; Doc string" ...).
+ ;; We want to print, for instance, `defvar' values while escaping
+ ;; control characters (so that we don't end up with lines with
+ ;; trailing tab characters and the like), but we don't want to do
+ ;; this for doc strings, because then the doc strings would be on
+ ;; one single line, which would lead to more VC churn. So --
+ ;; typically (defvar foo 'value "\ Doc string" ...).
(insert "(")
(dotimes (_ 3)
(prin1 (pop def) (current-buffer)
@@ -655,7 +674,9 @@ If GENERATE-FULL, don't update, but regenerate all the loaddefs files."
(insert "\\\n")))
(while def
(insert " ")
- (prin1 (pop def) (current-buffer) t))
+ (prin1 (pop def) (current-buffer)
+ '(t (escape-newlines . t)
+ (escape-control-characters . t))))
(insert ")")))
(defun loaddefs-generate--excluded-files ()
diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el
index 6a193a56d2d..5ae9d8368f0 100644
--- a/lisp/emacs-lisp/macroexp.el
+++ b/lisp/emacs-lisp/macroexp.el
@@ -823,7 +823,7 @@ test of free variables in the following ways:
(eval-when-compile
(add-hook 'emacs-startup-hook
(lambda ()
- (and (not (byte-code-function-p
+ (and (not (compiled-function-p
(symbol-function 'macroexpand-all)))
(locate-library "macroexp.elc")
(load "macroexp.elc")))))
diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el
index 2d5a1b5e77b..a9a20ab5abf 100644
--- a/lisp/emacs-lisp/nadvice.el
+++ b/lisp/emacs-lisp/nadvice.el
@@ -167,31 +167,31 @@ DOC is a string where \"FUNCTION\" and \"OLDFUN\" are expected.")
(defun advice--interactive-form (function)
"Like `interactive-form' but tries to avoid autoloading functions."
- (when (commandp function)
- (if (not (and (symbolp function) (autoloadp (indirect-function function))))
- (interactive-form function)
+ (if (not (and (symbolp function) (autoloadp (indirect-function function))))
+ (interactive-form function)
+ (when (commandp function)
`(interactive (advice-eval-interactive-spec
(cadr (interactive-form ',function)))))))
-(defun advice--make-interactive-form (function main)
+(defun advice--make-interactive-form (iff ifm)
;; TODO: make it so that interactive spec can be a constant which
;; dynamically checks the advice--car/cdr to do its job.
;; For that, advice-eval-interactive-spec needs to be more faithful.
- (let* ((iff (advice--interactive-form function))
- (ifm (advice--interactive-form main))
- (fspec (cadr iff)))
+ (let* ((fspec (cadr iff)))
(when (eq 'function (car-safe fspec)) ;; Macroexpanded lambda?
- (setq fspec (nth 1 fspec)))
+ (setq fspec (eval fspec t)))
(if (functionp fspec)
`(funcall ',fspec ',(cadr ifm))
(cadr (or iff ifm)))))
(cl-defmethod oclosure-interactive-form ((ad advice) &optional _)
- (let ((car (advice--car ad))
- (cdr (advice--cdr ad)))
- (when (or (commandp car) (commandp cdr))
- `(interactive ,(advice--make-interactive-form car cdr)))))
+ (let* ((car (advice--car ad))
+ (cdr (advice--cdr ad))
+ (ifa (advice--interactive-form car))
+ (ifd (advice--interactive-form cdr)))
+ (when (or ifa ifd)
+ `(interactive ,(advice--make-interactive-form ifa ifd)))))
(cl-defmethod cl-print-object ((object advice) stream)
(cl-assert (advice--p object))
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index f9600675998..24880a66a05 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -301,6 +301,7 @@ packages in `package-directory-list'."
:type 'directory
:initialize #'custom-initialize-delay
:risky t
+ :group 'applications
:version "24.1")
;;;###autoload
@@ -320,6 +321,7 @@ These directories contain packages intended for system-wide; in
contrast, `package-user-dir' contains packages for personal use."
:type '(repeat directory)
:initialize #'custom-initialize-delay
+ :group 'applications
:risky t
:version "24.1")
@@ -628,6 +630,7 @@ called via `package-activate-all'. To change which packages are
loaded and/or activated, customize `package-load-list'.")
(put 'package-alist 'risky-local-variable t)
+;;;###autoload
(defvar package-activated-list nil
;; FIXME: This should implicitly include all builtin packages.
"List of the names of currently activated packages.")
@@ -786,10 +789,14 @@ byte-compilation of the new package to fail."
(with-demoted-errors "Error in package--load-files-for-activation: %s"
(let* (result
(dir (package-desc-dir pkg-desc))
- (load-path-sans-dir
- (cl-remove-if (apply-partially #'string= dir)
- (or (bound-and-true-p find-function-source-path)
- load-path)))
+ ;; A previous implementation would skip `dir' itself.
+ ;; However, in normal use reloading from the same directory
+ ;; never happens anyway, while in certain cases external to
+ ;; Emacs a package in the same directory not necessary
+ ;; stays byte-identical, e.g. during development. Just
+ ;; don't special-case `dir'.
+ (effective-path (or (bound-and-true-p find-library-source-path)
+ load-path))
(files (directory-files-recursively dir "\\`[^\\.].*\\.el\\'"))
(history (mapcar #'file-truename
(cl-remove-if-not #'stringp
@@ -797,8 +804,19 @@ byte-compilation of the new package to fail."
(dolist (file files)
(when-let ((library (package--library-stem
(file-relative-name file dir)))
- (canonical (locate-library library nil load-path-sans-dir))
- (found (member (file-truename canonical) history))
+ (canonical (locate-library library nil effective-path))
+ (truename (file-truename canonical))
+ ;; Normally, all files in a package are compiled by
+ ;; now, but don't assume that. E.g. different
+ ;; versions can add or remove `no-byte-compile'.
+ (altname (if (string-suffix-p ".el" truename)
+ (replace-regexp-in-string
+ "\\.el\\'" ".elc" truename t)
+ (replace-regexp-in-string
+ "\\.elc\\'" ".el" truename t)))
+ (found (or (member truename history)
+ (and (not (string= altname truename))
+ (member altname history))))
(recent-index (length found)))
(unless (equal (file-name-base library)
(format "%s-autoloads" (package-desc-name pkg-desc)))
@@ -1007,7 +1025,9 @@ untar into a directory named DIR; otherwise, signal an error."
(unless (file-exists-p file)
(require 'autoload)
(let ((coding-system-for-write 'utf-8-emacs-unix))
- (write-region (autoload-rubric file "package" nil) nil file nil 'silent)))
+ (with-suppressed-warnings ((obsolete autoload-rubric))
+ (write-region (autoload-rubric file "package" nil)
+ nil file nil 'silent))))
file)
(defvar autoload-timestamps)
@@ -1311,7 +1331,7 @@ errors signaled by ERROR-FORM or by BODY).
(cl-defun package--with-response-buffer-1 (url body &key async file error-function noerror &allow-other-keys)
(if (string-match-p "\\`https?:" url)
- (let ((url (concat url file)))
+ (let ((url (url-expand-file-name file url)))
(if async
(package--unless-error #'ignore
(url-retrieve
@@ -1646,6 +1666,7 @@ The variable `package-load-list' controls which packages to load."
(require 'package)
(package--activate-all)))))
+;;;###autoload
(defun package--activate-all ()
(dolist (elt (package--alist))
(condition-case err
@@ -2067,7 +2088,10 @@ If PACKAGE is a `package-desc' object, MIN-VERSION is ignored."
package-activated-list)
;; We used the quickstart: make it possible to use package-installed-p
;; even before package is fully initialized.
- (memq package package-activated-list))
+ (or
+ (memq package package-activated-list)
+ ;; Also check built-in packages.
+ (package-built-in-p package min-version)))
(t
(or
(let ((pkg-descs (cdr (assq package (package--alist)))))
@@ -3507,7 +3531,7 @@ If optional arg BUTTON is non-nil, describe its associated package."
(let ((place (cdr desc))
(out (copy-sequence (car desc))))
(add-text-properties place (1+ place)
- '(face (bold font-lock-warning-face))
+ '(face help-key-binding)
out)
out))
(package--prettify-quick-help-key (cons desc 0))))
@@ -4272,6 +4296,7 @@ activations need to be changed, such as when `package-load-list' is modified."
(locate-user-emacs-file "package-quickstart.el")
"Location of the file used to speed up activation of packages at startup."
:type 'file
+ :group 'applications
:initialize #'custom-initialize-delay
:version "27.1")
diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index 07443dabfef..10bd4bc6886 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -607,31 +607,38 @@ recording whether the var has been referenced by earlier parts of the match."
(symbolp . vectorp)
(symbolp . stringp)
(symbolp . byte-code-function-p)
+ (symbolp . compiled-function-p)
(symbolp . recordp)
(integerp . consp)
(integerp . arrayp)
(integerp . vectorp)
(integerp . stringp)
(integerp . byte-code-function-p)
+ (integerp . compiled-function-p)
(integerp . recordp)
(numberp . consp)
(numberp . arrayp)
(numberp . vectorp)
(numberp . stringp)
(numberp . byte-code-function-p)
+ (numberp . compiled-function-p)
(numberp . recordp)
(consp . arrayp)
(consp . atom)
(consp . vectorp)
(consp . stringp)
(consp . byte-code-function-p)
+ (consp . compiled-function-p)
(consp . recordp)
(arrayp . byte-code-function-p)
+ (arrayp . compiled-function-p)
(vectorp . byte-code-function-p)
+ (vectorp . compiled-function-p)
(vectorp . recordp)
(stringp . vectorp)
(stringp . recordp)
- (stringp . byte-code-function-p)))
+ (stringp . byte-code-function-p)
+ (stringp . compiled-function-p)))
(defun pcase--mutually-exclusive-p (pred1 pred2)
(or (member (cons pred1 pred2)
@@ -771,8 +778,8 @@ A and B can be one of:
((consp (cadr pat)) #'consp)
((stringp (cadr pat)) #'stringp)
((vectorp (cadr pat)) #'vectorp)
- ((byte-code-function-p (cadr pat))
- #'byte-code-function-p))))
+ ((compiled-function-p (cadr pat))
+ #'compiled-function-p))))
(pcase--mutually-exclusive-p (cadr upat) otherpred))
'(:pcase--fail . nil))
;; Since we turn (or 'a 'b 'c) into (pred (pcase--flip (memq '(a b c))))
diff --git a/lisp/emacs-lisp/regi.el b/lisp/emacs-lisp/regi.el
index 0099d157e4e..a7d61ed51ca 100644
--- a/lisp/emacs-lisp/regi.el
+++ b/lisp/emacs-lisp/regi.el
@@ -5,7 +5,6 @@
;; Author: 1993 Barry A. Warsaw, Century Computing, Inc. <bwarsaw@cen.com>
;; Created: 24-Feb-1993
;; Old-Version: 1.8
-;; Last Modified: 1993/06/01 21:33:00
;; Keywords: extensions, matching
;; This file is part of GNU Emacs.
diff --git a/lisp/emacs-lisp/ring.el b/lisp/emacs-lisp/ring.el
index 2b2039f9d15..e8b92a532fa 100644
--- a/lisp/emacs-lisp/ring.el
+++ b/lisp/emacs-lisp/ring.el
@@ -42,6 +42,8 @@
;;; Code:
+(eval-when-compile (require 'cl-lib))
+
;;; User Functions:
;;;###autoload
@@ -51,6 +53,8 @@
(consp (cdr x)) (integerp (cadr x))
(vectorp (cddr x))))
+(cl-deftype ring () '(satisfies ring-p))
+
;;;###autoload
(defun make-ring (size)
"Make a ring that can contain SIZE elements."
diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el
index 18eb168a70a..ec51146484a 100644
--- a/lisp/emacs-lisp/rx.el
+++ b/lisp/emacs-lisp/rx.el
@@ -1451,6 +1451,12 @@ following constructs:
REF can be a number, as usual, or a name
introduced by a previous (let REF ...)
construct."
+ (rx--pcase-expand regexps))
+
+;; Autoloaded because it's referred to by the pcase rx macro above,
+;; whose body ends up in loaddefs.el.
+;;;###autoload
+(defun rx--pcase-expand (regexps)
(let* ((rx--pcase-vars nil)
(regexp (rx--to-expr (rx--pcase-transform (cons 'seq regexps)))))
`(and (pred stringp)
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 36c17f4cd5e..b6f0f66e5b1 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -168,21 +168,25 @@ if positive or too small if negative)."
((or (stringp sequence) (vectorp sequence)) (substring sequence start end))
((listp sequence)
(let (len
- (errtext (format "Bad bounding indices: %s, %s" start end)))
+ (orig-start start)
+ (orig-end end))
(and end (< end 0) (setq end (+ end (setq len (length sequence)))))
(if (< start 0) (setq start (+ start (or len (setq len (length sequence))))))
(unless (>= start 0)
- (error "%s" errtext))
+ (error "Start index out of bounds: %s" orig-start))
(when (> start 0)
(setq sequence (nthcdr (1- start) sequence))
- (or sequence (error "%s" errtext))
+ (unless sequence
+ (error "Start index out of bounds: %s" orig-start))
(setq sequence (cdr sequence)))
(if end
- (let ((res nil))
- (while (and (>= (setq end (1- end)) start) sequence)
- (push (pop sequence) res))
- (or (= (1+ end) start) (error "%s" errtext))
- (nreverse res))
+ (let ((n (- end start)))
+ (when (or (< n 0)
+ (if len
+ (> end len)
+ (and (> n 0) (null (nthcdr (1- n) sequence)))))
+ (error "End index out of bounds: %s" orig-end))
+ (take n sequence))
(copy-sequence sequence))))
(t (error "Unsupported sequence: %s" sequence))))
@@ -451,6 +455,33 @@ TESTFN is used to compare elements, or `equal' if TESTFN is nil."
(setq result (cons elt result))))
(nreverse result)))
+(cl-defmethod seq-uniq ((sequence list) &optional testfn)
+ (let ((result nil))
+ (if (not testfn)
+ ;; Fast path. If the list is long, use a hash table to speed
+ ;; things up even more.
+ (let ((l (length sequence)))
+ (if (> l 100)
+ (let ((hash (make-hash-table :test #'equal :size l)))
+ (while sequence
+ (unless (gethash (car sequence) hash)
+ (setf (gethash (car sequence) hash) t)
+ (push (car sequence) result))
+ (setq sequence (cdr sequence))))
+ ;; Short list.
+ (while sequence
+ (unless (member (car sequence) result)
+ (push (car sequence) result))
+ (pop sequence))))
+ ;; Slower path.
+ (while sequence
+ (unless (seq-find (lambda (elem)
+ (funcall testfn elem (car sequence)))
+ result)
+ (push (car sequence) result))
+ (pop sequence)))
+ (nreverse result)))
+
(cl-defgeneric seq-mapcat (function sequence &optional type)
"Concatenate the result of applying FUNCTION to each element of SEQUENCE.
The result is a sequence of type TYPE, or a list if TYPE is nil."
@@ -587,11 +618,13 @@ Signal an error if SEQUENCE is empty."
(cl-defmethod seq-take ((list list) n)
"Optimized implementation of `seq-take' for lists."
- (let ((result '()))
- (while (and list (> n 0))
- (setq n (1- n))
- (push (pop list) result))
- (nreverse result)))
+ (if (eval-when-compile (fboundp 'take))
+ (take n list)
+ (let ((result '()))
+ (while (and list (> n 0))
+ (setq n (1- n))
+ (push (pop list) result))
+ (nreverse result))))
(cl-defmethod seq-drop-while (pred (list list))
"Optimized implementation of `seq-drop-while' for lists."
diff --git a/lisp/emacs-lisp/shadow.el b/lisp/emacs-lisp/shadow.el
index 2343a9b589f..da32e4564f6 100644
--- a/lisp/emacs-lisp/shadow.el
+++ b/lisp/emacs-lisp/shadow.el
@@ -128,11 +128,8 @@ See the documentation for `list-load-path-shadows' for further information."
(if (setq orig-dir
(assoc file files
- (when dir-case-insensitive
- (lambda (f1 f2)
- (eq (compare-strings f1 nil nil
- f2 nil nil t)
- t)))))
+ (and dir-case-insensitive
+ #'string-equal-ignore-case)))
;; This file was seen before, we have a shadowing.
;; Report it unless the files are identical.
(let ((base1 (concat (cdr orig-dir) "/" (car orig-dir)))
diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el
index a2d954cadbb..d187af9ac83 100644
--- a/lisp/emacs-lisp/shortdoc.el
+++ b/lisp/emacs-lisp/shortdoc.el
@@ -243,6 +243,8 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'),
"Predicates for Strings"
(string-equal
:eval (string-equal "foo" "foo"))
+ (string-equal-ignore-case
+ :eval (string-equal-ignore-case "foo" "FOO"))
(eq
:eval (eq "foo" "foo"))
(eql
@@ -501,7 +503,7 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'),
(set-file-modes
:no-value "(set-file-modes \"/tmp/foo\" #o644)")
(set-file-times
- :no-value (set-file-times "/tmp/foo" (current-time)))
+ :no-value (set-file-times "/tmp/foo"))
"File Modes"
(set-default-file-modes
:no-value "(set-default-file-modes #o755)")
@@ -595,6 +597,10 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'),
:eval (nth 1 '(one two three)))
(nthcdr
:eval (nthcdr 1 '(one two three)))
+ (take
+ :eval (take 3 '(one two three four)))
+ (ntake
+ :eval (ntake 3 (list 'one 'two 'three 'four)))
(elt
:eval (elt '(one two three) 1))
(car-safe
@@ -1179,9 +1185,6 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'),
(ash
:eval (ash 1 4)
:eval (ash 16 -1))
- (lsh
- :eval (lsh 1 4)
- :eval (lsh 16 -1))
(logand
:no-eval "(logand #b10 #b111)"
:result-string "#b10")
diff --git a/lisp/emacs-lisp/subr-x.el b/lisp/emacs-lisp/subr-x.el
index 5037ae47e83..bd7c3c82f97 100644
--- a/lisp/emacs-lisp/subr-x.el
+++ b/lisp/emacs-lisp/subr-x.el
@@ -107,13 +107,18 @@ characters; nil stands for the empty string."
;;;###autoload
(defun string-truncate-left (string length)
- "Truncate STRING to LENGTH, replacing initial surplus with \"...\"."
+ "If STRING is longer than LENGTH, return a truncated version.
+When truncating, \"...\" is always prepended to the string, so
+the resulting string may be longer than the original if LENGTH is
+3 or smaller."
(let ((strlen (length string)))
(if (<= strlen length)
string
(setq length (max 0 (- length 3)))
- (concat "..." (substring string (max 0 (- strlen 1 length)))))))
+ (concat "..." (substring string (min (1- strlen)
+ (max 0 (- strlen length))))))))
+;;;###autoload
(defsubst string-blank-p (string)
"Check whether STRING is either empty or only whitespace.
The following characters count as whitespace here: space, tab, newline and
@@ -249,13 +254,9 @@ the string."
(unless (natnump length)
(signal 'wrong-type-argument (list 'natnump length)))
(let ((pad-length (- length (length string))))
- (if (< pad-length 0)
- string
- (concat (and start
- (make-string pad-length (or padding ?\s)))
- string
- (and (not start)
- (make-string pad-length (or padding ?\s)))))))
+ (cond ((<= pad-length 0) string)
+ (start (concat (make-string pad-length (or padding ?\s)) string))
+ (t (concat string (make-string pad-length (or padding ?\s)))))))
(defun string-chop-newline (string)
"Remove the final newline (if any) from STRING."
@@ -466,6 +467,18 @@ be marked unmodified, effectively ignoring those changes."
(equal ,hash (buffer-hash)))
(restore-buffer-modified-p nil))))))))
+(defun emacs-etc--hide-local-variables ()
+ "Hide local variables.
+Used by `emacs-authors-mode' and `emacs-news-mode'."
+ (narrow-to-region (point-min)
+ (save-excursion
+ (goto-char (point-max))
+ ;; Obfuscate to avoid this being interpreted
+ ;; as a local variable section itself.
+ (if (re-search-backward "^Local\sVariables:$" nil t)
+ (progn (forward-line -1) (point))
+ (point-max)))))
+
(provide 'subr-x)
;;; subr-x.el ends here
diff --git a/lisp/emacs-lisp/timer.el b/lisp/emacs-lisp/timer.el
index fd29abf40a3..b25a040a96c 100644
--- a/lisp/emacs-lisp/timer.el
+++ b/lisp/emacs-lisp/timer.el
@@ -122,7 +122,7 @@ of SECS seconds since the epoch. SECS may be a fraction."
(setq ticks (ash ticks 1))
(setq hz (ash hz 1)))
(let ((more-ticks (+ ticks trunc-s-ticks)))
- (time-convert (cons (- more-ticks (% more-ticks trunc-s-ticks)) hz)))))
+ (time-convert (cons (- more-ticks (% more-ticks trunc-s-ticks)) hz) t))))
(defun timer-relative-time (time secs &optional usecs psecs)
"Advance TIME by SECS seconds.
@@ -159,32 +159,42 @@ SECS may be a fraction."
timer)
(defun timer--activate (timer &optional triggered-p reuse-cell idle)
- (if (and (timerp timer)
- (integerp (timer--high-seconds timer))
- (integerp (timer--low-seconds timer))
- (integerp (timer--usecs timer))
- (integerp (timer--psecs timer))
- (timer--function timer))
- (let ((timers (if idle timer-idle-list timer-list))
- last)
- ;; Skip all timers to trigger before the new one.
- (while (and timers (timer--time-less-p (car timers) timer))
- (setq last timers
- timers (cdr timers)))
- (if reuse-cell
- (progn
- (setcar reuse-cell timer)
- (setcdr reuse-cell timers))
- (setq reuse-cell (cons timer timers)))
- ;; Insert new timer after last which possibly means in front of queue.
- (setf (cond (last (cdr last))
- (idle timer-idle-list)
- (t timer-list))
- reuse-cell)
- (setf (timer--triggered timer) triggered-p)
- (setf (timer--idle-delay timer) idle)
- nil)
- (error "Invalid or uninitialized timer")))
+ (let ((timers (if idle timer-idle-list timer-list))
+ last)
+ (cond
+ ((not (and (timerp timer)
+ (integerp (timer--high-seconds timer))
+ (integerp (timer--low-seconds timer))
+ (integerp (timer--usecs timer))
+ (integerp (timer--psecs timer))
+ (timer--function timer)))
+ (error "Invalid or uninitialized timer"))
+ ;; FIXME: This is not reliable because `idle-delay' is only set late,
+ ;; by `timer-activate-when-idle' :-(
+ ;;((not (eq (not idle)
+ ;; (not (timer--idle-delay timer))))
+ ;; (error "idle arg %S out of sync with idle-delay field of timer: %S"
+ ;; idle timer))
+ ((memq timer timers)
+ (error "Timer already activated"))
+ (t
+ ;; Skip all timers to trigger before the new one.
+ (while (and timers (timer--time-less-p (car timers) timer))
+ (setq last timers
+ timers (cdr timers)))
+ (if reuse-cell
+ (progn
+ (setcar reuse-cell timer)
+ (setcdr reuse-cell timers))
+ (setq reuse-cell (cons timer timers)))
+ ;; Insert new timer after last which possibly means in front of queue.
+ (setf (cond (last (cdr last))
+ (idle timer-idle-list)
+ (t timer-list))
+ reuse-cell)
+ (setf (timer--triggered timer) triggered-p)
+ (setf (timer--idle-delay timer) idle)
+ nil))))
(defun timer-activate (timer &optional triggered-p reuse-cell)
"Insert TIMER into `timer-list'.
@@ -216,7 +226,7 @@ the time of the current timer. That's because the activated
timer will fire right away."
(timer--activate timer (not dont-wait) reuse-cell 'idle))
-(defalias 'disable-timeout 'cancel-timer)
+(defalias 'disable-timeout #'cancel-timer)
(defun cancel-timer (timer)
"Remove TIMER from the list of active timers."
@@ -430,7 +440,7 @@ The action is to call FUNCTION with arguments ARGS.
This function returns a timer object which you can use in `cancel-timer'."
(interactive "sRun after delay (seconds): \nNRepeat interval: \naFunction: ")
- (apply 'run-at-time secs repeat function args))
+ (apply #'run-at-time secs repeat function args))
(defun add-timeout (secs function object &optional repeat)
"Add a timer to run SECS seconds from now, to call FUNCTION on OBJECT.
@@ -457,7 +467,7 @@ This function returns a timer object which you can use in `cancel-timer'."
(interactive
(list (read-from-minibuffer "Run after idle (seconds): " nil nil t)
(y-or-n-p "Repeat each time Emacs is idle? ")
- (intern (completing-read "Function: " obarray 'fboundp t))))
+ (intern (completing-read "Function: " obarray #'fboundp t))))
(let ((timer (timer-create)))
(timer-set-function timer function args)
(timer-set-idle-time timer secs repeat)
diff --git a/lisp/emacs-lisp/trace.el b/lisp/emacs-lisp/trace.el
index c2f6c162269..aea12f146da 100644
--- a/lisp/emacs-lisp/trace.el
+++ b/lisp/emacs-lisp/trace.el
@@ -1,6 +1,6 @@
;;; trace.el --- tracing facility for Emacs Lisp functions -*- lexical-binding: t -*-
-;; Copyright (C) 1993, 1998, 2000-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1993-2022 Free Software Foundation, Inc.
;; Author: Hans Chalupsky <hans@cs.buffalo.edu>
;; Maintainer: emacs-devel@gnu.org
@@ -22,12 +22,6 @@
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-;; LCD Archive Entry:
-;; trace|Hans Chalupsky|hans@cs.buffalo.edu|
-;; Tracing facility for Emacs Lisp functions|
-;; 1993/05/18 00:41:16|2.0|~/packages/trace.el.Z|
-
-
;;; Commentary:
;; Introduction:
diff --git a/lisp/emacs-lisp/warnings.el b/lisp/emacs-lisp/warnings.el
index 23e20c3b10c..3a966957ec5 100644
--- a/lisp/emacs-lisp/warnings.el
+++ b/lisp/emacs-lisp/warnings.el
@@ -27,6 +27,8 @@
;;; Code:
+(require 'icons)
+
(defgroup warnings nil
"Log and display warnings."
:version "22.1"
@@ -201,20 +203,28 @@ SUPPRESS-LIST is the list of kinds of warnings to suppress."
;; we return t.
some-match))
-(define-button-type 'warning-suppress-warning
- 'action #'warning-suppress-action
- 'help-echo "mouse-2, RET: Don't display this warning automatically")
-(defun warning-suppress-action (button)
- (customize-save-variable 'warning-suppress-types
- (cons (list (button-get button 'warning-type))
- warning-suppress-types)))
-(define-button-type 'warning-suppress-log-warning
- 'action #'warning-suppress-log-action
- 'help-echo "mouse-2, RET: Don't log this warning")
-(defun warning-suppress-log-action (button)
- (customize-save-variable 'warning-suppress-log-types
- (cons (list (button-get button 'warning-type))
- warning-suppress-types)))
+(define-icon warnings-suppress button
+ '((emoji "⛔")
+ (symbol " ■ ")
+ (text " stop "))
+ "Suppress warnings."
+ :version "29.1"
+ :help-echo "Click to suppress this warning type")
+
+(defun warnings-suppress (type)
+ (pcase (car
+ (read-multiple-choice
+ (format "Suppress `%s' warnings? " type)
+ `((?y ,(format "yes, ignore `%s' warnings completely" type))
+ (?n "no, just disable showing them")
+ (?q "quit and do nothing"))))
+ (?y
+ (customize-save-variable 'warning-suppress-log-types
+ (cons (list type) warning-suppress-log-types)))
+ (?n
+ (customize-save-variable 'warning-suppress-types
+ (cons (list type) warning-suppress-types)))
+ (_ (message "Exiting"))))
;;;###autoload
(defun display-warning (type message &optional level buffer-name)
@@ -289,23 +299,18 @@ entirely by setting `warning-suppress-types' or
(unless (bolp)
(funcall newline))
(setq start (point))
+ ;; Don't output the button when doing batch compilation
+ ;; and similar.
+ (unless (or noninteractive (eq type 'bytecomp))
+ (insert (buttonize (icon-string 'warnings-suppress)
+ #'warnings-suppress type)
+ " "))
(if warning-prefix-function
(setq level-info (funcall warning-prefix-function
level level-info)))
(insert (format (nth 1 level-info)
(format warning-type-format typename))
message)
- ;; Don't output the buttons when doing batch compilation
- ;; and similar.
- (unless (or noninteractive (eq type 'bytecomp))
- (insert " ")
- (insert-button "Disable showing"
- 'type 'warning-suppress-warning
- 'warning-type type)
- (insert " ")
- (insert-button "Disable logging"
- 'type 'warning-suppress-log-warning
- 'warning-type type))
(funcall newline)
(when (and warning-fill-prefix
(not (string-search "\n" message))
diff --git a/lisp/emulation/cua-base.el b/lisp/emulation/cua-base.el
index 162d1bb641b..297f7aba646 100644
--- a/lisp/emulation/cua-base.el
+++ b/lisp/emulation/cua-base.el
@@ -1144,15 +1144,15 @@ If ARG is the atom `-', scroll upward by nearly full screen."
'(self-insert-command))
def nil))
-(defvar cua-global-keymap (make-sparse-keymap)
- "Global keymap for `cua-mode'; users may add to this keymap.")
-
-(defvar cua--cua-keys-keymap (make-sparse-keymap))
-(defvar cua--prefix-override-keymap (make-sparse-keymap))
-(defvar cua--prefix-repeat-keymap (make-sparse-keymap))
-(defvar cua--global-mark-keymap (make-sparse-keymap)) ; Initialized when cua-gmrk.el is loaded
-(defvar cua--rectangle-keymap (make-sparse-keymap)) ; Initialized when cua-rect.el is loaded
-(defvar cua--region-keymap (make-sparse-keymap))
+(defvar-keymap cua-global-keymap
+ :doc "Global keymap for `cua-mode'; users may add to this keymap.")
+
+(defvar-keymap cua--cua-keys-keymap)
+(defvar-keymap cua--prefix-override-keymap)
+(defvar-keymap cua--prefix-repeat-keymap)
+(defvar-keymap cua--global-mark-keymap) ; Initialized when cua-gmrk.el is loaded
+(defvar-keymap cua--rectangle-keymap) ; Initialized when cua-rect.el is loaded
+(defvar-keymap cua--region-keymap)
(defvar cua--ena-cua-keys-keymap nil)
(defvar cua--ena-prefix-override-keymap nil)
diff --git a/lisp/emulation/viper-ex.el b/lisp/emulation/viper-ex.el
index d1bf5e38d53..ec7b1e4cac3 100644
--- a/lisp/emulation/viper-ex.el
+++ b/lisp/emulation/viper-ex.el
@@ -1547,7 +1547,7 @@ reversed."
(if skip-rest
()
;; setup buffer
- (if (setq wind (viper-get-visible-buffer-window buf))
+ (if (setq wind (get-buffer-window buf 'visible))
()
(setq wind (get-lru-window 'visible))
(set-window-buffer wind buf))
diff --git a/lisp/emulation/viper-init.el b/lisp/emulation/viper-init.el
index 5430cd700bd..df2487a4477 100644
--- a/lisp/emulation/viper-init.el
+++ b/lisp/emulation/viper-init.el
@@ -71,7 +71,7 @@ In all likelihood, you don't need to bother with this setting."
(defun viper-has-face-support-p ()
(cond ((viper-window-display-p))
(viper-force-faces)
- ((x-display-color-p))
+ ((display-color-p))
(t (memq window-system '(pc)))))
diff --git a/lisp/emulation/viper-keym.el b/lisp/emulation/viper-keym.el
index ca175c140cd..ed978805596 100644
--- a/lisp/emulation/viper-keym.el
+++ b/lisp/emulation/viper-keym.el
@@ -79,9 +79,9 @@ If nil, C-h gets the usual Vi bindings."
;; Keymaps for vital things like \e and C-z.
;; Not for users
-(defvar viper-vi-intercept-map (make-sparse-keymap))
-(defvar viper-insert-intercept-map (make-sparse-keymap))
-(defvar viper-emacs-intercept-map (make-sparse-keymap))
+(defvar-keymap viper-vi-intercept-map)
+(defvar-keymap viper-insert-intercept-map)
+(defvar-keymap viper-emacs-intercept-map)
(defvar-local viper-vi-local-user-map (make-sparse-keymap)
"Keymap for user-defined local bindings.
@@ -91,60 +91,62 @@ For instance, in letter-mode, one may want to bind ZZ to
to `save-buffers-kill-emacs' then post article, etc.")
(put 'viper-vi-local-user-map 'permanent-local t)
-(defvar viper-vi-global-user-map (make-sparse-keymap)
- "Keymap for user-defined global bindings.
+(defvar-keymap viper-vi-global-user-map
+ :doc "Keymap for user-defined global bindings.
These bindings are seen in all Viper buffers.")
-(defvar viper-vi-basic-map (make-keymap)
- "This is the main keymap in effect in Viper's Vi state.
-This map is global, shared by all buffers.")
+(defvar-keymap viper-vi-basic-map
+ :doc "This is the main keymap in effect in Viper's Vi state.
+This map is global, shared by all buffers."
+ :full t)
-(defvar viper-vi-kbd-map (make-sparse-keymap)
- "This keymap keeps keyboard macros defined via the :map command.")
+(defvar-keymap viper-vi-kbd-map
+ :doc "This keymap keeps keyboard macros defined via the :map command.")
-(defvar viper-vi-diehard-map (make-sparse-keymap)
- "This keymap is in use when the user asks Viper to simulate Vi very closely.
-This happens when viper-expert-level is 1 or 2. See viper-set-expert-level.")
+(defvar-keymap viper-vi-diehard-map
+ :doc "This keymap is in use when the user asks Viper to simulate Vi very closely.
+This happens when `viper-expert-level' is 1 or 2. See `viper-set-expert-level'.")
(defvar-local viper-insert-local-user-map (make-sparse-keymap)
"Auxiliary map for per-buffer user-defined keybindings in Insert state.")
(put 'viper-insert-local-user-map 'permanent-local t)
-(defvar viper-insert-global-user-map (make-sparse-keymap)
- "Auxiliary map for global user-defined bindings in Insert state.")
+(defvar-keymap viper-insert-global-user-map
+ :doc "Auxiliary map for global user-defined bindings in Insert state.")
-(defvar viper-insert-basic-map (make-sparse-keymap)
- "The basic insert-mode keymap.")
+(defvar-keymap viper-insert-basic-map
+ :doc "The basic insert-mode keymap.")
-(defvar viper-insert-diehard-map (make-keymap)
- "Map used when user wants vi-style keys in insert mode.
+(defvar-keymap viper-insert-diehard-map
+ :doc "Map used when user wants vi-style keys in insert mode.
Most of the Emacs keys are suppressed. This map overshadows
-viper-insert-basic-map. Not recommended, except for novice users.")
+`viper-insert-basic-map'. Not recommended, except for novice users."
+ :full t)
-(defvar viper-insert-kbd-map (make-sparse-keymap)
- "This keymap keeps VI-style kbd macros for insert mode.")
+(defvar-keymap viper-insert-kbd-map
+ :doc "This keymap keeps VI-style kbd macros for insert mode.")
-(defvar viper-replace-map (make-sparse-keymap)
- "Map used in Viper's replace state.")
+(defvar-keymap viper-replace-map
+ :doc "Map used in Viper's replace state.")
-(defvar viper-emacs-global-user-map (make-sparse-keymap)
- "Auxiliary map for global user-defined bindings in Emacs state.")
+(defvar-keymap viper-emacs-global-user-map
+ :doc "Auxiliary map for global user-defined bindings in Emacs state.")
-(defvar viper-emacs-kbd-map (make-sparse-keymap)
- "This keymap keeps Vi-style kbd macros for Emacs mode.")
+(defvar-keymap viper-emacs-kbd-map
+ :doc "This keymap keeps Vi-style kbd macros for Emacs mode.")
(defvar-local viper-emacs-local-user-map (make-sparse-keymap)
"Auxiliary map for local user-defined bindings in Emacs state.")
(put 'viper-emacs-local-user-map 'permanent-local t)
;; This keymap should stay empty
-(defvar viper-empty-keymap (make-sparse-keymap))
+(defvar-keymap viper-empty-keymap)
;; This was the main Vi mode in old versions of VIP which may have been
;; extensively used by VIP users. We declare it as a global var and, after
;; viper-custom-file-name is loaded, we add this keymap to viper-vi-basic-map.
-(defvar viper-mode-map (make-sparse-keymap))
+(defvar-keymap viper-mode-map)
;; Some important keys used in viper
(defcustom viper-toggle-key [(control ?z)] ; "\C-z"
@@ -442,41 +444,41 @@ In insert mode, this key also functions as Meta."
;;; Minibuffer keymap
-(defvar viper-minibuffer-map (make-sparse-keymap)
- "Keymap used to modify keys when Minibuffer is in Insert state.")
+(defvar-keymap viper-minibuffer-map
+ :doc "Keymap used to modify keys when Minibuffer is in Insert state.")
(define-key viper-minibuffer-map "\C-m" 'viper-exit-minibuffer)
(define-key viper-minibuffer-map "\C-j" 'viper-exit-minibuffer)
;; Map used to read Ex-style commands.
-(defvar viper-ex-cmd-map (make-sparse-keymap))
+(defvar-keymap viper-ex-cmd-map)
(define-key viper-ex-cmd-map " " 'ex-cmd-read-exit)
(define-key viper-ex-cmd-map "\t" 'ex-cmd-complete)
;; Keymap for reading file names in Ex-style commands.
-(defvar ex-read-filename-map (make-sparse-keymap))
+(defvar-keymap ex-read-filename-map)
(define-key ex-read-filename-map " " 'viper-complete-filename-or-exit)
(define-key ex-read-filename-map "!" 'viper-handle-!)
;; Some other maps
-(defvar viper-slash-and-colon-map (make-sparse-keymap)
- "This map redefines `/' and `:' to behave as in Vi.
+(defvar-keymap viper-slash-and-colon-map
+ :doc "This map redefines \\`/' and \\`:' to behave as in Vi.
Useful in some modes, such as Gnus, MH, etc.")
(define-key viper-slash-and-colon-map ":" 'viper-ex)
(define-key viper-slash-and-colon-map "/" 'viper-search-forward)
-(defvar viper-comint-mode-modifier-map (make-sparse-keymap)
- "This map modifies comint mode.")
+(defvar-keymap viper-comint-mode-modifier-map
+ :doc "This map modifies comint mode.")
(define-key viper-comint-mode-modifier-map "\C-m" 'viper-exec-key-in-emacs)
(define-key viper-comint-mode-modifier-map "\C-d" 'viper-exec-key-in-emacs)
-(defvar viper-dired-modifier-map (make-sparse-keymap)
- "This map modifies Dired behavior.")
+(defvar-keymap viper-dired-modifier-map
+ :doc "This map modifies Dired behavior.")
(define-key viper-dired-modifier-map ":" 'viper-ex)
(define-key viper-dired-modifier-map "/" 'viper-search-forward)
-(defvar viper-gnus-modifier-map (make-sparse-keymap)
- "This map modifies Gnus behavior.")
+(defvar-keymap viper-gnus-modifier-map
+ :doc "This map modifies Gnus behavior.")
(define-key viper-gnus-modifier-map ":" 'viper-ex)
diff --git a/lisp/emulation/viper-util.el b/lisp/emulation/viper-util.el
index 6d23ae9a0fd..25c55acf96c 100644
--- a/lisp/emulation/viper-util.el
+++ b/lisp/emulation/viper-util.el
@@ -1,6 +1,6 @@
;;; viper-util.el --- Utilities used by viper.el -*- lexical-binding:t -*-
-;; Copyright (C) 1994-1997, 1999-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1994-2022 Free Software Foundation, Inc.
;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
;; Package: viper
@@ -57,7 +57,7 @@
(define-obsolete-function-alias 'viper-int-to-char #'identity "27.1")
(define-obsolete-function-alias 'viper-get-face #'facep "27.1")
(define-obsolete-function-alias 'viper-color-defined-p
- #'x-color-defined-p "27.1")
+ #'color-defined-p "27.1")
(define-obsolete-function-alias 'viper-iconify
#'iconify-or-deiconify-frame "27.1")
@@ -71,7 +71,7 @@
(= char char1))
(t nil)))
-(define-obsolete-function-alias 'viper-color-display-p #'x-display-color-p "29.1")
+(define-obsolete-function-alias 'viper-color-display-p #'display-color-p "29.1")
(defun viper-get-cursor-color (&optional _frame)
(cdr (assoc 'cursor-color (frame-parameters))))
@@ -89,8 +89,8 @@ Otherwise return the normal value."
;; cursor colors
(defun viper-change-cursor-color (new-color &optional frame)
- (if (and (viper-window-display-p) (x-display-color-p)
- (stringp new-color) (x-color-defined-p new-color)
+ (if (and (viper-window-display-p) (display-color-p)
+ (stringp new-color) (color-defined-p new-color)
(not (string= new-color (viper-get-cursor-color))))
(modify-frame-parameters
(or frame (selected-frame))
@@ -121,9 +121,9 @@ Otherwise return the normal value."
;; By default, saves current frame cursor color before changing viper state
(defun viper-save-cursor-color (before-which-mode)
- (if (and (viper-window-display-p) (x-display-color-p))
+ (if (and (viper-window-display-p) (display-color-p))
(let ((color (viper-get-cursor-color)))
- (if (and (stringp color) (x-color-defined-p color)
+ (if (and (stringp color) (color-defined-p color)
;; there is something fishy in that the color is not saved if
;; it is the same as frames default cursor color. need to be
;; checked.
@@ -175,35 +175,23 @@ Otherwise return the normal value."
;; Check the current version against the major and minor version numbers
-;; using op: cur-vers op major.minor If emacs-major-version or
-;; emacs-minor-version are not defined, we assume that the current version
-;; is hopelessly outdated. We assume that emacs-major-version and
-;; emacs-minor-version are defined. Otherwise, for Emacs/XEmacs 19, if the
-;; current minor version is < 10 (xemacs) or < 23 (emacs) the return value
-;; will be nil (when op is =, >, or >=) and t (when op is <, <=), which may be
-;; incorrect. However, this gives correct result in our cases, since we are
-;; testing for sufficiently high Emacs versions.
-(defun viper-check-version (op major minor &optional type-of-emacs)
+;; using op: cur-vers op major.minor
+(defun viper-check-version (op major minor &optional _type-of-emacs)
(declare (obsolete nil "28.1"))
- (if (and (boundp 'emacs-major-version) (boundp 'emacs-minor-version))
- (and (cond ((eq type-of-emacs 'xemacs) (featurep 'xemacs))
- ((eq type-of-emacs 'emacs) (featurep 'emacs))
- (t t))
- (cond ((eq op '=) (and (= emacs-minor-version minor)
- (= emacs-major-version major)))
- ((memq op '(> >= < <=))
- (and (or (funcall op emacs-major-version major)
- (= emacs-major-version major))
- (if (= emacs-major-version major)
- (funcall op emacs-minor-version minor)
- t)))
- (t
- (error "%S: Invalid op in viper-check-version" op))))
- (cond ((memq op '(= > >=)) nil)
- ((memq op '(< <=)) t))))
+ (cond ((eq op '=) (and (= emacs-minor-version minor)
+ (= emacs-major-version major)))
+ ((memq op '(> >= < <=))
+ (and (or (funcall op emacs-major-version major)
+ (= emacs-major-version major))
+ (if (= emacs-major-version major)
+ (funcall op emacs-minor-version minor)
+ t)))
+ (t
+ (error "%S: Invalid op in viper-check-version" op))))
(defun viper-get-visible-buffer-window (wind)
+ (declare (obsolete "use `(get-buffer-window wind 'visible)'." "29.1"))
(get-buffer-window wind 'visible))
;; Return line position.
@@ -1005,6 +993,7 @@ Otherwise return the normal value."
(t (prin1-to-string event-seq)))))
(defun viper-key-press-events-to-chars (events)
+ (declare (obsolete nil "29.1"))
(mapconcat #'char-to-string events ""))
diff --git a/lisp/emulation/viper.el b/lisp/emulation/viper.el
index be87d788e92..d1c8b5ff2dd 100644
--- a/lisp/emulation/viper.el
+++ b/lisp/emulation/viper.el
@@ -7,7 +7,7 @@
;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
;; Keywords: emulations
-;; Version: 3.14.1
+;; Version: 3.14.2
;; Yoni Rabkin <yoni@rabkins.net> contacted the maintainer of this
;; file on 20/3/2008, and the maintainer agreed that when a bug is
@@ -379,7 +379,7 @@ widget."
flora-mode
sql-mode
- text-mode indented-text-mode
+ text-mode
tex-mode latex-mode bibtex-mode
ps-mode
@@ -605,7 +605,7 @@ This startup message appears whenever you load Viper, unless you type \\`y' now.
;; Apply a little heuristic to invoke vi state on major-modes
;; that are not listed in viper-vi-state-mode-list
-(defun this-major-mode-requires-vi-state (mode)
+(defun viper-this-major-mode-requires-vi-state (mode)
(let ((major-mode mode))
(cond ((apply #'derived-mode-p viper-vi-state-mode-list) t)
((apply #'derived-mode-p viper-emacs-state-mode-list) nil)
@@ -634,7 +634,7 @@ This startup message appears whenever you load Viper, unless you type \\`y' now.
(remove-hook symbol #'viper-minibuffer-post-command-hook)
(remove-hook symbol #'viper-minibuffer-setup-sentinel)
(remove-hook symbol #'viper-major-mode-change-sentinel)
- (remove-hook symbol #'set-viper-state-in-major-mode)
+ (remove-hook symbol #'viper-set-state-in-major-mode)
(remove-hook symbol #'viper-post-command-sentinel)
)))
@@ -786,12 +786,12 @@ It also can't undo some Viper settings."
(defvar viper-new-major-mode-buffer-list nil)
;; set appropriate Viper state in buffers that changed major mode
-(defun set-viper-state-in-major-mode ()
+(defun viper-set-state-in-major-mode ()
(mapc
(lambda (buf)
(if (viper-buffer-live-p buf)
(with-current-buffer buf
- (cond ((and (this-major-mode-requires-vi-state major-mode)
+ (cond ((and (viper-this-major-mode-requires-vi-state major-mode)
(eq viper-current-state 'emacs-state))
(viper-mode))
((cl-member-if #'derived-mode-p viper-emacs-state-mode-list)
@@ -810,7 +810,7 @@ It also can't undo some Viper settings."
;; clear the list of bufs that changed major mode
(setq viper-new-major-mode-buffer-list nil)
;; change the global value of hook
- (remove-hook 'viper-post-command-hooks #'set-viper-state-in-major-mode))
+ (remove-hook 'viper-post-command-hooks #'viper-set-state-in-major-mode))
;; sets up post-command-hook to turn viper-mode, if the current mode is
;; fundamental
@@ -820,7 +820,7 @@ It also can't undo some Viper settings."
(setq viper-new-major-mode-buffer-list
(cons (current-buffer) viper-new-major-mode-buffer-list))))
;; change the global value of hook
- (add-hook 'viper-post-command-hooks #'set-viper-state-in-major-mode t))
+ (add-hook 'viper-post-command-hooks #'viper-set-state-in-major-mode t))
;;; Handling of tty's ESC event
@@ -891,7 +891,7 @@ Two differences:
(viper-setup-ESC-to-escape t)
(add-hook 'change-major-mode-hook #'viper-major-mode-change-sentinel)
- (add-hook 'find-file-hook #'set-viper-state-in-major-mode)
+ (add-hook 'find-file-hook #'viper-set-state-in-major-mode)
;; keep this because many modes we don't know about use this hook
(defvar text-mode-hook)
@@ -1242,12 +1242,15 @@ These two lines must come in the order given."))
(when (eq viper-current-state 'emacs-state)
(viper-change-state-to-emacs))
- (if (this-major-mode-requires-vi-state major-mode)
+ (if (viper-this-major-mode-requires-vi-state major-mode)
(viper-mode))
- (add-function :after initial-major-mode #'set-viper-state-in-major-mode))
-
+ (add-function :after initial-major-mode #'viper-set-state-in-major-mode))
+(define-obsolete-function-alias 'set-viper-state-in-major-mode
+ #'viper-set-state-in-major-mode "29.1")
+(define-obsolete-function-alias 'this-major-mode-requires-vi-state
+ #'viper-this-major-mode-requires-vi-state "29.1")
(run-hooks 'viper-load-hook) ; the last chance to change something
diff --git a/lisp/env.el b/lisp/env.el
index a35383a13b1..5cdedbfb99a 100644
--- a/lisp/env.el
+++ b/lisp/env.el
@@ -1,6 +1,6 @@
;;; env.el --- functions to manipulate environment variables -*- lexical-binding:t -*-
-;; Copyright (C) 1991, 1994, 2000-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1991-2022 Free Software Foundation, Inc.
;; Maintainer: emacs-devel@gnu.org
;; Keywords: processes, unix
diff --git a/lisp/epa-ks.el b/lisp/epa-ks.el
index f41429f7734..7c60b659f0a 100644
--- a/lisp/epa-ks.el
+++ b/lisp/epa-ks.el
@@ -295,13 +295,11 @@ enough, since keyservers have strict timeout settings."
:created
(and (match-string 4)
(not (string-empty-p (match-string 4)))
- (time-convert
- (string-to-number (match-string 4))))
+ (time-convert (string-to-number (match-string 4)) t))
:expires
(and (match-string 5)
(not (string-empty-p (match-string 5)))
- (time-convert
- (string-to-number (match-string 5))))
+ (time-convert (string-to-number (match-string 5)) t))
:flags
(mapcar (lambda (flag)
(cdr (assq flag '((?r revoked)
diff --git a/lisp/epg.el b/lisp/epg.el
index c5d946cb76c..c3c26badbba 100644
--- a/lisp/epg.el
+++ b/lisp/epg.el
@@ -606,7 +606,7 @@ callback data (if any)."
process
terminal-name
agent-file
- (agent-mtime '(0 0 0 0)))
+ (agent-mtime 0))
;; Set GPG_TTY and TERM for pinentry-curses. Note that we can't
;; use `terminal-name' here to get the real pty name for the child
;; process, though /dev/fd/0" is not portable.
@@ -633,7 +633,7 @@ callback data (if any)."
(setq agent-file (match-string 1 agent-info)
agent-mtime (or (file-attribute-modification-time
(file-attributes agent-file))
- '(0 0 0 0))))
+ 0)))
(if epg-debug
(save-excursion
(unless epg-debug-buffer
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index 8be4894ecbb..df9efe4b0c3 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -230,7 +230,7 @@ current IRC process is still alive.")
(defvar-local erc-server-lines-sent nil
"Line counter.")
-(defvar-local erc-server-last-peers '(nil . nil)
+(defvar-local erc-server-last-peers nil
"Last peers used, both sender and receiver.
Those are used for /MSG destination shortcuts.")
@@ -562,7 +562,7 @@ TLS (see `erc-session-client-certificate' for more details)."
(setq erc-server-last-received-time time))
(setq erc-server-lines-sent 0)
;; last peers (sender and receiver)
- (setq erc-server-last-peers '(nil . nil)))
+ (setq erc-server-last-peers (cons nil nil)))
;; we do our own encoding and decoding
(when (fboundp 'set-process-coding-system)
(set-process-coding-system process 'raw-text))
@@ -939,21 +939,20 @@ be used. If the target is \".\", the last person you've sent a message
to will be used."
(cond
((string-match "^\\s-*\\(\\S-+\\) ?\\(.*\\)" line)
- (let ((tgt (match-string 1 line))
- (s (match-string 2 line)))
+ (let* ((tgt (match-string 1 line))
+ (s (match-string 2 line))
+ (server-buffer (erc-server-buffer))
+ (peers (buffer-local-value 'erc-server-last-peers server-buffer)))
(erc-log (format "cmd: MSG(%s): [%s] %s" message-command tgt s))
(cond
((string= tgt ",")
- (if (car erc-server-last-peers)
- (setq tgt (car erc-server-last-peers))
- (setq tgt nil)))
+ (setq tgt (car peers)))
((string= tgt ".")
- (if (cdr erc-server-last-peers)
- (setq tgt (cdr erc-server-last-peers))
- (setq tgt nil))))
+ (setq tgt (cdr peers))))
(cond
(tgt
- (setcdr erc-server-last-peers tgt)
+ (with-current-buffer server-buffer
+ (setq erc-server-last-peers (cons (car peers) tgt)))
(erc-server-send (format "%s %s :%s" message-command tgt s)
force))
(t
@@ -1012,21 +1011,15 @@ PROCs `process-buffer' is `current-buffer' when this function is called."
(save-match-data
(let* ((tag-list (when (eq (aref string 0) ?@)
(substring string 1
- (if (>= emacs-major-version 28)
- (string-search " " string)
- (string-match " " string)))))
+ (string-search " " string))))
(msg (make-erc-response :unparsed string :tags (when tag-list
(erc-parse-tags
tag-list))))
(string (if tag-list
- (substring string (+ 1 (if (>= emacs-major-version 28)
- (string-search " " string)
- (string-match " " string))))
+ (substring string (+ 1 (string-search " " string)))
string))
(posn (if (eq (aref string 0) ?:)
- (if (>= emacs-major-version 28)
- (string-search " " string)
- (string-match " " string))
+ (string-search " " string)
0)))
(setf (erc-response.sender msg)
@@ -1036,9 +1029,7 @@ PROCs `process-buffer' is `current-buffer' when this function is called."
(setf (erc-response.command msg)
(let* ((bposn (string-match "[^ \n]" string posn))
- (eposn (if (>= emacs-major-version 28)
- (string-search " " string bposn)
- (string-match " " string bposn))))
+ (eposn (string-search " " string bposn)))
(setq posn (and eposn
(string-match "[^ \n]" string eposn)))
(substring string bposn eposn)))
@@ -1046,9 +1037,7 @@ PROCs `process-buffer' is `current-buffer' when this function is called."
(while (and posn
(not (eq (aref string posn) ?:)))
(push (let* ((bposn posn)
- (eposn (if (>= emacs-major-version 28)
- (string-search " " string bposn)
- (string-match " " string bposn))))
+ (eposn (string-search " " string bposn)))
(setq posn (and eposn
(string-match "[^ \n]" string eposn)))
(substring string bposn eposn))
@@ -1526,11 +1515,13 @@ add things to `%s' instead."
(setf (erc-response.contents parsed) msg)
(setq buffer (erc-get-buffer (if privp nick tgt) proc))
;; Even worth checking for empty target here? (invalid anyway)
- (unless (or buffer noticep (string-empty-p tgt) (eq ?$ (aref tgt 0)))
- (if (and privp msgp (not (erc-is-message-ctcp-and-not-action-p msg)))
+ (unless (or buffer noticep (string-empty-p tgt) (eq ?$ (aref tgt 0))
+ (erc-is-message-ctcp-and-not-action-p msg))
+ (if privp
(when erc-auto-query
(let ((erc-join-buffer erc-auto-query))
(setq buffer (erc--open-target nick))))
+ ;; A channel buffer has been killed but is still joined
(setq buffer (erc--open-target tgt))))
(when buffer
(with-current-buffer buffer
@@ -1550,7 +1541,7 @@ add things to `%s' instead."
(erc-process-ctcp-reply proc parsed nick login host
(match-string 1 msg)))))
(t
- (setcar erc-server-last-peers nick)
+ (setq erc-server-last-peers (cons nick (cdr erc-server-last-peers)))
(setq s (erc-format-privmessage
(or fnick nick) msg
;; If buffer is a query buffer,
@@ -1667,9 +1658,7 @@ Then display the welcome message."
start (- (match-end 0) 3))
(setq start (match-end 0))))
v))
- (if (if (>= emacs-major-version 28)
- (string-search "," value)
- (string-match-p "," value))
+ (if (string-search "," value)
(split-string value ",")
(list value)))))
diff --git a/lisp/erc/erc-compat.el b/lisp/erc/erc-compat.el
index 16cfb15a5ae..8a00e711acd 100644
--- a/lisp/erc/erc-compat.el
+++ b/lisp/erc/erc-compat.el
@@ -25,8 +25,14 @@
;; This mostly defines stuff that cannot be worked around easily.
+;; ERC depends on the `compat' library from GNU ELPA for supporting
+;; older versions of Emacs. See this discussion for additional info:
+;; https://lists.gnu.org/archive/html/emacs-devel/2022-07/msg00512.html
+
;;; Code:
+(require 'compat nil 'noerror)
+
;;;###autoload(autoload 'erc-define-minor-mode "erc-compat")
(define-obsolete-function-alias 'erc-define-minor-mode
#'define-minor-mode "28.1")
diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index d0e1848e0eb..977080a4de1 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -191,9 +191,7 @@ compared with `erc-nick-equal-p' which is IRC case-insensitive."
test (cadr (plist-member elt prop)))
;; if the property exists and is equal, we continue, else, try the
;; next element of the list
- (or (and (eq prop :nick) (if (>= emacs-major-version 28)
- (string-search "!" val)
- (string-match "!" val))
+ (or (and (eq prop :nick) (string-search "!" val)
test (string-equal test val))
(and (eq prop :nick)
test val
@@ -659,13 +657,7 @@ that subcommand."
(define-inline erc-dcc-unquote-filename (filename)
(inline-quote
- (if (>= emacs-major-version 28)
- (string-replace
- "\\\\" "\\"
- (string-replace "\\\"" "\"" ,filename))
- (replace-regexp-in-string
- "\\\\\\\\" "\\"
- (replace-regexp-in-string "\\\\\"" "\"" ,filename t t) t t))))
+ (string-replace "\\\\" "\\" (string-replace "\\\"" "\"" ,filename))))
(defun erc-dcc-handle-ctcp-send (proc query nick login host to)
"This is called if a CTCP DCC SEND subcommand is sent to the client.
@@ -987,7 +979,7 @@ The contents of the BUFFER will then be erased."
;; If people really need this, we can convert it into a proper option.
-(defvar erc-dcc--X-send-final-turbo-ack nil
+(defvar erc-dcc--send-final-turbo-ack nil
"Workaround for maverick turbo senders that only require a final ACK.
The only known culprit is WeeChat, with its xfer.network.fast_send
option, which is on by default. Leaving this set to nil and calling
@@ -1032,7 +1024,7 @@ rather than every 1024 byte block, but nobody seems to care."
;; Some senders want us to hang up. Only observed w. TSEND.
((and (plist-get erc-dcc-entry-data :turbo)
(= received-bytes (plist-get erc-dcc-entry-data :size)))
- (when erc-dcc--X-send-final-turbo-ack
+ (when erc-dcc--send-final-turbo-ack
(process-send-string proc (erc-pack-int received-bytes)))
(delete-process proc))
((not (or (plist-get erc-dcc-entry-data :turbo)
@@ -1182,18 +1174,18 @@ other client."
(proc (plist-get entry :peer))
(parent-proc (plist-get entry :parent)))
(erc-setup-buffer buffer)
- ;; buffer is now the current buffer.
- (erc-dcc-chat-mode)
- (setq erc-server-process parent-proc)
- (setq erc-dcc-from nick)
- (setq erc-dcc-entry-data entry)
- (setq erc-dcc-unprocessed-output "")
- (setq erc-insert-marker (point-max-marker))
- (setq erc-input-marker (make-marker))
- (erc-display-prompt buffer (point-max))
- (set-process-buffer proc buffer)
- (add-hook 'kill-buffer-hook #'erc-dcc-chat-buffer-killed nil t)
- (run-hook-with-args 'erc-dcc-chat-connect-hook proc)
+ (with-current-buffer buffer
+ (erc-dcc-chat-mode)
+ (setq erc-server-process parent-proc
+ erc-dcc-from nick
+ erc-dcc-entry-data entry
+ erc-dcc-unprocessed-output ""
+ erc-insert-marker (point-max-marker)
+ erc-input-marker (make-marker))
+ (erc-display-prompt buffer (point-max))
+ (set-process-buffer proc buffer)
+ (add-hook 'kill-buffer-hook #'erc-dcc-chat-buffer-killed nil t)
+ (run-hook-with-args 'erc-dcc-chat-connect-hook proc))
buffer))
(defun erc-dcc-chat-accept (entry parent-proc)
diff --git a/lisp/erc/erc-networks.el b/lisp/erc/erc-networks.el
index 091b8aa92d7..c54b12fcb0b 100644
--- a/lisp/erc/erc-networks.el
+++ b/lisp/erc/erc-networks.el
@@ -1547,6 +1547,3 @@ VALUE is the options value.")
(provide 'erc-networks)
;;; erc-networks.el ends here
-;;
-;; Local Variables:
-;; End:
diff --git a/lisp/erc/erc-speedbar.el b/lisp/erc/erc-speedbar.el
index 5b06c21612f..11979a01301 100644
--- a/lisp/erc/erc-speedbar.el
+++ b/lisp/erc/erc-speedbar.el
@@ -31,8 +31,7 @@
;; * Write intelligent update function:
;; update-channel, update-nick, remove-nick-from-channel, ...
;; * Use indicator-strings for op/voice
-;; * Extract/convert face notes field from bbdb if available and show
-;; it using sb-image.el
+;; * Extract/convert face notes field from bbdb if available
;;
;;; Code:
@@ -139,9 +138,7 @@ This will add a speedbar major display mode."
t))))
(defun erc-speedbar-expand-server (text server indent)
- (cond ((if (>= emacs-major-version 28)
- (string-search "+" text)
- (string-match "\\+" text))
+ (cond ((string-search "+" text)
(speedbar-change-expand-button-char ?-)
(if (speedbar-with-writable
(save-excursion
@@ -150,9 +147,7 @@ This will add a speedbar major display mode."
(speedbar-change-expand-button-char ?-)
(speedbar-change-expand-button-char ??)))
(;; we have to contract this node
- (if (>= emacs-major-version 28)
- (string-search "-" text)
- (string-match "-" text))
+ (string-search "-" text)
(speedbar-change-expand-button-char ?+)
(speedbar-delete-subblock indent))
(t (error "Ooops... not sure what to do")))
@@ -189,9 +184,7 @@ This will add a speedbar major display mode."
"For the line matching TEXT, in CHANNEL, expand or contract a line.
INDENT is the current indentation level."
(cond
- ((if (>= emacs-major-version 28)
- (string-search "+" text)
- (string-match "\\+" text))
+ ((string-search "+" text)
(speedbar-change-expand-button-char ?-)
(speedbar-with-writable
(save-excursion
@@ -240,9 +233,7 @@ INDENT is the current indentation level."
(speedbar-with-writable
(dolist (entry names)
(erc-speedbar-insert-user entry ?+ (1+ indent))))))))))
- ((if (>= emacs-major-version 28)
- (string-search "-" text)
- (string-match "-" text))
+ ((string-search "-" text)
(speedbar-change-expand-button-char ?+)
(speedbar-delete-subblock indent))
(t (error "Ooops... not sure what to do")))
@@ -293,9 +284,7 @@ The update is only done when the channel is actually expanded already."
(erc-speedbar-expand-channel "+" buffer 1)))))
(defun erc-speedbar-expand-user (text token indent)
- (cond ((if (>= emacs-major-version 28)
- (string-search "+" text)
- (string-match "\\+" text))
+ (cond ((string-search "+" text)
(speedbar-change-expand-button-char ?-)
(speedbar-with-writable
(save-excursion
@@ -318,9 +307,7 @@ The update is only done when the channel is actually expanded already."
nil nil nil nil
info nil nil nil
(1+ indent)))))))
- ((if (>= emacs-major-version 28)
- (string-search "-" text)
- (string-match "-" text))
+ ((string-search "-" text)
(speedbar-change-expand-button-char ?+)
(speedbar-delete-subblock indent))
(t (error "Ooops... not sure what to do")))
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index 0a16831fba3..151d75e7ce1 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -2,7 +2,7 @@
;; Copyright (C) 1997-2022 Free Software Foundation, Inc.
-;; Author: Alexander L. Belikoff (alexander@belikoff.net)
+;; Author: Alexander L. Belikoff <alexander@belikoff.net>
;; Maintainer: Amin Bandali <bandali@gnu.org>, F. Jason Park <jp@neverwas.me>
;; Contributors: Sergey Berezin (sergey.berezin@cs.cmu.edu),
;; Mario Lang (mlang@delysid.org),
@@ -13,7 +13,7 @@
;; Michael Olson (mwolson@gnu.org)
;; Kelvin White (kwhite@gnu.org)
;; Version: 5.4.1
-;; Package-Requires: ((emacs "27.1"))
+;; Package-Requires: ((emacs "27.1") (compat "28.1.2.0"))
;; Keywords: IRC, chat, client, Internet
;; URL: https://www.gnu.org/software/emacs/erc.html
@@ -69,6 +69,8 @@
(require 'iso8601)
(eval-when-compile (require 'subr-x))
+(require 'erc-compat)
+
(defconst erc-version "5.4.1"
"This version of ERC.")
@@ -3519,9 +3521,7 @@ Without SECRET, consult auth-source, possibly passing SERVER as the
"Non-nil when channel is server-local on a network that allows them."
(and-let* (((eq ?& (aref channel 0)))
(chan-types (erc--get-isupport-entry 'CHANTYPES 'single))
- ((if (>= emacs-major-version 28)
- (string-search "&" chan-types)
- (string-match-p "&" chan-types))))))
+ ((string-search "&" chan-types)))))
(defun erc-cmd-JOIN (channel &optional key)
"Join the channel given in CHANNEL, optionally with KEY.
@@ -4654,8 +4654,9 @@ a new window, but not to select it. See the documentation for
(const :tag "Use current buffer" buffer)
(const :tag "Use current buffer" t)))
-;; FIXME either retire this or put it to use or more clearly explain
-;; what it's supposed to do. It's currently only used by the obsolete
+;; FIXME either retire this or put it to use after determining how
+;; it's meant to work. Clearly, the doc string does not describe
+;; current behavior. It's currently only used by the obsolete
;; function `erc-auto-query'.
(defcustom erc-query-on-unjoined-chan-privmsg t
"If non-nil create query buffer on receiving any PRIVMSG at all.
@@ -7004,21 +7005,12 @@ shortened server name instead."
(fill-region (point-min) (point-max))
(buffer-string))))
(setq header-line-format
- (if (>= emacs-major-version 28)
- (string-replace
- "%"
- "%%"
- (if face
- (propertize header 'help-echo help-echo
- 'face face)
- (propertize header 'help-echo help-echo)))
- (replace-regexp-in-string
- "%"
- "%%"
- (if face
- (propertize header 'help-echo help-echo
- 'face face)
- (propertize header 'help-echo help-echo)))))))
+ (string-replace
+ "%"
+ "%%"
+ (if face
+ (propertize header 'help-echo help-echo 'face face)
+ (propertize header 'help-echo help-echo))))))
(t (setq header-line-format
(if face
(propertize header 'face face)
@@ -7303,9 +7295,7 @@ functions."
nick user host channel
(if (not (string= reason ""))
(format ": %s"
- (if (>= emacs-major-version 28)
- (string-replace "%" "%%" reason)
- (replace-regexp-in-string "%" "%%" reason)))
+ (string-replace "%" "%%" reason))
"")))))
diff --git a/lisp/eshell/em-alias.el b/lisp/eshell/em-alias.el
index 5d3aaf7c81c..9ad218d5988 100644
--- a/lisp/eshell/em-alias.el
+++ b/lisp/eshell/em-alias.el
@@ -206,7 +206,7 @@ file named by `eshell-aliases-file'.")
(let ((eshell-current-handles
(eshell-create-handles eshell-aliases-file 'overwrite)))
(eshell/alias)
- (eshell-close-handles 0))))
+ (eshell-close-handles 0 'nil))))
(defsubst eshell-lookup-alias (name)
"Check whether NAME is aliased. Return the alias if there is one."
diff --git a/lisp/eshell/em-extpipe.el b/lisp/eshell/em-extpipe.el
index 3db1dea5955..7d81f27a18f 100644
--- a/lisp/eshell/em-extpipe.el
+++ b/lisp/eshell/em-extpipe.el
@@ -49,7 +49,7 @@
(add-hook 'eshell-pre-rewrite-command-hook
#'eshell-rewrite-external-pipeline -20 t))
-(defmacro em-extpipe--or-with-catch (&rest disjuncts)
+(defmacro eshell-extpipe--or-with-catch (&rest disjuncts)
"Evaluate DISJUNCTS like `or' but catch `eshell-incomplete'.
If `eshell-incomplete' is thrown during the evaluation of a
@@ -118,7 +118,7 @@ as though it were Eshell syntax."
(if (re-search-forward pat next t)
(throw 'found (match-beginning 1))
(goto-char next)
- (while (em-extpipe--or-with-catch
+ (while (eshell-extpipe--or-with-catch
(eshell-parse-lisp-argument)
(eshell-parse-backslash)
(eshell-parse-double-quote)
diff --git a/lisp/eshell/em-hist.el b/lisp/eshell/em-hist.el
index 1877749c5cf..1db239b9f72 100644
--- a/lisp/eshell/em-hist.el
+++ b/lisp/eshell/em-hist.el
@@ -55,7 +55,6 @@
;;; Code:
(eval-when-compile (require 'cl-lib))
-(eval-when-compile (require 'subr-x)) ; `string-blank-p'
(require 'ring)
(require 'esh-opt)
diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el
index 3967817b0ed..68276b22d95 100644
--- a/lisp/eshell/em-unix.el
+++ b/lisp/eshell/em-unix.el
@@ -968,7 +968,7 @@ Show wall-clock time elapsed during execution of COMMAND.")
(if eshell-diff-window-config
(set-window-configuration eshell-diff-window-config)))
-(defun nil-blank-string (string)
+(defun eshell-nil-blank-string (string)
"Return STRING, or nil if STRING contains only blank characters."
(cond
((string-match "[^[:blank:]]" string) string)
@@ -999,7 +999,7 @@ Show wall-clock time elapsed during execution of COMMAND.")
(condition-case nil
(diff-no-select
old new
- (nil-blank-string (eshell-flatten-and-stringify args)))
+ (eshell-nil-blank-string (eshell-flatten-and-stringify args)))
(error
(throw 'eshell-replace-command
(eshell-parse-command "*diff" orig-args))))
@@ -1049,6 +1049,8 @@ Show wall-clock time elapsed during execution of COMMAND.")
(put 'eshell/occur 'eshell-no-numeric-conversions t)
+(define-obsolete-function-alias 'nil-blank-string #'eshell-nil-blank-string "29.1")
+
(provide 'em-unix)
;; Local Variables:
diff --git a/lisp/eshell/esh-arg.el b/lisp/eshell/esh-arg.el
index 459487f4358..8e44a88459f 100644
--- a/lisp/eshell/esh-arg.el
+++ b/lisp/eshell/esh-arg.el
@@ -186,7 +186,7 @@ If QUOTED is nil, the resulting value(s) may be converted to
numbers (see `eshell-concat-1').
If each argument in REST is a non-list value, the result will be
-a single value, as if (mapconcat #'eshell-stringify REST) had been
+a single value, as if (mapconcat #\\='eshell-stringify REST) had been
called, possibly converted to a number.
If there is at least one (non-nil) list argument, the result will
diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el
index 775e4c1057e..2f77f3f4974 100644
--- a/lisp/eshell/esh-cmd.el
+++ b/lisp/eshell/esh-cmd.el
@@ -133,6 +133,10 @@ There are several different kinds of commands, however."
Such arguments will be passed to `read', and then evaluated."
:type 'regexp)
+(defcustom eshell-lisp-form-nil-is-failure t
+ "If non-nil, Lisp forms like (COMMAND ARGS) treat a nil result as failure."
+ :type 'boolean)
+
(defcustom eshell-pre-command-hook nil
"A hook run before each interactive command is invoked."
:type 'hook)
@@ -541,9 +545,7 @@ implemented via rewriting, rather than as a function."
,(eshell-invokify-arg body t)))
(setcar for-items (cadr for-items))
(setcdr for-items (cddr for-items)))
- (eshell-close-handles
- eshell-last-command-status
- (list 'quote eshell-last-command-result))))))
+ (eshell-close-handles)))))
(defun eshell-structure-basic-command (func names keyword test body
&optional else)
@@ -551,10 +553,11 @@ implemented via rewriting, rather than as a function."
The first of NAMES should be the positive form, and the second the
negative. It's not likely that users should ever need to call this
function."
- ;; If the test form begins with `eshell-convert', it means
- ;; something data-wise will be returned, and we should let
- ;; that determine the truth of the statement.
- (unless (eq (car test) 'eshell-convert)
+ ;; If the test form begins with `eshell-convert' or
+ ;; `eshell-escape-arg', it means something data-wise will be
+ ;; returned, and we should let that determine the truth of the
+ ;; statement.
+ (unless (memq (car test) '(eshell-convert eshell-escape-arg))
(setq test
`(progn ,test
(eshell-exit-success-p))))
@@ -574,9 +577,7 @@ function."
`(let ((eshell-command-body '(nil))
(eshell-test-body '(nil)))
(,func ,test ,body ,else)
- (eshell-close-handles
- eshell-last-command-status
- (list 'quote eshell-last-command-result))))
+ (eshell-close-handles)))
(defun eshell-rewrite-while-command (terms)
"Rewrite a `while' command into its equivalent Eshell command form.
@@ -606,7 +607,7 @@ must be implemented via rewriting, rather than as a function."
t))
(if (= (length terms) 4)
`(eshell-protect
- ,(eshell-invokify-arg (car (last terms)))) t))))
+ ,(eshell-invokify-arg (car (last terms)) t))))))
(defvar eshell-last-command-result) ;Defined in esh-io.el.
@@ -1121,7 +1122,7 @@ be finished later after the completion of an asynchronous subprocess."
(setcar eshell-test-body nil))
(unless (car eshell-test-body)
(setcar eshell-test-body (copy-tree (car args))))
- (while (cadr (eshell-do-eval (car eshell-test-body)))
+ (while (cadr (eshell-do-eval (car eshell-test-body) synchronous-p))
(setcar eshell-command-body
(if (cddr args)
`(progn ,@(copy-tree (cdr args)))
@@ -1141,7 +1142,8 @@ be finished later after the completion of an asynchronous subprocess."
(setcar eshell-test-body (copy-tree (car args))))
(setcar eshell-command-body
(copy-tree
- (if (cadr (eshell-do-eval (car eshell-test-body)))
+ (if (cadr (eshell-do-eval (car eshell-test-body)
+ synchronous-p))
(cadr args)
(car (cddr args)))))
(eshell-do-eval (car eshell-command-body) synchronous-p))
@@ -1415,43 +1417,53 @@ via `eshell-errorn'."
(defun eshell-lisp-command (object &optional args)
"Insert Lisp OBJECT, using ARGS if a function."
(catch 'eshell-external ; deferred to an external command
+ (setq eshell-last-command-status 0
+ eshell-last-arguments args)
(let* ((eshell-ensure-newline-p (eshell-interactive-output-p))
+ (command-form-p (functionp object))
(result
- (if (functionp object)
- (progn
- (setq eshell-last-arguments args
- eshell-last-command-name
+ (if command-form-p
+ (let ((numeric (not (get object
+ 'eshell-no-numeric-conversions)))
+ (fname-args (get object 'eshell-filename-arguments)))
+ (when (or numeric fname-args)
+ (while args
+ (let ((arg (car args)))
+ (cond
+ ((and numeric (stringp arg) (> (length arg) 0)
+ (text-property-any 0 (length arg)
+ 'number t arg))
+ ;; If any of the arguments are flagged as
+ ;; numbers waiting for conversion, convert
+ ;; them now.
+ (setcar args (string-to-number arg)))
+ ((and fname-args (stringp arg)
+ (string-equal arg "~"))
+ ;; If any of the arguments match "~",
+ ;; prepend "./" to treat it as a regular
+ ;; file name.
+ (setcar args (concat "./" arg)))))
+ (setq args (cdr args))))
+ (setq eshell-last-command-name
(concat "#<function " (symbol-name object) ">"))
- (let ((numeric (not (get object
- 'eshell-no-numeric-conversions)))
- (fname-args (get object 'eshell-filename-arguments)))
- (when (or numeric fname-args)
- (while args
- (let ((arg (car args)))
- (cond ((and numeric (stringp arg) (> (length arg) 0)
- (text-property-any 0 (length arg)
- 'number t arg))
- ;; If any of the arguments are
- ;; flagged as numbers waiting for
- ;; conversion, convert them now.
- (setcar args (string-to-number arg)))
- ((and fname-args (stringp arg)
- (string-equal arg "~"))
- ;; If any of the arguments match "~",
- ;; prepend "./" to treat it as a
- ;; regular file name.
- (setcar args (concat "./" arg)))))
- (setq args (cdr args)))))
(eshell-apply object eshell-last-arguments))
- (setq eshell-last-arguments args
- eshell-last-command-name "#<Lisp object>")
+ (setq eshell-last-command-name "#<Lisp object>")
(eshell-eval object))))
(if (and eshell-ensure-newline-p
(save-excursion
(goto-char eshell-last-output-end)
(not (bolp))))
(eshell-print "\n"))
- (eshell-close-handles 0 (list 'quote result)))))
+ (eshell-close-handles
+ ;; If `eshell-lisp-form-nil-is-failure' is non-nil, Lisp forms
+ ;; that succeeded but have a nil result should have an exit
+ ;; status of 2.
+ (when (and eshell-lisp-form-nil-is-failure
+ (not command-form-p)
+ (= eshell-last-command-status 0)
+ (not result))
+ 2)
+ (list 'quote result)))))
(defalias 'eshell-lisp-command* #'eshell-lisp-command)
diff --git a/lisp/eshell/esh-io.el b/lisp/eshell/esh-io.el
index c035890ddf0..27703976f6d 100644
--- a/lisp/eshell/esh-io.el
+++ b/lisp/eshell/esh-io.el
@@ -254,6 +254,30 @@ a nil value of mode defaults to `insert'."
(setq idx (1+ idx))))
handles)
+(defun eshell-close-handles (&optional exit-code result handles)
+ "Close all of the current HANDLES, taking refcounts into account.
+If HANDLES is nil, use `eshell-current-handles'.
+
+EXIT-CODE is the process exit code (zero, if the command
+completed successfully). If nil, then use the exit code already
+set in `eshell-last-command-status'.
+
+RESULT is the quoted value of the last command. If nil, then use
+the value already set in `eshell-last-command-result'."
+ (when exit-code
+ (setq eshell-last-command-status exit-code))
+ (when result
+ (cl-assert (eq (car result) 'quote))
+ (setq eshell-last-command-result (cadr result)))
+ (let ((handles (or handles eshell-current-handles)))
+ (dotimes (idx eshell-number-of-handles)
+ (when-let ((handle (aref handles idx)))
+ (setcdr handle (1- (cdr handle)))
+ (when (= (cdr handle) 0)
+ (dolist (target (ensure-list (car (aref handles idx))))
+ (eshell-close-target target (= eshell-last-command-status 0)))
+ (setcar handle nil))))))
+
(defun eshell-close-target (target status)
"Close an output TARGET, passing STATUS as the result.
STATUS should be non-nil on successful termination of the output."
@@ -276,18 +300,21 @@ STATUS should be non-nil on successful termination of the output."
;; If we're redirecting to a process (via a pipe, or process
;; redirection), send it EOF so that it knows we're finished.
((eshell-processp target)
- ;; According to POSIX.1-2017, section 11.1.9, sending EOF causes
- ;; all bytes waiting to be read to be sent to the process
- ;; immediately. Thus, if there are any bytes waiting, we need to
- ;; send EOF twice: once to flush the buffer, and a second time to
- ;; cause the next read() to return a size of 0, indicating
- ;; end-of-file to the reading process. However, some platforms
- ;; (e.g. Solaris) actually require sending a *third* EOF. Since
- ;; sending extra EOFs while the process is running shouldn't break
- ;; anything, we'll just send the maximum we'd ever need. See
- ;; bug#56025 for further details.
- (let ((i 0))
- (while (and (<= (cl-incf i) 3)
+ ;; According to POSIX.1-2017, section 11.1.9, when communicating
+ ;; via terminal, sending EOF causes all bytes waiting to be read
+ ;; to be sent to the process immediately. Thus, if there are any
+ ;; bytes waiting, we need to send EOF twice: once to flush the
+ ;; buffer, and a second time to cause the next read() to return a
+ ;; size of 0, indicating end-of-file to the reading process.
+ ;; However, some platforms (e.g. Solaris) actually require sending
+ ;; a *third* EOF. Since sending extra EOFs while the process is
+ ;; running are a no-op, we'll just send the maximum we'd ever
+ ;; need. See bug#56025 for further details.
+ (let ((i 0)
+ ;; Only call `process-send-eof' once if communicating via a
+ ;; pipe (in truth, this just closes the pipe).
+ (max-attempts (if (process-tty-name target 'stdin) 3 1)))
+ (while (and (<= (cl-incf i) max-attempts)
(eq (process-status target) 'run))
(process-send-eof target))))
@@ -302,32 +329,6 @@ STATUS should be non-nil on successful termination of the output."
((consp target)
(apply (car target) status (cdr target)))))
-(defun eshell-close-handles (exit-code &optional result handles)
- "Close all of the current handles, taking refcounts into account.
-EXIT-CODE is the process exit code; mainly, it is zero, if the command
-completed successfully. RESULT is the quoted value of the last
-command. If nil, then the meta variables for keeping track of the
-last execution result should not be changed."
- (let ((idx 0))
- (cl-assert (or (not result) (eq (car result) 'quote)))
- (setq eshell-last-command-status exit-code
- eshell-last-command-result (cadr result))
- (while (< idx eshell-number-of-handles)
- (let ((handles (or handles eshell-current-handles)))
- (when (aref handles idx)
- (setcdr (aref handles idx)
- (1- (cdr (aref handles idx))))
- (when (= (cdr (aref handles idx)) 0)
- (let ((target (car (aref handles idx))))
- (if (not (listp target))
- (eshell-close-target target (= exit-code 0))
- (while target
- (eshell-close-target (car target) (= exit-code 0))
- (setq target (cdr target)))))
- (setcar (aref handles idx) nil))))
- (setq idx (1+ idx)))
- nil))
-
(defun eshell-kill-append (string)
"Call `kill-append' with STRING, if it is indeed a string."
(if (stringp string)
diff --git a/lisp/eshell/esh-mode.el b/lisp/eshell/esh-mode.el
index 972d4f9df00..ecbcf88b973 100644
--- a/lisp/eshell/esh-mode.el
+++ b/lisp/eshell/esh-mode.el
@@ -301,7 +301,8 @@ and the hook `eshell-exit-hook'."
"Emacs shell interactive mode."
(setq-local eshell-mode t)
- (when eshell-status-in-mode-line
+ (when (and eshell-status-in-mode-line
+ (listp mode-line-format))
(make-local-variable 'eshell-command-running-string)
(let ((fmt (copy-sequence mode-line-format)))
(setq-local mode-line-format fmt))
diff --git a/lisp/eshell/esh-proc.el b/lisp/eshell/esh-proc.el
index 70426ccaf2a..c367b5cd643 100644
--- a/lisp/eshell/esh-proc.el
+++ b/lisp/eshell/esh-proc.el
@@ -250,30 +250,6 @@ The prompt will be set to PROMPT."
"A marker that tracks the beginning of output of the last subprocess.
Used only on systems which do not support async subprocesses.")
-(defvar eshell-needs-pipe
- '("bc"
- ;; xclip.el (in GNU ELPA) calls all of these with
- ;; `process-connection-type' set to nil.
- "pbpaste" "putclip" "xclip" "xsel" "wl-copy")
- "List of commands which need `process-connection-type' to be nil.
-Currently only affects commands in pipelines, and not those at
-the front. If an element contains a directory part it must match
-the full name of a command, otherwise just the nondirectory part must match.")
-
-(defun eshell-needs-pipe-p (command)
- "Return non-nil if COMMAND needs `process-connection-type' to be nil.
-See `eshell-needs-pipe'."
- (and (bound-and-true-p eshell-in-pipeline-p)
- (not (eq eshell-in-pipeline-p 'first))
- ;; FIXME should this return non-nil for anything that is
- ;; neither 'first nor 'last? See bug#1388 discussion.
- (catch 'found
- (dolist (exe eshell-needs-pipe)
- (if (string-equal exe (if (string-search "/" exe)
- command
- (file-name-nondirectory command)))
- (throw 'found t))))))
-
(defun eshell-gather-process-output (command args)
"Gather the output from COMMAND + ARGS."
(require 'esh-var)
@@ -290,31 +266,36 @@ See `eshell-needs-pipe'."
(cond
((fboundp 'make-process)
(setq proc
- (let ((process-connection-type
- (unless (eshell-needs-pipe-p command)
- process-connection-type))
- (command (file-local-name (expand-file-name command))))
- (apply #'start-file-process
- (file-name-nondirectory command) nil command args)))
+ (let ((command (file-local-name (expand-file-name command)))
+ (conn-type (pcase (bound-and-true-p eshell-in-pipeline-p)
+ ('first '(nil . pipe))
+ ('last '(pipe . nil))
+ ('t 'pipe)
+ ('nil nil))))
+ (make-process
+ :name (file-name-nondirectory command)
+ :buffer (current-buffer)
+ :command (cons command args)
+ :filter (if (eshell-interactive-output-p)
+ #'eshell-output-filter
+ #'eshell-insertion-filter)
+ :sentinel #'eshell-sentinel
+ :connection-type conn-type
+ :file-handler t)))
(eshell-record-process-object proc)
- (set-process-buffer proc (current-buffer))
- (set-process-filter proc (if (eshell-interactive-output-p)
- #'eshell-output-filter
- #'eshell-insertion-filter))
- (set-process-sentinel proc #'eshell-sentinel)
(run-hook-with-args 'eshell-exec-hook proc)
(when (fboundp 'process-coding-system)
(let ((coding-systems (process-coding-system proc)))
(setq decoding (car coding-systems)
encoding (cdr coding-systems)))
- ;; If start-process decided to use some coding system for
+ ;; If `make-process' decided to use some coding system for
;; decoding data sent from the process and the coding system
;; doesn't specify EOL conversion, we had better convert CRLF
;; to LF.
(if (vectorp (coding-system-eol-type decoding))
(setq decoding (coding-system-change-eol-conversion decoding 'dos)
changed t))
- ;; Even if start-process left the coding system for encoding
+ ;; Even if `make-process' left the coding system for encoding
;; data sent from the process undecided, we had better use the
;; same one as what we use for decoding. But, we should
;; suppress EOL conversion.
@@ -365,7 +346,9 @@ See `eshell-needs-pipe'."
(defvar eshell-last-output-end) ;Defined in esh-mode.el.
(eshell-update-markers eshell-last-output-end)
;; Simulate the effect of eshell-sentinel.
- (eshell-close-handles (if (numberp exit-status) exit-status -1))
+ (eshell-close-handles
+ (if (numberp exit-status) exit-status -1)
+ (list 'quote (and (numberp exit-status) (= exit-status 0))))
(eshell-kill-process-function command exit-status)
(or (bound-and-true-p eshell-in-pipeline-p)
(setq eshell-last-sync-output-start nil))
@@ -417,40 +400,36 @@ PROC is the process that's exiting. STRING is the exit message."
(when (buffer-live-p (process-buffer proc))
(with-current-buffer (process-buffer proc)
(unwind-protect
- (let ((entry (assq proc eshell-process-list)))
-; (if (not entry)
-; (error "Sentinel called for unowned process `%s'"
-; (process-name proc))
- (when entry
- (unwind-protect
- (progn
- (unless (string= string "run")
- ;; Write the exit message if the status is
- ;; abnormal and the process is already writing
- ;; to the terminal.
- (when (and (eq proc (eshell-tail-process))
- (not (string-match "^\\(finished\\|exited\\)"
- string)))
- (funcall (process-filter proc) proc string))
- (let ((handles (nth 1 entry))
- (str (prog1 (nth 3 entry)
- (setf (nth 3 entry) nil)))
- (status (process-exit-status proc)))
- ;; If we're in the middle of handling output
- ;; from this process then schedule the EOF for
- ;; later.
- (letrec ((finish-io
- (lambda ()
- (if (nth 4 entry)
- (run-at-time 0 nil finish-io)
- (when str
- (ignore-error 'eshell-pipe-broken
- (eshell-output-object
- str nil handles)))
- (eshell-close-handles
- status 'nil handles)))))
- (funcall finish-io)))))
- (eshell-remove-process-entry entry))))
+ (when-let ((entry (assq proc eshell-process-list)))
+ (unwind-protect
+ (unless (string= string "run")
+ ;; Write the exit message if the status is
+ ;; abnormal and the process is already writing
+ ;; to the terminal.
+ (when (and (eq proc (eshell-tail-process))
+ (not (string-match "^\\(finished\\|exited\\)"
+ string)))
+ (funcall (process-filter proc) proc string))
+ (let ((handles (nth 1 entry))
+ (str (prog1 (nth 3 entry)
+ (setf (nth 3 entry) nil)))
+ (status (process-exit-status proc)))
+ ;; If we're in the middle of handling output
+ ;; from this process then schedule the EOF for
+ ;; later.
+ (letrec ((finish-io
+ (lambda ()
+ (if (nth 4 entry)
+ (run-at-time 0 nil finish-io)
+ (when str
+ (ignore-error 'eshell-pipe-broken
+ (eshell-output-object
+ str nil handles)))
+ (eshell-close-handles
+ status (list 'quote (= status 0))
+ handles)))))
+ (funcall finish-io))))
+ (eshell-remove-process-entry entry)))
(eshell-kill-process-function proc string)))))
(defun eshell-process-interact (func &optional all query)
diff --git a/lisp/eshell/esh-util.el b/lisp/eshell/esh-util.el
index 5144e305121..9258ca5e40e 100644
--- a/lisp/eshell/esh-util.el
+++ b/lisp/eshell/esh-util.el
@@ -539,7 +539,7 @@ list."
(autoload 'parse-time-string "parse-time")
(eval-when-compile
- (require 'ange-ftp nil t)) ; ange-ftp-parse-filename
+ (require 'ange-ftp)) ; ange-ftp-parse-filename
(defvar tramp-file-name-structure)
(declare-function ange-ftp-ls "ange-ftp"
diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el
index 2c92567773e..2f6614b5d73 100644
--- a/lisp/eshell/esh-var.el
+++ b/lisp/eshell/esh-var.el
@@ -212,7 +212,9 @@ Additionally, if COPY-TO-ENVIRONMENT is non-nil, the alias should be
copied (a.k.a. \"exported\") to the environment of created subprocesses."
:type '(repeat (list string sexp
(choice (const :tag "Copy to environment" t)
- (const :tag "Use only in Eshell" nil))))
+ (const :tag "Use only in Eshell" nil))
+ (choice (const :tag "Call without argument" t)
+ (const :tag "Call with 2 arguments" nil))))
:risky t)
(defvar-keymap eshell-var-mode-map
diff --git a/lisp/ezimage.el b/lisp/ezimage.el
index 9e5a08e682f..ad98c453368 100644
--- a/lisp/ezimage.el
+++ b/lisp/ezimage.el
@@ -182,11 +182,6 @@ Optional argument STRING is a string upon which to add text properties."
(when ezimage-use-images
(let* ((bt (buffer-substring start (+ length start)))
(a (assoc bt ezimage-expand-image-button-alist)))
- ;; Regular images (created with `insert-image' are intangible
- ;; which (I suppose) make them more compatible with XEmacs 21.
- ;; Unfortunately, there is a giant pile of code dependent on the
- ;; underlying text. This means if we leave it tangible, then I
- ;; don't have to change said giant piles of code.
(if (and a (symbol-value (cdr a)))
(ezimage-insert-over-text (symbol-value (cdr a))
start
diff --git a/lisp/faces.el b/lisp/faces.el
index f04ea9115ee..390ddbf606a 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -657,8 +657,8 @@ If FACE is a face-alias, get the documentation for the target face."
(put face 'face-documentation (purecopy string)))
-(defalias 'face-doc-string 'face-documentation)
-(defalias 'set-face-doc-string 'set-face-documentation)
+(define-obsolete-function-alias 'face-doc-string #'face-documentation "29.1")
+(define-obsolete-function-alias 'set-face-doc-string #'set-face-documentation "29.1")
@@ -2037,7 +2037,7 @@ as backgrounds."
(setq color (background-color-at-point))))
(when (and convert-to-RGB
(not (string-equal color "")))
- (let ((components (x-color-values color)))
+ (let ((components (color-values color)))
(unless (string-match-p "^#\\(?:[[:xdigit:]][[:xdigit:]][[:xdigit:]]\\)+$" color)
(setq color (format "#%04X%04X%04X"
(logand 65535 (nth 0 components))
@@ -2046,18 +2046,29 @@ as backgrounds."
(when msg (message "Color: `%s'" color))
color))
-(defun face-at-point (&optional thing multiple)
- "Return the face of the character after point.
-If it has more than one face, return the first one.
-If THING is non-nil try first to get a face name from the buffer.
-IF MULTIPLE is non-nil, return a list of all faces.
-Return nil if there is no face."
+(defun face-at-point (&optional text multiple)
+ "Return a face name from point in the current buffer.
+This function is meant to be used as a conveniency function for
+providing defaults when prompting the user for a face name.
+
+If TEXT is non-nil, return the text at point if it names an
+existing face.
+
+Otherwise, look at the faces in effect at point as text
+properties or overlay properties, and return one of these face
+names.
+
+IF MULTIPLE is non-nil, return a list of faces.
+
+Return nil if there is no face at point.
+
+This function is not meant for handling faces programatically; to
+do that, use `get-text-property' and `get-char-property'."
(let (faces)
- (if thing
- ;; Try to get a face name from the buffer.
- (let ((face (intern-soft (thing-at-point 'symbol))))
- (if (facep face)
- (push face faces))))
+ (when text
+ ;; Try to get a face name from the buffer.
+ (when-let ((face (thing-at-point 'face)))
+ (push face faces)))
;; Add the named faces that the `read-face-name' or `face' property uses.
(let ((faceprop (or (get-char-property (point) 'read-face-name)
(get-char-property (point) 'face))))
@@ -2496,18 +2507,9 @@ default."
"Basic face for highlighting."
:group 'basic-faces)
-;; Region face: under NS, default to the system-defined selection
-;; color (optimized for the fixed white background of other apps),
-;; if background is light.
(defface region
'((((class color) (min-colors 88) (background dark))
:background "blue3" :extend t)
- (((class color) (min-colors 88) (background light) (type gtk))
- :distant-foreground "gtk_selection_fg_color"
- :background "gtk_selection_bg_color" :extend t)
- (((class color) (min-colors 88) (background light) (type ns))
- :distant-foreground "ns_selection_fg_color"
- :background "ns_selection_bg_color" :extend t)
(((class color) (min-colors 88) (background light))
:background "lightgoldenrod2" :extend t)
(((class color) (min-colors 16) (background dark))
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 9de0dd40d16..e4017595916 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -24,14 +24,14 @@
;;; Commentary:
-;;
-;; Command find-file-at-point replaces find-file. With a prefix, it
-;; behaves exactly like find-file. Without a prefix, it first tries
-;; to guess a default file or URL from the text around the point
+
+;; Command `find-file-at-point' replaces `find-file'. With a prefix,
+;; it behaves exactly like find-file. Without a prefix, it first
+;; tries to guess a default file or URL from the text around the point
;; (`ffap-require-prefix' swaps these behaviors). This is useful for
;; following references in situations such as mail or news buffers,
;; README's, MANIFEST's, and so on. Submit bugs or suggestions with
-;; M-x report-emacs-bug.
+;; `M-x report-emacs-bug'.
;;
;; For the default installation, add this line to your init file:
;;
@@ -68,29 +68,27 @@
;; If you do not like these bindings, modify the variable
;; `ffap-bindings', or write your own.
;;
-;; If you use ange-ftp, browse-url, complete, efs, it is best to load
-;; or autoload them before ffap. If you use ff-paths, load it
-;; afterwards. Try apropos {C-h a ffap RET} to get a list of the many
-;; option variables. In particular, if ffap is slow, try these:
+;; If you use ange-ftp, it is best to load or autoload it before ffap.
+;; If you use ff-paths, load it afterwards. Try apropos `C-h a ffap
+;; RET' to get a list of the many option variables. In particular, if
+;; ffap is slow, try these:
;;
;; (setq ffap-alist nil) ; faster, dumber prompting
-;; (setq ffap-machine-p-known 'accept) ; no pinging
;; (setq ffap-url-regexp nil) ; disable URL features in ffap
;; (setq ffap-shell-prompt-regexp nil) ; disable shell prompt stripping
;; (setq ffap-gopher-regexp nil) ; disable gopher bookmark matching
;;
;; ffap uses `browse-url' to fetch URLs.
-;; For a hairier `ffap-url-fetcher', try ffap-url.el (same ftp site).
;; Also, you can add `ffap-menu-rescan' to various hooks to fontify
;; the file and URL references within a buffer.
+;;; Code:
+
;;; Change Log:
-;;
-;; The History and Contributors moved to ffap.LOG (same ftp site),
-;; which also has some old examples and commentary from ffap 1.5.
+;; The History and Contributors moved to ffap.LOG, which also has some
+;; old examples and commentary from ffap 1.5.
-
;;; Todo list:
;; * let "/dir/file#key" jump to key (tag or regexp) in /dir/file
;; * find file of symbol if TAGS is loaded (like above)
@@ -98,13 +96,10 @@
;; * notice node in "(dired)Virtual Dired" (quotes, parentheses, whitespace)
;; * notice "machine.dom blah blah blah dir/file" (how?)
;; * regexp options for ffap-string-at-point, like font-lock (MCOOK)
-;; * v19: could replace `ffap-locate-file' with a quieter `locate-library'
+;; * could replace `ffap-locate-file' with a quieter `locate-library'
;; * handle "$(VAR)" in Makefiles
;; * use the font-lock machinery
-
-;;; Code:
-
(eval-when-compile (require 'cl-lib))
(require 'url-parse)
(require 'thingatpt)
@@ -114,9 +109,6 @@
:group 'matching
:group 'convenience)
-;; The code is organized in pages, separated by formfeed characters.
-;; See the next two pages for standard customization ideas.
-
;;; User Variables:
@@ -173,7 +165,7 @@ well-formed, such as \"user@host\" or \"<user@host>\"."
(defcustom ffap-ftp-default-user "anonymous"
"User name in FTP file names generated by `ffap-host-to-filename'.
Note this name may be omitted if it equals the default
-\(either `efs-default-user' or `ange-ftp-default-user')."
+(`ange-ftp-default-user')."
:type 'string
:group 'ffap)
@@ -190,7 +182,7 @@ Note this name may be omitted if it equals the default
"\\("
"news\\(post\\)?:\\|mailto:\\|file:" ; no host ok
"\\|"
- "\\(ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\)://" ; needs host
+ "\\(ftp\\|https?\\|telnet\\|gopher\\|gemini\\|www\\|wais\\)://" ; needs host
"\\)")
"Regexp matching the beginning of a URI, for ffap.
If the value is nil, disable URL-matching features in ffap.")
@@ -245,14 +237,12 @@ it passes it on to `dired'."
:group 'ffap)
(defcustom ffap-newfile-prompt nil
- ;; Suggestion from RHOGEE, 11 Jul 1994. Disabled, I think this is
- ;; better handled by `find-file-not-found-functions'.
"Whether `find-file-at-point' prompts about a nonexistent file."
:type 'boolean
:group 'ffap)
+(make-obsolete-variable 'ffap-newfile-prompt 'find-file-not-found-functions "29.1")
(defcustom ffap-require-prefix nil
- ;; Suggestion from RHOGEE, 20 Oct 1994.
"If set, reverses the prefix argument to `find-file-at-point'.
This is nil so neophytes notice ffap. Experts may prefer to disable
ffap most of the time."
@@ -260,21 +250,20 @@ ffap most of the time."
:group 'ffap)
;;;###autoload
-(defcustom ffap-file-finder 'find-file
+(defcustom ffap-file-finder #'find-file
"The command called by `find-file-at-point' to find a file."
:type 'function
:group 'ffap
:risky t)
-(defcustom ffap-directory-finder 'dired
+(defcustom ffap-directory-finder #'dired
"The command called by `dired-at-point' to find a directory."
:type 'function
:group 'ffap
:risky t)
-(defcustom ffap-url-fetcher 'browse-url
- "A function of one argument, called by ffap to fetch an URL.
-For a fancy alternative, get `ffap-url.el'."
+(defcustom ffap-url-fetcher #'browse-url
+ "A function of one argument, called by ffap to fetch an URL."
:type '(choice (const browse-url)
function)
:group 'ffap
@@ -313,10 +302,6 @@ disable ffap most of the time."
;;; Find Next Thing in buffer (`ffap-next'):
-;;
-;; Original ffap-next-url (URLs only) from RPECK 30 Mar 1995. Since
-;; then, broke it up into ffap-next-guess (noninteractive) and
-;; ffap-next (a command). It now work on files as well as url's.
(defvar ffap-next-guess nil
"Last value returned by `ffap-next-guess'.")
@@ -433,13 +418,6 @@ Returned values:
t means that HOST answered.
`accept' means the relevant variable told us to accept.
\"mesg\" means HOST exists, but does not respond for some reason."
- ;; Try some (Emory local):
- ;; (ffap-machine-p "ftp" nil nil 'ping)
- ;; (ffap-machine-p "nonesuch" nil nil 'ping)
- ;; (ffap-machine-p "ftp.mathcs.emory.edu" nil nil 'ping)
- ;; (ffap-machine-p "mathcs" 5678 nil 'ping)
- ;; (ffap-machine-p "foo.bonk" nil nil 'ping)
- ;; (ffap-machine-p "foo.bonk.com" nil nil 'ping)
(if (or (string-match "[^-[:alnum:].]" host) ; Invalid chars (?)
(not (string-match "[^0-9]" host))) ; 1: a number? 2: quick reject
nil
@@ -495,16 +473,13 @@ Returned values:
(defun ffap-replace-file-component (fullname name)
"In remote FULLNAME, replace path with NAME. May return nil."
- ;; Use efs if loaded, but do not load it otherwise.
- (if (fboundp 'efs-replace-path-component)
- (funcall 'efs-replace-path-component fullname name)
- (and (stringp fullname)
- (stringp name)
- (concat (file-remote-p fullname) name))))
-;; (ffap-replace-file-component "/who@foo.com:/whatever" "/new")
+ (and (stringp fullname)
+ (stringp name)
+ (concat (file-remote-p fullname) name)))
(defun ffap-file-suffix (file)
"Return trailing `.foo' suffix of FILE, or nil if none."
+ (declare (obsolete file-name-extension "29.1"))
(let ((pos (string-match "\\.[^./]*\\'" file)))
(and pos (substring file pos nil))))
@@ -528,7 +503,7 @@ The optional NOMODIFY argument suppresses the extra search."
;; three reasons to suppress search:
(nomodify nil)
((not (rassq 'jka-compr-handler file-name-handler-alist)) nil)
- ((member (ffap-file-suffix file) ffap-compression-suffixes) nil)
+ ((member (file-name-extension file t) ffap-compression-suffixes) nil)
(t ; ok, do the search
(let ((list ffap-compression-suffixes) try ret)
(while list
@@ -539,9 +514,6 @@ The optional NOMODIFY argument suppresses the extra search."
(defun ffap-file-remote-p (filename)
"If FILENAME looks remote, return it (maybe slightly improved)."
- ;; (ffap-file-remote-p "/user@foo.bar.com:/pub")
- ;; (ffap-file-remote-p "/cssun.mathcs.emory.edu://dir")
- ;; (ffap-file-remote-p "/ffap.el:80")
(or (and ffap-ftp-regexp
(string-match ffap-ftp-regexp filename)
;; Convert "/host.com://dir" to "/host:/dir", to handle a dying
@@ -568,9 +540,8 @@ Looks at `ffap-ftp-default-user', returns \"\" for \"localhost\"."
""
(let ((user ffap-ftp-default-user))
;; Avoid including the user if it is same as default:
- (if (or (equal user (ffap-symbol-value 'ange-ftp-default-user))
- (equal user (ffap-symbol-value 'efs-default-user)))
- (setq user nil))
+ (when (equal user (ffap-symbol-value 'ange-ftp-default-user))
+ (setq user nil))
(concat "/" user (and user "@") host ":"))))
(defun ffap-fixup-machine (mach)
@@ -583,7 +554,7 @@ Looks at `ffap-ftp-default-user', returns \"\" for \"localhost\"."
;; www.ncsa.uiuc.edu
((and (string-match "\\`w\\(ww\\|eb\\)[-.]" mach))
(concat "http://" mach "/"))
- ;; More cases? Maybe "telnet:" for archie?
+ ;; More cases?
(ffap-ftp-regexp (ffap-host-to-filename mach))
))
@@ -643,18 +614,6 @@ Looks at `ffap-ftp-default-user', returns \"\" for \"localhost\"."
;;; File Name Handling:
-;;
-;; The upcoming ffap-alist actions need various utilities to prepare
-;; and search directories. Too many features here.
-
-;; (defun ffap-last (l) (while (cdr l) (setq l (cdr l))) l)
-;; (defun ffap-splice (func inlist)
-;; "Equivalent to (apply 'nconc (mapcar FUNC INLIST)), but less consing."
-;; (let* ((head (cons 17 nil)) (last head))
-;; (while inlist
-;; (setcdr last (funcall func (car inlist)))
-;; (setq last (ffap-last last) inlist (cdr inlist)))
-;; (cdr head)))
(defun ffap-list-env (env &optional empty)
"Return a list of strings parsed from environment variable ENV.
@@ -769,8 +728,7 @@ This uses `ffap-file-exists-string', which may try adding suffixes from
;;
;; These search actions depend on the major-mode or regexps matching
;; the current name. The little functions and their variables are
-;; deferred to the next section, at some loss of "code locality". A
-;; good example of featuritis. Trim this list for speed.
+;; deferred to the next section, at some loss of "code locality".
(defvar ffap-alist
'(
@@ -781,19 +739,18 @@ This uses `ffap-file-exists-string', which may try adding suffixes from
("\\.elc?\\'" . ffap-el) ; simple.el, simple.elc
(emacs-lisp-mode . ffap-el-mode) ; rmail, gnus, simple, custom
;; (lisp-interaction-mode . ffap-el-mode) ; maybe
- (finder-mode . ffap-el-mode) ; type {C-h p} and try it
+ (finder-mode . ffap-el-mode) ; type `C-h p' and try it
(help-mode . ffap-el-mode) ; maybe useful
(c++-mode . ffap-c++-mode) ; search ffap-c++-path
(cc-mode . ffap-c-mode) ; same
("\\.\\([chCH]\\|cc\\|hh\\)\\'" . ffap-c-mode) ; stdio.h
- (fortran-mode . ffap-fortran-mode) ; FORTRAN requested by MDB
+ (fortran-mode . ffap-fortran-mode)
("\\.[fF]\\'" . ffap-fortran-mode)
(tex-mode . ffap-tex-mode) ; search ffap-tex-path
(latex-mode . ffap-latex-mode) ; similar
("\\.\\(tex\\|sty\\|doc\\|cls\\)\\'" . ffap-tex)
("\\.bib\\'" . ffap-bib) ; search ffap-bib-path
("\\`\\." . ffap-home) ; .emacs, .bashrc, .profile
- ("\\`~/" . ffap-lcd) ; |~/misc/ffap.el.Z|
;; This used to have a blank, but ffap-string-at-point doesn't
;; handle blanks.
;; https://lists.gnu.org/r/emacs-devel/2008-01/msg01058.html
@@ -1039,9 +996,8 @@ out of NAME."
(match-beginning 1) (match-end 1)))))
try))))
-;; Maybe a "Lisp Code Directory" reference:
(defun ffap-lcd (name)
- ;; FIXME: Is this still in use?
+ (declare (obsolete nil "29.1"))
(and
(or
;; lisp-dir-apropos output buffer:
@@ -1110,8 +1066,7 @@ Function `ffap-string-at-point' uses the data fields as follows:
The arguments CHARS, BEG and END are handled as described in
`skip-chars-forward'.")
-(defvar ffap-string-at-point nil
- ;; Added at suggestion of RHOGEE (for ff-paths), 7/24/95.
+(defvar ffap-string-at-point nil ; for ff-paths
"Last string returned by the function `ffap-string-at-point'.")
(defcustom ffap-file-name-with-spaces nil
@@ -1563,12 +1518,6 @@ which may actually result in an URL rather than a filename."
;; during the completing-read call).
(setq file-name-handler-alist (delq elem file-name-handler-alist)))))
-;; The rest of this page is just to work with package complete.el.
-;; This code assumes that you load ffap.el after complete.el.
-;;
-;; We must inform complete about whether our completion function
-;; will do filename style completion.
-
;;; Highlighting (`ffap-highlight'):
@@ -1644,7 +1593,7 @@ Uses the face `ffap' if it is defined, or else `highlight'."
If `ffap-url-regexp' is not nil, the FILENAME may also be an URL.
With a prefix, this command behaves exactly like `ffap-file-finder'.
If `ffap-require-prefix' is set, the prefix meaning is reversed.
-See also the variables `ffap-dired-wildcards', `ffap-newfile-prompt',
+See also the variables `ffap-dired-wildcards',
`ffap-url-unwrap-local', `ffap-url-unwrap-remote',
`ffap-file-name-with-spaces', and the functions `ffap-file-at-point'
and `ffap-url-at-point'."
@@ -1675,14 +1624,14 @@ and `ffap-url-at-point'."
(file-exists-p filename)
(y-or-n-p "File does not exist, create buffer? "))
(find-file
- ;; expand-file-name fixes "~/~/.emacs" bug sent by CHUCKR.
+ ;; expand-file-name fixes "~/~/.emacs" bug
(expand-file-name filename)))
;; User does not want to find a non-existent file:
((signal 'file-missing (list "Opening file buffer"
"No such file or directory"
filename)))))))
-;; Shortcut: allow {M-x ffap} rather than {M-x find-file-at-point}.
+;; Shortcut: allow `M-x ffap' rather than `M-x find-file-at-point'.
;;;###autoload
(defalias 'ffap 'find-file-at-point)
@@ -1825,7 +1774,7 @@ Applies `ffap-menu-text-plist' text properties at all matches."
;;; Mouse Support (`ffap-at-mouse'):
;;
-;; See the suggested binding in ffap-bindings (near eof).
+;; See the suggested binding in `ffap-bindings' (near eof).
(defvar ffap-at-mouse-fallback nil ; ffap-menu? too time-consuming
"Command invoked by `ffap-at-mouse' if nothing found at click, or nil.
@@ -1886,7 +1835,7 @@ Only intended for interactive use."
"Like `ffap', but put buffer in another frame.
Only intended for interactive use."
(interactive (list (ffap-prompter nil " other frame")))
- ;; Extra code works around dedicated windows (noted by JENS, 7/96):
+ ;; Extra code works around dedicated windows:
(let* ((win (selected-window))
(wdp (window-dedicated-p win))
value)
@@ -2113,7 +2062,7 @@ Only intended for interactive use."
"Like `dired-at-point', but put buffer in another frame.
Only intended for interactive use."
(interactive)
- ;; Extra code works around dedicated windows (noted by JENS, 7/96):
+ ;; Extra code works around dedicated windows:
(let* ((win (selected-window))
(wdp (window-dedicated-p win))
value)
diff --git a/lisp/files.el b/lisp/files.el
index 25b58423649..05a924a363d 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -577,8 +577,6 @@ location of point in the current buffer."
;;;It is not useful to make this a local variable.
;;;(put 'find-file-not-found-functions 'permanent-local t)
-(define-obsolete-variable-alias 'find-file-not-found-hooks
- 'find-file-not-found-functions "22.1")
(defvar find-file-not-found-functions nil
"List of functions to be called for `find-file' on nonexistent file.
These functions are called as soon as the error is detected.
@@ -1428,7 +1426,7 @@ containing it, until no links are left at any level.
;; If these are equal, we have the (or a) root directory.
(or (string= dir dirfile)
(and (file-name-case-insensitive-p dir)
- (eq (compare-strings dir 0 nil dirfile 0 nil t) t))
+ (string-equal-ignore-case dir dirfile))
;; If this is the same dir we last got the truename for,
;; save time--don't recalculate.
(if (assoc dir (car prev-dirs))
@@ -2952,7 +2950,7 @@ ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\|CBR\\|7Z\\|SQUASHFS\\)\\'" .
("\\.js[mx]?\\'" . javascript-mode)
;; https://en.wikipedia.org/wiki/.har
("\\.har\\'" . javascript-mode)
- ("\\.json\\'" . javascript-mode)
+ ("\\.json\\'" . js-json-mode)
("\\.[ds]?va?h?\\'" . verilog-mode)
("\\.by\\'" . bovine-grammar-mode)
("\\.wy\\'" . wisent-grammar-mode)
@@ -3850,10 +3848,8 @@ DIR-NAME is the name of the associated directory. Otherwise it is nil."
(cond ((memq var ignored-local-variables)
;; Ignore any variable in `ignored-local-variables'.
nil)
- ((seq-some (lambda (elem)
- (and (eq (car elem) var)
- (eq (cdr elem) val)))
- ignored-local-variable-values)
+ ;; Ignore variables with the specified values.
+ ((member elt ignored-local-variable-values)
nil)
;; Obey `enable-local-eval'.
((eq var 'eval)
@@ -4448,7 +4444,8 @@ This function returns either:
;; The entry MTIME should match the most recent
;; MTIME among matching files.
(and cached-files
- (equal (nth 2 dir-elt)
+ (time-equal-p
+ (nth 2 dir-elt)
(let ((latest 0))
(dolist (f cached-files latest)
(let ((f-time
@@ -5119,14 +5116,16 @@ extension, the value is \"\"."
"")))))
(defun file-name-with-extension (filename extension)
- "Set the EXTENSION of a FILENAME.
+ "Return FILENAME modified to have the specified EXTENSION.
The extension (in a file name) is the part that begins with the last \".\".
+This function removes any existing extension from FILENAME, and then
+appends EXTENSION to it.
-Trims a leading dot from the EXTENSION so that either \"foo\" or
-\".foo\" can be given.
+EXTENSION may include the leading dot; if it doesn't, this function
+will provide it.
-Errors if the FILENAME or EXTENSION are empty, or if the given
-FILENAME has the format of a directory.
+It is an error if FILENAME or EXTENSION is empty, or if FILENAME
+is in the form of a directory name according to `directory-name-p'.
See also `file-name-sans-extension'."
(let ((extn (string-trim-left extension "[.]")))
@@ -5459,21 +5458,17 @@ on a DOS/Windows machine, it returns FILENAME in expanded form."
;; Test for different drive letters
(not (eq t (compare-strings filename 0 2 directory 0 2 fold-case)))
;; Test for UNCs on different servers
- (not (eq t (compare-strings
- (progn
- (if (string-match "\\`//\\([^:/]+\\)/" filename)
- (match-string 1 filename)
- ;; Windows file names cannot have ? in
- ;; them, so use that to detect when
- ;; neither FILENAME nor DIRECTORY is a
- ;; UNC.
- "?"))
- 0 nil
- (progn
- (if (string-match "\\`//\\([^:/]+\\)/" directory)
- (match-string 1 directory)
- "?"))
- 0 nil t)))))
+ (not (string-equal-ignore-case
+ (if (string-match "\\`//\\([^:/]+\\)/" filename)
+ (match-string 1 filename)
+ ;; Windows file names cannot have ? in
+ ;; them, so use that to detect when
+ ;; neither FILENAME nor DIRECTORY is a
+ ;; UNC.
+ "?")
+ (if (string-match "\\`//\\([^:/]+\\)/" directory)
+ (match-string 1 directory)
+ "?")))))
;; Test for different remote file system identification
(not (equal fremote dremote)))
filename
@@ -8238,6 +8233,7 @@ arguments as the running Emacs)."
(_
(apply operation arguments))))))
+;;;###autoload
(defsubst file-name-quoted-p (name &optional top)
"Whether NAME is quoted with prefix \"/:\".
If NAME is a remote file name and TOP is nil, check the local part of NAME."
@@ -8337,7 +8333,7 @@ such as `?d' for a directory, or `?l' for a symbolic link and will override
the leading `-' char."
(string
(or filetype
- (pcase (lsh mode -12)
+ (pcase (ash mode -12)
;; POSIX specifies that the file type is included in st_mode
;; and provides names for the file types but values only for
;; the permissions (e.g., S_IWOTH=2).
diff --git a/lisp/filesets.el b/lisp/filesets.el
index a8d837e7e15..4831bf167dd 100644
--- a/lisp/filesets.el
+++ b/lisp/filesets.el
@@ -146,29 +146,16 @@ is loaded before user customizations. Thus, if (require \\='filesets)
precedes the `custom-set-variables' command or, for XEmacs, if init.el
is loaded before custom.el, set this variable to t.")
-
-;;; utils
(defun filesets-filter-list (lst cond-fn)
"Remove all elements not conforming to COND-FN from list LST.
COND-FN takes one argument: the current element."
-; (cl-remove 'dummy lst :test (lambda (dummy elt)
-; (not (funcall cond-fn elt)))))
- (let ((rv nil))
- (dolist (elt lst)
- (when (funcall cond-fn elt)
- (push elt rv)))
- (nreverse rv)))
+ (declare (obsolete seq-filter "29.1"))
+ (seq-filter cond-fn lst))
(defun filesets-ormap (fsom-pred lst)
"Return the tail of LST for the head of which FSOM-PRED is non-nil."
- (let ((fsom-lst lst)
- (fsom-rv nil))
- (while (and fsom-lst
- (null fsom-rv))
- (if (funcall fsom-pred (car fsom-lst))
- (setq fsom-rv fsom-lst)
- (setq fsom-lst (cdr fsom-lst))))
- fsom-rv))
+ (declare (obsolete seq-drop-while "29.1"))
+ (seq-drop-while (lambda (x) (not (funcall fsom-pred x))) lst))
(define-obsolete-function-alias 'filesets-some #'cl-some "28.1")
(define-obsolete-function-alias 'filesets-member #'cl-member "28.1")
@@ -257,13 +244,13 @@ SYM to VAL and return t. If INIT-FLAG is non-nil, set with
(setq filesets-menu-use-cached-flag nil)
(when (default-boundp 'filesets-data)
(let ((modified-filesets
- (filesets-filter-list val
- (lambda (x)
- (let ((name (car x))
- (data (cdr x)))
- (let ((elt (assoc name filesets-data)))
- (or (not elt)
- (not (equal data (cdr elt))))))))))
+ (seq-filter (lambda (x)
+ (let ((name (car x))
+ (data (cdr x)))
+ (let ((elt (assoc name filesets-data)))
+ (or (not elt)
+ (not (equal data (cdr elt)))))))
+ val)))
(dolist (x modified-filesets)
(filesets-reset-fileset (car x))))))
(filesets-set-default sym val))
@@ -1033,12 +1020,12 @@ defined in `filesets-ingroup-patterns'."
(defun filesets-filter-dir-names (lst &optional negative)
"Remove non-directory names from a list of strings.
If NEGATIVE is non-nil, remove all directory names."
- (filesets-filter-list lst
- (lambda (x)
- (and (not (string-match-p "^\\.+/$" x))
- (if negative
- (not (string-match-p "[:/\\]$" x))
- (string-match-p "[:/\\]$" x))))))
+ (seq-filter (lambda (x)
+ (and (not (string-match-p "^\\.+/$" x))
+ (if negative
+ (not (string-match-p "[:/\\]$" x))
+ (string-match-p "[:/\\]$" x))))
+ lst))
(defun filesets-conditional-sort (lst &optional access-fn)
"Return a sorted copy of LST, LST being a list of strings.
@@ -1683,9 +1670,9 @@ Assume MODE (see `filesets-entry-mode'), if provided."
(filesets-directory-files dir patt ':files t))
;; (message "Filesets: malformed entry: %s" entry)))))))
(error "Filesets: malformed entry: %s" entry)))))))
- (filesets-filter-list fl
- (lambda (file)
- (not (filesets-filetype-property file event))))))
+ (seq-filter (lambda (file)
+ (not (filesets-filetype-property file event)))
+ fl)))
(defun filesets-files-under (level depth entry dir patt &optional relativep)
"Files under DIR that match PATT.
@@ -2499,8 +2486,4 @@ Set up hooks, load the cache file -- if existing -- and build the menu."
(provide 'filesets)
-;; Local Variables:
-;; sentence-end-double-space:t
-;; End:
-
;;; filesets.el ends here
diff --git a/lisp/find-dired.el b/lisp/find-dired.el
index 63f2148e47c..be3d106912a 100644
--- a/lisp/find-dired.el
+++ b/lisp/find-dired.el
@@ -1,7 +1,6 @@
;;; find-dired.el --- run a `find' command and dired the output -*- lexical-binding: t -*-
-;; Copyright (C) 1992, 1994-1995, 2000-2022 Free Software Foundation,
-;; Inc.
+;; Copyright (C) 1992-2022 Free Software Foundation, Inc.
;; Author: Roland McGrath <roland@gnu.org>,
;; Sebastian Kremer <sk@thp.uni-koeln.de>
@@ -242,6 +241,11 @@ it finishes, type \\[kill-find]."
(setq default-directory dir)
;; Start the find process.
(shell-command (concat command "&") (current-buffer))
+ (let ((proc (get-buffer-process (current-buffer))))
+ ;; Initialize the process marker; it is used by the filter.
+ (move-marker (process-mark proc) (point) (current-buffer))
+ (set-process-filter proc #'find-dired-filter)
+ (set-process-sentinel proc #'find-dired-sentinel))
(dired-mode dir (cdr find-ls-option))
(let ((map (make-sparse-keymap)))
(set-keymap-parent map (current-local-map))
@@ -273,11 +277,6 @@ it finishes, type \\[kill-find]."
(insert " " command "\n")
(dired-insert-set-properties point (point)))
(setq buffer-read-only t)
- (let ((proc (get-buffer-process (current-buffer))))
- (set-process-filter proc #'find-dired-filter)
- (set-process-sentinel proc #'find-dired-sentinel)
- ;; Initialize the process marker; it is used by the filter.
- (move-marker (process-mark proc) (point) (current-buffer)))
(setq mode-line-process '(":%s"))))
(defun find-dired--escaped-ls-option ()
@@ -320,7 +319,7 @@ See `find-name-arg' to customize the arguments."
;; Date: 10 May 91 17:50:00 GMT
;; Organization: University of Waterloo
-(defalias 'lookfor-dired 'find-grep-dired)
+(define-obsolete-function-alias 'lookfor-dired #'find-grep-dired "29.1")
;;;###autoload
(defun find-grep-dired (dir regexp)
"Find files in DIR that contain matches for REGEXP and start Dired on output.
@@ -419,10 +418,10 @@ specifies what to use in place of \"-ls\" as the final argument."
"Sort entries in *Find* buffer by file name lexicographically."
(sort-subr nil 'forward-line 'end-of-line
(lambda ()
- (buffer-substring-no-properties
- (next-single-property-change
- (point) 'dired-filename)
- (line-end-position)))))
+ (when-let ((start
+ (next-single-property-change
+ (point) 'dired-filename)))
+ (buffer-substring-no-properties start (line-end-position))))))
(provide 'find-dired)
diff --git a/lisp/find-lisp.el b/lisp/find-lisp.el
index 0a712c0b811..e825d9cba04 100644
--- a/lisp/find-lisp.el
+++ b/lisp/find-lisp.el
@@ -281,7 +281,7 @@ It is a function which takes two arguments, the directory and its parent."
(set-buffer buffer)
(insert find-lisp-line-indent
(find-lisp-format file (file-attributes file 'string) (list "")
- (current-time))))
+ nil)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Lifted from ls-lisp. We don't want to require it, because that
diff --git a/lisp/finder.el b/lisp/finder.el
index 73072c0cd48..08d20963b46 100644
--- a/lisp/finder.el
+++ b/lisp/finder.el
@@ -77,6 +77,7 @@ Each element has the form (KEYWORD . DESCRIPTION).")
(defvar-keymap finder-mode-map
:doc "Keymap used in `finder-mode'."
+ :parent special-mode-map
"SPC" #'finder-select
"f" #'finder-select
"<follow-link>" 'mouse-face
@@ -420,15 +421,14 @@ FILE should be in a form suitable for passing to `locate-library'."
(interactive)
(finder-list-keywords))
-(define-derived-mode finder-mode nil "Finder"
+(define-derived-mode finder-mode special-mode "Finder"
"Major mode for browsing package documentation.
\\<finder-mode-map>
\\[finder-select] more help for the item on the current line
-\\[finder-exit] exit Finder mode and kill the Finder buffer."
- :syntax-table finder-mode-syntax-table
+\\[finder-exit] exit Finder mode and kill the Finder buffer.
+
+\\{finder-mode-map}"
:interactive nil
- (setq buffer-read-only t
- buffer-undo-list t)
(setq-local finder-headmark nil))
(defun finder-summary ()
@@ -436,9 +436,9 @@ FILE should be in a form suitable for passing to `locate-library'."
(interactive nil finder-mode)
(message "%s"
(substitute-command-keys
- "\\<finder-mode-map>\\[finder-select] = select, \
-\\[finder-mouse-select] = select, \\[finder-list-keywords] = to \
-finder directory, \\[finder-exit] = quit, \\[finder-summary] = help")))
+ "\\<finder-mode-map>\\[finder-select] select, \
+\\[finder-mouse-select] select, \\[finder-list-keywords] go to \
+finder directory, \\[finder-exit] quit, \\[finder-summary] help")))
(defun finder-exit ()
"Exit Finder mode.
diff --git a/lisp/font-core.el b/lisp/font-core.el
index f92d1e38306..f70c42bb03f 100644
--- a/lisp/font-core.el
+++ b/lisp/font-core.el
@@ -65,7 +65,7 @@ Other variables include that for syntactic keyword fontification,
`font-lock-syntactic-keywords' and those for buffer-specialized fontification
functions, `font-lock-fontify-buffer-function',
`font-lock-unfontify-buffer-function', `font-lock-fontify-region-function',
-`font-lock-unfontify-region-function', and `font-lock-inhibit-thing-lock'.")
+`font-lock-unfontify-region-function'.")
;; Autoload if this file no longer dumped.
;;;###autoload
(put 'font-lock-defaults 'risky-local-variable t)
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 181a7dc90ef..7eb5a414fe3 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -346,9 +346,6 @@ If a number, only buffers greater than this size have fontification messages."
(defvar font-lock-type-face 'font-lock-type-face
"Face name to use for type and class names.")
-(define-obsolete-variable-alias
- 'font-lock-reference-face 'font-lock-constant-face "20.3")
-
(defvar font-lock-constant-face 'font-lock-constant-face
"Face name to use for constant and label names.")
@@ -490,8 +487,7 @@ of the line, i.e., cause the MATCHER search to span lines.
These regular expressions can match text which spans lines,
although it is better to avoid it if possible since updating them
while editing text is slower, and it is not guaranteed to be
-always correct when using support modes like jit-lock or
-lazy-lock.
+always correct.
This variable is set by major modes via the variable
`font-lock-defaults'. Be careful when composing regexps for this
@@ -623,11 +619,8 @@ fontified.")
It should take two args, the beginning and end of the region.
This is normally set via `font-lock-defaults'.")
-(defvar font-lock-inhibit-thing-lock nil
- "List of Font Lock mode related modes that should not be turned on.
-Currently, valid mode names are `fast-lock-mode', `jit-lock-mode' and
-`lazy-lock-mode'. This is normally set via `font-lock-defaults'.")
-(make-obsolete-variable 'font-lock-inhibit-thing-lock nil "25.1")
+(defvar font-lock-inhibit-thing-lock nil)
+(make-obsolete-variable 'font-lock-inhibit-thing-lock "it does nothing." "25.1")
(defvar-local font-lock-multiline nil
"Whether font-lock should cater to multiline keywords.
@@ -642,7 +635,6 @@ Major/minor modes can set this variable if they know which option applies.")
(eval-when-compile
;;
- ;; Borrowed from lazy-lock.el.
;; We use this to preserve or protect things when modifying text properties.
(defmacro save-buffer-state (&rest body)
"Bind variables according to VARLIST and eval BODY restoring buffer state."
@@ -881,65 +873,17 @@ happens, so the major mode can be corrected."
;;; Font Lock Support mode.
-;; This is the code used to interface font-lock.el with any of its add-on
-;; packages, and provide the user interface. Packages that have their own
-;; local buffer fontification functions (see below) may have to call
-;; `font-lock-after-fontify-buffer' and/or `font-lock-after-unfontify-buffer'
-;; themselves.
-
-(defcustom font-lock-support-mode 'jit-lock-mode
+(defvar font-lock-support-mode #'jit-lock-mode
"Support mode for Font Lock mode.
-Support modes speed up Font Lock mode by being choosy about when fontification
-occurs. The default support mode, Just-in-time Lock mode (symbol
-`jit-lock-mode'), is recommended.
-
-Other, older support modes are Fast Lock mode (symbol `fast-lock-mode') and
-Lazy Lock mode (symbol `lazy-lock-mode'). See those modes for more info.
-However, they are no longer recommended, as Just-in-time Lock mode is better.
-
If nil, means support for Font Lock mode is never performed.
-If a symbol, use that support mode.
-If a list, each element should be of the form (MAJOR-MODE . SUPPORT-MODE),
-where MAJOR-MODE is a symbol or t (meaning the default). For example:
- ((c-mode . fast-lock-mode) (c++-mode . fast-lock-mode) (t . lazy-lock-mode))
-means that Fast Lock mode is used to support Font Lock mode for buffers in C or
-C++ modes, and Lazy Lock mode is used to support Font Lock mode otherwise.
-
-The value of this variable is used when Font Lock mode is turned on."
- :type '(choice (const :tag "none" nil)
- (const :tag "fast lock" fast-lock-mode)
- (const :tag "lazy lock" lazy-lock-mode)
- (const :tag "jit lock" jit-lock-mode)
- (repeat :menu-tag "mode specific" :tag "mode specific"
- :value ((t . jit-lock-mode))
- (cons :tag "Instance"
- (radio :tag "Mode"
- (const :tag "all" t)
- (symbol :tag "name"))
- (radio :tag "Support"
- (const :tag "none" nil)
- (const :tag "fast lock" fast-lock-mode)
- (const :tag "lazy lock" lazy-lock-mode)
- (const :tag "JIT lock" jit-lock-mode)))
- ))
- :version "21.1"
- :group 'font-lock)
+This can be useful for debugging.
-(defvar fast-lock-mode)
-(defvar lazy-lock-mode)
-(defvar jit-lock-mode)
+The value of this variable is used when Font Lock mode is turned on.")
-(declare-function fast-lock-after-fontify-buffer "fast-lock")
-(declare-function fast-lock-after-unfontify-buffer "fast-lock")
-(declare-function fast-lock-mode "fast-lock")
-(declare-function lazy-lock-after-fontify-buffer "lazy-lock")
-(declare-function lazy-lock-after-unfontify-buffer "lazy-lock")
-(declare-function lazy-lock-mode "lazy-lock")
+(defvar jit-lock-mode)
(defun font-lock-turn-on-thing-lock ()
(pcase (font-lock-value-in-major-mode font-lock-support-mode)
- ('fast-lock-mode (fast-lock-mode t))
- ('lazy-lock-mode (lazy-lock-mode t))
('jit-lock-mode
;; Prepare for jit-lock
(remove-hook 'after-change-functions
@@ -962,39 +906,11 @@ The value of this variable is used when Font Lock mode is turned on."
nil t))))
(defun font-lock-turn-off-thing-lock ()
- (cond ((bound-and-true-p fast-lock-mode)
- (fast-lock-mode -1))
- ((bound-and-true-p jit-lock-mode)
+ (cond ((bound-and-true-p jit-lock-mode)
(jit-lock-unregister 'font-lock-fontify-region)
;; Reset local vars to the non-jit-lock case.
- (kill-local-variable 'font-lock-fontify-buffer-function))
- ((bound-and-true-p lazy-lock-mode)
- (lazy-lock-mode -1))))
-
-(defun font-lock-after-fontify-buffer ()
- (cond ((bound-and-true-p fast-lock-mode)
- (fast-lock-after-fontify-buffer))
- ;; Useless now that jit-lock intercepts font-lock-fontify-buffer. -sm
- ;; (jit-lock-mode
- ;; (jit-lock-after-fontify-buffer))
- ((bound-and-true-p lazy-lock-mode)
- (lazy-lock-after-fontify-buffer))))
-
-(defun font-lock-after-unfontify-buffer ()
- (cond ((bound-and-true-p fast-lock-mode)
- (fast-lock-after-unfontify-buffer))
- ;; Useless as well. It's only called when:
- ;; - turning off font-lock: it does not matter if we leave spurious
- ;; `fontified' text props around since jit-lock-mode is also off.
- ;; - font-lock-default-fontify-buffer fails: this is not run
- ;; any more anyway. -sm
- ;;
- ;; (jit-lock-mode
- ;; (jit-lock-after-unfontify-buffer))
- ((bound-and-true-p lazy-lock-mode)
- (lazy-lock-after-unfontify-buffer))))
-
-;; End of Font Lock Support mode.
+ (kill-local-variable 'font-lock-fontify-buffer-function))))
+
;;; Fontification functions.
@@ -1160,7 +1076,6 @@ Lock mode."
(save-excursion
(save-match-data
(font-lock-fontify-region (point-min) (point-max) verbose)
- (font-lock-after-fontify-buffer)
(setq font-lock-fontified t)))
;; We don't restore the old fontification, so it's best to unfontify.
(quit (font-lock-unfontify-buffer)))))))
@@ -1171,7 +1086,6 @@ Lock mode."
(save-restriction
(widen)
(font-lock-unfontify-region (point-min) (point-max))
- (font-lock-after-unfontify-buffer)
(setq font-lock-fontified nil)))
(defvar font-lock-dont-widen nil
@@ -2190,7 +2104,7 @@ as the constructs of Haddock, Javadoc and similar systems."
;;;;;###autoload
;;(progn
;; ;; Make the Font Lock menu.
-;; (defvar font-lock-menu (make-sparse-keymap "Syntax Highlighting"))
+;; (defvar-keymap font-lock-menu :name "Syntax Highlighting")
;; ;; Add the menu items in reverse order.
;; (define-key font-lock-menu [fontify-less]
;; '("Less In Current Buffer" . font-lock-fontify-less))
@@ -2395,6 +2309,10 @@ This should be an integer. Used in `cpp-font-lock-keywords'.")
for C preprocessor directives. This definition is for the other modes
in which C preprocessor directives are used, e.g. `asm-mode' and
`ld-script-mode'.")
+
+(define-obsolete-function-alias 'font-lock-after-fontify-buffer #'ignore "29.1")
+(define-obsolete-function-alias 'font-lock-after-unfontify-buffer #'ignore "29.1")
+
(provide 'font-lock)
diff --git a/lisp/fringe.el b/lisp/fringe.el
index 657a73772d5..0c88501298f 100644
--- a/lisp/fringe.el
+++ b/lisp/fringe.el
@@ -46,6 +46,7 @@
(let ((bitmaps '(question-mark exclamation-mark
left-arrow right-arrow up-arrow down-arrow
left-curly-arrow right-curly-arrow
+ large-circle
left-triangle right-triangle
top-left-angle top-right-angle
bottom-left-angle bottom-right-angle
@@ -324,6 +325,17 @@ If BITMAP already exists, the existing definition is replaced."
;; The real implementation is in src/fringe.c.
))
+(defun fringe-custom-set-bitmap (symbol value)
+ "Set SYMBOL to a fringe bitmap VALUE.
+This sets the `fringe' property on SYMBOL to match that of VALUE,
+and then force all windows to be updated on the next redisplay.
+You should use this for the :set parameter for customization
+options to pick a fringe bitmap."
+ (prog1
+ (set symbol value)
+ (put symbol 'fringe (get value 'fringe))
+ (force-window-update)))
+
(provide 'fringe)
;;; fringe.el ends here
diff --git a/lisp/gnus/ChangeLog.3 b/lisp/gnus/ChangeLog.3
index f3324b29190..c33c76f68d0 100644
--- a/lisp/gnus/ChangeLog.3
+++ b/lisp/gnus/ChangeLog.3
@@ -21361,7 +21361,7 @@
to get all the groups a message ID is in.
* spam-stat.el (spam-stat-split-fancy-spam-threshold)
- (spam-stat-split-fancy): Change "threshhold" to "threshold".
+ (spam-stat-split-fancy): Fix typo for "threshold".
(spam-stat-score-buffer-user-functions): Add :number custom type.
2005-04-06 Katsumi Yamaoka <yamaoka@jpl.org>
diff --git a/lisp/gnus/deuglify.el b/lisp/gnus/deuglify.el
index 732c6062b8b..41fc2d83ac3 100644
--- a/lisp/gnus/deuglify.el
+++ b/lisp/gnus/deuglify.el
@@ -223,6 +223,7 @@
(defconst gnus-outlook-deuglify-version "1.5 Gnus version"
"Version of gnus-outlook-deuglify.")
+(make-obsolete-variable 'gnus-outlook-deuglify-version 'emacs-version "29.1")
;;; User Customizable Variables:
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index 4b68a54ce81..480ebe377d7 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -268,7 +268,7 @@ This can also be a list of the above values."
(defcustom gnus-hidden-properties
;; We use to have `intangible' here as well, but Emacs's command loop moves
;; point out of invisible text anyway, so `intangible' is clearly not
- ;; needed there. And XEmacs doesn't handle `intangible' anyway.
+ ;; needed there.
'(invisible t)
"Property list to use for hiding text."
:type 'plist
@@ -1939,8 +1939,8 @@ always hide."
'boring-headers)))
;; Hide boring Newsgroups header.
((eq elem 'newsgroups)
- (when (gnus-string-equal
- (gnus-fetch-field "newsgroups")
+ (when (string-equal-ignore-case
+ (or (gnus-fetch-field "newsgroups") "")
(gnus-group-real-name
(if (boundp 'gnus-newsgroup-name)
gnus-newsgroup-name
@@ -1954,7 +1954,7 @@ always hide."
gnus-newsgroup-name ""))))
(when (and to to-address
(ignore-errors
- (gnus-string-equal
+ (string-equal-ignore-case
;; only one address in To
(nth 1 (mail-extract-address-components to))
to-address)))
@@ -1967,7 +1967,7 @@ always hide."
gnus-newsgroup-name ""))))
(when (and to to-list
(ignore-errors
- (gnus-string-equal
+ (string-equal-ignore-case
;; only one address in To
(nth 1 (mail-extract-address-components to))
to-list)))
@@ -1980,15 +1980,15 @@ always hide."
gnus-newsgroup-name ""))))
(when (and cc to-list
(ignore-errors
- (gnus-string-equal
+ (string-equal-ignore-case
;; only one address in Cc
(nth 1 (mail-extract-address-components cc))
to-list)))
(gnus-article-hide-header "cc"))))
((eq elem 'followup-to)
- (when (gnus-string-equal
- (message-fetch-field "followup-to")
- (message-fetch-field "newsgroups"))
+ (when (string-equal-ignore-case
+ (or (message-fetch-field "followup-to") "")
+ (or (message-fetch-field "newsgroups") ""))
(gnus-article-hide-header "followup-to")))
((eq elem 'reply-to)
(if (gnus-group-find-parameter
@@ -8470,8 +8470,6 @@ url is put as the `gnus-button-url' overlay property on the button."
(when comma
(dotimes (_ (with-temp-buffer
(insert comma)
- ;; Note: the XEmacs version of `how-many' takes
- ;; no optional argument.
(goto-char (point-min))
(how-many ",")))
(Info-index-next 1)))
diff --git a/lisp/gnus/gnus-demon.el b/lisp/gnus/gnus-demon.el
index d9da8529ebe..f6cfd727f78 100644
--- a/lisp/gnus/gnus-demon.el
+++ b/lisp/gnus/gnus-demon.el
@@ -222,7 +222,7 @@ minutes, the connection is closed."
(defun gnus-demon-nntp-close-connection ()
(save-window-excursion
- (when (time-less-p '(0 300) (time-since nntp-last-command-time))
+ (when (time-less-p 300 (time-since nntp-last-command-time))
(nntp-close-server))))
(defun gnus-demon-add-scanmail ()
diff --git a/lisp/gnus/gnus-diary.el b/lisp/gnus/gnus-diary.el
index cd2b53064b9..6028d4fcb2f 100644
--- a/lisp/gnus/gnus-diary.el
+++ b/lisp/gnus/gnus-diary.el
@@ -65,8 +65,9 @@ There are currently two built-in format functions:
(const :tag "french" gnus-diary-delay-format-french)
(symbol :tag "other")))
-(defconst gnus-diary-version nndiary-version
+(defconst gnus-diary-version "0.2-b14"
"Current Diary back end version.")
+(make-obsolete-variable 'gnus-diary-version 'emacs-version "29.1")
;; Compatibility functions ==================================================
@@ -377,8 +378,9 @@ If ARG (or prefix) is non-nil, force prompting for all fields."
(defun gnus-diary-version ()
"Current Diary back end version."
+ (declare (obsolete emacs-version "29.1"))
(interactive)
- (message "NNDiary version %s" nndiary-version))
+ (message "NNDiary version %s" gnus-diary-version))
(provide 'gnus-diary)
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 04d19e29a3a..a6b6c4a6cda 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -4532,9 +4532,11 @@ and the second element is the address."
;; FIXME? gnus-secondary-servers is obsolete,
;; and it is not obvious that there is anything
;; sensible to use instead in this particular case.
- (if (boundp 'gnus-secondary-servers)
- gnus-secondary-servers
- (cdr gnus-select-method))))
+ ;; (if (boundp 'gnus-secondary-servers)
+ ;; gnus-secondary-servers
+ ;; (cdr gnus-select-method))
+ nil
+ ))
;; We got a server name.
how)))
gnus-group-mode)
diff --git a/lisp/gnus/gnus-int.el b/lisp/gnus/gnus-int.el
index f00f2a0d04e..a85510ba91e 100644
--- a/lisp/gnus/gnus-int.el
+++ b/lisp/gnus/gnus-int.el
@@ -114,10 +114,7 @@ If CONFIRM is non-nil, the user will be asked for an NNTP server."
;; Read server name with completion.
(setq gnus-nntp-server
(gnus-completing-read "NNTP server"
- (cons gnus-nntp-server
- (if (boundp 'gnus-secondary-servers)
- gnus-secondary-servers))
- nil gnus-nntp-server)))
+ nil nil gnus-nntp-server)))
(when (and gnus-nntp-server
(stringp gnus-nntp-server)
diff --git a/lisp/gnus/gnus-srvr.el b/lisp/gnus/gnus-srvr.el
index a520bfcd8b1..54be0f8e6a0 100644
--- a/lisp/gnus/gnus-srvr.el
+++ b/lisp/gnus/gnus-srvr.el
@@ -699,7 +699,6 @@ claim them."
"n" #'gnus-browse-next-group
"p" #'gnus-browse-prev-group
"DEL" #'gnus-browse-prev-group
- "<delete>" #'gnus-browse-prev-group
"N" #'gnus-browse-next-group
"P" #'gnus-browse-prev-group
"M-n" #'gnus-browse-next-group
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index 7f96e16c8ae..90b57695c57 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -1958,8 +1958,6 @@ increase the score of each group you read."
"C-M-b" #'gnus-summary-prev-thread
"M-<down>" #'gnus-summary-next-thread
"M-<up>" #'gnus-summary-prev-thread
- "C-M-u" #'gnus-summary-up-thread
- "C-M-d" #'gnus-summary-down-thread
"&" #'gnus-summary-execute-command
"c" #'gnus-summary-catchup-and-exit
"C-w" #'gnus-summary-mark-region-as-read
@@ -12929,7 +12927,7 @@ treated as multipart/mixed."
(expirable gnus-expirable-mark "e"))
"An alist of names/marks/keystrokes.")
-(defvar gnus-summary-generic-mark-map (make-sparse-keymap))
+(defvar-keymap gnus-summary-generic-mark-map)
(defvar gnus-summary-mark-map)
(defun gnus-summary-make-all-marking-commands ()
diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el
index 218a4d242b2..4c93814e0dc 100644
--- a/lisp/gnus/gnus-util.el
+++ b/lisp/gnus/gnus-util.el
@@ -40,17 +40,14 @@
(defcustom gnus-completing-read-function 'gnus-emacs-completing-read
"Function use to do completing read."
- :version "24.1"
+ :version "29.1"
:group 'gnus-meta
:type '(radio (function-item
:doc "Use Emacs standard `completing-read' function."
gnus-emacs-completing-read)
(function-item
:doc "Use `ido-completing-read' function."
- gnus-ido-completing-read)
- (function-item
- :doc "Use iswitchb based completing-read function."
- gnus-iswitchb-completing-read)))
+ gnus-ido-completing-read)))
(defcustom gnus-completion-styles
(append (when (and (assq 'substring completion-styles-alist)
@@ -383,7 +380,7 @@ Cache the result as a text property stored in DATE."
;; Either return the cached value...
`(let ((d ,date))
(if (equal "" d)
- '(0 0)
+ 0
(or (get-text-property 0 'gnus-time d)
;; or compute the value...
(let ((time (safe-date-to-time d)))
@@ -750,15 +747,6 @@ nil. See also `gnus-bind-print-variables'."
(when (file-exists-p file)
(delete-file file)))
-(defun gnus-delete-duplicates (list)
- "Remove duplicate entries from LIST."
- (let ((result nil))
- (while list
- (unless (member (car list) result)
- (push (car list) result))
- (pop list))
- (nreverse result)))
-
(defun gnus-delete-directory (directory)
"Delete files in DIRECTORY. Subdirectories remain.
If there's no subdirectory, delete DIRECTORY as well."
@@ -1078,6 +1066,7 @@ ARG is passed to the first function."
;; (`string-equal' uses symbol print names.)
(defun gnus-string-equal (x y)
"Like `string-equal', except it compares case-insensitively."
+ (declare (obsolete string-equal-ignore-case "29.1"))
(and (= (length x) (length y))
(or (string-equal x y)
(string-equal (downcase x) (downcase y)))))
@@ -1133,14 +1122,11 @@ sure of changing the value of `foo'."
If you find some problem with the directory separator character, try
\"[/\\\\]\" for some systems.")
-(defun gnus-url-unhex (x)
- (if (> x ?9)
- (if (>= x ?a)
- (+ 10 (- x ?a))
- (+ 10 (- x ?A)))
- (- x ?0)))
+(autoload 'url-unhex "url-util")
+(define-obsolete-function-alias 'gnus-url-unhex #'url-unhex "29.1")
-;; Fixme: Do it like QP.
+;; FIXME: Make obsolete in favor of `url-unhex-string', which is
+;; identical except for the call to `char-to-string'.
(defun gnus-url-unhex-string (str &optional allow-newlines)
"Remove %XX, embedded spaces, etc in a url.
If optional second argument ALLOW-NEWLINES is non-nil, then allow the
@@ -1150,9 +1136,9 @@ forbidden in URL encoding."
(case-fold-search t))
(while (string-match "%[0-9a-f][0-9a-f]" str)
(let* ((start (match-beginning 0))
- (ch1 (gnus-url-unhex (elt str (+ start 1))))
+ (ch1 (url-unhex (elt str (+ start 1))))
(code (+ (* 16 ch1)
- (gnus-url-unhex (elt str (+ start 2))))))
+ (url-unhex (elt str (+ start 2))))))
(setq tmp (concat
tmp (substring str 0 start)
(cond
@@ -1213,6 +1199,7 @@ SPEC is a predicate specifier that contains stuff like `or', `and',
(defun gnus-iswitchb-completing-read (prompt collection &optional require-match
initial-input history def)
"`iswitchb' based completing-read function."
+ (declare (obsolete nil "29.1"))
;; Make sure iswitchb is loaded before we let-bind its variables.
;; If it is loaded inside the let, variables can become unbound afterwards.
(require 'iswitchb)
@@ -1253,7 +1240,7 @@ SPEC is a predicate specifier that contains stuff like `or', `and',
contents value)
(if (or (null (setq value (symbol-value variable)))
(not (equal (car value) file))
- (not (equal (nth 1 value) time)))
+ (not (time-equal-p (nth 1 value) time)))
(progn
(setq contents (funcall function file))
(set variable (list file time contents))
@@ -1387,8 +1374,7 @@ sequence, this is like `mapcar'. With several, it is like the Common Lisp
system-configuration)
((memq 'type lst)
(symbol-name system-type))
- (t nil)))
- ) ;; codename
+ (t nil))))
(cond
((not (memq 'emacs lst))
nil)
@@ -1553,6 +1539,8 @@ lists of strings."
;; gnus-util.
(autoload 'gnus-output-to-rmail "gnus-rmail")
+(define-obsolete-function-alias 'gnus-delete-duplicates #'seq-uniq "29.1")
+
(provide 'gnus-util)
;;; gnus-util.el ends here
diff --git a/lisp/gnus/gnus-uu.el b/lisp/gnus/gnus-uu.el
index 6990d8ee778..ee6cab365f3 100644
--- a/lisp/gnus/gnus-uu.el
+++ b/lisp/gnus/gnus-uu.el
@@ -260,9 +260,10 @@ Default is t."
"Non-nil means that files will be viewed with metamail.
The gnus-uu viewing functions will be ignored and gnus-uu will try
to guess at a content-type based on file name suffixes. Default
-it nil."
+is nil."
:group 'gnus-extract
:type 'boolean)
+(make-obsolete-variable 'gnus-uu-view-with-metamail "don't use it." "29.1")
(defcustom gnus-uu-unmark-articles-not-decoded nil
"If non-nil, gnus-uu will mark unsuccessfully decoded articles as unread.
diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el
index 7eea08f1744..0afd873a5df 100644
--- a/lisp/gnus/gnus.el
+++ b/lisp/gnus/gnus.el
@@ -1110,14 +1110,6 @@ that case, just return a fully prefixed name of the group --
sexp
string))
-(defcustom gnus-secondary-servers nil
- "List of NNTP servers that the user can choose between interactively.
-To make Gnus query you for a server, you have to give `gnus' a
-non-numeric prefix - `\\[universal-argument] \\[gnus]', in short."
- :group 'gnus-server
- :type '(repeat string))
-(make-obsolete-variable 'gnus-secondary-servers 'gnus-select-method "24.1")
-
(defcustom gnus-secondary-select-methods nil
"A list of secondary methods that will be used for reading news.
This is a list where each element is a complete select method (see
@@ -2244,12 +2236,10 @@ Disabling the agent may result in noticeable loss of performance."
"Which information should be exposed in the User-Agent header.
Can be a list of symbols or a string. Valid symbols are `gnus'
-\(show Gnus version) and `emacs' \(show Emacs version). In
-addition to the Emacs version, you can add `codename' \(show
-\(S)XEmacs codename) or either `config' \(show system
-configuration) or `type' \(show system type). If you set it to
-a string, be sure to use a valid format, see RFC 2616."
-
+(show Gnus version) and `emacs' (show Emacs version). In
+addition to the Emacs version, you can add `config' (show system
+configuration) or `type' (show system type). If you set it to a
+string, be sure to use a valid format, see RFC 2616."
:version "22.1"
:group 'gnus-message
:type '(choice (list (set :inline t
@@ -2257,8 +2247,7 @@ a string, be sure to use a valid format, see RFC 2616."
(const :value emacs :tag "Emacs version")
(choice :tag "system"
(const :value type :tag "system type")
- (const :value config :tag "system configuration"))
- (const :value codename :tag "Emacs codename")))
+ (const :value config :tag "system configuration"))))
(string)))
;; Convert old (< 2005-01-10) symbol type values:
@@ -4177,8 +4166,7 @@ prompt the user for the name of an NNTP server to use."
;; file.
(unless (string-match "^Gnus" gnus-version)
(load "gnus-load" nil t))
- (unless (or (byte-code-function-p (symbol-function 'gnus))
- (subr-native-elisp-p (symbol-function 'gnus)))
+ (unless (compiled-function-p (symbol-function 'gnus))
(message "You should compile Gnus")
(sit-for 2))
(let ((gnus-action-message-log (list nil)))
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 7c2b24c6eee..da05a768e3b 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -2081,11 +2081,13 @@ You must have the \"hashcash\" binary installed, see `hashcash-path'."
(defsubst message-delete-line (&optional n)
"Delete the current line (and the next N lines)."
+ (declare (obsolete delete-line "29.1"))
(delete-region (progn (beginning-of-line) (point))
(progn (forward-line (or n 1)) (point))))
(defun message-mark-active-p ()
"Non-nil means the mark and region are currently active in this buffer."
+ (declare (obsolete mark-active "29.1"))
mark-active)
(defun message-unquote-tokens (elems)
@@ -2384,7 +2386,7 @@ Leading \"Re: \" is not stripped by this function. Use the function
(setq old-subject
(message-strip-subject-re old-subject))
(message-goto-subject)
- (message-delete-line)
+ (delete-line)
(insert (concat "Subject: "
new-subject
" (was: "
@@ -2499,12 +2501,12 @@ been made to before the user asked for a Crosspost."
(while (re-search-backward
(concat "^" (regexp-quote message-cross-post-note) ".*")
head t)
- (message-delete-line))
+ (delete-line))
(message-goto-signature)
(while (re-search-backward
(concat "^" (regexp-quote message-followup-to-note) ".*")
head t)
- (message-delete-line))
+ (delete-line))
;; insert new note
(if (message-goto-signature)
(re-search-backward message-signature-separator))
@@ -2576,7 +2578,7 @@ With prefix-argument just set Follow-Up, don't cross-post."
(cond (cc-content
(save-excursion
(message-goto-to)
- (message-delete-line)
+ (delete-line)
(insert (concat "To: " cc-content "\n"))
(save-restriction
(message-narrow-to-headers)
@@ -2731,20 +2733,17 @@ Point is left at the beginning of the narrowed-to region."
(interactive nil message-mode)
(save-excursion
(save-restriction
- (let ((max (1+ (length message-header-format-alist)))
- rank)
+ (let ((max (1+ (length message-header-format-alist))))
(message-narrow-to-headers)
(while (re-search-forward "^[^ \n]+:" nil t)
(put-text-property
(match-beginning 0) (1+ (match-beginning 0))
'message-rank
- (if (setq rank (length (memq (assq (intern (buffer-substring
- (match-beginning 0)
- (1- (match-end 0))))
- message-header-format-alist)
- message-header-format-alist)))
- (- max rank)
- (1+ max)))))
+ (- max (length
+ (memq (assq (intern (buffer-substring
+ (match-beginning 0) (1- (match-end 0))))
+ message-header-format-alist)
+ message-header-format-alist))))))
(message-sort-headers-1))))
(defun message-kill-address ()
@@ -2953,12 +2952,12 @@ Consider adding this function to `message-header-setup-hook'"
["Fill Yanked Message" message-fill-yanked-message t]
["Insert Signature" message-insert-signature t]
["Caesar (rot13) Message" message-caesar-buffer-body t]
- ["Caesar (rot13) Region" message-caesar-region (message-mark-active-p)]
+ ["Caesar (rot13) Region" message-caesar-region mark-active]
["Elide Region" message-elide-region
- :active (message-mark-active-p)
+ :active mark-active
:help "Replace text in region with an ellipsis"]
["Delete Outside Region" message-delete-not-region
- :active (message-mark-active-p)
+ :active mark-active
:help "Delete all quoted text outside region"]
["Kill To Signature" message-kill-to-signature t]
["Newline and Reformat" message-newline-and-reformat t]
@@ -2966,7 +2965,7 @@ Consider adding this function to `message-header-setup-hook'"
["Spellcheck" ispell-message :help "Spellcheck this message"]
"----"
["Insert Region Marked" message-mark-inserted-region
- :active (message-mark-active-p) :help "Mark region with enclosing tags"]
+ :active mark-active :help "Mark region with enclosing tags"]
["Insert File Marked..." message-mark-insert-file
:help "Insert file at point marked with enclosing tags"]
["Attach File..." mml-attach-file t]
@@ -3930,17 +3929,16 @@ However, if `message-yank-prefix' is non-nil, insert that prefix on each line."
(goto-char start)
(forward-line 1))))
;; Delete blank lines at the start of the buffer.
- (while (and (point-min)
- (eolp)
- (not (eobp)))
- (message-delete-line))
+ (goto-char (point-min))
+ (while (and (eolp) (not (eobp)))
+ (delete-line))
;; Delete blank lines at the end of the buffer.
(goto-char (point-max))
(unless (eq (preceding-char) ?\n)
(insert "\n"))
(while (and (zerop (forward-line -1))
(looking-at "$"))
- (message-delete-line)))
+ (delete-line)))
;; Do the indentation.
(if (null message-yank-prefix)
(indent-rigidly start (or end (mark t)) message-indentation-spaces)
@@ -4180,8 +4178,7 @@ See `message-citation-line-format'."
(setq fname (car names)
lname (string-join (cdr names) " ")))
((> count 3)
- (setq fname (string-join (butlast names (- count 2))
- " ")
+ (setq fname (string-join (take 2 names) " ")
lname (string-join (nthcdr 2 names) " "))))
(when (string-match "\\(.*\\),\\'" fname)
(let ((newlname (match-string 1 fname)))
@@ -5145,9 +5142,9 @@ to find out how to use this."
(let ((headers message-mh-deletable-headers))
(while headers
(goto-char (point-min))
- (and (re-search-forward
- (concat "^" (symbol-name (car headers)) ": *") nil t)
- (message-delete-line))
+ (when (re-search-forward
+ (concat "^" (symbol-name (car headers)) ": *") nil t)
+ (delete-line))
(pop headers))))
(run-hooks 'message-send-mail-hook)
;; Pass it on to mh.
@@ -6279,7 +6276,7 @@ Headers already prepared in the buffer are not modified."
(and (re-search-forward
(concat "^" (symbol-name (car headers)) ": *") nil t)
(get-text-property (1+ (match-beginning 0)) 'message-deletable)
- (message-delete-line))
+ (delete-line))
(pop headers)))
;; Go through all the required headers and see if they are in the
;; articles already. If they are not, or are empty, they are
@@ -6498,7 +6495,7 @@ If the current line has `message-yank-prefix', insert it on the new line."
;; Tapdance around looong Message-IDs.
(forward-line -1)
(when (looking-at "[ \t]*$")
- (message-delete-line))
+ (delete-line))
(goto-char begin)
(search-forward ":" nil t)
(when (looking-at "\n[ \t]+")
diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el
index 79217d34001..1417ecdccc8 100644
--- a/lisp/gnus/mm-decode.el
+++ b/lisp/gnus/mm-decode.el
@@ -117,8 +117,7 @@
(cond ((fboundp 'libxml-parse-html-region) 'shr)
((executable-find "w3m") 'gnus-w3m)
((executable-find "links") 'links)
- ((executable-find "lynx") 'lynx)
- ((locate-library "html2text") 'html2text))
+ ((executable-find "lynx") 'lynx))
"Render of HTML contents.
It is one of defined renderer types, or a rendering function.
The defined renderer types are:
@@ -127,16 +126,14 @@ The defined renderer types are:
`w3m': use emacs-w3m;
`w3m-standalone': use plain w3m;
`links': use links;
-`lynx': use lynx;
-`html2text': use html2text."
- :version "27.1"
+`lynx': use lynx."
+ :version "29.1"
:type '(choice (const shr)
(const gnus-w3m)
(const w3m :tag "emacs-w3m")
(const w3m-standalone :tag "standalone w3m" )
(const links)
(const lynx)
- (const html2text)
(function))
:group 'mime-display)
diff --git a/lisp/gnus/mm-util.el b/lisp/gnus/mm-util.el
index 727e3abfffc..48cca45cb9b 100644
--- a/lisp/gnus/mm-util.el
+++ b/lisp/gnus/mm-util.el
@@ -673,7 +673,6 @@ If INHIBIT is non-nil, inhibit `mm-inhibit-file-name-handlers'."
inhibit-file-name-handlers)))
(write-region start end filename append visit lockname)))
-(defalias 'mm-make-temp-file 'make-temp-file)
(define-obsolete-function-alias 'mm-make-temp-file 'make-temp-file "26.1")
(defvar mm-image-load-path-cache nil)
diff --git a/lisp/gnus/mml.el b/lisp/gnus/mml.el
index 093e582ea7a..e8291cfe6f7 100644
--- a/lisp/gnus/mml.el
+++ b/lisp/gnus/mml.el
@@ -35,7 +35,6 @@
(declare-function gnus-setup-posting-charset "gnus-msg" (group))
(autoload 'gnus-completing-read "gnus-util")
(autoload 'message-fetch-field "message")
-(autoload 'message-mark-active-p "message")
(autoload 'message-info "message")
(autoload 'fill-flowed-encode "flow-fill")
(autoload 'message-posting-charset "message")
@@ -980,13 +979,10 @@ type detected."
(symbol-name type) value))))))
(defvar ange-ftp-name-format)
-(defvar efs-path-regexp)
(defun mml-parse-file-name (path)
- (if (if (boundp 'efs-path-regexp)
- (string-match efs-path-regexp path)
- (if (boundp 'ange-ftp-name-format)
- (string-match (car ange-ftp-name-format) path)))
+ (if (and (boundp 'ange-ftp-name-format)
+ (string-match (car ange-ftp-name-format) path))
(list (match-string 1 path) (match-string 2 path)
(substring path (1+ (match-end 2))))
path))
@@ -1239,7 +1235,7 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
;;
;;["Narrow" mml-narrow-to-part t]
["Quote MML in region" mml-quote-region
- :active (message-mark-active-p)
+ :active mark-active
:help "Quote MML tags in region"]
["Validate MML" mml-validate t]
["Preview" mml-preview t]
@@ -1517,7 +1513,7 @@ BUFFER is the name of the buffer to attach. See
(defun mml-attach-external (file &optional type description)
"Attach an external file into the buffer.
-FILE is an ange-ftp/efs specification of the part location.
+FILE is an ange-ftp specification of the part location.
TYPE is the MIME type to use."
(interactive
(let* ((file (mml-minibuffer-read-file "Attach external file: "))
diff --git a/lisp/gnus/mml2015.el b/lisp/gnus/mml2015.el
index a373b7999ec..bf9e975f749 100644
--- a/lisp/gnus/mml2015.el
+++ b/lisp/gnus/mml2015.el
@@ -45,7 +45,7 @@
;; could be removed.
(defvar mml2015-use 'epg
"The package used for PGP/MIME.
-Valid packages include `epg', `pgg' and `mailcrypt'.")
+Valid packages include `epg', and `mailcrypt'.")
;; Something is not RFC2015.
(defvar mml2015-function-alist
diff --git a/lisp/gnus/nnagent.el b/lisp/gnus/nnagent.el
index 60140a46411..d7e32e45809 100644
--- a/lisp/gnus/nnagent.el
+++ b/lisp/gnus/nnagent.el
@@ -35,6 +35,7 @@
(defconst nnagent-version "nnagent 1.0")
+(make-obsolete-variable 'nnagent-version 'emacs-version "29.1")
(defvoo nnagent-directory nil
"Internal variable."
diff --git a/lisp/gnus/nnbabyl.el b/lisp/gnus/nnbabyl.el
index ff0dea8ecdd..5f9903a5b06 100644
--- a/lisp/gnus/nnbabyl.el
+++ b/lisp/gnus/nnbabyl.el
@@ -55,6 +55,7 @@
(defconst nnbabyl-version "nnbabyl 1.0"
"nnbabyl version.")
+(make-obsolete-variable 'nnbabyl-version 'emacs-version "29.1")
(defvoo nnbabyl-mbox-buffer nil)
(defvoo nnbabyl-current-group nil)
diff --git a/lisp/gnus/nndiary.el b/lisp/gnus/nndiary.el
index bd60c43f59d..14540ac7e87 100644
--- a/lisp/gnus/nndiary.el
+++ b/lisp/gnus/nndiary.el
@@ -234,9 +234,11 @@ all. This may very well take some time.")
(defconst nndiary-version "0.2-b14"
"Current Diary back end version.")
+(make-obsolete-variable 'nndiary-version 'emacs-version "29.1")
(defun nndiary-version ()
"Current Diary back end version."
+ (declare (obsolete emacs-version "29.1"))
(interactive)
(message "NNDiary version %s" nndiary-version))
diff --git a/lisp/gnus/nndir.el b/lisp/gnus/nndir.el
index 2ca25534ce1..75a6ace107a 100644
--- a/lisp/gnus/nndir.el
+++ b/lisp/gnus/nndir.el
@@ -48,6 +48,7 @@
(defvoo nndir-status-string "" nil nnmh-status-string)
(defconst nndir-version "nndir 1.0")
+(make-obsolete-variable 'nndir-version 'emacs-version "29.1")
diff --git a/lisp/gnus/nndoc.el b/lisp/gnus/nndoc.el
index 19ccce47b50..cdff7c9accf 100644
--- a/lisp/gnus/nndoc.el
+++ b/lisp/gnus/nndoc.el
@@ -218,6 +218,7 @@ from the document.")
(defconst nndoc-version "nndoc 1.0"
"nndoc version.")
+(make-obsolete-variable 'nndoc-version 'emacs-version "29.1")
diff --git a/lisp/gnus/nndraft.el b/lisp/gnus/nndraft.el
index fa88b8a87e0..f21e4faf559 100644
--- a/lisp/gnus/nndraft.el
+++ b/lisp/gnus/nndraft.el
@@ -56,6 +56,7 @@ are generated if and only if they are also in `message-draft-headers'."
(defvoo nndraft-current-directory nil nil nnmh-current-directory)
(defconst nndraft-version "nndraft 1.0")
+(make-obsolete-variable 'nndraft-version 'emacs-version "29.1")
(defvoo nndraft-status-string "" nil nnmh-status-string)
diff --git a/lisp/gnus/nneething.el b/lisp/gnus/nneething.el
index 829d912cb2d..ff72842a2ee 100644
--- a/lisp/gnus/nneething.el
+++ b/lisp/gnus/nneething.el
@@ -57,6 +57,7 @@ included.")
(defconst nneething-version "nneething 1.0"
"nneething version.")
+(make-obsolete-variable 'nneething-version 'emacs-version "29.1")
(defvoo nneething-current-directory nil
"Current news group directory.")
@@ -245,7 +246,8 @@ included.")
(while map
(if (and (member (cadr (car map)) files)
;; We also remove files that have changed mod times.
- (equal (file-attribute-modification-time (file-attributes
+ (time-equal-p
+ (file-attribute-modification-time (file-attributes
(nneething-file-name (cadr (car map)))))
(cadr (cdar map))))
(progn
diff --git a/lisp/gnus/nnfolder.el b/lisp/gnus/nnfolder.el
index 5dc8e5c30d0..a2b461c15f0 100644
--- a/lisp/gnus/nnfolder.el
+++ b/lisp/gnus/nnfolder.el
@@ -91,6 +91,7 @@ message, a huge time saver for large mailboxes.")
(defconst nnfolder-version "nnfolder 2.0"
"nnfolder version.")
+(make-obsolete-variable 'nnfolder-version 'emacs-version "29.1")
(defconst nnfolder-article-marker "X-Gnus-Article-Number: "
"String used to demarcate what the article number for a message is.")
@@ -860,7 +861,8 @@ deleted. Point is left where the deleted region was."
(nnheader-find-file-noselect file t)))))
(mm-enable-multibyte) ;; Use multibyte buffer for future copying.
(buffer-disable-undo)
- (if (equal (cadr (assoc group nnfolder-scantime-alist))
+ (if (time-equal-p
+ (cadr (assoc group nnfolder-scantime-alist))
(file-attribute-modification-time (file-attributes file)))
;; This looks up-to-date, so we don't do any scanning.
(if (file-exists-p file)
diff --git a/lisp/gnus/nnheader.el b/lisp/gnus/nnheader.el
index c1c5f00ff7f..634cc251b87 100644
--- a/lisp/gnus/nnheader.el
+++ b/lisp/gnus/nnheader.el
@@ -918,15 +918,11 @@ first. Otherwise, find the newest one, though it may take a time."
(car (sort results #'file-newer-than-file-p)))))
(defvar ange-ftp-path-format)
-(defvar efs-path-regexp)
(defun nnheader-re-read-dir (path)
"Re-read directory PATH if PATH is on a remote system."
- (if (and (fboundp 'efs-re-read-dir) (boundp 'efs-path-regexp))
- (when (string-match efs-path-regexp path)
- (efs-re-read-dir path))
- (when (and (fboundp 'ange-ftp-re-read-dir) (boundp 'ange-ftp-path-format))
- (when (string-match (car ange-ftp-path-format) path)
- (ange-ftp-re-read-dir path)))))
+ (when (and (fboundp 'ange-ftp-reread-dir) (boundp 'ange-ftp-path-format))
+ (when (string-match (car ange-ftp-path-format) path)
+ (ange-ftp-reread-dir path))))
(defun nnheader-insert-file-contents (filename &optional visit beg end replace)
"Like `insert-file-contents', q.v., but only reads in the file.
@@ -1059,7 +1055,7 @@ See `find-file-noselect' for the arguments."
(or ,end (point-max)))
'(buffer-string)))))
-(defvar nnheader-last-message-time '(0 0))
+(defvar nnheader-last-message-time 0)
(defun nnheader-message-maybe (&rest args)
(let ((now (current-time)))
(when (time-less-p 1 (time-subtract now nnheader-last-message-time))
diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el
index 746109f26fa..73cd183a02a 100644
--- a/lisp/gnus/nnimap.el
+++ b/lisp/gnus/nnimap.el
@@ -34,7 +34,6 @@
(require 'gnus-util)
(require 'gnus)
(require 'nnoo)
-(require 'netrc)
(require 'utf7)
(require 'nnmail)
@@ -556,7 +555,7 @@ during splitting, which may be slow."
;; Look for the credentials based on
;; the virtual server name and the address
(nnimap-credentials
- (gnus-delete-duplicates
+ (seq-uniq
(list server nnimap-address))
ports
nnimap-user))))
diff --git a/lisp/gnus/nnmaildir.el b/lisp/gnus/nnmaildir.el
index 30f473b1291..4d1ecbf8642 100644
--- a/lisp/gnus/nnmaildir.el
+++ b/lisp/gnus/nnmaildir.el
@@ -62,6 +62,7 @@
(require 'subr-x))
(defconst nnmaildir-version "Gnus")
+(make-obsolete-variable 'nnmaildir-version 'emacs-version "29.1")
(defconst nnmaildir-flag-mark-mapping
'((?F . tick)
@@ -99,7 +100,7 @@ SUFFIX should start with \":2,\"."
(let* ((flags (substring suffix 3))
(flags-as-list (append flags nil))
(new-flags
- (concat (gnus-delete-duplicates
+ (concat (seq-uniq
;; maildir flags must be sorted
(sort (cons flag flags-as-list) #'<)))))
(concat ":2," new-flags)))
@@ -463,7 +464,7 @@ This variable is set by `nnmaildir-request-article'.")
;; usable: if the message has been edited or if nnmail-extra-headers
;; has been augmented since this data was parsed from the message,
;; then we have to reparse. Otherwise it's up-to-date.
- (when (and nov (equal mtime (nnmaildir--nov-get-mtime nov)))
+ (when (and nov (time-equal-p mtime (nnmaildir--nov-get-mtime nov)))
;; The timestamp matches. Now check nnmail-extra-headers.
(setq old-extra (nnmaildir--nov-get-extra nov))
(when (equal nnmaildir--extra old-extra) ;; common case
@@ -799,7 +800,7 @@ This variable is set by `nnmaildir-request-article'.")
isnew
(throw 'return t))
(setq nattr (file-attribute-modification-time nattr))
- (if (equal nattr (nnmaildir--grp-new group))
+ (if (time-equal-p nattr (nnmaildir--grp-new group))
(setq nattr nil))
(if read-only (setq dir (and (or isnew nattr) ndir))
(when (or isnew nattr)
@@ -811,7 +812,7 @@ This variable is set by `nnmaildir-request-article'.")
(rename-file x (concat cdir (nnmaildir--ensure-suffix file)))))
(setf (nnmaildir--grp-new group) nattr))
(setq cattr (file-attribute-modification-time (file-attributes cdir)))
- (if (equal cattr (nnmaildir--grp-cur group))
+ (if (time-equal-p cattr (nnmaildir--grp-cur group))
(setq cattr nil))
(setq dir (and (or isnew cattr) cdir)))
(unless dir (throw 'return t))
@@ -899,7 +900,7 @@ This variable is set by `nnmaildir-request-article'.")
(remhash scan-group groups))
(setq x (file-attribute-modification-time (file-attributes srv-dir))
scan-group (null scan-group))
- (if (equal x (nnmaildir--srv-mtime nnmaildir--cur-server))
+ (if (time-equal-p x (nnmaildir--srv-mtime nnmaildir--cur-server))
(when scan-group
(maphash (lambda (group-name _group)
(nnmaildir--scan group-name t groups
@@ -1015,7 +1016,7 @@ This variable is set by `nnmaildir-request-article'.")
dir (nnmaildir--nndir dir)
dir (nnmaildir--marks-dir dir)
ls (nnmaildir--group-ls nnmaildir--cur-server pgname)
- all-marks (gnus-delete-duplicates
+ all-marks (seq-uniq
;; get mark names from mark dirs and from flag
;; mappings
(append
@@ -1049,7 +1050,7 @@ This variable is set by `nnmaildir-request-article'.")
(t
markdir-mtime))))
(puthash mark mtime new-mmth)
- (when (equal mtime (gethash mark old-mmth))
+ (when (time-equal-p mtime (gethash mark old-mmth))
(setq ranges (assq mark old-marks))
(if ranges (setq ranges (cdr ranges)))
(throw 'got-ranges nil))
@@ -1697,7 +1698,7 @@ This variable is set by `nnmaildir-request-article'.")
pgname (nnmaildir--pgname nnmaildir--cur-server gname)
ls (nnmaildir--group-ls nnmaildir--cur-server pgname)
all-marks (funcall ls marksdir nil "\\`[^.]" 'nosort)
- all-marks (gnus-delete-duplicates
+ all-marks (seq-uniq
;; get mark names from mark dirs and from flag
;; mappings
(append
@@ -1785,9 +1786,4 @@ This variable is set by `nnmaildir-request-article'.")
(provide 'nnmaildir)
-;; Local Variables:
-;; indent-tabs-mode: t
-;; fill-column: 77
-;; End:
-
;;; nnmaildir.el ends here
diff --git a/lisp/gnus/nnmbox.el b/lisp/gnus/nnmbox.el
index 96ecc34e156..5735c97805e 100644
--- a/lisp/gnus/nnmbox.el
+++ b/lisp/gnus/nnmbox.el
@@ -52,6 +52,7 @@
(defconst nnmbox-version "nnmbox 1.0"
"nnmbox version.")
+(make-obsolete-variable 'nnmbox-version 'emacs-version "29.1")
(defvoo nnmbox-current-group nil
"Current nnmbox news group directory.")
diff --git a/lisp/gnus/nnmh.el b/lisp/gnus/nnmh.el
index 5d016267bc6..bced527d03f 100644
--- a/lisp/gnus/nnmh.el
+++ b/lisp/gnus/nnmh.el
@@ -55,6 +55,7 @@ as unread by Gnus.")
(defconst nnmh-version "nnmh 1.0"
"nnmh version.")
+(make-obsolete-variable 'nnmh-version 'emacs-version "29.1")
(defvoo nnmh-current-directory nil
"Current news group directory.")
@@ -539,7 +540,7 @@ as unread by Gnus.")
(let ((arts articles)
art)
(while (setq art (pop arts))
- (when (not (equal
+ (when (not (time-equal-p
(file-attribute-modification-time
(file-attributes (concat dir (int-to-string (car art)))))
(cdr art)))
@@ -547,14 +548,17 @@ as unread by Gnus.")
(push (car art) new))))
;; Go through all the new articles and add them, and their
;; time-stamps, to the list.
+ ;; Use list format for timestamps, so Emacs <27 can read .nnmh-articles.
(setq articles
(nconc articles
(mapcar
(lambda (art)
(cons art
- (file-attribute-modification-time
- (file-attributes
- (concat dir (int-to-string art))))))
+ (when-let ((modtime
+ (file-attribute-modification-time
+ (file-attributes
+ (concat dir (int-to-string art))))))
+ (time-convert modtime 'list))))
new)))
;; Make Gnus mark all new articles as unread.
(when new
diff --git a/lisp/gnus/nnml.el b/lisp/gnus/nnml.el
index 7fe2b516cce..ae726ba0f7b 100644
--- a/lisp/gnus/nnml.el
+++ b/lisp/gnus/nnml.el
@@ -89,6 +89,7 @@ non-nil.")
(defconst nnml-version "nnml 1.0"
"nnml version.")
+(make-obsolete-variable 'nnml-version 'emacs-version "29.1")
(defvoo nnml-nov-file-name ".overview")
diff --git a/lisp/gnus/nnrss.el b/lisp/gnus/nnrss.el
index f740af3b6d1..99e7b2a6f3f 100644
--- a/lisp/gnus/nnrss.el
+++ b/lisp/gnus/nnrss.el
@@ -71,6 +71,7 @@ this variable to the list of fields to be ignored.")
(defvoo nnrss-status-string "")
(defconst nnrss-version "nnrss 1.0")
+(make-obsolete-variable 'nnrss-version 'emacs-version "29.1")
(defvar nnrss-group-alist '()
"List of RSS addresses.")
@@ -325,7 +326,7 @@ for decoding when the cdr that the data specify is not available.")
(nnmail-expired-article-p
group
(if (listp (setq days (nth 1 e))) days
- (days-to-time (- days (time-to-days '(0 0)))))
+ (days-to-time (- days (time-to-days 0))))
force))
(setq nnrss-group-data (delq e nnrss-group-data)
changed t)
@@ -453,8 +454,8 @@ which RSS 2.0 allows."
(let (case-fold-search vector year month day time zone given)
(cond ((null date)) ; do nothing for this case
;; if the date is just digits (unix time stamp):
- ((string-match "^[0-9]+$" date)
- (setq given (time-convert (string-to-number date))))
+ ((string-match "\\`[0-9]+\\'" date)
+ (setq given (time-convert (string-to-number date) t)))
;; RFC 822
((string-match " [0-9]+ " date)
(setq vector (timezone-parse-date date)
diff --git a/lisp/gnus/nnspool.el b/lisp/gnus/nnspool.el
index 39b89abb88a..e5eb4b81604 100644
--- a/lisp/gnus/nnspool.el
+++ b/lisp/gnus/nnspool.el
@@ -114,6 +114,7 @@ there.")
(defconst nnspool-version "nnspool 2.0"
"Version numbers of this version of NNSPOOL.")
+(make-obsolete-variable 'nnspool-version 'emacs-version "29.1")
(defvoo nnspool-current-directory nil
"Current news group directory.")
diff --git a/lisp/gnus/nntp.el b/lisp/gnus/nntp.el
index f047c832931..6fa424a1555 100644
--- a/lisp/gnus/nntp.el
+++ b/lisp/gnus/nntp.el
@@ -217,25 +217,6 @@ then use this hook to rsh to the remote machine and start a proxy NNTP
server there that you can connect to. See also
`nntp-open-connection-function'")
-(defcustom nntp-authinfo-file "~/.authinfo"
- ".netrc-like file that holds nntp authinfo passwords."
- :type
- '(choice file
- (repeat :tag "Entries"
- :menu-tag "Inline"
- (list :format "%v"
- :value ("" ("login" . "") ("password" . ""))
- (string :tag "Host")
- (checklist :inline t
- (cons :format "%v"
- (const :format "" "login")
- (string :format "Login: %v"))
- (cons :format "%v"
- (const :format "" "password")
- (string :format "Password: %v")))))))
-
-(make-obsolete 'nntp-authinfo-file nil "24.1")
-
(defvoo nntp-connection-timeout nil
@@ -278,6 +259,7 @@ update their active files often, this can help.")
(defvoo nntp-connection-alist nil)
(defvoo nntp-status-string "")
(defconst nntp-version "nntp 5.0")
+(make-obsolete-variable 'nntp-version 'emacs-version "29.1")
(defvoo nntp-inhibit-erase nil)
(defvoo nntp-inhibit-output nil)
@@ -1152,11 +1134,6 @@ It will make innd servers spawn an nnrpd process to allow actual article
reading."
(nntp-send-command "^.*\n" "MODE READER"))
-(declare-function netrc-parse "netrc" (&optional file))
-(declare-function netrc-machine "netrc"
- (list machine &optional port defaultport))
-(declare-function netrc-get "netrc" (alist type))
-
(defun nntp-send-authinfo (&optional send-if-force)
"Send the AUTHINFO to the nntp server.
It will look in the \"~/.authinfo\" file for matching entries. If
@@ -1165,30 +1142,16 @@ and a password.
If SEND-IF-FORCE, only send authinfo to the server if the
.authinfo file has the FORCE token."
- (require 'netrc)
- (let* ((list (netrc-parse nntp-authinfo-file))
- (alist (netrc-machine list nntp-address "nntp"))
- (auth-info
+ (let* ((auth-info
(nth 0 (auth-source-search
:max 1
:host (list nntp-address (nnoo-current-server 'nntp))
:port `("119" "nntp" ,(format "%s" nntp-port-number)
"563" "nntps" "snews"))))
(auth-user (plist-get auth-info :user))
- (auth-force (plist-get auth-info :force))
- (auth-passwd (auth-info-password auth-info))
- (force (or (netrc-get alist "force")
- nntp-authinfo-force
- auth-force))
- (user (or
- ;; this is preferred to netrc-*
- auth-user
- (netrc-get alist "login")
- nntp-authinfo-user))
- (passwd (or
- ;; this is preferred to netrc-*
- auth-passwd
- (netrc-get alist "password"))))
+ (passwd (auth-info-password auth-info))
+ (force (or nntp-authinfo-force (plist-get auth-info :force)))
+ (user (or auth-user nntp-authinfo-user)))
(when (or (not send-if-force)
force)
(unless user
diff --git a/lisp/gnus/nnvirtual.el b/lisp/gnus/nnvirtual.el
index ae4265de7fb..7b192aa1d2e 100644
--- a/lisp/gnus/nnvirtual.el
+++ b/lisp/gnus/nnvirtual.el
@@ -57,6 +57,7 @@ component group will show up when you enter the virtual group.")
(defconst nnvirtual-version "nnvirtual 1.1")
+(make-obsolete-variable 'nnvirtual-version 'emacs-version "29.1")
(defvoo nnvirtual-current-group nil)
diff --git a/lisp/gnus/spam-stat.el b/lisp/gnus/spam-stat.el
index 084eb3d7745..5763ac14bb3 100644
--- a/lisp/gnus/spam-stat.el
+++ b/lisp/gnus/spam-stat.el
@@ -422,7 +422,8 @@ spam-stat (spam-stat-to-hash-table '(" spam-stat-ngood spam-stat-nbad))
(cond (spam-stat-dirty (message "Spam stat not loaded: spam-stat-dirty t"))
((or (not (boundp 'spam-stat-last-saved-at))
(null spam-stat-last-saved-at)
- (not (equal spam-stat-last-saved-at
+ (not (time-equal-p
+ spam-stat-last-saved-at
(file-attribute-modification-time
(file-attributes spam-stat-file)))))
(progn
diff --git a/lisp/gnus/spam.el b/lisp/gnus/spam.el
index 5af29c0a246..2883a6186bd 100644
--- a/lisp/gnus/spam.el
+++ b/lisp/gnus/spam.el
@@ -43,14 +43,12 @@
(require 'gnus-uu) ; because of key prefix issues
;;; for the definitions of group content classification and spam processors
(require 'gnus)
+(require 'dig)
(eval-when-compile
(require 'cl-lib)
(require 'hashcash))
-;; autoload query-dig
-(autoload 'query-dig "dig")
-
;; autoload spam-report
(autoload 'spam-report-gmane "spam-report")
(autoload 'spam-report-gmane-spam "spam-report")
@@ -2008,7 +2006,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
(unless matches
(let ((query-string (concat ip "." server)))
(if spam-use-dig
- (let ((query-result (query-dig query-string)))
+ (let ((query-result (dig-query query-string)))
(when query-result
(gnus-message 6 "(DIG): positive blackhole check `%s'"
query-result)
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index fbd40158701..74e18285e64 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -266,13 +266,9 @@ handling of autoloaded functions."
(current-buffer)))
(help-buffer-under-preparation t))
- (help-setup-xref
- (list (lambda (function buffer)
- (let ((describe-function-orig-buffer
- (if (buffer-live-p buffer) buffer)))
- (describe-function function)))
- function describe-function-orig-buffer)
- (called-interactively-p 'interactive))
+ (help-setup-xref (list #'describe-function--helper
+ function describe-function-orig-buffer)
+ (called-interactively-p 'interactive))
(save-excursion
(with-help-window (help-buffer)
@@ -791,15 +787,40 @@ the C sources, too."
(function-get function 'disabled))
(insert " This function is disabled.\n")))
+(defun help-fns--first-release-regexp (symbol)
+ (let* ((name (symbol-name symbol))
+ (quoted (regexp-quote name)))
+ ;; We used to use just (concat "\\_<" (regexp-quote name) "\\_>"),
+ ;; which had the advantage of adapting to the various notational
+ ;; conventions we've used over the years in etc/NEWS*, but it was also
+ ;; leading to many false positives. So we use a more restrictive regexp
+ ;; now (which can still lead to false positives, e.g. because we don't
+ ;; distinguish between occurrences of the same symbol for
+ ;; different purposes, such as function name, var name, face name,
+ ;; property name, ...).
+ (concat
+ ;; The main "canonical" occurrence of symbols is within '...'.
+ "'" quoted "'"
+ ;; Commands can also occur as `M-x blabla'.
+ "\\|M-x[ \t\n]+" quoted "\\_>"
+ ;; Other times we do '<key>' (<cmdname>).
+ "\\|(" quoted ")"
+ ;; Finally other times we just include sample code, which we will
+ ;; only recognize if it's indented by at least 2 spaces and start with
+ ;; an open paren.
+ "\\|^\\(?: \\|\t\\)[ \t]*(\\(.*[( ']\\)?" quoted "\\_>")
+ ))
+
+
(defun help-fns--first-release (symbol)
"Return the likely first release that defined SYMBOL, or nil."
;; Code below relies on the etc/NEWS* files.
;; FIXME: Maybe we should also use the */ChangeLog* files when available.
;; FIXME: Maybe we should also look for announcements of the addition
;; of the *packages* in which the function is defined.
- (let* ((name (symbol-name symbol))
- (re (concat "\\_<" (regexp-quote name) "\\_>"))
+ (let* ((re (help-fns--first-release-regexp symbol))
(news (directory-files data-directory t "\\`NEWS\\(\\'\\|\\.\\)"))
+ (case-fold-search nil)
(place nil)
(first nil))
(with-temp-buffer
@@ -816,10 +837,11 @@ the C sources, too."
;; Almost all entries are of the form "* ... in Emacs NN.MM."
;; but there are also a few in the form "* Emacs NN.MM is a bug
;; fix release ...".
- (if (not (re-search-backward "^\\* .* Emacs \\([0-9.]+[0-9]\\)"
- nil t))
- (message "Ref found in non-versioned section in %S"
- (file-name-nondirectory f))
+ (if (not (re-search-backward
+ "^\\* \\(?:.* \\)?Emacs \\([0-9.]+[0-9]\\)"
+ nil t))
+ (message "Ref to %S found in non-versioned section in %S"
+ symbol (file-name-nondirectory f))
(let ((version (match-string 1)))
(when (or (null first) (version< version first))
(setq place (list f pos))
@@ -827,6 +849,48 @@ the C sources, too."
(when first
(make-text-button first nil 'type 'help-news 'help-args place))))
+;; (defun help-fns--check-first-releases ()
+;; "Compare the old liberal regexp to the new more restrictive one."
+;; (interactive)
+;; (let* ((quoted nil)
+;; (rx-fun (lambda (orig-fun symbol)
+;; (if quoted
+;; (funcall orig-fun symbol)
+;; (format "\\_<%s\\_>"
+;; (regexp-quote (symbol-name symbol))))))
+;; (count
+;; (let ((count 0))
+;; (obarray-map (lambda (sym)
+;; (when (or (fboundp sym) (boundp sym))
+;; (cl-incf count)))
+;; obarray)
+;; count))
+;; (p (make-progress-reporter "Check first releases..." 0 count)))
+;; (with-current-buffer (get-buffer-create "*Check-first-release*")
+;; (unwind-protect
+;; (progn
+;; (advice-add 'help-fns--first-release-regexp :around rx-fun)
+;; (erase-buffer)
+;; (setq count 0)
+;; (obarray-map
+;; (lambda (sym)
+;; (when (or (fboundp sym) (boundp sym))
+;; (cl-incf count)
+;; (progress-reporter-update p count)
+;; (let ((vt (progn (setq quoted t)
+;; (help-fns--first-release sym)))
+;; (vnil (progn (setq quoted nil)
+;; (help-fns--first-release sym))))
+;; (when (and vnil (not (equal vt vnil)))
+;; (insert (symbol-name sym)
+;; "\nnot-quoted: " (or vnil "nil")
+;; "\nquoted: " (or vt "nil")
+;; "\n\n")))))
+;; obarray)
+;; (progress-reporter-done p))
+;; (advice-remove 'help-fns--first-release-regexp rx-fun))
+;; (display-buffer (current-buffer)))))
+
(add-hook 'help-fns-describe-function-functions
#'help-fns--mention-first-release)
(add-hook 'help-fns-describe-variable-functions
@@ -941,9 +1005,9 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED REAL-DEF)."
(help-fns--analyze-function function))
(file-name (find-lisp-object-file-name
function (if aliased 'defun def)))
- (beg (if (and (or (byte-code-function-p def)
+ (beg (if (and (or (functionp def)
(keymapp def)
- (memq (car-safe def) '(macro lambda closure)))
+ (eq (car-safe def) 'macro))
(stringp file-name)
(help-fns--autoloaded-p function))
(concat
@@ -962,7 +1026,7 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED REAL-DEF)."
(aliased
(format-message "an alias for `%s'" real-def))
((subr-native-elisp-p def)
- (concat beg "native compiled Lisp function"))
+ (concat beg "native-compiled Lisp function"))
((subrp def)
(concat beg (if (eq 'unevalled (cdr (subr-arity def)))
"special form"
@@ -976,12 +1040,12 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED REAL-DEF)."
(t "Lisp function"))))
((or (eq (car-safe def) 'macro)
;; For advised macros, def is a lambda
- ;; expression or a byte-code-function-p, so we
+ ;; expression or a compiled-function-p, so we
;; need to check macros before functions.
(macrop function))
(concat beg "Lisp macro"))
((byte-code-function-p def)
- (concat beg "compiled Lisp function"))
+ (concat beg "byte-compiled Lisp function"))
((module-function-p def)
(concat beg "module function"))
((eq (car-safe def) 'lambda)
@@ -1470,8 +1534,8 @@ This cancels value editing without updating the value."
(when safe-var
(princ " This variable is safe as a file local variable ")
(princ "if its value\n satisfies the predicate ")
- (princ (if (byte-code-function-p safe-var)
- "which is a byte-compiled expression.\n"
+ (princ (if (compiled-function-p safe-var)
+ "which is a compiled expression.\n"
(format-message "`%s'.\n" safe-var))))))
(add-hook 'help-fns-describe-variable-functions #'help-fns--var-risky)
@@ -1791,8 +1855,10 @@ current buffer and the selected frame, respectively."
(when (funcall testfn symbol)
;; Don't record the current entry in the stack.
(setq help-xref-stack-item nil)
- (cons name
- (funcall descfn symbol buffer frame))))
+ (let ((help-xref-stack nil)
+ (help-xref-forward-stack nil))
+ (funcall descfn symbol buffer frame))
+ (cons name (buffer-string))))
describe-symbol-backends))))
(single (null (cdr docs))))
(while (cdr docs)
@@ -1813,6 +1879,8 @@ current buffer and the selected frame, respectively."
;; Don't record the `describe-variable' item in the stack.
(setq help-xref-stack-item nil)
(help-setup-xref (list #'describe-symbol symbol) nil))
+ (goto-char (point-max))
+ (help-xref--navigation-buttons)
(goto-char (point-min))))))
;;;###autoload
@@ -2123,6 +2191,8 @@ documentation for the major and minor modes of that buffer."
(when (and (commandp sym)
;; Ignore aliases.
(not (symbolp (symbol-function sym)))
+ ;; Ignore obsolete commands.
+ (not (get sym 'byte-obsolete-info))
;; Ignore everything bound.
(not (where-is-internal sym nil t))
(apply #'derived-mode-p (command-modes sym)))
diff --git a/lisp/help-mode.el b/lisp/help-mode.el
index 8b5e48edad1..f49d20270cf 100644
--- a/lisp/help-mode.el
+++ b/lisp/help-mode.el
@@ -384,8 +384,8 @@ The format is (FUNCTION ARGS...).")
'help-function
(lambda (file pos)
(if help-window-keep-selected
- (view-buffer (find-file-noselect file))
- (view-buffer-other-window (find-file-noselect file)))
+ (view-file file)
+ (view-file-other-window file))
(goto-char pos))
'help-echo (purecopy "mouse-2, RET: show corresponding NEWS announcement"))
@@ -408,7 +408,7 @@ Commands:
\\{help-mode-map}"
(setq-local revert-buffer-function
#'help-mode-revert-buffer)
- (add-hook 'context-menu-functions 'help-mode-context-menu 5 t)
+ (add-hook 'context-menu-functions #'help-mode-context-menu 5 t)
(setq-local tool-bar-map
help-mode-tool-bar-map)
(setq-local help-mode--current-data nil)
@@ -673,22 +673,26 @@ that."
(while (and (not (bobp)) (bolp))
(delete-char -1))
(insert "\n")
- (when (or help-xref-stack help-xref-forward-stack)
- (insert "\n"))
- ;; Make a back-reference in this buffer if appropriate.
- (when help-xref-stack
- (help-insert-xref-button help-back-label 'help-back
- (current-buffer)))
- ;; Make a forward-reference in this buffer if appropriate.
- (when help-xref-forward-stack
- (when help-xref-stack
- (insert "\t"))
- (help-insert-xref-button help-forward-label 'help-forward
- (current-buffer)))
- (when (or help-xref-stack help-xref-forward-stack)
- (insert "\n")))
+ (help-xref--navigation-buttons))
(set-buffer-modified-p old-modified)))))
+(defun help-xref--navigation-buttons ()
+ (let ((inhibit-read-only t))
+ (when (or help-xref-stack help-xref-forward-stack)
+ (ensure-empty-lines 1))
+ ;; Make a back-reference in this buffer if appropriate.
+ (when help-xref-stack
+ (help-insert-xref-button help-back-label 'help-back
+ (current-buffer)))
+ ;; Make a forward-reference in this buffer if appropriate.
+ (when help-xref-forward-stack
+ (when help-xref-stack
+ (insert "\t"))
+ (help-insert-xref-button help-forward-label 'help-forward
+ (current-buffer)))
+ (unless (bolp)
+ (insert "\n"))))
+
;;;###autoload
(defun help-xref-button (match-number type &rest args)
"Make a hyperlink for cross-reference text previously matched.
@@ -758,7 +762,7 @@ See `help-make-xrefs'."
;; Additional functions for (re-)creating types of help buffers.
;;;###autoload
-(define-obsolete-function-alias 'help-xref-interned 'describe-symbol "25.1")
+(define-obsolete-function-alias 'help-xref-interned #'describe-symbol "25.1")
;; Navigation/hyperlinking with xrefs
@@ -828,7 +832,7 @@ The help buffers are divided into \"pages\" by the ^L character."
(defun help-goto-previous-page ()
"Go to the previous page (if any) in the current buffer.
-(If not at the start of a page, go to the start of the current page.)
+\(If not at the start of a page, go to the start of the current page.)
The help buffers are divided into \"pages\" by the ^L character."
(interactive nil help-mode)
diff --git a/lisp/help.el b/lisp/help.el
index abe17fa4ce2..37aab15df05 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -606,7 +606,6 @@ or a buffer name."
(setq-local outline-level (lambda () 1))
(setq-local outline-minor-mode-cycle t
outline-minor-mode-highlight t)
- (setq-local outline-minor-mode-use-buttons t)
(outline-minor-mode 1)
(save-excursion
(goto-char (point-min))
@@ -906,6 +905,18 @@ Describe the following key, mouse click, or menu item: "
;; Defined in help-fns.el.
(defvar describe-function-orig-buffer)
+;; These two are named functions because lambda-functions cannot be
+;; serialized in a native-compilation build, which breaks bookmark
+;; support in help-mode.el.
+(defun describe-key--helper (key-list buf)
+ (describe-key key-list
+ (if (buffer-live-p buf) buf)))
+
+(defun describe-function--helper (func buf)
+ (let ((describe-function-orig-buffer
+ (if (buffer-live-p buf) buf)))
+ (describe-function func)))
+
(defun describe-key (&optional key-list buffer up-event)
"Display documentation of the function invoked by KEY-LIST.
KEY-LIST can be any kind of a key sequence; it can include keyboard events,
@@ -959,10 +970,7 @@ current buffer."
`(,seq ,brief-desc ,defn ,locus)))
key-list))
2)))
- (help-setup-xref (list (lambda (key-list buf)
- (describe-key key-list
- (if (buffer-live-p buf) buf)))
- key-list buf)
+ (help-setup-xref (list #'describe-key--helper key-list buf)
(called-interactively-p 'interactive))
(if (and (<= (length info-list) 1)
(help--binding-undefined-p (nth 2 (car info-list))))
@@ -995,10 +1003,11 @@ current buffer."
(defun search-forward-help-for-help ()
"Search forward in the help-for-help window.
-This command is meant to be used after issuing the `C-h C-h' command."
+This command is meant to be used after issuing the \\[help-for-help] command."
(interactive)
(unless (get-buffer help-for-help-buffer-name)
- (error "No %s buffer; use `C-h C-h' first" help-for-help-buffer-name))
+ (error (substitute-command-keys "No %s buffer; use \\[help-for-help] first")
+ help-for-help-buffer-name))
;; Move cursor to the "help window".
(pop-to-buffer help-for-help-buffer-name)
;; Do incremental search forward.
@@ -1173,6 +1182,7 @@ Otherwise, return a new string."
(let ((k (buffer-substring-no-properties (+ orig-point 2)
end-point)))
(when (or (key-valid-p k)
+ (string-match-p "\\`mouse-[1-9]" k)
(string-match-p "\\`M-x " k))
(goto-char orig-point)
(delete-char 2)
@@ -1313,18 +1323,17 @@ If BUFFER, lookup keys while in that buffer. This only affects
things like :filters for menu bindings."
(let* ((amaps (accessible-keymaps startmap prefix))
(orig-maps (if no-menu
- (progn
- ;; Delete from MAPS each element that is for
- ;; the menu bar.
- (let* ((tail amaps)
- result)
- (while tail
- (let ((elem (car tail)))
- (when (not (and (>= (length (car elem)) 1)
- (eq (elt (car elem) 0) 'menu-bar)))
- (setq result (append result (list elem)))))
- (setq tail (cdr tail)))
- result))
+ ;; Delete from MAPS each element that is for
+ ;; the menu bar.
+ (let* ((tail amaps)
+ result)
+ (while tail
+ (let ((elem (car tail)))
+ (when (not (and (>= (length (car elem)) 1)
+ (eq (elt (car elem) 0) 'menu-bar)))
+ (setq result (append result (list elem)))))
+ (setq tail (cdr tail)))
+ result)
amaps))
(maps orig-maps)
(print-title (or maps always-title))
@@ -1438,8 +1447,7 @@ prefix keys PREFIX (a string or vector).
TRANSL, PARTIAL, SHADOW, NOMENU, MENTION-SHADOW and BUFFER are as
in `describe-map-tree'."
;; Converted from describe_map in keymap.c.
- (let* ((suppress (and partial 'suppress-keymap))
- (map (keymap-canonicalize map))
+ (let* ((map (keymap-canonicalize map))
(tail map)
(first t)
done vect)
@@ -1470,7 +1478,7 @@ in `describe-map-tree'."
;; commands.
(setq definition (keymap--get-keyelt (cdr (car tail)) nil))
(or (not (symbolp definition))
- (null (get definition suppress)))
+ (not (get definition (when partial 'suppress-keymap))))
;; Don't show a command that isn't really
;; visible because a local definition of the
;; same key shadows it.
@@ -1503,7 +1511,7 @@ in `describe-map-tree'."
(push (cons tail prefix) help--keymaps-seen)))))
(setq tail (cdr tail)))
;; If we found some sparse map events, sort them.
- (let ((vect (sort vect 'help--describe-map-compare))
+ (let ((vect (sort vect #'help--describe-map-compare))
(columns ())
line-start key-end column)
;; Now output them in sorted order.
diff --git a/lisp/hex-util.el b/lisp/hex-util.el
index 0858e46ec54..101c8be7b48 100644
--- a/lisp/hex-util.el
+++ b/lisp/hex-util.el
@@ -41,8 +41,8 @@
(dst (make-string (/ len 2) 0))
(idx 0)(pos 0))
(while (< pos len)
- ;; logior and lsh are not byte-coded.
- ;; (aset dst idx (logior (lsh (hex-char-to-num (aref string pos)) 4)
+ ;; logior and ash are not byte-coded.
+ ;; (aset dst idx (logior (ash (hex-char-to-num (aref string pos)) 4)
;; (hex-char-to-num (aref string (1+ pos)))))
(aset dst idx (+ (* (hex-char-to-num (aref string pos)) 16)
(hex-char-to-num (aref string (1+ pos)))))
@@ -56,8 +56,8 @@
(dst (make-string (* len 2) 0))
(idx 0)(pos 0))
(while (< pos len)
- ;; logand and lsh are not byte-coded.
- ;; (aset dst idx (num-to-hex-char (logand (lsh (aref string pos) -4) 15)))
+ ;; logand and ash are not byte-coded.
+ ;; (aset dst idx (num-to-hex-char (logand (ash (aref string pos) -4) 15)))
(aset dst idx (num-to-hex-char (/ (aref string pos) 16)))
(setq idx (1+ idx))
;; (aset dst idx (num-to-hex-char (logand (aref string pos) 15)))
diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el
index dbcc152c15d..bf7446f151a 100644
--- a/lisp/htmlfontify.el
+++ b/lisp/htmlfontify.el
@@ -81,11 +81,9 @@
(eval-when-compile (require 'cl-lib))
(require 'cus-edit)
-(defconst htmlfontify-version 0.21)
-
(defconst hfy-meta-tags
- (format "<meta name=\"generator\" content=\"emacs %s; htmlfontify %0.2f\" />"
- emacs-version htmlfontify-version)
+ (format "<meta name=\"generator\" content=\"emacs %s; htmlfontify\" />"
+ emacs-version)
"The generator meta tag for this version of htmlfontify.")
(defconst htmlfontify-manual "Htmlfontify Manual"
@@ -2392,13 +2390,14 @@ You may also want to set `hfy-page-header' and `hfy-page-footer'."
(let ((file (hfy-initfile)))
(load file 'NOERROR nil nil) ))
-;; Obsolete.
-
(defun hfy-interq (set-a set-b)
"Return the intersection (using `eq') of two lists SET-A and SET-B."
(declare (obsolete seq-intersection "28.1"))
(nreverse (seq-intersection set-a set-b #'eq)))
+(defconst htmlfontify-version 0.21)
+(make-obsolete-variable 'htmlfontify-version 'emacs-version "29.1")
+
(define-obsolete-function-alias 'hfy-prop-invisible-p #'invisible-p "29.1")
(provide 'htmlfontify)
diff --git a/lisp/ibuf-ext.el b/lisp/ibuf-ext.el
index 822ecbdd99d..6b5cccec515 100644
--- a/lisp/ibuf-ext.el
+++ b/lisp/ibuf-ext.el
@@ -48,30 +48,12 @@
;;; Utility functions
(defun ibuffer-remove-alist (key alist)
"Remove all entries in ALIST that have a key equal to KEY."
- (while (ibuffer-awhen (assoc key alist)
- (setq alist (remove it alist)) it))
- alist)
-
-;; borrowed from Gnus
-(defun ibuffer-remove-duplicates (list)
- "Return a copy of LIST with duplicate elements removed."
- (let ((new nil)
- (tail list))
- (while tail
- (or (member (car tail) new)
- (setq new (cons (car tail) new)))
- (setq tail (cdr tail)))
- (nreverse new)))
-
-(defun ibuffer-split-list (ibuffer-split-list-fn ibuffer-split-list-elts)
- (let ((hip-crowd nil)
- (lamers nil))
- (dolist (ibuffer-split-list-elt ibuffer-split-list-elts)
- (if (funcall ibuffer-split-list-fn ibuffer-split-list-elt)
- (push ibuffer-split-list-elt hip-crowd)
- (push ibuffer-split-list-elt lamers)))
- ;; Too bad Emacs Lisp doesn't have multiple values.
- (list (nreverse hip-crowd) (nreverse lamers))))
+ (assoc-delete-all key (copy-sequence alist)))
+
+(defun ibuffer-split-list (fn elts)
+ (declare (obsolete seq-group-by "29.1"))
+ (let ((res (seq-group-by fn elts)))
+ (list (cdr (assq t res)) (cdr (assq nil res)))))
(defcustom ibuffer-never-show-predicates nil
"A list of predicates (a regexp or function) for buffers not to display.
@@ -769,11 +751,12 @@ specification, with the same structure as an element of the list
(i 0))
(dolist (filtergroup filter-group-alist)
(let ((filterset (cdr filtergroup)))
- (cl-destructuring-bind (hip-crowd lamers)
- (ibuffer-split-list (lambda (bufmark)
- (ibuffer-included-in-filters-p (car bufmark)
- filterset))
- bmarklist)
+ (let* ((res (seq-group-by (lambda (bufmark)
+ (ibuffer-included-in-filters-p (car bufmark)
+ filterset))
+ bmarklist))
+ (hip-crowd (cdr (assq t res)))
+ (lamers (cdr (assq nil res))))
(aset vec i hip-crowd)
(cl-incf i)
(setq bmarklist lamers))))
@@ -803,7 +786,7 @@ specification, with the same structure as an element of the list
(mapcar (lambda (mode)
(cons (format "%s" mode) `((mode . ,mode))))
(let ((modes
- (ibuffer-remove-duplicates
+ (seq-uniq
(mapcar (lambda (buf)
(buffer-local-value 'major-mode buf))
(buffer-list)))))
@@ -880,7 +863,7 @@ specification, with the same structure as an element of the list
"Move point to the filter group whose name is NAME."
(interactive
(list (ibuffer-read-filter-group-name "Jump to filter group: ")))
- (ibuffer-aif (assoc name (ibuffer-current-filter-groups-with-position))
+ (if-let ((it (assoc name (ibuffer-current-filter-groups-with-position))))
(goto-char (cdr it))
(error "No filter group with name %s" name)))
@@ -891,7 +874,7 @@ The group will be added to `ibuffer-filter-group-kill-ring'."
(interactive (list (ibuffer-read-filter-group-name "Kill filter group: " t)))
(when (equal name "Default")
(error "Can't kill default filter group"))
- (ibuffer-aif (assoc name ibuffer-filter-groups)
+ (if-let ((it (assoc name ibuffer-filter-groups)))
(progn
(push (copy-tree it) ibuffer-filter-group-kill-ring)
(setq ibuffer-filter-groups (ibuffer-remove-alist
@@ -906,13 +889,12 @@ The group will be added to `ibuffer-filter-group-kill-ring'."
"Kill the filter group at point.
See also `ibuffer-kill-filter-group'."
(interactive "P\np")
- (ibuffer-aif (save-excursion
- (ibuffer-forward-line 0)
- (get-text-property (point) 'ibuffer-filter-group-name))
- (progn
- (ibuffer-kill-filter-group it))
- (funcall (if interactive-p #'call-interactively #'funcall)
- #'kill-line arg)))
+ (if-let ((it (save-excursion
+ (ibuffer-forward-line 0)
+ (get-text-property (point) 'ibuffer-filter-group-name))))
+ (ibuffer-kill-filter-group it)
+ (funcall (if interactive-p #'call-interactively #'funcall)
+ #'kill-line arg)))
(defun ibuffer-insert-filter-group-before (newgroup group)
(let* ((found nil)
@@ -968,7 +950,7 @@ prompt for NAME, and use the current filters."
(list
(read-from-minibuffer "Save current filter groups as: ")
ibuffer-filter-groups)))
- (ibuffer-aif (assoc name ibuffer-saved-filter-groups)
+ (if-let ((it (assoc name ibuffer-saved-filter-groups)))
(setcdr it groups)
(push (cons name groups) ibuffer-saved-filter-groups))
(ibuffer-maybe-save-stuff))
@@ -1140,7 +1122,7 @@ Interactively, prompt for NAME, and use the current filters."
(list
(read-from-minibuffer "Save current filters as: ")
ibuffer-filtering-qualifiers)))
- (ibuffer-aif (assoc name ibuffer-saved-filters)
+ (if-let ((it (assoc name ibuffer-saved-filters)))
(setcdr it filters)
(push (cons name filters) ibuffer-saved-filters))
(ibuffer-maybe-save-stuff))
@@ -1317,7 +1299,7 @@ For example, for a buffer associated with file '/a/b/c.d', this
matches against '/a/b/c.d'."
(:description "full file name"
:reader (read-from-minibuffer "Filter by full file name (regexp): "))
- (ibuffer-awhen (with-current-buffer buf (ibuffer-buffer-file-name))
+ (when-let ((it (with-current-buffer buf (ibuffer-buffer-file-name))))
(string-match qualifier it)))
;;;###autoload (autoload 'ibuffer-filter-by-basename "ibuf-ext")
@@ -1329,7 +1311,7 @@ matches against `c.d'."
(:description "file basename"
:reader (read-from-minibuffer
"Filter by file name, without directory part (regex): "))
- (ibuffer-awhen (with-current-buffer buf (ibuffer-buffer-file-name))
+ (when-let ((it (with-current-buffer buf (ibuffer-buffer-file-name))))
(string-match qualifier (file-name-nondirectory it))))
;;;###autoload (autoload 'ibuffer-filter-by-file-extension "ibuf-ext")
@@ -1342,7 +1324,7 @@ pattern. For example, for a buffer associated with file
(:description "filename extension"
:reader (read-from-minibuffer
"Filter by filename extension without separator (regex): "))
- (ibuffer-awhen (with-current-buffer buf (ibuffer-buffer-file-name))
+ (when-let ((it (with-current-buffer buf (ibuffer-buffer-file-name))))
(string-match qualifier (or (file-name-extension it) ""))))
;;;###autoload (autoload 'ibuffer-filter-by-directory "ibuf-ext")
@@ -1352,11 +1334,11 @@ pattern. For example, for a buffer associated with file
For a buffer associated with file '/a/b/c.d', this matches
against '/a/b'. For a buffer not associated with a file, this
matches against the value of `default-directory' in that buffer."
- (:description "directory name"
- :reader (read-from-minibuffer "Filter by directory name (regex): "))
- (ibuffer-aif (with-current-buffer buf (ibuffer-buffer-file-name))
- (let ((dirname (file-name-directory it)))
- (when dirname (string-match qualifier dirname)))
+ ( :description "directory name"
+ :reader (read-from-minibuffer "Filter by directory name (regex): "))
+ (if-let ((it (with-current-buffer buf (ibuffer-buffer-file-name))))
+ (when-let ((dirname (file-name-directory it)))
+ (string-match qualifier dirname))
(when default-directory (string-match qualifier default-directory))))
;;;###autoload (autoload 'ibuffer-filter-by-size-gt "ibuf-ext")
@@ -1990,6 +1972,8 @@ defaults to one."
(push buf ibuffer-do-occur-bufs)))
(occur-1 regexp nlines ibuffer-do-occur-bufs)))
+(define-obsolete-function-alias 'ibuffer-remove-duplicates #'seq-uniq "29.1")
+
(provide 'ibuf-ext)
;; Local Variables:
diff --git a/lisp/ibuf-macs.el b/lisp/ibuf-macs.el
index 51b206d7c48..acffb74ead3 100644
--- a/lisp/ibuf-macs.el
+++ b/lisp/ibuf-macs.el
@@ -35,7 +35,7 @@
If TEST returns non-nil, bind `it' to the value, and evaluate
TRUE-BODY. Otherwise, evaluate forms in FALSE-BODY as if in `progn'.
Compare with `if'."
- (declare (indent 2))
+ (declare (obsolete if-let "29.1") (indent 2))
(let ((sym (make-symbol "ibuffer-aif-sym")))
`(let ((,sym ,test))
(if ,sym
@@ -47,10 +47,9 @@ Compare with `if'."
(defmacro ibuffer-awhen (test &rest body)
"Evaluate BODY if TEST returns non-nil.
During evaluation of body, bind `it' to the value returned by TEST."
- (declare (indent 1))
- `(ibuffer-aif ,test
- (progn ,@body)
- nil))
+ (declare (indent 1) (obsolete when-let "29.1"))
+ `(when-let ((it ,test))
+ ,@body))
(defmacro ibuffer-save-marks (&rest body)
"Save the marked status of the buffers and execute BODY; restore marks."
diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el
index 742d21d0b0f..5cb4fe2a7a3 100644
--- a/lisp/ibuffer.el
+++ b/lisp/ibuffer.el
@@ -447,7 +447,6 @@ directory, like `default-directory'."
"d" #'ibuffer-mark-for-delete
"C-d" #'ibuffer-mark-for-delete-backwards
- "k" #'ibuffer-mark-for-delete
"x" #'ibuffer-do-kill-on-deletion-marks
;; immediate operations
@@ -833,7 +832,7 @@ width and the longest string in LIST."
(let ((pt (save-excursion
(mouse-set-point event)
(point))))
- (ibuffer-aif (get-text-property (point) 'ibuffer-filter-group-name)
+ (if-let ((it (get-text-property (point) 'ibuffer-filter-group-name)))
(ibuffer-toggle-marks it)
(goto-char pt)
(let ((mark (ibuffer-current-mark)))
@@ -1264,8 +1263,8 @@ become unmarked.
If point is on a group name, then this function operates on that
group."
(interactive)
- (ibuffer-aif (get-text-property (point) 'ibuffer-filter-group-name)
- (setq group it))
+ (when-let ((it (get-text-property (point) 'ibuffer-filter-group-name)))
+ (setq group it))
(let ((count
(ibuffer-map-lines
(lambda (_buf mark)
@@ -1337,7 +1336,7 @@ If point is on a group name, this function operates on that group."
(when (and movement (< movement 0))
(setq arg (- arg)))
(ibuffer-forward-line 0)
- (ibuffer-aif (get-text-property (point) 'ibuffer-filter-group-name)
+ (if-let ((it (get-text-property (point) 'ibuffer-filter-group-name)))
(progn
(require 'ibuf-ext)
(ibuffer-mark-on-buffer #'identity mark it))
@@ -1541,7 +1540,7 @@ If point is on a group name, this function operates on that group."
;; `ibuffer-inline-columns' alist and insert it
;; into our generated code. Otherwise, we just
;; generate a call to the column function.
- (ibuffer-aif (assq sym ibuffer-inline-columns)
+ (if-let ((it (assq sym ibuffer-inline-columns)))
(nth 1 it)
`(or (,sym buffer mark) "")))
;; You're not expected to understand this. Hell, I
@@ -1738,7 +1737,7 @@ If point is on a group name, this function operates on that group."
(cond ((zerop total) "No processes")
((= 1 total) "1 process")
(t (format "%d processes" total))))))
- (ibuffer-aif (get-buffer-process buffer)
+ (if-let ((it (get-buffer-process buffer)))
(format "(%s %s)" it (process-status it))
""))
@@ -1873,8 +1872,8 @@ the buffer object itself and the current mark symbol."
(let ((result
(if (buffer-live-p (ibuffer-current-buffer))
(when (or (null group)
- (ibuffer-aif (get-text-property (point) 'ibuffer-filter-group)
- (equal group it)))
+ (when-let ((it (get-text-property (point) 'ibuffer-filter-group)))
+ (equal group it)))
(save-excursion
(funcall function
(ibuffer-current-buffer)
@@ -2333,7 +2332,18 @@ FORMATS is the value to use for `ibuffer-formats'.
(run-hooks 'ibuffer-hook))
(setq buffer-read-only t))
(unless ibuffer-expert
- (message "Commands: m, u, t, RET, g, k, S, D, Q; q to quit; h for help"))))))
+ (message (substitute-command-keys
+ (concat "Commands: \\[ibuffer-mark-forward], "
+ "\\[ibuffer-unmark-forward], "
+ "\\[ibuffer-toggle-marks], "
+ "\\[ibuffer-visit-buffer], "
+ "\\[ibuffer-update], "
+ "\\[ibuffer-do-kill-lines], "
+ "\\[ibuffer-do-save], "
+ "\\[ibuffer-do-delete], "
+ "\\[ibuffer-do-query-replace]; "
+ "\\[quit-window] to quit; "
+ "\\[describe-mode] for help"))))))))
;;;###autoload
(defun ibuffer-jump (&optional other-window)
diff --git a/lisp/image-dired.el b/lisp/image-dired.el
index 9ceaf1bf734..93cce33c2ba 100644
--- a/lisp/image-dired.el
+++ b/lisp/image-dired.el
@@ -913,7 +913,7 @@ Otherwise, delete overlays."
(interactive)
(setq image-dired-dired-disp-props
(not image-dired-dired-disp-props))
- (message "Dired display properties %s."
+ (message "Dired display properties %s"
(if image-dired-dired-disp-props
"on"
"off")))
@@ -1464,7 +1464,7 @@ Should be called from commands in `image-dired-thumbnail-mode'."
`(let ((file-name (image-dired-original-file-name))
(dired-buf (image-dired-associated-dired-buffer)))
(if (not (and dired-buf file-name))
- (message "No image, or image with correct properties, at point.")
+ (message "No image, or image with correct properties, at point")
(with-current-buffer dired-buf
(when (dired-goto-file file-name)
,@body
@@ -2106,7 +2106,7 @@ default value at the prompt."
(image-dired-set-exif-data file "ImageDescription"
(read-string "Value of ImageDescription: "
old-value)))
- (message "Successfully wrote ImageDescription tag.")
+ (message "Successfully wrote ImageDescription tag")
(error "Could not write ImageDescription tag")))))
(defun image-dired-set-exif-data (file tag-name tag-value)
@@ -2295,7 +2295,7 @@ matching tag will be marked in the Dired buffer."
(when (search-forward-regexp (format "\\s %s$" curr-file) nil t)
(setq hits (+ hits 1))
(dired-mark 1))))
- (message "%d files with matching tag marked." hits)))
+ (message "%d files with matching tag marked" hits)))
@@ -2728,14 +2728,14 @@ the operation by activating the Cancel button.\n\n")
(lambda (&rest _ignore)
(image-dired-save-information-from-widgets)
(bury-buffer)
- (message "Done."))
+ (message "Done"))
"Save")
(widget-insert " ")
(widget-create 'push-button
:notify
(lambda (&rest _ignore)
(bury-buffer)
- (message "Operation canceled."))
+ (message "Operation canceled"))
"Cancel")
(widget-insert "\n")
(use-local-map widget-keymap)
@@ -2973,7 +2973,7 @@ Dired."
(let ((file-name (image-dired-original-file-name))
(dired-buf (image-dired-associated-dired-buffer)))
(if (not (and dired-buf file-name))
- (message "No image, or image with correct properties, at point.")
+ (message "No image, or image with correct properties, at point")
(with-current-buffer dired-buf
(message "%s" file-name)
(when (dired-goto-file file-name)
diff --git a/lisp/image.el b/lisp/image.el
index 02e5c85fafd..de2afdc2c7b 100644
--- a/lisp/image.el
+++ b/lisp/image.el
@@ -32,7 +32,6 @@
:group 'multimedia)
(declare-function image-flush "image.c" (spec &optional frame))
-(defalias 'image-refresh 'image-flush)
(defconst image-type-header-regexps
`(("\\`/[\t\n\r ]*\\*.*XPM.\\*/" . xpm)
@@ -1304,6 +1303,8 @@ changing the displayed image size does not affect the saved image."
(setf (image-property image :flip)
(not (image-property image :flip)))))
+(define-obsolete-function-alias 'image-refresh #'image-flush "29.1")
+
(provide 'image)
;;; image.el ends here
diff --git a/lisp/image/exif.el b/lisp/image/exif.el
index fd4673dc1b6..b25968af536 100644
--- a/lisp/image/exif.el
+++ b/lisp/image/exif.el
@@ -261,9 +261,9 @@ VALUE is an integer representing BYTES characters."
(set-buffer-multibyte nil)
(if le
(dotimes (i bytes)
- (insert (logand (lsh value (* i -8)) 255)))
+ (insert (logand (ash value (* i -8)) 255)))
(dotimes (i bytes)
- (insert (logand (lsh value (* (- (1- bytes) i) -8)) 255))))
+ (insert (logand (ash value (* (- (1- bytes) i) -8)) 255))))
(insert 0)
(buffer-string)))
diff --git a/lisp/info-look.el b/lisp/info-look.el
index 6c8ef091a08..7f45f976a24 100644
--- a/lisp/info-look.el
+++ b/lisp/info-look.el
@@ -1068,7 +1068,6 @@ Return nil if there is nothing appropriate in the buffer near point."
("newsticker" "Index")
("octave" "(octave-mode)Variable Index" "(octave-mode)Lisp Function Index")
("org" "Variable Index" "Command and Function Index")
- ("pgg" "Variable Index" "Function Index")
("rcirc" "Variable Index" "Index")
("reftex" "Index")
("sasl" "Variable Index" "Function Index")
diff --git a/lisp/info.el b/lisp/info.el
index 7fdb893edc5..7c1b34ed642 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -4382,7 +4382,7 @@ a string of ASCII characters.")
;; Autoload cookie needed by desktop.el
;;;###autoload
-(define-derived-mode Info-mode nil "Info" ;FIXME: Derive from special-mode?
+(define-derived-mode Info-mode special-mode "Info"
"Info mode provides commands for browsing through the Info documentation tree.
Documentation in Info is divided into \"nodes\", each of which discusses
one topic and contains references to other nodes which discuss related
@@ -4520,7 +4520,7 @@ Advanced commands:
("java" . "ccmode") ("idl" . "ccmode") ("pike" . "ccmode")
("skeleton" . "autotype") ("auto-insert" . "autotype")
("copyright" . "autotype") ("executable" . "autotype")
- ("time-stamp" . "autotype") ("quickurl" . "autotype")
+ ("time-stamp" . "autotype")
("tempo" . "autotype") ("hippie-expand" . "autotype")
("cvs" . "pcl-cvs") ("ada" . "ada-mode") "calc"
("calcAlg" . "calc") ("calcDigit" . "calc") ("calcVar" . "calc")
diff --git a/lisp/international/characters.el b/lisp/international/characters.el
index ca28222c815..d6e83c81e74 100644
--- a/lisp/international/characters.el
+++ b/lisp/international/characters.el
@@ -1525,6 +1525,17 @@ Setup `char-width-table' appropriate for non-CJK language environment."
(aset char-acronym-table (+ #xE0021 i) (format " %c TAG" (+ 33 i))))
(aset char-acronym-table #xE007F "->|TAG") ; CANCEL TAG
+(dotimes (i 256)
+ (let* ((vs-number (1+ i))
+ (codepoint (if (< i 16)
+ (+ #xfe00 i)
+ (+ #xe0100 i -16)))
+ (delimiter (cond ((<= vs-number 9) "0")
+ ((<= vs-number 99) "")
+ (t " "))))
+ (aset char-acronym-table codepoint
+ (format "VS%s%s" delimiter vs-number))))
+
;; We can't use the \N{name} things here, because this file is used
;; too early in the build process.
(defvar bidi-control-characters
@@ -1574,7 +1585,9 @@ option `glyphless-char-display'."
#x80 #x9F method))
((eq target 'variation-selectors)
(glyphless-set-char-table-range glyphless-char-display
- #xFE00 #xFE0F method))
+ #xFE00 #xFE0F method)
+ (glyphless-set-char-table-range glyphless-char-display
+ #xE0100 #xE01EF method))
((or (eq target 'format-control)
(eq target 'bidi-control))
(when unicode-category-table
@@ -1647,10 +1660,10 @@ GROUP must be one of these symbols:
that are relevant for bidirectional formatting control,
like U+2069 (PDI) and U+202B (RLE).
`variation-selectors':
- Characters in the range U+FE00..U+FE0F, used for
- selecting alternate glyph presentations, such as
- Emoji vs Text presentation, of the preceding
- character(s).
+ Characters in the range U+FE00..U+FE0F and
+ U+E0100..U+E01EF, used for selecting alternate glyph
+ presentations, such as Emoji vs Text presentation, of
+ the preceding character(s).
`no-font': For GUI frames, characters for which no suitable
font is found; for text-mode frames, characters
that cannot be encoded by `terminal-coding-system'.
diff --git a/lisp/international/iso-transl.el b/lisp/international/iso-transl.el
index 90fdc06b1e4..5e9fd69ea02 100644
--- a/lisp/international/iso-transl.el
+++ b/lisp/international/iso-transl.el
@@ -76,6 +76,7 @@
("\"E" . [?Ë])
("\"I" . [?Ï])
("\"O" . [?Ö])
+ ("\"S" . [?ẞ])
("\"U" . [?Ü])
("\"a" . [?ä])
("\"e" . [?ë])
@@ -324,6 +325,7 @@ sequence VECTOR. (VECTOR is normally one character long.)")
("German"
("A" . [?Ä])
("O" . [?Ö])
+ ("S" . [?ẞ])
("U" . [?Ü])
("a" . [?ä])
("o" . [?ö])
diff --git a/lisp/international/ja-dic-utl.el b/lisp/international/ja-dic-utl.el
index cc636986f99..3f6500669a4 100644
--- a/lisp/international/ja-dic-utl.el
+++ b/lisp/international/ja-dic-utl.el
@@ -112,11 +112,9 @@ without okurigana are placed at the head of the returned list."
(princ (substitute-command-keys "\
The library `ja-dic' can't be loaded.
-The most common case is that you have not yet installed the library
-included in LEIM (Libraries of Emacs Input Method) which is
-distributed separately from Emacs.
-
-LEIM is available from the same ftp directory as Emacs.")))
+This might indicate a problem with your Emacs installation, as
+LEIM (Libraries of Emacs Input Method) should normally always be
+installed together with Emacs.")))
(signal (car err) (cdr err)))))
(let ((vec (make-vector len 0))
diff --git a/lisp/international/latin1-disp.el b/lisp/international/latin1-disp.el
index 7054077fb02..af751927932 100644
--- a/lisp/international/latin1-disp.el
+++ b/lisp/international/latin1-disp.el
@@ -124,6 +124,7 @@ display for all of `latin1-display-sets'. See also
(?\™ "TM") ;; TRADE MARK SIGN
(?\› ">") ;; SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
(?• "·")
+ (?ẞ "SS") ;; LATIN CAPITAL LETTER SHARP S
)))
(setq latin1-display t))
(mapc #'latin1-display-reset latin1-display-sets)
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index df1c06ec272..12896cc4b0e 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -2199,8 +2199,7 @@ See `set-language-info-alist' for use in programs."
first nil))
(dolist (elt l)
(when (or (eq input-method elt)
- (eq t (compare-strings language-name nil nil
- (nth 1 elt) nil nil t)))
+ (string-equal-ignore-case language-name (nth 1 elt)))
(when first
(insert "Input methods:\n")
(setq first nil))
@@ -2599,7 +2598,7 @@ Matching is done ignoring case and any hyphens and underscores in the
names. E.g. `ISO_8859-1' and `iso88591' both match `iso-8859-1'."
(setq charset1 (replace-regexp-in-string "[-_]" "" charset1))
(setq charset2 (replace-regexp-in-string "[-_]" "" charset2))
- (eq t (compare-strings charset1 nil nil charset2 nil nil t)))
+ (string-equal-ignore-case charset1 charset2))
(defvar locale-charset-alist nil
"Coding system alist keyed on locale-style charset name.
diff --git a/lisp/international/mule-diag.el b/lisp/international/mule-diag.el
index 6b630c73e8e..cdf2e527e25 100644
--- a/lisp/international/mule-diag.el
+++ b/lisp/international/mule-diag.el
@@ -1065,35 +1065,39 @@ see the function `describe-fontset' for the format of the list."
(help-xref-button 1 'help-input-method (match-string 1))))))))
(defun list-input-methods-1 ()
- (if (not input-method-alist)
- (princ "
-No input method is available, perhaps because you have not
-installed LEIM (Libraries of Emacs Input Methods).")
- (princ (substitute-command-keys
- "LANGUAGE\n NAME (`TITLE' in mode line)\n"))
- (princ " SHORT-DESCRIPTION\n------------------------------\n")
- (setq input-method-alist
- (sort input-method-alist
- (lambda (x y) (string< (nth 1 x) (nth 1 y)))))
-
- (let (language)
- (dolist (elt input-method-alist)
- (when (not (equal language (nth 1 elt)))
- (setq language (nth 1 elt))
- (princ language)
- (terpri))
- (princ (format-message
- " %s (`%s' in mode line)\n %s\n"
- (car elt)
- (let ((title (nth 3 elt)))
- (if (and (consp title) (stringp (car title)))
- (car title)
- title))
- ;; If the doc is multi-line, indent all
- ;; non-blank lines. (Bug#8066)
- (replace-regexp-in-string
- "\n\\(.\\)" "\n \\1"
- (substitute-command-keys (or (nth 4 elt) "")))))))))
+ (with-current-buffer standard-output
+ (if (not input-method-alist)
+ (insert "
+No input method is available.
+
+This might indicate a problem with your Emacs installation, as
+LEIM (Libraries of Emacs Input Method) should normally always be
+installed together with Emacs.")
+ (insert (substitute-command-keys
+ "LANGUAGE\n NAME (`TITLE' in mode line)\n"))
+ (insert " SHORT-DESCRIPTION\n------------------------------\n")
+ (setq input-method-alist
+ (sort input-method-alist
+ (lambda (x y) (string< (nth 1 x) (nth 1 y)))))
+
+ (let (language)
+ (dolist (elt input-method-alist)
+ (when (not (equal language (nth 1 elt)))
+ (setq language (nth 1 elt))
+ (insert "\n" (propertize language 'face 'help-for-help-header) "\n\n"))
+ (insert (format-message
+ " %s (`%s' in mode line)\n %s\n"
+ (car elt)
+ (let ((title (nth 3 elt)))
+ (if (and (consp title) (stringp (car title)))
+ (car title)
+ title))
+ ;; If the doc is multi-line, indent all
+ ;; non-blank lines. (Bug#8066)
+ (replace-regexp-in-string
+ "\n\\(.\\)" "\n \\1"
+ (substitute-command-keys (or (nth 4 elt) ""))))))))))
+
;;; DIAGNOSIS
diff --git a/lisp/international/quail.el b/lisp/international/quail.el
index 529cf97215e..4bb6dbcc8e4 100644
--- a/lisp/international/quail.el
+++ b/lisp/international/quail.el
@@ -249,11 +249,9 @@ This activates input method defined by PACKAGE-NAME by running
(princ (car libraries))
(princ (substitute-command-keys "\" is not in `load-path'.
-The most common case is that you have not yet installed appropriate
-libraries in LEIM (Libraries of Emacs Input Method) which is
-distributed separately from Emacs.
-
-LEIM is available from the same ftp directory as Emacs.")))
+This might indicate a problem with your Emacs installation, as
+LEIM (Libraries of Emacs Input Method) should normally always be
+installed together with Emacs.")))
(error "Can't use the Quail package `%s'" package-name))
(setq libraries (cdr libraries))))))
(quail-select-package package-name)
diff --git a/lisp/international/titdic-cnv.el b/lisp/international/titdic-cnv.el
index 2a91e7cb5ec..080045e7520 100644
--- a/lisp/international/titdic-cnv.el
+++ b/lisp/international/titdic-cnv.el
@@ -1191,10 +1191,7 @@ The library is named pinyin.el, and contains the constant
(dst-file (cadr command-line-args-left))
(coding-system-for-write 'utf-8-unix))
(with-temp-file dst-file
- (insert ";;; " (file-name-nondirectory dst-file)
- " -*- lexical-binding:t -*-
-;; This file is automatically generated from pinyin.map, by the
-;; function pinyin-convert.\n\n")
+ (generate-lisp-file-heading dst-file 'pinyin-convert)
(insert "(defconst pinyin-character-map\n'(")
(let ((pos (point)))
(insert-file-contents src-file)
@@ -1214,7 +1211,7 @@ The library is named pinyin.el, and contains the constant
(forward-line 1)))
(insert ")\n\"An alist holding correspondences between pinyin syllables\
and\nChinese characters.\")\n\n")
- (insert "(provide 'pinyin)\n"))
+ (generate-lisp-file-trailer dst-file :compile t))
(kill-emacs 0)))
;;; titdic-cnv.el ends here
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 8f480a87d94..31fcf01949f 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -537,8 +537,6 @@ This is like `describe-bindings', but displays only Isearch keys."
(describe-function 'isearch-forward))
(when isearch-mode (isearch-update)))
-(defalias 'isearch-mode-help 'isearch-describe-mode)
-
;; Define isearch-mode keymap.
@@ -2838,7 +2836,9 @@ The command accepts Unicode names like \"smiling face\" or
isearch-barrier
(1+ isearch-other-end)))))
(isearch-search)
- ))
+ (when (and (memq isearch-wrap-pause '(no no-ding))
+ (not isearch-success))
+ (isearch-repeat (if isearch-forward 'forward 'backward)))))
(isearch-push-state)
(if isearch-op-fun (funcall isearch-op-fun))
(isearch-update))
@@ -4634,6 +4634,8 @@ CASE-FOLD non-nil means the search was case-insensitive."
(replace-regexp-in-string "\"" "[\"“”]")))))
(buffer-local-restore-state isearch-fold-quotes-mode--state)))
+(define-obsolete-function-alias 'isearch-mode-help #'isearch-describe-mode "29.1")
+
(provide 'isearch)
;;; isearch.el ends here
diff --git a/lisp/keymap.el b/lisp/keymap.el
index ad7d4fbbba1..107565590c1 100644
--- a/lisp/keymap.el
+++ b/lisp/keymap.el
@@ -313,7 +313,7 @@ Modifiers have to be specified in this order:
which is
Alt-Control-Hyper-Meta-Shift-super"
- (declare (pure t) (side-effect-free t))
+ (declare (pure t) (side-effect-free error-free))
(let ((case-fold-search nil))
(and
(stringp keys)
@@ -530,7 +530,8 @@ should be a MENU form as accepted by `easy-menu-define'.
(keymap keymap)
(prefix (define-prefix-command prefix nil name))
(full (make-keymap name))
- (t (make-sparse-keymap name)))))
+ (t (make-sparse-keymap name))))
+ seen-keys)
(when suppress
(suppress-keymap keymap (eq suppress 'nodigits)))
(when parent
@@ -544,6 +545,9 @@ should be a MENU form as accepted by `easy-menu-define'.
(let ((def (pop definitions)))
(if (eq key :menu)
(easy-menu-define nil keymap "" def)
+ (if (member key seen-keys)
+ (error "Duplicate definition for key: %S %s" key keymap)
+ (push key seen-keys))
(keymap-set keymap key def)))))
keymap)))
@@ -571,6 +575,16 @@ as the variable documentation string.
(push (pop defs) opts))))
(unless (zerop (% (length defs) 2))
(error "Uneven number of key/definition pairs: %s" defs))
+ (let ((defs defs)
+ key seen-keys)
+ (while defs
+ (setq key (pop defs))
+ (pop defs)
+ (when (not (eq key :menu))
+ (if (member key seen-keys)
+ (error "Duplicate definition for key '%s' in keymap '%s'"
+ key variable-name)
+ (push key seen-keys)))))
`(defvar ,variable-name
(define-keymap ,@(nreverse opts) ,@defs)
,@(and doc (list doc)))))
diff --git a/lisp/kmacro.el b/lisp/kmacro.el
index 92118ad1433..72420a67309 100644
--- a/lisp/kmacro.el
+++ b/lisp/kmacro.el
@@ -920,6 +920,7 @@ The ARG parameter is unused."
(vectorp f) ;FIXME: Deprecated.
(kmacro-p f)))))
+;;;###autoload
(defun kmacro-name-last-macro (symbol)
"Assign a name to the last keyboard macro defined.
Argument SYMBOL is the name to define.
diff --git a/lisp/language/european.el b/lisp/language/european.el
index 8e3aac7c2ee..937215074bc 100644
--- a/lisp/language/european.el
+++ b/lisp/language/european.el
@@ -390,7 +390,7 @@ Latin-9 is sometimes nicknamed `Latin-0'."))
(define-coding-system-alias 'cp284 'ibm284)
(define-coding-system 'ibm285
- "UK english version of EBCDIC"
+ "UK English version of EBCDIC"
:coding-type 'charset
:charset-list '(ibm285)
:mnemonic ?*)
diff --git a/lisp/language/misc-lang.el b/lisp/language/misc-lang.el
index 1e915c2f838..3d5b68f84be 100644
--- a/lisp/language/misc-lang.el
+++ b/lisp/language/misc-lang.el
@@ -137,10 +137,13 @@ thin (i.e. 1-dot width) space."
(set-char-table-range
composition-function-table
'(#x600 . #x74F)
- (list (vector "[\u200C\u200D][\u0600-\u074F\u200C\u200D]+"
- 1 #'arabic-shape-gstring)
- (vector "[\u0600-\u074F\u200C\u200D]+"
+ (list (vector "[\u0600-\u074F\u200C\u200D]+"
0 #'arabic-shape-gstring)))
+(set-char-table-range
+ composition-function-table
+ '(#x200C . #x200D)
+ (list (vector "[\u200C\u200D][\u0600-\u074F\u200C\u200D]+"
+ 0 #'arabic-shape-gstring)))
;; The Egyptian Hieroglyph Format Controls were introduced in Unicode
;; Standard v12.0. Apparently, they are not yet well supported in
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index dfbdf401dcc..855f5a25b16 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -38,16 +38,16 @@ Rotate left Calc Solutions \\[5x5-solve-rotate-left]
Rotate right Calc Solutions \\[5x5-solve-rotate-right]
Quit current game \\[5x5-quit-game]
-(fn &optional SIZE)" t nil)
+(fn &optional SIZE)" t)
(autoload '5x5-crack-randomly "5x5" "\
-Attempt to crack 5x5 using random solutions." t nil)
+Attempt to crack 5x5 using random solutions." t)
(autoload '5x5-crack-mutating-current "5x5" "\
-Attempt to crack 5x5 by mutating the current solution." t nil)
+Attempt to crack 5x5 by mutating the current solution." t)
(autoload '5x5-crack-mutating-best "5x5" "\
-Attempt to crack 5x5 by mutating the best solution." t nil)
+Attempt to crack 5x5 by mutating the best solution." t)
(autoload '5x5-crack-xor-mutate "5x5" "\
Attempt to crack 5x5 by xoring the current and best solution.
-Mutate the result." t nil)
+Mutate the result." t)
(autoload '5x5-crack "5x5" "\
Attempt to find a solution for 5x5.
@@ -56,7 +56,7 @@ two parameters, the first will be a grid vector array that is the current
solution and the second will be the best solution so far. The function
should return a grid vector array that is the new solution.
-(fn BREEDER)" t nil)
+(fn BREEDER)" t)
(register-definition-prefixes "5x5" '("5x5-"))
@@ -81,7 +81,7 @@ will be recognized as referring to the same user; when creating a new
ChangeLog entry, one element will be chosen at random.")
(custom-autoload 'add-log-mailing-address "add-log" t)
(autoload 'prompt-for-change-log-name "add-log" "\
-Prompt for a change log name." nil nil)
+Prompt for a change log name.")
(autoload 'find-change-log "add-log" "\
Find a change log file for \\[add-change-log-entry] and return the name.
@@ -102,7 +102,7 @@ Once a file is found, `change-log-default-name' is set locally in the
current buffer to the complete file name.
Optional arg BUFFER-FILE overrides `buffer-file-name'.
-(fn &optional FILE-NAME BUFFER-FILE)" nil nil)
+(fn &optional FILE-NAME BUFFER-FILE)")
(autoload 'add-change-log-entry "add-log" "\
Find ChangeLog buffer, add an entry for today and an item for this file.
Optional arg WHOAMI (interactive prefix) non-nil means prompt for
@@ -138,13 +138,13 @@ notices.
Today's date is calculated according to `add-log-time-zone-rule' if
non-nil, otherwise in local time.
-(fn &optional WHOAMI CHANGELOG-FILE-NAME OTHER-WINDOW NEW-ENTRY PUT-NEW-ENTRY-ON-NEW-LINE)" t nil)
+(fn &optional WHOAMI CHANGELOG-FILE-NAME OTHER-WINDOW NEW-ENTRY PUT-NEW-ENTRY-ON-NEW-LINE)" t)
(autoload 'add-change-log-entry-other-window "add-log" "\
Find change log file in other window and add entry and item.
This is just like `add-change-log-entry' except that it displays
the change log file in another window.
-(fn &optional WHOAMI FILE-NAME)" t nil)
+(fn &optional WHOAMI FILE-NAME)" t)
(autoload 'change-log-mode "add-log" "\
Major mode for editing change logs; like Indented Text mode.
Prevents numeric backups and sets `left-margin' to 8 and `fill-column' to 74.
@@ -154,7 +154,7 @@ Runs `change-log-mode-hook'.
\\{change-log-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'add-log-current-defun "add-log" "\
Return name of function definition point is in, or nil.
@@ -167,7 +167,7 @@ identifiers followed by `:' or `='. See variables
`add-log-current-defun-header-regexp' and
`add-log-current-defun-function'.
-Has a preference of looking backwards." nil nil)
+Has a preference of looking backwards.")
(autoload 'change-log-merge "add-log" "\
Merge the contents of change log file OTHER-LOG with this buffer.
Both must be found in Change Log mode (since the merging depends on
@@ -177,7 +177,7 @@ or a buffer.
Entries are inserted in chronological order. Both the current and
old-style time formats for entries are supported.
-(fn OTHER-LOG)" t nil)
+(fn OTHER-LOG)" t)
(register-definition-prefixes "add-log" '("add-log-" "change-log-"))
@@ -206,11 +206,11 @@ COMPILE argument of `ad-activate' was supplied as nil.")
(autoload 'ad-enable-advice "advice" "\
Enables the advice of FUNCTION with CLASS and NAME.
-(fn FUNCTION CLASS NAME)" t nil)
+(fn FUNCTION CLASS NAME)" t)
(autoload 'ad-disable-advice "advice" "\
Disable the advice of FUNCTION with CLASS and NAME.
-(fn FUNCTION CLASS NAME)" t nil)
+(fn FUNCTION CLASS NAME)" t)
(autoload 'ad-add-advice "advice" "\
Add a piece of ADVICE to FUNCTION's list of advices in CLASS.
@@ -234,7 +234,7 @@ If FUNCTION was not advised already, its advice info will be
initialized. Redefining a piece of advice whose name is part of
the cache-id will clear the cache.
-(fn FUNCTION ADVICE CLASS POSITION)" nil nil)
+(fn FUNCTION ADVICE CLASS POSITION)")
(autoload 'ad-activate "advice" "\
Activate all the advice information of an advised FUNCTION.
If FUNCTION has a proper original definition then an advised
@@ -252,7 +252,7 @@ an advised function that has actual pieces of advice but none of them are
enabled is equivalent to a call to `ad-deactivate'. The current advised
definition will always be cached for later usage.
-(fn FUNCTION &optional COMPILE)" t nil)
+(fn FUNCTION &optional COMPILE)" t)
(autoload 'defadvice "advice" "\
Define a piece of advice for FUNCTION (a symbol).
The syntax of `defadvice' is as follows:
@@ -335,7 +335,7 @@ default rule lists defined in `align-rules-list' and
`align-exclude-rules-list'. See `align-rules-list' for more details
on the format of these lists.
-(fn BEG END &optional SEPARATE RULES EXCLUDE-RULES)" t nil)
+(fn BEG END &optional SEPARATE RULES EXCLUDE-RULES)" t)
(autoload 'align-regexp "align" "\
Align the current region using an ad-hoc rule read from the minibuffer.
BEG and END mark the limits of the region. Interactively, this function
@@ -378,7 +378,7 @@ The non-interactive form of the previous example would look something like:
This function is a nothing more than a small wrapper that helps you
construct a rule to pass to `align-region', which does the real work.
-(fn BEG END REGEXP &optional GROUP SPACING REPEAT)" t nil)
+(fn BEG END REGEXP &optional GROUP SPACING REPEAT)" t)
(autoload 'align-entire "align" "\
Align the selected region as if it were one alignment section.
BEG and END mark the extent of the region. If RULES or EXCLUDE-RULES
@@ -386,7 +386,7 @@ is set to a list of rules (see `align-rules-list'), it can be used to
override the default alignment rules that would have been used to
align that section.
-(fn BEG END &optional RULES EXCLUDE-RULES)" t nil)
+(fn BEG END &optional RULES EXCLUDE-RULES)" t)
(autoload 'align-current "align" "\
Call `align' on the current alignment section.
This function assumes you want to align only the current section, and
@@ -395,7 +395,7 @@ EXCLUDE-RULES is set to a list of rules (see `align-rules-list'), it
can be used to override the default alignment rules that would have
been used to align that section.
-(fn &optional RULES EXCLUDE-RULES)" t nil)
+(fn &optional RULES EXCLUDE-RULES)" t)
(autoload 'align-highlight-rule "align" "\
Highlight the whitespace which a given rule would have modified.
BEG and END mark the extent of the region. TITLE identifies the rule
@@ -404,13 +404,13 @@ list of rules (see `align-rules-list'), it can be used to override the
default alignment rules that would have been used to identify the text
to be colored.
-(fn BEG END TITLE &optional RULES EXCLUDE-RULES)" t nil)
+(fn BEG END TITLE &optional RULES EXCLUDE-RULES)" t)
(autoload 'align-unhighlight-rule "align" "\
-Remove any highlighting that was added by `align-highlight-rule'." t nil)
+Remove any highlighting that was added by `align-highlight-rule'." t)
(autoload 'align-newline-and-indent "align" "\
A replacement function for `newline-and-indent', aligning as it goes.
The alignment is done by calling `align' on the region that was
-indented." t nil)
+indented." t)
(register-definition-prefixes "align" '("align-"))
@@ -422,7 +422,7 @@ Institute `allout-auto-activation'.
Intended to be used as the `allout-auto-activation' :set function.
-(fn VAR VALUE)" nil nil)
+(fn VAR VALUE)")
(autoload 'allout-setup "allout" "\
Do fundamental Emacs session for allout auto-activation.
@@ -430,7 +430,7 @@ Establishes allout processing as part of visiting a file if
`allout-auto-activation' is non-nil, or removes it otherwise.
The proper way to use this is through customizing the setting of
-`allout-auto-activation'." nil nil)
+`allout-auto-activation'.")
(defvar allout-auto-activation nil "\
Configure allout outline mode auto-activation.
@@ -567,7 +567,7 @@ the HOT-SPOT Operation section.
Misc commands:
-------------
-M-x outlineify-sticky Activate outline mode for current buffer,
+\\[allout-outlinify-sticky] Activate outline mode for current buffer,
and establish a default file-var setting
for `allout-layout'.
\\[allout-mark-topic] `allout-mark-topic'
@@ -742,15 +742,16 @@ evaluate `allout-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
-(defalias 'outlinify-sticky #'outlineify-sticky)
-(autoload 'outlineify-sticky "allout" "\
+(fn &optional ARG)" t)
+(define-obsolete-function-alias 'outlinify-sticky #'allout-outlinify-sticky "29.1")
+(define-obsolete-function-alias 'outlineify-sticky #'allout-outlinify-sticky "29.1")
+(autoload 'allout-outlinify-sticky "allout" "\
Activate outline mode and establish file var so it is started subsequently.
See `allout-layout' and customization of `allout-auto-activation'
for details on preparing Emacs for automatic allout activation.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "allout" '("allout-"))
@@ -762,7 +763,7 @@ Commission or decommission allout-widgets-mode along with allout-mode.
Meant to be used by customization of `allout-widgets-auto-activation'.
-(fn VARNAME VALUE)" nil nil)
+(fn VARNAME VALUE)")
(defvar allout-widgets-auto-activation nil "\
Activate to enable allout icon graphics wherever allout mode is active.
@@ -814,7 +815,7 @@ evaluate `allout-widgets-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "allout-widgets" '("allout-"))
@@ -825,7 +826,7 @@ it is disabled.
;;; Generated autoloads from net/ange-ftp.el
-(defalias 'ange-ftp-re-read-dir 'ange-ftp-reread-dir)
+(define-obsolete-function-alias 'ange-ftp-re-read-dir #'ange-ftp-reread-dir "29.1")
(autoload 'ange-ftp-reread-dir "ange-ftp" "\
Reread remote directory DIR to update the directory cache.
The implementation of remote FTP file names caches directory contents
@@ -833,11 +834,11 @@ for speed. Therefore, when new remote files are created, Emacs
may not know they exist. You can use this command to reread a specific
directory, so that Emacs will know its current contents.
-(fn &optional DIR)" t nil)
+(fn &optional DIR)" t)
(autoload 'ange-ftp-hook-function "ange-ftp" "\
-(fn OPERATION &rest ARGS)" nil nil)
+(fn OPERATION &rest ARGS)")
(register-definition-prefixes "ange-ftp" '("ange-ftp-" "ftp-error" "internal-ange-ftp-mode"))
@@ -851,7 +852,7 @@ passing through `animate-n-steps' positions before the final ones.
If HPOS is nil (or omitted), center the string horizontally
in the current window.
-(fn STRING VPOS &optional HPOS)" nil nil)
+(fn STRING VPOS &optional HPOS)")
(autoload 'animate-sequence "animate" "\
Display animation strings from LIST-OF-STRING with buffer *Animation*.
Strings will be separated from each other by SPACE lines.
@@ -859,14 +860,14 @@ Strings will be separated from each other by SPACE lines.
animation in the buffer named by variable's value, creating the
buffer if one does not exist.
-(fn LIST-OF-STRINGS SPACE)" nil nil)
+(fn LIST-OF-STRINGS SPACE)")
(autoload 'animate-birthday-present "animate" "\
Return a birthday present in the buffer *Birthday-Present*.
When optional arg NAME is non-nil or called-interactively, prompt for
NAME of birthday present receiver and return a birthday present in
the buffer *Birthday-Present-for-Name*.
-(fn &optional NAME)" t nil)
+(fn &optional NAME)" t)
(register-definition-prefixes "animate" '("animat"))
@@ -874,7 +875,7 @@ the buffer *Birthday-Present-for-Name*.
(push (purecopy '(ansi-color 3 4 2)) package--builtin-versions)
(autoload 'ansi-color-for-comint-mode-on "ansi-color" "\
-Set `ansi-color-for-comint-mode' to t." t nil)
+Set `ansi-color-for-comint-mode' to t." t)
(autoload 'ansi-color-process-output "ansi-color" "\
Maybe translate SGR control sequences of comint output into text properties.
@@ -888,11 +889,11 @@ The comint output is assumed to lie between the marker
This is a good function to put in `comint-output-filter-functions'.
-(fn IGNORED)" nil nil)
+(fn IGNORED)")
(autoload 'ansi-color-compilation-filter "ansi-color" "\
Maybe translate SGR control sequences into text properties.
This function depends on the `ansi-color-for-compilation-mode'
-variable, and is meant to be used in `compilation-filter-hook'." nil nil)
+variable, and is meant to be used in `compilation-filter-hook'.")
(register-definition-prefixes "ansi-color" '("ansi-color-"))
@@ -914,14 +915,14 @@ the rules.
If the file for a super-grammar cannot be determined, special file names
are used according to variable `antlr-unknown-file-formats' and a
commentary with value `antlr-help-unknown-file-text' is added. The
-*Help* buffer always starts with the text in `antlr-help-rules-intro'." t nil)
+*Help* buffer always starts with the text in `antlr-help-rules-intro'." t)
(autoload 'antlr-mode "antlr-mode" "\
Major mode for editing ANTLR grammar files.
-(fn)" t nil)
+(fn)" t)
(autoload 'antlr-set-tabs "antlr-mode" "\
Use ANTLR's convention for TABs according to `antlr-tab-offset-alist'.
-Used in `antlr-mode'. Also a useful function in `java-mode-hook'." nil nil)
+Used in `antlr-mode'. Also a useful function in `java-mode-hook'.")
(register-definition-prefixes "antlr-mode" '("antlr-"))
@@ -934,13 +935,13 @@ Optional argument WARNTIME is an integer (or string) giving the number
of minutes before the appointment at which to start warning.
The default is `appt-message-warning-time'.
-(fn TIME MSG &optional WARNTIME)" t nil)
+(fn TIME MSG &optional WARNTIME)" t)
(autoload 'appt-activate "appt" "\
Toggle checking of appointments.
With optional numeric argument ARG, turn appointment checking on if
ARG is positive, otherwise off.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "appt" '("appt-"))
@@ -954,7 +955,7 @@ literally, or a string which is used as a regexp to search for.
SUBJECT is a string that is included in the prompt to identify what
kind of objects to search.
-(fn SUBJECT)" nil nil)
+(fn SUBJECT)")
(autoload 'apropos-user-option "apropos" "\
Show user options that match PATTERN.
PATTERN can be a word, a list of words (separated by spaces),
@@ -965,14 +966,14 @@ search for matches for any two (or more) of those words.
With \\[universal-argument] prefix, or if `apropos-do-all' is non-nil, also show
variables, not just user options.
-(fn PATTERN &optional DO-ALL)" t nil)
+(fn PATTERN &optional DO-ALL)" t)
(autoload 'apropos-variable "apropos" "\
Show variables that match PATTERN.
With the optional argument DO-NOT-ALL non-nil (or when called
interactively with the prefix \\[universal-argument]), show user
options only, i.e. behave like `apropos-user-option'.
-(fn PATTERN &optional DO-NOT-ALL)" t nil)
+(fn PATTERN &optional DO-NOT-ALL)" t)
(autoload 'apropos-local-variable "apropos" "\
Show buffer-local variables that match PATTERN.
Optional arg BUFFER (default: current buffer) is the buffer to check.
@@ -980,7 +981,7 @@ Optional arg BUFFER (default: current buffer) is the buffer to check.
The output includes variables that are not yet set in BUFFER, but that
will be buffer-local when set.
-(fn PATTERN &optional BUFFER)" t nil)
+(fn PATTERN &optional BUFFER)" t)
(autoload 'apropos-function "apropos" "\
Show functions that match PATTERN.
@@ -992,7 +993,7 @@ search for matches for any two (or more) of those words.
This is the same as running `apropos-command' with a \\[universal-argument] prefix,
or a non-nil `apropos-do-all' argument.
-(fn PATTERN)" t nil)
+(fn PATTERN)" t)
(defalias 'command-apropos #'apropos-command)
(autoload 'apropos-command "apropos" "\
Show commands (interactively callable functions) that match PATTERN.
@@ -1010,11 +1011,11 @@ satisfy the predicate VAR-PREDICATE.
When called from a Lisp program, a string PATTERN is used as a regexp,
while a list of strings is used as a word list.
-(fn PATTERN &optional DO-ALL VAR-PREDICATE)" t nil)
+(fn PATTERN &optional DO-ALL VAR-PREDICATE)" t)
(autoload 'apropos-documentation-property "apropos" "\
Like (documentation-property SYMBOL PROPERTY RAW) but handle errors.
-(fn SYMBOL PROPERTY RAW)" nil nil)
+(fn SYMBOL PROPERTY RAW)")
(autoload 'apropos "apropos" "\
Show all meaningful Lisp symbols whose names match PATTERN.
Symbols are shown if they are defined as functions, variables, or
@@ -1033,14 +1034,14 @@ Return list of symbols and documentation found.
The *Apropos* window will be selected if `help-window-select' is
non-nil.
-(fn PATTERN &optional DO-ALL)" t nil)
+(fn PATTERN &optional DO-ALL)" t)
(autoload 'apropos-library "apropos" "\
List the variables and functions defined by library FILE.
FILE should be one of the libraries currently loaded and should
thus be found in `load-history'. If `apropos-do-all' is non-nil,
the output includes key-bindings of commands.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'apropos-value "apropos" "\
Show all symbols whose value's printed representation matches PATTERN.
PATTERN can be a word, a list of words (separated by spaces),
@@ -1054,13 +1055,13 @@ names and values of properties.
Returns list of symbols and values found.
-(fn PATTERN &optional DO-ALL)" t nil)
+(fn PATTERN &optional DO-ALL)" t)
(autoload 'apropos-local-value "apropos" "\
Show buffer-local variables whose values match PATTERN.
This is like `apropos-value', but only for buffer-local variables.
Optional arg BUFFER (default: current buffer) is the buffer to check.
-(fn PATTERN &optional BUFFER)" t nil)
+(fn PATTERN &optional BUFFER)" t)
(autoload 'apropos-documentation "apropos" "\
Show symbols whose documentation contains matches for PATTERN.
PATTERN can be a word, a list of words (separated by spaces),
@@ -1075,7 +1076,7 @@ documentation strings.
Returns list of symbols and documentation found.
-(fn PATTERN &optional DO-ALL)" t nil)
+(fn PATTERN &optional DO-ALL)" t)
(register-definition-prefixes "apropos" '("apropos-"))
@@ -1094,7 +1095,7 @@ archive.
\\{archive-mode-map}
-(fn &optional FORCE)" nil nil)
+(fn &optional FORCE)")
(register-definition-prefixes "arc-mode" '("arc"))
@@ -1172,8 +1173,8 @@ take a numeric prefix argument):
Entering array mode calls the function `array-mode-hook'.
-(fn)" t nil)
-(register-definition-prefixes "array" '("array-" "current-line" "limit-index" "move-to-column-untabify" "untabify-backward"))
+(fn)" t)
+(register-definition-prefixes "array" '("array-"))
;;; Generated autoloads from textmodes/artist.el
@@ -1390,7 +1391,7 @@ evaluate `artist-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "artist" '("artist-"))
@@ -1416,7 +1417,7 @@ Turning on Asm mode runs the hook `asm-mode-hook' at the end of initialization.
Special commands:
\\{asm-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "asm-mode" '("asm-"))
@@ -1426,6 +1427,10 @@ Special commands:
How many seconds passwords are cached, or nil to disable expiring.
Overrides `password-cache-expiry' through a let-binding.")
(custom-autoload 'auth-source-cache-expiry "auth-source" t)
+(autoload 'auth-source-netrc-parse-all "auth-source" "\
+Parse FILE and return all entries.
+
+(fn FILE)")
(autoload 'authinfo-mode "auth-source" "\
Mode for editing .authinfo/.netrc files.
@@ -1435,7 +1440,7 @@ point is moved into the passwords (see `authinfo-hide-elements').
\\{authinfo-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "auth-source" '("auth"))
@@ -1443,7 +1448,7 @@ point is moved into the passwords (see `authinfo-hide-elements').
(push (purecopy '(auth-source-pass 5 0 0)) package--builtin-versions)
(autoload 'auth-source-pass-enable "auth-source-pass" "\
-Enable auth-source-password-store." nil nil)
+Enable auth-source-password-store.")
(autoload 'auth-source-pass-get "auth-source-pass" "\
Return the value associated to KEY in the password-store entry ENTRY.
@@ -1457,12 +1462,21 @@ secret
key1: value1
key2: value2
-(fn KEY ENTRY)" nil nil)
+(fn KEY ENTRY)")
(register-definition-prefixes "auth-source-pass" '("auth-source-pass-"))
;;; Generated autoloads from cedet/ede/auto.el
+(autoload 'ede-add-project-autoload "ede/auto" "\
+Add PROJAUTO, an EDE autoload definition to `ede-project-class-files'.
+Optional argument FLAG indicates how this autoload should be
+added. Possible values are:
+ `generic' - A generic project type. Keep this at the very end.
+ `unique' - A unique project type for a specific project. Keep at the very
+ front of the list so more generic projects don't get priority.
+
+(fn PROJAUTO &optional FLAG)")
(register-definition-prefixes "ede/auto" '("ede-"))
@@ -1471,7 +1485,7 @@ key2: value2
(autoload 'autoconf-mode "autoconf" "\
Major mode for editing Autoconf configure.ac files.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "autoconf" '("autoconf-"))
@@ -1485,13 +1499,13 @@ Major mode for editing Autoconf configure.ac files.
(put 'auto-insert 'safe-local-variable #'null)
(autoload 'auto-insert "autoinsert" "\
Insert default contents into new files if variable `auto-insert' is non-nil.
-Matches the visited file name against the elements of `auto-insert-alist'." t nil)
+Matches the visited file name against the elements of `auto-insert-alist'." t)
(autoload 'define-auto-insert "autoinsert" "\
Associate CONDITION with (additional) ACTION in `auto-insert-alist'.
Optional AFTER means to insert action after all existing actions for CONDITION,
or if CONDITION had no actions, after all other CONDITIONs.
-(fn CONDITION ACTION &optional AFTER)" nil nil)
+(fn CONDITION ACTION &optional AFTER)")
(function-put 'define-auto-insert 'lisp-indent-function 'defun)
(defvar auto-insert-mode nil "\
Non-nil if Auto-Insert mode is enabled.
@@ -1521,64 +1535,10 @@ evaluate `(default-value \\='auto-insert-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "autoinsert" '("auto-insert"))
-;;; Generated autoloads from emacs-lisp/autoload.el
-
-(put 'autoload-ensure-writable 'risky-local-variable t)
-(autoload 'update-file-autoloads "autoload" "\
-Update the autoloads for FILE.
-If prefix arg SAVE-AFTER is non-nil, save the buffer too.
-
-If FILE binds `generated-autoload-file' as a file-local variable,
-autoloads are written into that file. Otherwise, the autoloads
-file is determined by OUTFILE. If called interactively, prompt
-for OUTFILE; if called from Lisp with OUTFILE nil, use the
-existing value of `generated-autoload-file'.
-
-Return FILE if there was no autoload cookie in it, else nil.
-
-(fn FILE &optional SAVE-AFTER OUTFILE)" t nil)
-(autoload 'update-directory-autoloads "autoload" "\
-Update autoload definitions for Lisp files in the directories DIRS.
-In an interactive call, you must give one argument, the name of a
-single directory. In a call from Lisp, you can supply multiple
-directories as separate arguments, but this usage is discouraged.
-
-The function does NOT recursively descend into subdirectories of the
-directory or directories specified.
-
-In an interactive call, prompt for a default output file for the
-autoload definitions. When called from Lisp, use the existing
-value of `generated-autoload-file'. If any Lisp file binds
-`generated-autoload-file' as a file-local variable, write its
-autoloads into the specified file instead.
-
-(fn &rest DIRS)" t nil)
-(make-obsolete 'update-directory-autoloads 'make-directory-autoloads "28.1")
-(autoload 'make-directory-autoloads "autoload" "\
-Update autoload definitions for Lisp files in the directories DIRS.
-DIR can be either a single directory or a list of
-directories. (The latter usage is discouraged.)
-
-The autoloads will be written to OUTPUT-FILE. If any Lisp file
-binds `generated-autoload-file' as a file-local variable, write
-its autoloads into the specified file instead.
-
-The function does NOT recursively descend into subdirectories of the
-directory or directories specified.
-
-(fn DIR OUTPUT-FILE)" t nil)
-(autoload 'batch-update-autoloads "autoload" "\
-Update loaddefs.el autoloads in batch mode.
-Calls `update-directory-autoloads' on the command line arguments.
-Definitions are written to `generated-autoload-file' (which
-should be non-nil)." nil nil)
-(register-definition-prefixes "autoload" '("autoload-" "batch-update-autoloads--summary" "generate-" "make-autoload" "no-update-autoloads"))
-
-
;;; Generated autoloads from autorevert.el
(autoload 'auto-revert-mode "autorevert" "\
@@ -1613,12 +1573,12 @@ evaluate `auto-revert-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'turn-on-auto-revert-mode "autorevert" "\
Turn on Auto-Revert Mode.
This function is designed to be added to hooks, for example:
- (add-hook \\='c-mode-hook #\\='turn-on-auto-revert-mode)" nil nil)
+ (add-hook \\='c-mode-hook #\\='turn-on-auto-revert-mode)")
(autoload 'auto-revert-tail-mode "autorevert" "\
Toggle reverting tail of buffer when the file grows.
@@ -1652,12 +1612,12 @@ evaluate `auto-revert-tail-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'turn-on-auto-revert-tail-mode "autorevert" "\
Turn on Auto-Revert Tail Mode.
This function is designed to be added to hooks, for example:
- (add-hook \\='my-logfile-mode-hook #\\='turn-on-auto-revert-tail-mode)" nil nil)
+ (add-hook \\='my-logfile-mode-hook #\\='turn-on-auto-revert-tail-mode)")
(defvar global-auto-revert-mode nil "\
Non-nil if Global Auto-Revert mode is enabled.
See the `global-auto-revert-mode' command
@@ -1701,7 +1661,7 @@ evaluate `(default-value \\='global-auto-revert-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "autorevert" '("auto-revert-" "global-auto-revert-"))
@@ -1741,7 +1701,7 @@ Effects of the different modes:
and `mouse-avoidance-nudge-dist' and `mouse-avoidance-nudge-var' for
definition of \"random distance\".)
-(fn &optional MODE)" t nil)
+(fn &optional MODE)" t)
(register-definition-prefixes "avoid" '("mouse-avoidance-"))
@@ -1750,7 +1710,7 @@ definition of \"random distance\".)
(push (purecopy '(backtrace 1 0)) package--builtin-versions)
(autoload 'backtrace "backtrace" "\
Print a trace of Lisp function calls currently active.
-Output stream used is value of `standard-output'." nil nil)
+Output stream used is value of `standard-output'.")
(register-definition-prefixes "backtrace" '("backtrace-"))
@@ -1770,7 +1730,7 @@ Run script using `bat-run' and `bat-run-args'.
\\{bat-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "bat-mode" '("bat-"))
@@ -1780,7 +1740,7 @@ Run script using `bat-run' and `bat-run-args'.
(autoload 'battery "battery" "\
Display battery status information in the echo area.
The text being displayed in the echo area is controlled by the variables
-`battery-echo-area-format' and `battery-status-function'." t nil)
+`battery-echo-area-format' and `battery-status-function'." t)
(defvar display-battery-mode nil "\
Non-nil if Display-Battery mode is enabled.
See the `display-battery-mode' command
@@ -1815,8 +1775,8 @@ evaluate `(default-value \\='display-battery-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
-(register-definition-prefixes "battery" '("battery-" "my-"))
+(fn &optional ARG)" t)
+(register-definition-prefixes "battery" '("battery-"))
;;; Generated autoloads from emacs-lisp/benchmark.el
@@ -1833,7 +1793,7 @@ specifies a minimum number of seconds that the benchmark execution
should take. In that case the return value is prepended with the
number of repetitions actually used.
-(fn FUNC &optional REPETITIONS)" nil nil)
+(fn FUNC &optional REPETITIONS)")
(autoload 'benchmark-run "benchmark" "\
Time execution of FORMS.
If REPETITIONS is supplied as a number, run FORMS that many times,
@@ -1862,7 +1822,7 @@ For non-interactive use see also `benchmark-run' and
FORM can also be a function in which case we measure the time it takes
to call it without any argument.
-(fn REPETITIONS FORM)" t nil)
+(fn REPETITIONS FORM)" t)
(autoload 'benchmark-progn "benchmark" "\
Evaluate BODY and message the time taken.
The return value is the value of the final form in BODY.
@@ -1874,7 +1834,7 @@ The return value is the value of the final form in BODY.
;;; Generated autoloads from textmodes/bib-mode.el
-(register-definition-prefixes "bib-mode" '("addbib" "bib-" "mark-bib" "return-key-bib" "unread-bib"))
+(register-definition-prefixes "bib-mode" '("bib-"))
;;; Generated autoloads from textmodes/bibtex.el
@@ -1893,7 +1853,7 @@ When called interactively, FORCE is t, CURRENT is t if current buffer
visits a file using `bibtex-mode', and SELECT is t if current buffer
does not use `bibtex-mode'.
-(fn &optional CURRENT FORCE SELECT)" t nil)
+(fn &optional CURRENT FORCE SELECT)" t)
(autoload 'bibtex-mode "bibtex" "\
Major mode for editing BibTeX files.
@@ -1947,7 +1907,7 @@ if that value is non-nil.
\\{bibtex-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'bibtex-search-entry "bibtex" "\
Move point to the beginning of BibTeX entry named KEY.
Return position of entry if KEY is found or nil if not found.
@@ -1961,7 +1921,7 @@ Also, GLOBAL is t if the current mode is not `bibtex-mode'
or `bibtex-search-entry-globally' is non-nil.
A prefix arg negates the value of `bibtex-search-entry-globally'.
-(fn KEY &optional GLOBAL START DISPLAY)" t nil)
+(fn KEY &optional GLOBAL START DISPLAY)" t)
(register-definition-prefixes "bibtex" '("bibtex-"))
@@ -1970,7 +1930,7 @@ A prefix arg negates the value of `bibtex-search-entry-globally'.
(autoload 'bibtex-style-mode "bibtex-style" "\
Major mode for editing BibTeX style files.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "bibtex-style" '("bibtex-style-"))
@@ -1987,15 +1947,15 @@ Regular expression matching the start of a BinHex encoded region.")
Binhex decode region between START and END without using an external program.
If HEADER-ONLY is non-nil only decode header and return filename.
-(fn START END &optional HEADER-ONLY)" t nil)
+(fn START END &optional HEADER-ONLY)" t)
(autoload 'binhex-decode-region-external "binhex" "\
Binhex decode region between START and END using external decoder.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'binhex-decode-region "binhex" "\
Binhex decode region between START and END.
-(fn START END)" t nil)
+(fn START END)" t)
(register-definition-prefixes "binhex" '("binhex-"))
@@ -2113,7 +2073,7 @@ H * * * O - - - - - - - - - - - - - - - - - - - -
Be sure to compare the second example of a hit with the first example of
a reflection.
-(fn NUM)" t nil)
+(fn NUM)" t)
(register-definition-prefixes "blackbox" '("bb-" "blackbox-"))
@@ -2155,7 +2115,7 @@ Use \\[bookmark-delete] to remove bookmarks (you give it a name and
it removes only the first instance of a bookmark with that name from
the list of bookmarks.)
-(fn &optional NAME NO-OVERWRITE)" t nil)
+(fn &optional NAME NO-OVERWRITE)" t)
(autoload 'bookmark-set-no-overwrite "bookmark" "\
Set a bookmark named NAME at the current location.
If NAME is nil, then prompt the user.
@@ -2184,7 +2144,7 @@ Use \\[bookmark-delete] to remove bookmarks (you give it a name and
it removes only the first instance of a bookmark with that name from
the list of bookmarks.)
-(fn &optional NAME PUSH-BOOKMARK)" t nil)
+(fn &optional NAME PUSH-BOOKMARK)" t)
(autoload 'bookmark-jump "bookmark" "\
Jump to bookmark BOOKMARK (a point in some file).
You may have a problem using this function if the value of variable
@@ -2204,15 +2164,15 @@ If DISPLAY-FUNC is non-nil, it is a function to invoke to display the
bookmark. It defaults to `pop-to-buffer-same-window'. A typical value for
DISPLAY-FUNC would be `switch-to-buffer-other-window'.
-(fn BOOKMARK &optional DISPLAY-FUNC)" t nil)
+(fn BOOKMARK &optional DISPLAY-FUNC)" t)
(autoload 'bookmark-jump-other-window "bookmark" "\
Jump to BOOKMARK in another window. See `bookmark-jump' for more.
-(fn BOOKMARK)" t nil)
+(fn BOOKMARK)" t)
(autoload 'bookmark-jump-other-frame "bookmark" "\
Jump to BOOKMARK in another frame. See `bookmark-jump' for more.
-(fn BOOKMARK)" t nil)
+(fn BOOKMARK)" t)
(autoload 'bookmark-relocate "bookmark" "\
Relocate BOOKMARK-NAME to another file, reading file name with minibuffer.
@@ -2220,14 +2180,14 @@ This makes an already existing bookmark point to that file, instead of
the one it used to point at. Useful when a file has been renamed
after a bookmark was set in it.
-(fn BOOKMARK-NAME)" t nil)
+(fn BOOKMARK-NAME)" t)
(autoload 'bookmark-insert-location "bookmark" "\
Insert the name of the file associated with BOOKMARK-NAME.
Optional second arg NO-HISTORY means don't record this in the
minibuffer history list `bookmark-history'.
-(fn BOOKMARK-NAME &optional NO-HISTORY)" t nil)
+(fn BOOKMARK-NAME &optional NO-HISTORY)" t)
(defalias 'bookmark-locate 'bookmark-insert-location)
(autoload 'bookmark-rename "bookmark" "\
Change the name of OLD-NAME bookmark to NEW-NAME name.
@@ -2242,7 +2202,7 @@ While you are entering the new name, consecutive \\<bookmark-minibuffer-read-nam
consecutive words from the text of the buffer into the new bookmark
name.
-(fn OLD-NAME &optional NEW-NAME)" t nil)
+(fn OLD-NAME &optional NEW-NAME)" t)
(autoload 'bookmark-insert "bookmark" "\
Insert the text of the file pointed to by bookmark BOOKMARK-NAME.
BOOKMARK-NAME is a bookmark name (a string), not a bookmark record.
@@ -2252,7 +2212,7 @@ You may have a problem using this function if the value of variable
bookmarks. See help on function `bookmark-load' for more about
this.
-(fn BOOKMARK-NAME)" t nil)
+(fn BOOKMARK-NAME)" t)
(autoload 'bookmark-delete "bookmark" "\
Delete BOOKMARK-NAME from the bookmark list.
@@ -2263,15 +2223,15 @@ one most recently used in this file, if any).
Optional second arg BATCH means don't update the bookmark list buffer,
probably because we were called from there.
-(fn BOOKMARK-NAME &optional BATCH)" t nil)
+(fn BOOKMARK-NAME &optional BATCH)" t)
(autoload 'bookmark-delete-all "bookmark" "\
Permanently delete all bookmarks.
If optional argument NO-CONFIRM is non-nil, don't ask for
confirmation.
-(fn &optional NO-CONFIRM)" t nil)
+(fn &optional NO-CONFIRM)" t)
(autoload 'bookmark-write "bookmark" "\
-Write bookmarks to a file (reading the file name with the minibuffer)." t nil)
+Write bookmarks to a file (reading the file name with the minibuffer)." t)
(function-put 'bookmark-write 'interactive-only 'bookmark-save)
(autoload 'bookmark-save "bookmark" "\
Save currently defined bookmarks in FILE.
@@ -2286,7 +2246,7 @@ When you want to load in the bookmarks from a file, use
for a file, defaulting to the file defined by variable
`bookmark-default-file'.
-(fn &optional PARG FILE MAKE-DEFAULT)" t nil)
+(fn &optional PARG FILE MAKE-DEFAULT)" t)
(autoload 'bookmark-load "bookmark" "\
Load bookmarks from FILE (which must be in bookmark format).
Appends loaded bookmarks to the front of the list of bookmarks.
@@ -2306,19 +2266,19 @@ If you load a file containing bookmarks with the same names as
bookmarks already present in your Emacs, the new bookmarks will get
unique numeric suffixes \"<2>\", \"<3>\", etc.
-(fn FILE &optional OVERWRITE NO-MSG DEFAULT)" t nil)
+(fn FILE &optional OVERWRITE NO-MSG DEFAULT)" t)
(autoload 'bookmark-bmenu-get-buffer "bookmark" "\
Return the Bookmark List, building it if it doesn't exists.
-Don't affect the buffer ring order." nil nil)
+Don't affect the buffer ring order.")
(autoload 'bookmark-bmenu-list "bookmark" "\
Display a list of existing bookmarks.
The list is displayed in a buffer named `*Bookmark List*'.
The leftmost column displays a D if the bookmark is flagged for
-deletion, or > if it is flagged for displaying." t nil)
+deletion, or > if it is flagged for displaying." t)
(defalias 'list-bookmarks 'bookmark-bmenu-list)
(defalias 'edit-bookmarks 'bookmark-bmenu-list)
(autoload 'bookmark-bmenu-search "bookmark" "\
-Incremental search of bookmarks, hiding the non-matches as we go." '(bookmark-bmenu-mode) nil)
+Incremental search of bookmarks, hiding the non-matches as we go." '(bookmark-bmenu-mode))
(defvar menu-bar-bookmark-map (let ((map (make-sparse-keymap "Bookmark functions"))) (bindings--define-key map [load] '(menu-item "Load a Bookmark File..." bookmark-load :help "Load bookmarks from a bookmark file)")) (bindings--define-key map [write] '(menu-item "Save Bookmarks As..." bookmark-write :help "Write bookmarks to a file (reading the file name with the minibuffer)")) (bindings--define-key map [save] '(menu-item "Save Bookmarks" bookmark-save :help "Save currently defined bookmarks")) (bindings--define-key map [edit] '(menu-item "Edit Bookmark List" bookmark-bmenu-list :help "Display a list of existing bookmarks")) (bindings--define-key map [delete] '(menu-item "Delete Bookmark..." bookmark-delete :help "Delete a bookmark from the bookmark list")) (bindings--define-key map [delete-all] '(menu-item "Delete all Bookmarks..." bookmark-delete-all :help "Delete all bookmarks from the bookmark list")) (bindings--define-key map [rename] '(menu-item "Rename Bookmark..." bookmark-rename :help "Change the name of a bookmark")) (bindings--define-key map [locate] '(menu-item "Insert Location..." bookmark-locate :help "Insert the name of the file associated with a bookmark")) (bindings--define-key map [insert] '(menu-item "Insert Contents..." bookmark-insert :help "Insert the text of the file pointed to by a bookmark")) (bindings--define-key map [set] '(menu-item "Set Bookmark..." bookmark-set :help "Set a bookmark named inside a file.")) (bindings--define-key map [jump] '(menu-item "Jump to Bookmark..." bookmark-jump :help "Jump to a bookmark (a point in some file)")) map))
(defalias 'menu-bar-bookmark-map menu-bar-bookmark-map)
(register-definition-prefixes "bookmark" '("bookmark-" "with-buffer-modified-unmodified"))
@@ -2359,7 +2319,7 @@ Currently, it also consults `browse-url-browser-function' first
if it is set to an alist, although this usage is deprecated since
Emacs 28.1 and will be removed in a future release.
-(fn URL &optional KIND)" nil nil)
+(fn URL &optional KIND)")
(autoload 'browse-url-of-file "browse-url" "\
Use a web browser to display FILE.
Display the current buffer's file if FILE is nil or if called
@@ -2367,7 +2327,7 @@ interactively. Turn the filename into a URL with function
`browse-url-file-url'. Pass the URL to a browser using the
`browse-url' function then run `browse-url-of-file-hook'.
-(fn &optional FILE)" t nil)
+(fn &optional FILE)" t)
(autoload 'browse-url-of-buffer "browse-url" "\
Use a web browser to display BUFFER.
See `browse-url' for details.
@@ -2376,14 +2336,14 @@ Display the current buffer if BUFFER is nil. Display only the
currently visible part of BUFFER (from a temporary file) if buffer is
narrowed.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'browse-url-of-dired-file "browse-url" "\
-In Dired, ask a WWW browser to display the file named on this line." t nil)
+In Dired, ask a WWW browser to display the file named on this line." t)
(autoload 'browse-url-of-region "browse-url" "\
Use a web browser to display the current region.
See `browse-url' for details.
-(fn MIN MAX)" t nil)
+(fn MIN MAX)" t)
(autoload 'browse-url "browse-url" "\
Open URL using a configurable method.
This will typically (by default) open URL with an external web
@@ -2405,14 +2365,14 @@ significance of ARGS (most of the functions ignore it).
If ARGS are omitted, the default is to pass
`browse-url-new-window-flag' as ARGS.
-(fn URL &rest ARGS)" t nil)
+(fn URL &rest ARGS)" t)
(autoload 'browse-url-at-point "browse-url" "\
Open URL at point using a configurable method.
See `browse-url' for details.
Optional prefix argument ARG non-nil inverts the value of the option
`browse-url-new-window-flag'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'browse-url-with-browser-kind "browse-url" "\
Browse URL with a browser of the given browser KIND.
KIND is either `internal' or `external'.
@@ -2420,7 +2380,7 @@ KIND is either `internal' or `external'.
When called interactively, the default browser kind is the
opposite of the browser kind of `browse-url-browser-function'.
-(fn KIND URL &optional ARG)" t nil)
+(fn KIND URL &optional ARG)" t)
(autoload 'browse-url-at-mouse "browse-url" "\
Use a web browser to load a URL clicked with the mouse.
See `browse-url' for details.
@@ -2428,13 +2388,13 @@ See `browse-url' for details.
The URL is the one around or before the position of the mouse
click but point is not changed.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(autoload 'browse-url-xdg-open "browse-url" "\
Pass the specified URL to the \"xdg-open\" command.
xdg-open is a desktop utility that calls your preferred web browser.
The optional argument IGNORED is not used.
-(fn URL &optional IGNORED)" t nil)
+(fn URL &optional IGNORED)" t)
(autoload 'browse-url-mozilla "browse-url" "\
Ask the Mozilla WWW browser to load URL.
Default to the URL around or before point. The strings in variable
@@ -2452,7 +2412,7 @@ new tab in an existing window instead.
When called non-interactively, optional second argument NEW-WINDOW is
used instead of `browse-url-new-window-flag'.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(make-obsolete 'browse-url-mozilla 'nil "29.1")
(autoload 'browse-url-firefox "browse-url" "\
Ask the Firefox WWW browser to load URL.
@@ -2470,7 +2430,7 @@ is loaded in a new tab in an existing window instead.
Non-interactively, this uses the optional second argument NEW-WINDOW
instead of `browse-url-new-window-flag'.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(autoload 'browse-url-chromium "browse-url" "\
Ask the Chromium WWW browser to load URL.
Default to the URL around or before point. The strings in
@@ -2478,24 +2438,24 @@ variable `browse-url-chromium-arguments' are also passed to
Chromium.
The optional argument NEW-WINDOW is not used.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(autoload 'browse-url-webpositive "browse-url" "\
Ask the WebPositive WWW browser to load URL.
Default to the URL around or before point.
The optional argument NEW-WINDOW is not used.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(autoload 'browse-url-default-haiku-browser "browse-url" "\
Browse URL with the system default browser.
Default to the URL around or before point.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(autoload 'browse-url-emacs "browse-url" "\
Ask Emacs to load URL into a buffer and show it in another window.
Optional argument SAME-WINDOW non-nil means show the URL in the
currently selected window instead.
-(fn URL &optional SAME-WINDOW)" t nil)
+(fn URL &optional SAME-WINDOW)" t)
(autoload 'browse-url-gnome-moz "browse-url" "\
Ask Mozilla to load URL via the GNOME program `gnome-moz-remote'.
Default to the URL around or before point. The strings in variable
@@ -2509,7 +2469,7 @@ effect of `browse-url-new-window-flag'.
When called non-interactively, optional second argument NEW-WINDOW is
used instead of `browse-url-new-window-flag'.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(make-obsolete 'browse-url-gnome-moz 'nil "25.1")
(autoload 'browse-url-conkeror "browse-url" "\
Ask the Conkeror WWW browser to load URL.
@@ -2529,7 +2489,7 @@ new window, load it in a new buffer in an existing window instead.
When called non-interactively, use optional second argument
NEW-WINDOW instead of `browse-url-new-window-flag'.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(make-obsolete 'browse-url-conkeror 'nil "28.1")
(autoload 'browse-url-w3 "browse-url" "\
Ask the w3 WWW browser to load URL.
@@ -2542,14 +2502,14 @@ prefix argument reverses the effect of `browse-url-new-window-flag'.
When called non-interactively, optional second argument NEW-WINDOW is
used instead of `browse-url-new-window-flag'.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(make-obsolete 'browse-url-w3 'nil "29.1")
(autoload 'browse-url-w3-gnudoit "browse-url" "\
Ask another Emacs running gnuserv to load the URL using the W3 browser.
The `browse-url-gnudoit-program' program is used with options given by
`browse-url-gnudoit-args'. Default to the URL around or before point.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(make-obsolete 'browse-url-w3-gnudoit 'nil "25.1")
(autoload 'browse-url-text-xterm "browse-url" "\
Ask a text browser to load URL.
@@ -2559,7 +2519,7 @@ in an Xterm window using the Xterm program named by `browse-url-xterm-program'
with possible additional arguments `browse-url-xterm-args'.
The optional argument NEW-WINDOW is not used.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(autoload 'browse-url-text-emacs "browse-url" "\
Ask a text browser to load URL.
URL defaults to the URL around or before point.
@@ -2574,7 +2534,7 @@ reverses the effect of `browse-url-new-window-flag'.
When called non-interactively, optional second argument NEW-WINDOW is
used instead of `browse-url-new-window-flag'.
-(fn URL &optional NEW-BUFFER)" t nil)
+(fn URL &optional NEW-BUFFER)" t)
(autoload 'browse-url-mail "browse-url" "\
Open a new mail message buffer within Emacs for the RFC 2368 URL.
Default to using the mailto: URL around or before point as the
@@ -2590,7 +2550,7 @@ non-nil interactive prefix argument reverses the effect of
When called non-interactively, optional second argument NEW-WINDOW is
used instead of `browse-url-new-window-flag'.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(autoload 'browse-url-generic "browse-url" "\
Ask the WWW browser defined by `browse-url-generic-program' to load URL.
Default to the URL around or before point. A fresh copy of the
@@ -2598,13 +2558,13 @@ browser is started up in a new process with possible additional arguments
`browse-url-generic-args'. This is appropriate for browsers which
don't offer a form of remote control.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(autoload 'browse-url-kde "browse-url" "\
Ask the KDE WWW browser to load URL.
Default to the URL around or before point.
The optional argument NEW-WINDOW is not used.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(autoload 'browse-url-elinks "browse-url" "\
Ask the Elinks WWW browser to load URL.
Default to the URL around the point.
@@ -2615,19 +2575,19 @@ none yet running, a newly started instance.
The Elinks command will be prepended by the program+arguments
from `browse-url-elinks-wrapper'.
-(fn URL &optional NEW-WINDOW)" t nil)
+(fn URL &optional NEW-WINDOW)" t)
(autoload 'browse-url-button-open "browse-url" "\
Follow the link under point using `browse-url'.
If EXTERNAL (the prefix if used interactively), open with the
external browser instead of the default one.
-(fn &optional EXTERNAL MOUSE-EVENT)" t nil)
+(fn &optional EXTERNAL MOUSE-EVENT)" t)
(autoload 'browse-url-button-open-url "browse-url" "\
Open URL using `browse-url'.
If `current-prefix-arg' is non-nil, use
`browse-url-secondary-browser-function' instead.
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "browse-url" '("browse-url-"))
@@ -2636,13 +2596,13 @@ If `current-prefix-arg' is non-nil, use
(autoload 'bs-cycle-next "bs" "\
Select next buffer defined by buffer cycling.
The buffers taking part in buffer cycling are defined
-by buffer configuration `bs-cycle-configuration-name'." t nil)
+by buffer configuration `bs-cycle-configuration-name'." t)
(autoload 'bs-cycle-previous "bs" "\
Select previous buffer defined by buffer cycling.
The buffers taking part in buffer cycling are defined
-by buffer configuration `bs-cycle-configuration-name'." t nil)
+by buffer configuration `bs-cycle-configuration-name'." t)
(autoload 'bs-customize "bs" "\
-Customization of group bs for Buffer Selection Menu." t nil)
+Customization of group bs for Buffer Selection Menu." t)
(autoload 'bs-show "bs" "\
Make a menu of buffers so you can manipulate buffers or the buffer list.
\\<bs-mode-map>
@@ -2652,12 +2612,12 @@ User can move with [up] or [down], select a buffer
by \\[bs-select] or [SPC]
Type \\[bs-kill] to leave Buffer Selection Menu without a selection.
-Type \\[bs-help] after invocation to get help on commands available.
+Type \\[describe-mode] after invocation to get help on commands available.
With prefix argument ARG show a different buffer list. Function
`bs--configuration-name-for-prefix-arg' determine accordingly
name of buffer configuration.
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "bs" '("bs-"))
@@ -2675,7 +2635,7 @@ columns on its right towards the left.
\\[bubbles-set-game-easy] sets the difficulty to easy.
\\[bubbles-set-game-medium] sets the difficulty to medium.
\\[bubbles-set-game-difficult] sets the difficulty to difficult.
-\\[bubbles-set-game-hard] sets the difficulty to hard." t nil)
+\\[bubbles-set-game-hard] sets the difficulty to hard." t)
(register-definition-prefixes "bubbles" '("bubbles-"))
@@ -2700,7 +2660,7 @@ evaluate `bug-reference-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'bug-reference-prog-mode "bug-reference" "\
Like `bug-reference-mode', but only buttonize in comments and strings.
@@ -2719,7 +2679,7 @@ evaluate `bug-reference-prog-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "bug-reference" '("bug-reference-"))
@@ -2737,7 +2697,7 @@ it is disabled.
(autoload 'byte-compile-warning-enabled-p "bytecomp" "\
Return non-nil if WARNING is enabled, according to `byte-compile-warnings'.
-(fn WARNING &optional SYMBOL)" nil nil)
+(fn WARNING &optional SYMBOL)")
(autoload 'byte-compile-disable-warning "bytecomp" "\
Change `byte-compile-warnings' to disable WARNING.
If `byte-compile-warnings' is t, set it to `(not WARNING)'.
@@ -2745,7 +2705,7 @@ Otherwise, if the first element is `not', add WARNING, else remove it.
Normally you should let-bind `byte-compile-warnings' before calling this,
else the global value will be modified.
-(fn WARNING)" nil nil)
+(fn WARNING)")
(autoload 'byte-compile-enable-warning "bytecomp" "\
Change `byte-compile-warnings' to enable WARNING.
If `byte-compile-warnings' is t, do nothing. Otherwise, if the
@@ -2753,12 +2713,12 @@ first element is `not', remove WARNING, else add it.
Normally you should let-bind `byte-compile-warnings' before calling this,
else the global value will be modified.
-(fn WARNING)" nil nil)
+(fn WARNING)")
(autoload 'byte-force-recompile "bytecomp" "\
Recompile every `.el' file in DIRECTORY that already has a `.elc' file.
Files in subdirectories of DIRECTORY are processed also.
-(fn DIRECTORY)" t nil)
+(fn DIRECTORY)" t)
(autoload 'byte-recompile-directory "bytecomp" "\
Recompile every `.el' file in DIRECTORY that needs recompilation.
This happens when a `.elc' file exists but is older than the `.el' file.
@@ -2778,7 +2738,7 @@ This command will normally not follow symlinks when compiling
files. If FOLLOW-SYMLINKS is non-nil, symlinked `.el' files will
also be compiled.
-(fn DIRECTORY &optional ARG FORCE FOLLOW-SYMLINKS)" t nil)
+(fn DIRECTORY &optional ARG FORCE FOLLOW-SYMLINKS)" t)
(put 'no-byte-compile 'safe-local-variable 'booleanp)
(autoload 'byte-compile-file "bytecomp" "\
Compile a file of Lisp code named FILENAME into a file of byte code.
@@ -2791,19 +2751,19 @@ value is `no-byte-compile'.
See also `emacs-lisp-byte-compile-and-load'.
-(fn FILENAME &optional LOAD)" t nil)
+(fn FILENAME &optional LOAD)" t)
(set-advertised-calling-convention 'byte-compile-file '(filename) '"28.1")
(autoload 'compile-defun "bytecomp" "\
Compile and evaluate the current top-level form.
Print the result in the echo area.
With argument ARG, insert value in current buffer after the form.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'byte-compile "bytecomp" "\
If FORM is a symbol, byte-compile its function definition.
If FORM is a lambda or a macro, byte-compile it as a function.
-(fn FORM)" nil nil)
+(fn FORM)")
(autoload 'display-call-tree "bytecomp" "\
Display a call graph of a specified file.
This lists which functions have been called, what functions called
@@ -2819,11 +2779,11 @@ The call tree also lists those functions which are not known to be called
(that is, to which no calls have been compiled), and which cannot be
invoked interactively.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'batch-byte-compile-if-not-done "bytecomp" "\
Like `byte-compile-file' but doesn't recompile if already up to date.
Use this from the command line, with `-batch';
-it won't work in an interactive Emacs." nil nil)
+it won't work in an interactive Emacs.")
(autoload 'batch-byte-compile "bytecomp" "\
Run `byte-compile-file' on the files remaining on the command line.
Use this from the command line, with `-batch';
@@ -2840,7 +2800,7 @@ For example, invoke \"emacs -batch -f batch-byte-compile $emacs/ ~/*.el\".
If NOFORCE is non-nil, don't recompile a file that seems to be
already up-to-date.
-(fn &optional NOFORCE)" nil nil)
+(fn &optional NOFORCE)")
(autoload 'batch-byte-recompile-directory "bytecomp" "\
Run `byte-recompile-directory' on the dirs remaining on the command line.
Must be used only with `-batch', and kills Emacs on completion.
@@ -2850,13 +2810,13 @@ Optional argument ARG is passed as second argument ARG to
`byte-recompile-directory'; see there for its possible values
and corresponding effects.
-(fn &optional ARG)" nil nil)
+(fn &optional ARG)")
(register-definition-prefixes "bytecomp" '("batch-byte-compile-file" "byte" "displaying-byte-compile-warnings" "emacs-lisp-" "no-byte-compile"))
;;; Generated autoloads from cedet/semantic/bovine/c.el
-(register-definition-prefixes "semantic/bovine/c" '("c-mode" "semantic"))
+(register-definition-prefixes "semantic/bovine/c" '("semantic"))
;;; Generated autoloads from calendar/cal-bahai.el
@@ -2895,7 +2855,7 @@ List Yahrzeit dates for *Gregorian* DEATH-DATE from START-YEAR to END-YEAR.
When called interactively from the calendar window, the date of death is taken
from the cursor position.
-(fn DEATH-DATE START-YEAR END-YEAR)" t nil)
+(fn DEATH-DATE START-YEAR END-YEAR)" t)
(register-definition-prefixes "cal-hebrew" '("calendar-hebrew-" "diary-hebrew-" "holiday-hebrew"))
@@ -2955,64 +2915,64 @@ from the cursor position.
(autoload 'calc-dispatch "calc" "\
Invoke the GNU Emacs Calculator. See \\[calc-dispatch-help] for details.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'calc "calc" "\
The Emacs Calculator. Full documentation is listed under `calc-mode'.
-(fn &optional ARG FULL-DISPLAY INTERACTIVE)" t nil)
+(fn &optional ARG FULL-DISPLAY INTERACTIVE)" t)
(autoload 'full-calc "calc" "\
Invoke the Calculator and give it a full-sized window.
-(fn &optional INTERACTIVE)" t nil)
+(fn &optional INTERACTIVE)" t)
(autoload 'quick-calc "calc" "\
Do a quick calculation in the minibuffer without invoking full Calculator.
With prefix argument INSERT, insert the result in the current
buffer. Otherwise, the result is copied into the kill ring.
-(fn &optional INSERT)" t nil)
+(fn &optional INSERT)" t)
(autoload 'calc-eval "calc" "\
Do a quick calculation and return the result as a string.
Return value will either be the formatted result in string form,
or a list containing a character position and an error message in string form.
-(fn STR &optional SEPARATOR &rest ARGS)" nil nil)
+(fn STR &optional SEPARATOR &rest ARGS)")
(autoload 'calc-keypad "calc" "\
Invoke the Calculator in \"visual keypad\" mode.
This is most useful in the X window system.
In this mode, click on the Calc \"buttons\" using the left mouse button.
Or, position the cursor manually and do \\[calc-keypad-press].
-(fn &optional INTERACTIVE)" t nil)
+(fn &optional INTERACTIVE)" t)
(autoload 'full-calc-keypad "calc" "\
Invoke the Calculator in full-screen \"visual keypad\" mode.
See calc-keypad for details.
-(fn &optional INTERACTIVE)" t nil)
+(fn &optional INTERACTIVE)" t)
(autoload 'calc-grab-region "calc" "\
Parse the region as a vector of numbers and push it on the Calculator stack.
-(fn TOP BOT ARG)" t nil)
+(fn TOP BOT ARG)" t)
(autoload 'calc-grab-rectangle "calc" "\
Parse a rectangle as a matrix of numbers and push it on the Calculator stack.
-(fn TOP BOT ARG)" t nil)
+(fn TOP BOT ARG)" t)
(autoload 'calc-grab-sum-down "calc" "\
Parse a rectangle as a matrix of numbers and sum its columns.
-(fn TOP BOT ARG)" t nil)
+(fn TOP BOT ARG)" t)
(autoload 'calc-grab-sum-across "calc" "\
Parse a rectangle as a matrix of numbers and sum its rows.
-(fn TOP BOT ARG)" t nil)
+(fn TOP BOT ARG)" t)
(autoload 'calc-embedded "calc" "\
Start Calc Embedded mode on the formula surrounding point.
-(fn ARG &optional END OBEG OEND)" t nil)
+(fn ARG &optional END OBEG OEND)" t)
(autoload 'calc-embedded-activate "calc" "\
Scan the current editing buffer for all embedded := and => formulas.
Also looks for the equivalent TeX words, \\gets and \\evalto.
-(fn &optional ARG CBUF)" t nil)
+(fn &optional ARG CBUF)" t)
(autoload 'defmath "calc" "\
Define Calc function.
@@ -3206,7 +3166,7 @@ See Info node `(calc)Defining Functions'.
(autoload 'calc-undo "calc-undo" "\
-(fn N)" t nil)
+(fn N)" t)
(register-definition-prefixes "calc-undo" '("calc-"))
@@ -3249,7 +3209,7 @@ See Info node `(calc)Defining Functions'.
(autoload 'calculator "calculator" "\
Run the Emacs calculator.
-See the documentation for `calculator-mode' for more information." t nil)
+See the documentation for `calculator-mode' for more information." t)
(register-definition-prefixes "calculator" '("calculator-"))
@@ -3290,7 +3250,7 @@ Runs the following hooks:
This function is suitable for execution in an init file.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "calendar" '("calendar-" "diary-" "holiday-buffer" "lunar-phases-buffer" "solar-sunrises-buffer"))
@@ -3299,13 +3259,13 @@ This function is suitable for execution in an init file.
(autoload 'canlock-insert-header "canlock" "\
Insert a Cancel-Key and/or a Cancel-Lock header if possible.
-(fn &optional ID-FOR-KEY ID-FOR-LOCK PASSWORD)" nil nil)
+(fn &optional ID-FOR-KEY ID-FOR-LOCK PASSWORD)")
(autoload 'canlock-verify "canlock" "\
Verify Cancel-Lock or Cancel-Key in BUFFER.
If BUFFER is nil, the current buffer is assumed. Signal an error if
it fails.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(register-definition-prefixes "canlock" '("canlock-"))
@@ -3337,7 +3297,7 @@ it fails.
;;; Generated autoloads from progmodes/cc-engine.el
(autoload 'c-guess-basic-syntax "cc-engine" "\
-Return the syntactic context of the current line." nil nil)
+Return the syntactic context of the current line.")
(register-definition-prefixes "cc-engine" '("c-"))
@@ -3361,7 +3321,7 @@ If given a prefix argument (or if the optional argument ACCUMULATE is
non-nil) then the previous guess is extended, otherwise a new guess is
made from scratch.
-(fn &optional ACCUMULATE)" t nil)
+(fn &optional ACCUMULATE)" t)
(autoload 'c-guess-no-install "cc-guess" "\
Guess the style in the region up to `c-guess-region-max'; don't install it.
@@ -3369,7 +3329,7 @@ If given a prefix argument (or if the optional argument ACCUMULATE is
non-nil) then the previous guess is extended, otherwise a new guess is
made from scratch.
-(fn &optional ACCUMULATE)" t nil)
+(fn &optional ACCUMULATE)" t)
(autoload 'c-guess-buffer "cc-guess" "\
Guess the style on the whole current buffer, and install it.
@@ -3379,7 +3339,7 @@ If given a prefix argument (or if the optional argument ACCUMULATE is
non-nil) then the previous guess is extended, otherwise a new guess is
made from scratch.
-(fn &optional ACCUMULATE)" t nil)
+(fn &optional ACCUMULATE)" t)
(autoload 'c-guess-buffer-no-install "cc-guess" "\
Guess the style on the whole current buffer; don't install it.
@@ -3387,7 +3347,7 @@ If given a prefix argument (or if the optional argument ACCUMULATE is
non-nil) then the previous guess is extended, otherwise a new guess is
made from scratch.
-(fn &optional ACCUMULATE)" t nil)
+(fn &optional ACCUMULATE)" t)
(autoload 'c-guess-region "cc-guess" "\
Guess the style on the region and install it.
@@ -3397,7 +3357,7 @@ If given a prefix argument (or if the optional argument ACCUMULATE is
non-nil) then the previous guess is extended, otherwise a new guess is
made from scratch.
-(fn START END &optional ACCUMULATE)" t nil)
+(fn START END &optional ACCUMULATE)" t)
(autoload 'c-guess-region-no-install "cc-guess" "\
Guess the style on the region; don't install it.
@@ -3421,7 +3381,7 @@ guess is made from scratch.
Note that the larger the region to guess in, the slower the guessing.
So you can limit the region with `c-guess-region-max'.
-(fn START END &optional ACCUMULATE)" t nil)
+(fn START END &optional ACCUMULATE)" t)
(autoload 'c-guess-install "cc-guess" "\
Install the latest guessed style into the current buffer.
(This guessed style is a combination of `c-guess-guessed-basic-offset',
@@ -3431,7 +3391,7 @@ The style is entered into CC Mode's style system by
`c-add-style'. Its name is either STYLE-NAME, or a name based on
the absolute file name of the file if STYLE-NAME is nil.
-(fn &optional STYLE-NAME)" t nil)
+(fn &optional STYLE-NAME)" t)
(register-definition-prefixes "cc-guess" '("c-guess-"))
@@ -3456,7 +3416,7 @@ only some basic setup is done, and a call to `c-init-language-vars' or
`c-init-language-vars-for' is necessary too (which gives more
control). See \"cc-mode.el\" for more info.
-(fn &optional NEW-STYLE-INIT)" nil nil)
+(fn &optional NEW-STYLE-INIT)")
(add-to-list 'auto-mode-alist '("\\.\\(cc\\|hh\\)\\'" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.[ch]\\(pp\\|xx\\|\\+\\+\\)\\'" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.\\(CC?\\|HH?\\)\\'" . c++-mode))
@@ -3482,7 +3442,7 @@ initialization, then `c-mode-hook'.
Key bindings:
\\{c-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'c-or-c++-mode "cc-mode" "\
Analyze buffer and enable either C or C++ mode.
@@ -3493,7 +3453,7 @@ should be used.
This function attempts to use file contents to determine whether
the code is C or C++ and based on that chooses whether to enable
-`c-mode' or `c++-mode'." t nil)
+`c-mode' or `c++-mode'." t)
(autoload 'c++-mode "cc-mode" "\
Major mode for editing C++ code.
To submit a problem report, enter `\\[c-submit-bug-report]' from a
@@ -3510,7 +3470,7 @@ initialization, then `c++-mode-hook'.
Key bindings:
\\{c++-mode-map}
-(fn)" t nil)
+(fn)" t)
(add-to-list 'auto-mode-alist '("\\.m\\'" . objc-mode))
(autoload 'objc-mode "cc-mode" "\
Major mode for editing Objective C code.
@@ -3528,7 +3488,7 @@ initialization, then `objc-mode-hook'.
Key bindings:
\\{objc-mode-map}
-(fn)" t nil)
+(fn)" t)
(add-to-list 'auto-mode-alist '("\\.java\\'" . java-mode))
(autoload 'java-mode "cc-mode" "\
Major mode for editing Java code.
@@ -3546,7 +3506,7 @@ initialization, then `java-mode-hook'.
Key bindings:
\\{java-mode-map}
-(fn)" t nil)
+(fn)" t)
(add-to-list 'auto-mode-alist '("\\.idl\\'" . idl-mode))
(autoload 'idl-mode "cc-mode" "\
Major mode for editing CORBA's IDL, PSDL and CIDL code.
@@ -3564,7 +3524,7 @@ initialization, then `idl-mode-hook'.
Key bindings:
\\{idl-mode-map}
-(fn)" t nil)
+(fn)" t)
(add-to-list 'auto-mode-alist '("\\.\\(u?lpc\\|pike\\|pmod\\(\\.in\\)?\\)\\'" . pike-mode))
(add-to-list 'interpreter-mode-alist '("pike" . pike-mode))
(autoload 'pike-mode "cc-mode" "\
@@ -3583,7 +3543,7 @@ initialization, then `pike-mode-hook'.
Key bindings:
\\{pike-mode-map}
-(fn)" t nil)
+(fn)" t)
(add-to-list 'auto-mode-alist '("\\.awk\\'" . awk-mode))
(add-to-list 'interpreter-mode-alist '("awk" . awk-mode))
(add-to-list 'interpreter-mode-alist '("mawk" . awk-mode))
@@ -3604,7 +3564,7 @@ initialization, then `awk-mode-hook'.
Key bindings:
\\{awk-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "cc-mode" '("awk-mode-map" "c++-mode-" "c-" "idl-mode-" "java-mode-" "objc-mode-" "pike-mode-"))
@@ -3633,7 +3593,7 @@ calls c-set-style internally in this way whilst initializing a buffer; if
c-set-style is called like this from anywhere else, it will usually behave as
a null operation.
-(fn STYLENAME &optional DONT-OVERRIDE)" t nil)
+(fn STYLENAME &optional DONT-OVERRIDE)" t)
(autoload 'c-add-style "cc-styles" "\
Add a style to `c-style-alist', or update an existing one.
STYLE is a string identifying the style to add or update. DESCRIPTION
@@ -3645,14 +3605,14 @@ See the variable `c-style-alist' for the semantics of BASESTYLE,
VARIABLE and VALUE. This function also sets the current style to
STYLE using `c-set-style' if the optional SET-P flag is non-nil.
-(fn STYLE DESCRIPTION &optional SET-P)" t nil)
+(fn STYLE DESCRIPTION &optional SET-P)" t)
(autoload 'c-set-offset "cc-styles" "\
Change the value of a syntactic element symbol in `c-offsets-alist'.
SYMBOL is the syntactic element symbol to change and OFFSET is the new
offset for that syntactic element. The optional argument is not used
and exists only for compatibility reasons.
-(fn SYMBOL OFFSET &optional IGNORED)" t nil)
+(fn SYMBOL OFFSET &optional IGNORED)" t)
(register-definition-prefixes "cc-styles" '("c-" "cc-choose-style-for-mode"))
@@ -3669,11 +3629,11 @@ and exists only for compatibility reasons.
(autoload 'ccl-compile "ccl" "\
Return the compiled code of CCL-PROGRAM as a vector of integers.
-(fn CCL-PROGRAM)" nil nil)
+(fn CCL-PROGRAM)")
(autoload 'ccl-dump "ccl" "\
Disassemble compiled CCL-code CODE.
-(fn CODE)" nil nil)
+(fn CODE)")
(autoload 'declare-ccl-program "ccl" "\
Declare NAME as a name of CCL program.
@@ -3947,7 +3907,7 @@ The return value is a vector of resulting CCL registers.
See the documentation of `define-ccl-program' for the detail of CCL program.
-(fn CCL-PROG &rest ARGS)" nil nil)
+(fn CCL-PROG &rest ARGS)")
(register-definition-prefixes "ccl" '("ccl-"))
@@ -3959,7 +3919,7 @@ FORM is a piece of Elisp code after macroexpansion.
Returns a form where all lambdas don't have any free variables.
-(fn FORM)" nil nil)
+(fn FORM)")
(register-definition-prefixes "cconv" '("cconv-"))
@@ -4004,7 +3964,7 @@ There are no special keybindings by default.
Action blocks are treated as defuns, i.e. \\[beginning-of-defun] moves
to the action header.
-(fn)" t nil)
+(fn)" t)
(autoload 'cfengine2-mode "cfengine" "\
Major mode for editing CFEngine2 input.
There are no special keybindings by default.
@@ -4012,9 +3972,9 @@ There are no special keybindings by default.
Action blocks are treated as defuns, i.e. \\[beginning-of-defun] moves
to the action header.
-(fn)" t nil)
+(fn)" t)
(autoload 'cfengine-auto-mode "cfengine" "\
-Choose `cfengine2-mode' or `cfengine3-mode' by buffer contents." t nil)
+Choose `cfengine2-mode' or `cfengine3-mode' by buffer contents." t)
(register-definition-prefixes "cfengine" '("cfengine"))
@@ -4038,7 +3998,7 @@ just return the result of calling `regexp-quote' on STRING.
FROM is for internal use. It specifies an index in the STRING
from which to start.
-(fn STRING &optional LAX FROM)" nil nil)
+(fn STRING &optional LAX FROM)")
(register-definition-prefixes "char-fold" '("char-fold-"))
@@ -4058,12 +4018,12 @@ from which to start.
Check veracity of all `declare-function' statements in FILE.
See `check-declare-directory' for more information.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'check-declare-directory "check-declare" "\
Check veracity of all `declare-function' statements under directory ROOT.
Returns non-nil if any false statements are found.
-(fn ROOT)" t nil)
+(fn ROOT)" t)
(register-definition-prefixes "check-declare" '("check-declare-"))
@@ -4080,13 +4040,13 @@ Returns non-nil if any false statements are found.
(autoload 'checkdoc-list-of-strings-p "checkdoc" "\
Return t when OBJ is a list of strings.
-(fn OBJ)" nil nil)
+(fn OBJ)")
(put 'checkdoc-proper-noun-regexp 'safe-local-variable 'stringp)
(put 'checkdoc-common-verbs-regexp 'safe-local-variable 'stringp)
(autoload 'checkdoc "checkdoc" "\
Interactively check the entire buffer for style errors.
The current status of the check will be displayed in a buffer which
-the users will view as each check is completed." '(emacs-lisp-mode) nil)
+the users will view as each check is completed." '(emacs-lisp-mode))
(autoload 'checkdoc-interactive "checkdoc" "\
Interactively check the current buffer for doc string errors.
Prefix argument START-HERE will start the checking from the current
@@ -4096,7 +4056,7 @@ errors. Does not check for comment or space warnings.
Optional argument SHOWSTATUS indicates that we should update the
checkdoc status window instead of the usual behavior.
-(fn &optional START-HERE SHOWSTATUS)" '(emacs-lisp-mode) nil)
+(fn &optional START-HERE SHOWSTATUS)" '(emacs-lisp-mode))
(autoload 'checkdoc-message-interactive "checkdoc" "\
Interactively check the current buffer for message string errors.
Prefix argument START-HERE will start the checking from the current
@@ -4106,23 +4066,23 @@ errors. Does not check for comment or space warnings.
Optional argument SHOWSTATUS indicates that we should update the
checkdoc status window instead of the usual behavior.
-(fn &optional START-HERE SHOWSTATUS)" '(emacs-lisp-mode) nil)
+(fn &optional START-HERE SHOWSTATUS)" '(emacs-lisp-mode))
(autoload 'checkdoc-eval-current-buffer "checkdoc" "\
Evaluate and check documentation for the current buffer.
Evaluation is done first because good documentation for something that
doesn't work is just not useful. Comments, doc strings, and rogue
-spacing are all verified." t nil)
+spacing are all verified." t)
(autoload 'checkdoc-current-buffer "checkdoc" "\
Check current buffer for document, comment, error style, and rogue spaces.
With a prefix argument (in Lisp, the argument TAKE-NOTES),
store all errors found in a warnings buffer,
otherwise stop after the first error.
-(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode))
(autoload 'checkdoc-file "checkdoc" "\
Check FILE for document, comment, error style, and rogue spaces.
-(fn FILE)" nil nil)
+(fn FILE)")
(autoload 'checkdoc-start "checkdoc" "\
Start scanning the current buffer for documentation string style errors.
Only documentation strings are checked.
@@ -4130,20 +4090,20 @@ Use `checkdoc-continue' to continue checking if an error cannot be fixed.
Prefix argument TAKE-NOTES means to collect all the warning messages into
a separate buffer.
-(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode))
(autoload 'checkdoc-continue "checkdoc" "\
Find the next doc string in the current buffer which has a style error.
Prefix argument TAKE-NOTES means to continue through the whole
buffer and save warnings in a separate buffer.
-(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode))
(autoload 'checkdoc-comments "checkdoc" "\
Find missing comment sections in the current Emacs Lisp file.
Prefix argument TAKE-NOTES non-nil means to save warnings in a
separate buffer. Otherwise print a message. This returns the error
if there is one.
-(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode))
(autoload 'checkdoc-rogue-spaces "checkdoc" "\
Find extra spaces at the end of lines in the current file.
Prefix argument TAKE-NOTES non-nil means to save warnings in a
@@ -4151,17 +4111,17 @@ separate buffer. Otherwise print a message. This returns the error
if there is one.
Optional argument INTERACT permits more interactive fixing.
-(fn &optional TAKE-NOTES INTERACT)" '(emacs-lisp-mode) nil)
+(fn &optional TAKE-NOTES INTERACT)" '(emacs-lisp-mode))
(autoload 'checkdoc-message-text "checkdoc" "\
Scan the buffer for occurrences of the error function, and verify text.
Optional argument TAKE-NOTES causes all errors to be logged.
-(fn &optional TAKE-NOTES)" '(emacs-lisp-mode) nil)
+(fn &optional TAKE-NOTES)" '(emacs-lisp-mode))
(autoload 'checkdoc-eval-defun "checkdoc" "\
Evaluate the current form with `eval-defun' and check its documentation.
Evaluation is done first so the form will be read before the
documentation is checked. If there is a documentation error, then the display
-of what was evaluated will be overwritten by the diagnostic message." t nil)
+of what was evaluated will be overwritten by the diagnostic message." t)
(autoload 'checkdoc-defun "checkdoc" "\
Examine the doc string of the function or variable under point.
Call `error' if the doc string has problems. If NO-ERROR is
@@ -4169,50 +4129,50 @@ non-nil, then do not call error, but call `message' instead.
If the doc string passes the test, then check the function for rogue white
space at the end of each line.
-(fn &optional NO-ERROR)" t nil)
+(fn &optional NO-ERROR)" t)
(autoload 'checkdoc-dired "checkdoc" "\
In Dired, run `checkdoc' on marked files.
Skip anything that doesn't have the Emacs Lisp library file
extension (\".el\").
When called from Lisp, FILES is a list of filenames.
-(fn FILES)" '(dired-mode) nil)
+(fn FILES)" '(dired-mode))
(autoload 'checkdoc-ispell "checkdoc" "\
Check the style and spelling of everything interactively.
Calls `checkdoc' with spell-checking turned on.
-Prefix argument is the same as for `checkdoc'." t nil)
+Prefix argument is the same as for `checkdoc'." t)
(autoload 'checkdoc-ispell-current-buffer "checkdoc" "\
Check the style and spelling of the current buffer.
Calls `checkdoc-current-buffer' with spell-checking turned on.
-Prefix argument is the same as for `checkdoc-current-buffer'." t nil)
+Prefix argument is the same as for `checkdoc-current-buffer'." t)
(autoload 'checkdoc-ispell-interactive "checkdoc" "\
Check the style and spelling of the current buffer interactively.
Calls `checkdoc-interactive' with spell-checking turned on.
-Prefix argument is the same as for `checkdoc-interactive'." t nil)
+Prefix argument is the same as for `checkdoc-interactive'." t)
(autoload 'checkdoc-ispell-message-interactive "checkdoc" "\
Check the style and spelling of message text interactively.
Calls `checkdoc-message-interactive' with spell-checking turned on.
-Prefix argument is the same as for `checkdoc-message-interactive'." t nil)
+Prefix argument is the same as for `checkdoc-message-interactive'." t)
(autoload 'checkdoc-ispell-message-text "checkdoc" "\
Check the style and spelling of message text interactively.
Calls `checkdoc-message-text' with spell-checking turned on.
-Prefix argument is the same as for `checkdoc-message-text'." t nil)
+Prefix argument is the same as for `checkdoc-message-text'." t)
(autoload 'checkdoc-ispell-start "checkdoc" "\
Check the style and spelling of the current buffer.
Calls `checkdoc-start' with spell-checking turned on.
-Prefix argument is the same as for `checkdoc-start'." t nil)
+Prefix argument is the same as for `checkdoc-start'." t)
(autoload 'checkdoc-ispell-continue "checkdoc" "\
Check the style and spelling of the current buffer after point.
Calls `checkdoc-continue' with spell-checking turned on.
-Prefix argument is the same as for `checkdoc-continue'." t nil)
+Prefix argument is the same as for `checkdoc-continue'." t)
(autoload 'checkdoc-ispell-comments "checkdoc" "\
Check the style and spelling of the current buffer's comments.
Calls `checkdoc-comments' with spell-checking turned on.
-Prefix argument is the same as for `checkdoc-comments'." t nil)
+Prefix argument is the same as for `checkdoc-comments'." t)
(autoload 'checkdoc-ispell-defun "checkdoc" "\
Check the style and spelling of the current defun with Ispell.
Calls `checkdoc-defun' with spell-checking turned on.
-Prefix argument is the same as for `checkdoc-defun'." t nil)
+Prefix argument is the same as for `checkdoc-defun'." t)
(autoload 'checkdoc-minor-mode "checkdoc" "\
Toggle automatic docstring checking (Checkdoc minor mode).
@@ -4236,9 +4196,9 @@ evaluate `checkdoc-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'checkdoc-package-keywords "checkdoc" "\
-Find package keywords that aren't in `finder-known-keywords'." t nil)
+Find package keywords that aren't in `finder-known-keywords'." t)
(register-definition-prefixes "checkdoc" '("checkdoc-"))
@@ -4248,24 +4208,24 @@ Find package keywords that aren't in `finder-known-keywords'." t nil)
Decode HZ/ZW encoded text in the current region.
Return the length of resulting text.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'decode-hz-buffer "china-util" "\
-Decode HZ/ZW encoded text in the current buffer." t nil)
+Decode HZ/ZW encoded text in the current buffer." t)
(autoload 'encode-hz-region "china-util" "\
Encode the text in the current region to HZ.
Return the length of resulting text.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'encode-hz-buffer "china-util" "\
-Encode the text in the current buffer to HZ." t nil)
+Encode the text in the current buffer to HZ." t)
(autoload 'post-read-decode-hz "china-util" "\
-(fn LEN)" nil nil)
+(fn LEN)")
(autoload 'pre-write-encode-hz "china-util" "\
-(fn FROM TO)" nil nil)
+(fn FROM TO)")
(register-definition-prefixes "china-util" '("decode-hz-line-continuation" "hz-" "hz/zw-start-gb" "iso2022-" "zw-start-gb"))
@@ -4278,14 +4238,14 @@ a form for evaluation. If PATTERN is empty (or nil), every form in the
command history is offered. The form is placed in the minibuffer for
editing and the result is evaluated.
-(fn &optional PATTERN)" t nil)
+(fn &optional PATTERN)" t)
(autoload 'list-command-history "chistory" "\
List history of commands that used the minibuffer.
The number of commands listed is controlled by `list-command-history-max'.
Calls value of `list-command-history-filter' (if non-nil) on each history
element to judge if that element should be excluded from the list.
-The buffer is left in Command History mode." t nil)
+The buffer is left in Command History mode." t)
(autoload 'command-history "chistory" "\
Examine commands from variable `command-history' in a buffer.
The number of commands listed is controlled by `list-command-history-max'.
@@ -4297,7 +4257,7 @@ and digits provide prefix arguments. Tab does not indent.
\\{command-history-mode-map}
This command always recompiles the Command History listing
-and runs the normal hook `command-history-hook'." t nil)
+and runs the normal hook `command-history-hook'." t)
(register-definition-prefixes "chistory" '("command-history-" "default-command-history-filter" "list-command-history-"))
@@ -4334,7 +4294,7 @@ evaluate `(default-value \\='cl-font-lock-built-in-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "cl-font-lock" '("cl-font-lock-"))
@@ -4360,7 +4320,7 @@ DEFAULT-BODY, if present, is used as the body of a default method.
(autoload 'cl-generic-define "cl-generic" "\
-(fn NAME ARGS OPTIONS)" nil nil)
+(fn NAME ARGS OPTIONS)")
(autoload 'cl-defmethod "cl-generic" "\
Define a new method for generic function NAME.
This defines an implementation of NAME to use for invocations
@@ -4408,11 +4368,11 @@ The set of acceptable TYPEs (also called \"specializers\") is defined
(autoload 'cl-generic-define-method "cl-generic" "\
-(fn NAME QUALIFIERS ARGS CALL-CON FUNCTION)" nil nil)
+(fn NAME QUALIFIERS ARGS CALL-CON FUNCTION)")
(autoload 'cl-find-method "cl-generic" "\
-(fn GENERIC QUALIFIERS SPECIALIZERS)" nil nil)
+(fn GENERIC QUALIFIERS SPECIALIZERS)")
(register-definition-prefixes "cl-generic" '("cl-"))
@@ -4494,7 +4454,7 @@ If the current mode is actually `emacs-lisp-mode', look for a
at `common-lisp-indent-function' and, if set, use its value
instead.
-(fn INDENT-POINT STATE)" nil nil)
+(fn INDENT-POINT STATE)")
(register-definition-prefixes "cl-indent" '("common-lisp-" "lisp-"))
@@ -4551,13 +4511,13 @@ evaluate `(default-value \\='cl-old-struct-compat-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "cl-lib" '("cl-"))
;;; Generated autoloads from emacs-lisp/cl-macs.el
-(register-definition-prefixes "cl-macs" '("cl-" "foo" "function-form"))
+(register-definition-prefixes "cl-macs" '("cl-"))
;;; Generated autoloads from emacs-lisp/cl-print.el
@@ -4569,13 +4529,13 @@ You can add methods to it to customize the output.
But if you just want to print something, don't call this directly:
call other entry points instead, such as `cl-prin1'.
-(fn OBJECT STREAM)" nil nil)
+(fn OBJECT STREAM)")
(autoload 'cl-print-expand-ellipsis "cl-print" "\
Print the expansion of an ellipsis to STREAM.
VALUE should be the value of the `cl-print-ellipsis' text property
which was attached to the ellipsis by `cl-prin1'.
-(fn VALUE STREAM)" nil nil)
+(fn VALUE STREAM)")
(autoload 'cl-prin1 "cl-print" "\
Print OBJECT on STREAM according to its type.
Output is further controlled by the variables
@@ -4583,11 +4543,11 @@ Output is further controlled by the variables
variables for the standard printing functions. See Info
node `(elisp)Output Variables'.
-(fn OBJECT &optional STREAM)" nil nil)
+(fn OBJECT &optional STREAM)")
(autoload 'cl-prin1-to-string "cl-print" "\
Return a string containing the `cl-prin1'-printed representation of OBJECT.
-(fn OBJECT)" nil nil)
+(fn OBJECT)")
(autoload 'cl-print-to-string-with-limit "cl-print" "\
Return a string containing a printed representation of VALUE.
Attempt to get the length of the returned string under LIMIT
@@ -4604,7 +4564,7 @@ this function with `cl-prin1-expand-ellipsis' to expand an
ellipsis, abbreviating the expansion to stay within a size
limit.
-(fn PRINT-FUNCTION VALUE LIMIT)" nil nil)
+(fn PRINT-FUNCTION VALUE LIMIT)")
(register-definition-prefixes "cl-print" '("cl-print-" "help-byte-code"))
@@ -4628,7 +4588,7 @@ otherwise use `c-macro-cppflags'.
Noninteractive args are START, END, SUBST.
For use inside Lisp programs, see also `c-macro-expansion'.
-(fn START END SUBST)" t nil)
+(fn START END SUBST)" t)
(register-definition-prefixes "cmacexp" '("c-macro-"))
@@ -4647,7 +4607,7 @@ Runs the hook `inferior-scheme-mode-hook' (after the `comint-mode-hook'
is run).
(Type \\[describe-mode] in the process buffer for a list of commands.)
-(fn CMD)" t nil)
+(fn CMD)" t)
(register-definition-prefixes "cmuscheme" '("cmuscheme-load-hook" "inferior-scheme-" "scheme-" "switch-to-scheme"))
@@ -4669,7 +4629,7 @@ Optional argument FRAME specifies the frame where the color is to be
displayed. If FRAME is omitted or nil, use the selected frame.
If FRAME cannot display COLOR, return nil.
-(fn COLOR &optional FRAME)" nil nil)
+(fn COLOR &optional FRAME)")
(register-definition-prefixes "color" '("color-"))
@@ -4706,7 +4666,7 @@ If PROGRAM is a string, any more args are arguments to PROGRAM.
Return the (possibly newly created) process buffer.
-(fn NAME BUFFER PROGRAM &optional STARTFILE &rest SWITCHES)" nil nil)
+(fn NAME BUFFER PROGRAM &optional STARTFILE &rest SWITCHES)")
(autoload 'make-comint "comint" "\
Make a Comint process NAME in a buffer, running PROGRAM.
The name of the buffer is made by surrounding NAME with `*'s.
@@ -4721,7 +4681,7 @@ If PROGRAM is a string, any more args are arguments to PROGRAM.
Returns the (possibly newly created) process buffer.
-(fn NAME PROGRAM &optional STARTFILE &rest SWITCHES)" nil nil)
+(fn NAME PROGRAM &optional STARTFILE &rest SWITCHES)")
(autoload 'comint-run "comint" "\
Run PROGRAM in a Comint buffer and switch to that buffer.
@@ -4734,7 +4694,7 @@ hooks on this symbol are run in the buffer.
See `make-comint' and `comint-exec'.
-(fn PROGRAM &optional SWITCHES)" t nil)
+(fn PROGRAM &optional SWITCHES)" t)
(function-put 'comint-run 'interactive-only 'make-comint)
(defvar comint-file-name-prefix (purecopy "") "\
Prefix prepended to absolute file names taken from process input.
@@ -4746,26 +4706,26 @@ With prefix arg ECHO, echo output in process buffer.
If NO-DISPLAY is non-nil, do not show the output buffer.
-(fn COMMAND OUTPUT-BUFFER ECHO &optional NO-DISPLAY)" t nil)
+(fn COMMAND OUTPUT-BUFFER ECHO &optional NO-DISPLAY)" t)
(autoload 'comint-redirect-send-command-to-process "comint" "\
Send COMMAND to PROCESS, with output to OUTPUT-BUFFER.
With prefix arg, echo output in process buffer.
If NO-DISPLAY is non-nil, do not show the output buffer.
-(fn COMMAND OUTPUT-BUFFER PROCESS ECHO &optional NO-DISPLAY)" t nil)
+(fn COMMAND OUTPUT-BUFFER PROCESS ECHO &optional NO-DISPLAY)" t)
(autoload 'comint-redirect-results-list "comint" "\
Send COMMAND to current process.
Return a list of expressions in the output which match REGEXP.
REGEXP-GROUP is the regular expression group in REGEXP to use.
-(fn COMMAND REGEXP REGEXP-GROUP)" nil nil)
+(fn COMMAND REGEXP REGEXP-GROUP)")
(autoload 'comint-redirect-results-list-from-process "comint" "\
Send COMMAND to PROCESS.
Return a list of expressions in the output which match REGEXP.
REGEXP-GROUP is the regular expression group in REGEXP to use.
-(fn PROCESS COMMAND REGEXP REGEXP-GROUP)" nil nil)
+(fn PROCESS COMMAND REGEXP REGEXP-GROUP)")
(register-definition-prefixes "comint" '("comint-"))
@@ -4775,25 +4735,25 @@ REGEXP-GROUP is the regular expression group in REGEXP to use.
(autoload 'comp-subr-trampoline-install "comp" "\
Make SUBR-NAME effectively advice-able when called from native code.
-(fn SUBR-NAME)" nil nil)
+(fn SUBR-NAME)")
(autoload 'comp-c-func-name "comp" "\
Given NAME, return a name suitable for the native code.
Add PREFIX in front of it. If FIRST is not nil, pick the first
available name ignoring compilation context and potential name
clashes.
-(fn NAME PREFIX &optional FIRST)" nil nil)
+(fn NAME PREFIX &optional FIRST)")
(autoload 'comp-clean-up-stale-eln "comp" "\
Remove all FILE*.eln* files found in `native-comp-eln-load-path'.
The files to be removed are those produced from the original source
filename (including FILE).
-(fn FILE)" nil nil)
+(fn FILE)")
(autoload 'comp-lookup-eln "comp" "\
Given a Lisp source FILENAME return the corresponding .eln file if found.
Search happens in `native-comp-eln-load-path'.
-(fn FILENAME)" nil nil)
+(fn FILENAME)")
(autoload 'native-compile "comp" "\
Compile FUNCTION-OR-FILE into native code.
This is the synchronous entry-point for the Emacs Lisp native
@@ -4806,7 +4766,7 @@ If FUNCTION-OR-FILE is a filename, return the filename of the
compiled object. If FUNCTION-OR-FILE is a function symbol or a
form, return the compiled function.
-(fn FUNCTION-OR-FILE &optional OUTPUT)" nil nil)
+(fn FUNCTION-OR-FILE &optional OUTPUT)")
(autoload 'batch-native-compile "comp" "\
Perform batch native compilation of remaining command-line arguments.
@@ -4818,14 +4778,14 @@ as part of building the source tarball, in which case the .eln file
will be placed under the native-lisp/ directory (actually, in the
last directory in `native-comp-eln-load-path').
-(fn &optional FOR-TARBALL)" nil nil)
+(fn &optional FOR-TARBALL)")
(autoload 'batch-byte+native-compile "comp" "\
Like `batch-native-compile', but used for bootstrap.
Generate .elc files in addition to the .eln files.
Force the produced .eln to be outputted in the eln system
directory (the last entry in `native-comp-eln-load-path') unless
`native-compile-target-directory' is non-nil. If the environment
-variable \"NATIVE_DISABLED\" is set, only byte compile." nil nil)
+variable \"NATIVE_DISABLED\" is set, only byte compile.")
(autoload 'native-compile-async "comp" "\
Compile FILES asynchronously.
FILES is one file or a list of filenames or directories.
@@ -4845,7 +4805,7 @@ a function -- A function selecting files with matching names.
The variable `native-comp-async-jobs-number' specifies the number
of (commands) to run simultaneously.
-(fn FILES &optional RECURSIVELY LOAD SELECTOR)" nil nil)
+(fn FILES &optional RECURSIVELY LOAD SELECTOR)")
(register-definition-prefixes "comp" '("comp-" "make-comp-edge" "native-" "no-native-compile"))
@@ -4890,7 +4850,7 @@ on first call it advances points to the next difference,
on second call it synchronizes points by skipping the difference,
on third call it again advances points to the next difference and so on.
-(fn IGNORE-WHITESPACE)" t nil)
+(fn IGNORE-WHITESPACE)" t)
(register-definition-prefixes "compare-w" '("compare-"))
@@ -4954,7 +4914,7 @@ You might also use mode hooks to specify it in certain modes, like this:
It's often useful to leave a space at the end of the value.")
(custom-autoload 'compile-command "compile" t)
-(put 'compile-command 'safe-local-variable (lambda (a) (and (stringp a) (or (not (boundp 'compilation-read-command)) compilation-read-command))))
+(put 'compile-command 'safe-local-variable (lambda (a) (and (stringp a) (if (boundp 'compilation-read-command) compilation-read-command t))))
(defvar compilation-disable-input nil "\
If non-nil, send end-of-file as compilation process input.
This only affects platforms that support asynchronous processes (see
@@ -4989,7 +4949,11 @@ The name used for the buffer is actually whatever is returned by
the function in `compilation-buffer-name-function', so you can set that
to a function that generates a unique name.
-(fn COMMAND &optional COMINT)" t nil)
+(fn COMMAND &optional COMINT)" t)
+(autoload 'compilation--default-buffer-name "compile" "\
+
+
+(fn NAME-OF-MODE)")
(autoload 'compilation-start "compile" "\
Run compilation command COMMAND (low level interface).
If COMMAND starts with a cd command, that becomes the `default-directory'.
@@ -5015,7 +4979,7 @@ point is not changed.
Returns the compilation buffer created.
-(fn COMMAND &optional MODE NAME-FUNCTION HIGHLIGHT-REGEXP CONTINUE)" nil nil)
+(fn COMMAND &optional MODE NAME-FUNCTION HIGHLIGHT-REGEXP CONTINUE)")
(autoload 'compilation-mode "compile" "\
Major mode for compilation log buffers.
\\<compilation-mode-map>To visit the source for a line-numbered error,
@@ -5026,7 +4990,7 @@ Runs `compilation-mode-hook' with `run-mode-hooks' (which see).
\\{compilation-mode-map}
-(fn &optional NAME-OF-MODE)" t nil)
+(fn &optional NAME-OF-MODE)" t)
(put 'define-compilation-mode 'doc-string-elt 3)
(autoload 'compilation-shell-minor-mode "compile" "\
Toggle Compilation Shell minor mode.
@@ -5051,9 +5015,7 @@ evaluate `compilation-shell-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-\\{compilation-shell-minor-mode-map}
-
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'compilation-minor-mode "compile" "\
Toggle Compilation minor mode.
@@ -5076,14 +5038,12 @@ evaluate `compilation-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-\\{compilation-minor-mode-map}
-
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'compilation-next-error-function "compile" "\
Advance to the next error message and visit the file where the error was.
This is the value of `next-error-function' in Compilation buffers.
-(fn N &optional RESET)" t nil)
+(fn N &optional RESET)" t)
(register-definition-prefixes "compile" '("compil" "define-compilation-mode" "kill-compilation" "recompile"))
@@ -5130,7 +5090,7 @@ evaluate `(default-value \\='dynamic-completion-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "completion" '("*c-def-regexp*" "*lisp-def-regexp*" "accept-completion" "add-" "cdabbrev-" "check-completion-length" "clear-all-completions" "cmpl-" "complet" "current-completion-source" "delete-completion" "enable-completion" "find-" "inside-locate-completion-entry" "interactive-completion-string-reader" "kill-" "list-all-completions" "load-completions-from-file" "make-c" "next-cdabbrev" "num-cmpl-sources" "reset-cdabbrev" "save" "set-c" "symbol-" "use-completion-"))
@@ -5167,12 +5127,12 @@ See also `conf-space-mode', `conf-colon-mode', `conf-javaprop-mode',
\\{conf-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'conf-unix-mode "conf-mode" "\
Conf Mode starter for Unix style Conf files.
Comments start with `#'. For details see `conf-mode'.
-(fn)" t nil)
+(fn)" t)
(autoload 'conf-windows-mode "conf-mode" "\
Conf Mode starter for Windows style Conf files.
Comments start with `;'.
@@ -5187,7 +5147,7 @@ Default={5984FFE0-28D4-11CF-AE66-08002B2E1262}
[{5984FFE0-28D4-11CF-AE66-08002B2E1262}]
PersistMoniker=file://Folder.htt
-(fn)" t nil)
+(fn)" t)
(autoload 'conf-javaprop-mode "conf-mode" "\
Conf Mode starter for Java properties files.
Comments start with `#' but are also recognized with `//' or
@@ -5205,7 +5165,7 @@ x.1 =
x.2.y.1.z.1 =
x.2.y.1.z.2.zz =
-(fn)" t nil)
+(fn)" t)
(autoload 'conf-space-mode "conf-mode" "\
Conf Mode starter for space separated conf files.
\"Assignments\" are with ` '. Keywords before the parameters are
@@ -5229,12 +5189,12 @@ class desktop
add /dev/audio desktop
add /dev/mixer desktop
-(fn)" t nil)
+(fn)" t)
(autoload 'conf-space-keywords "conf-mode" "\
Enter Conf Space mode using regexp KEYWORDS to match the keywords.
See `conf-space-mode'.
-(fn KEYWORDS)" t nil)
+(fn KEYWORDS)" t)
(autoload 'conf-colon-mode "conf-mode" "\
Conf Mode starter for Colon files.
\"Assignments\" are with `:'.
@@ -5245,7 +5205,7 @@ For details see `conf-mode'. Example:
<Multi_key> <exclam> <exclam> : \"\\241\" exclamdown
<Multi_key> <c> <slash> : \"\\242\" cent
-(fn)" t nil)
+(fn)" t)
(autoload 'conf-ppd-mode "conf-mode" "\
Conf Mode starter for Adobe/CUPS PPD files.
Comments start with `*%' and \"assignments\" are with `:'.
@@ -5256,7 +5216,7 @@ For details see `conf-mode'. Example:
*DefaultTransfer: Null
*Transfer Null.Inverse: \"{ 1 exch sub }\"
-(fn)" t nil)
+(fn)" t)
(autoload 'conf-xdefaults-mode "conf-mode" "\
Conf Mode starter for Xdefaults files.
Comments start with `!' and \"assignments\" are with `:'.
@@ -5267,7 +5227,7 @@ For details see `conf-mode'. Example:
*background: gray99
*foreground: black
-(fn)" t nil)
+(fn)" t)
(autoload 'conf-toml-mode "conf-mode" "\
Conf Mode starter for TOML files.
Comments start with `#' and \"assignments\" are with `='.
@@ -5278,7 +5238,7 @@ For details see `conf-mode'. Example:
[entry]
value = \"some string\"
-(fn)" t nil)
+(fn)" t)
(autoload 'conf-desktop-mode "conf-mode" "\
Conf Mode started for freedesktop.org Desktop files.
Comments start with `#' and \"assignments\" are with `='.
@@ -5291,7 +5251,7 @@ For details see `conf-mode'.
Exec=gimp-2.8 %U
Terminal=false
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "conf-mode" '("conf-"))
@@ -5309,19 +5269,19 @@ of load, ENDMSG at the end.
Interactively, PHRASE-FILE defaults to `cookie-file', unless that
is nil or a prefix argument is used.
-(fn PHRASE-FILE &optional STARTMSG ENDMSG)" t nil)
+(fn PHRASE-FILE &optional STARTMSG ENDMSG)" t)
(autoload 'cookie-insert "cookie1" "\
Insert random phrases from PHRASE-FILE; COUNT of them.
When the phrase file is read in, display STARTMSG at the beginning
of load, ENDMSG at the end.
-(fn PHRASE-FILE &optional COUNT STARTMSG ENDMSG)" nil nil)
+(fn PHRASE-FILE &optional COUNT STARTMSG ENDMSG)")
(autoload 'cookie-snarf "cookie1" "\
Read the PHRASE-FILE, return it as a vector of strings.
Emit STARTMSG and ENDMSG before and after. Cache the result; second
and subsequent calls on the same file won't go to disk.
-(fn PHRASE-FILE &optional STARTMSG ENDMSG)" nil nil)
+(fn PHRASE-FILE &optional STARTMSG ENDMSG)")
(register-definition-prefixes "cookie1" '("cookie"))
@@ -5339,21 +5299,21 @@ following the copyright are updated as well.
If non-nil, INTERACTIVEP tells the function to behave as when it's called
interactively.
-(fn &optional ARG INTERACTIVEP)" t nil)
+(fn &optional ARG INTERACTIVEP)" t)
(autoload 'copyright-fix-years "copyright" "\
Convert 2 digit years to 4 digit years.
Uses heuristic: year >= 50 means 19xx, < 50 means 20xx.
If `copyright-year-ranges' (which see) is non-nil, also
-independently replaces consecutive years with a range." t nil)
+independently replaces consecutive years with a range." t)
(autoload 'copyright "copyright" "\
Insert a copyright by $ORGANIZATION notice at cursor.
-(fn &optional STR ARG)" t nil)
+(fn &optional STR ARG)" t)
(autoload 'copyright-update-directory "copyright" "\
Update copyright notice for all files in DIRECTORY matching MATCH.
If FIX is non-nil, run `copyright-fix-years' instead.
-(fn DIRECTORY MATCH &optional FIX)" t nil)
+(fn DIRECTORY MATCH &optional FIX)" t)
(register-definition-prefixes "copyright" '("copyright-"))
@@ -5542,14 +5502,14 @@ DO NOT FORGET to read micro-docs (available from `Perl' menu)
or as help on variables `cperl-tips', `cperl-problems',
`cperl-praise', `cperl-speed'.
-(fn)" t nil)
+(fn)" t)
(autoload 'cperl-perldoc "cperl-mode" "\
Run `perldoc' on WORD.
-(fn WORD)" t nil)
+(fn WORD)" t)
(autoload 'cperl-perldoc-at-point "cperl-mode" "\
-Run a `perldoc' on the word around point." t nil)
-(register-definition-prefixes "cperl-mode" '("cperl-" "pod2man-program"))
+Run a `perldoc' on the word around point." t)
+(register-definition-prefixes "cperl-mode" '("cperl-"))
;;; Generated autoloads from progmodes/cpp.el
@@ -5560,9 +5520,9 @@ This command pops up a buffer which you should edit to specify
what kind of highlighting to use, and the criteria for highlighting.
A prefix arg suppresses display of that buffer.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'cpp-parse-edit "cpp" "\
-Edit display information for cpp conditionals." t nil)
+Edit display information for cpp conditionals." t)
(register-definition-prefixes "cpp" '("cpp-"))
@@ -5597,7 +5557,7 @@ contents of the minibuffer are \"alice,bob,eve\" and point is between
This function returns a list of the strings that were read,
with empty strings removed.
-(fn PROMPT TABLE &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)" nil nil)
+(fn PROMPT TABLE &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)")
(register-definition-prefixes "crm" '("crm-"))
@@ -5629,12 +5589,12 @@ be used to fill comments.
\\{css-mode-map}
-(fn)" t nil)
+(fn)" t)
(add-to-list 'auto-mode-alist '("\\.scss\\'" . scss-mode))
(autoload 'scss-mode "css-mode" "\
Major mode to edit \"Sassy CSS\" files.
-(fn)" t nil)
+(fn)" t)
(autoload 'css-lookup-symbol "css-mode" "\
Display the CSS documentation for SYMBOL, as found on MDN.
When this command is used interactively, it picks a default
@@ -5642,7 +5602,7 @@ symbol based on the CSS text before point -- either an @-keyword,
a property name, a pseudo-class, or a pseudo-element, depending
on what is seen near point.
-(fn SYMBOL)" t nil)
+(fn SYMBOL)" t)
(register-definition-prefixes "css-mode" '("css-" "scss-"))
@@ -5701,11 +5661,11 @@ evaluate `(default-value \\='cua-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'cua-selection-mode "cua-base" "\
Enable CUA selection mode without the C-z/C-x/C-c/C-v bindings.
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "cua-base" '("cua-"))
@@ -5736,7 +5696,7 @@ evaluate `cua-rectangle-mark-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "cua-rect" '("cua-"))
@@ -5764,7 +5724,7 @@ evaluate `cursor-intangible-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'cursor-sensor-mode "cursor-sensor" "\
Handle the `cursor-sensor-functions' text property.
@@ -5788,7 +5748,7 @@ evaluate `cursor-sensor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "cursor-sensor" '("cursor-sensor-"))
@@ -5819,7 +5779,7 @@ If VARIABLE has a `custom-type' property, it must be a widget and the
If given a prefix (or a COMMENT argument), also prompt for a comment.
-(fn VARIABLE VALUE &optional COMMENT)" t nil)
+(fn VARIABLE VALUE &optional COMMENT)" t)
(autoload 'customize-set-variable "cus-edit" "\
Set the default for VARIABLE to VALUE, and return VALUE.
VALUE is a Lisp object.
@@ -5835,7 +5795,7 @@ If VARIABLE has a `custom-type' property, it must be a widget and the
If given a prefix (or a COMMENT argument), also prompt for a comment.
-(fn VARIABLE VALUE &optional COMMENT)" t nil)
+(fn VARIABLE VALUE &optional COMMENT)" t)
(autoload 'setopt "cus-edit" "\
Set VARIABLE/VALUE pairs, and return the final VALUE.
This is like `setq', but is meant for user options instead of
@@ -5846,7 +5806,7 @@ plain variables. This means that `setopt' will execute any
(autoload 'setopt--set "cus-edit" "\
-(fn VARIABLE VALUE)" nil nil)
+(fn VARIABLE VALUE)")
(autoload 'customize-save-variable "cus-edit" "\
Set the default for VARIABLE to VALUE, and save it for future sessions.
Return VALUE.
@@ -5862,7 +5822,7 @@ If VARIABLE has a `custom-type' property, it must be a widget and the
If given a prefix (or a COMMENT argument), also prompt for a comment.
-(fn VARIABLE VALUE &optional COMMENT)" t nil)
+(fn VARIABLE VALUE &optional COMMENT)" t)
(autoload 'customize-push-and-save "cus-edit" "\
Add ELTS to LIST-VAR and save for future sessions, safely.
ELTS should be a list. This function adds each entry to the
@@ -5872,39 +5832,39 @@ If Emacs is initialized, call `customize-save-variable' to save
the resulting list value now. Otherwise, add an entry to
`after-init-hook' to save it after initialization.
-(fn LIST-VAR ELTS)" nil nil)
+(fn LIST-VAR ELTS)")
(autoload 'customize "cus-edit" "\
Select a customization buffer which you can use to set user options.
User options are structured into \"groups\".
Initially the top-level group `Emacs' and its immediate subgroups
-are shown; the contents of those subgroups are initially hidden." t nil)
+are shown; the contents of those subgroups are initially hidden." t)
(autoload 'customize-mode "cus-edit" "\
Customize options related to a major or minor mode.
By default the current major mode is used. With a prefix
argument or if the current major mode has no known group, prompt
for the MODE to customize.
-(fn MODE)" t nil)
+(fn MODE)" t)
(autoload 'customize-group "cus-edit" "\
Customize GROUP, which must be a customization group.
If OTHER-WINDOW is non-nil, display in another window.
-(fn &optional GROUP OTHER-WINDOW)" t nil)
+(fn &optional GROUP OTHER-WINDOW)" t)
(autoload 'customize-group-other-window "cus-edit" "\
Customize GROUP, which must be a customization group, in another window.
-(fn &optional GROUP)" t nil)
+(fn &optional GROUP)" t)
(defalias 'customize-variable 'customize-option)
(autoload 'customize-option "cus-edit" "\
Customize SYMBOL, which must be a user option.
-(fn SYMBOL)" t nil)
+(fn SYMBOL)" t)
(defalias 'customize-variable-other-window 'customize-option-other-window)
(autoload 'customize-option-other-window "cus-edit" "\
Customize SYMBOL, which must be a user option.
Show the buffer in another window, but don't select it.
-(fn SYMBOL)" t nil)
+(fn SYMBOL)" t)
(defvar customize-package-emacs-version-alist nil "\
Alist mapping versions of a package to Emacs versions.
We use this for packages that have their own names, but are released
@@ -5946,7 +5906,7 @@ release.
With argument SINCE-VERSION (a string), customize all settings
that were added or redefined since that version.
-(fn &optional SINCE-VERSION)" t nil)
+(fn &optional SINCE-VERSION)" t)
(autoload 'customize-face "cus-edit" "\
Customize FACE, which should be a face name or nil.
If FACE is nil, customize all faces. If FACE is actually a
@@ -5957,7 +5917,7 @@ If OTHER-WINDOW is non-nil, display in another window.
Interactively, when point is on text which has a face specified,
suggest to customize that face, if it's customizable.
-(fn &optional FACE OTHER-WINDOW)" t nil)
+(fn &optional FACE OTHER-WINDOW)" t)
(autoload 'customize-face-other-window "cus-edit" "\
Show customization buffer for face FACE in other window.
If FACE is actually a face-alias, customize the face it is aliased to.
@@ -5965,13 +5925,13 @@ If FACE is actually a face-alias, customize the face it is aliased to.
Interactively, when point is on text which has a face specified,
suggest to customize that face, if it's customizable.
-(fn &optional FACE)" t nil)
+(fn &optional FACE)" t)
(autoload 'customize-unsaved "cus-edit" "\
-Customize all options and faces set in this session but not saved." t nil)
+Customize all options and faces set in this session but not saved." t)
(autoload 'customize-rogue "cus-edit" "\
-Customize all user variables modified outside customize." t nil)
+Customize all user variables modified outside customize." t)
(autoload 'customize-saved "cus-edit" "\
-Customize all saved options and faces." t nil)
+Customize all saved options and faces." t)
(autoload 'customize-apropos "cus-edit" "\
Customize loaded options, faces and groups matching PATTERN.
PATTERN can be a word, a list of words (separated by spaces),
@@ -5983,23 +5943,23 @@ If TYPE is `options', include only options.
If TYPE is `faces', include only faces.
If TYPE is `groups', include only groups.
-(fn PATTERN &optional TYPE)" t nil)
+(fn PATTERN &optional TYPE)" t)
(autoload 'customize-apropos-options "cus-edit" "\
Customize all loaded customizable options matching REGEXP.
-(fn REGEXP &optional IGNORED)" t nil)
+(fn REGEXP &optional IGNORED)" t)
(autoload 'customize-apropos-faces "cus-edit" "\
Customize all loaded faces matching REGEXP.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(autoload 'customize-apropos-groups "cus-edit" "\
Customize all loaded groups matching REGEXP.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(autoload 'custom-prompt-customize-unsaved-options "cus-edit" "\
Prompt user to customize any unsaved customization options.
Return nil if user chooses to customize, for use in
-`kill-emacs-query-functions'." nil nil)
+`kill-emacs-query-functions'.")
(autoload 'custom-buffer-create "cus-edit" "\
Create a buffer containing OPTIONS.
Optional NAME is the name of the buffer.
@@ -6008,7 +5968,7 @@ SYMBOL is a customization option, and WIDGET is a widget for editing
that option.
DESCRIPTION is unused.
-(fn OPTIONS &optional NAME DESCRIPTION)" nil nil)
+(fn OPTIONS &optional NAME DESCRIPTION)")
(autoload 'custom-buffer-create-other-window "cus-edit" "\
Create a buffer containing OPTIONS, and display it in another window.
The result includes selecting that window.
@@ -6018,11 +5978,11 @@ SYMBOL is a customization option, and WIDGET is a widget for editing
that option.
DESCRIPTION is unused.
-(fn OPTIONS &optional NAME DESCRIPTION)" nil nil)
+(fn OPTIONS &optional NAME DESCRIPTION)")
(autoload 'customize-browse "cus-edit" "\
Create a tree browser for the customize hierarchy.
-(fn &optional GROUP)" t nil)
+(fn &optional GROUP)" t)
(defvar custom-file nil "\
File used for storing customization information.
The default is nil, which means to use your init file
@@ -6057,21 +6017,37 @@ file. Otherwise, Emacs will not load the file when it starts up,
and hence will not set `custom-file' to that file either.")
(custom-autoload 'custom-file "cus-edit" t)
(autoload 'custom-save-all "cus-edit" "\
-Save all customizations in `custom-file'." nil nil)
+Save all customizations in `custom-file'.")
(autoload 'customize-save-customized "cus-edit" "\
-Save all user options which have been set in this session." t nil)
+Save all user options which have been set in this session." t)
(autoload 'custom-menu-create "cus-edit" "\
Create menu for customization group SYMBOL.
The menu is in a format applicable to `easy-menu-define'.
-(fn SYMBOL)" nil nil)
+(fn SYMBOL)")
(autoload 'customize-menu-create "cus-edit" "\
Return a customize menu for customization group SYMBOL.
If optional NAME is given, use that as the name of the menu.
Otherwise the menu will be named `Customize'.
The format is suitable for use with `easy-menu-define'.
-(fn SYMBOL &optional NAME)" nil nil)
+(fn SYMBOL &optional NAME)")
+(autoload 'customize-icon "cus-edit" "\
+Customize ICON.
+
+(fn ICON)" t)
+(autoload 'custom-set-icons "cus-edit" "\
+Install user customizations of icon specs specified in ARGS.
+These settings are registered as theme `user'.
+The arguments should each be a list of the form:
+
+ (SYMBOL EXP)
+
+This stores EXP (without evaluating it) as the saved spec for SYMBOL.
+
+(fn &rest ARGS)")
+(autoload 'custom-save-icons "cus-edit" "\
+Save all customized icons in `custom-file'.")
(register-definition-prefixes "cus-edit" '("Custom-" "cus" "widget-"))
@@ -6086,27 +6062,27 @@ from the Custom save file.
BUFFER, if non-nil, should be a buffer to use; the default is
named *Custom Theme*.
-(fn &optional THEME BUFFER)" t nil)
+(fn &optional THEME BUFFER)" t)
(autoload 'custom-theme-visit-theme "cus-theme" "\
Set up a Custom buffer to edit custom theme THEME.
-(fn THEME)" t nil)
+(fn THEME)" t)
(autoload 'describe-theme "cus-theme" "\
Display a description of the Custom theme THEME (a symbol).
-(fn THEME)" t nil)
+(fn THEME)" t)
(autoload 'customize-themes "cus-theme" "\
Display a selectable list of Custom themes.
When called from Lisp, BUFFER should be the buffer to use; if
omitted, a buffer named *Custom Themes* is used.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(register-definition-prefixes "cus-theme" '("custom-" "describe-theme-1"))
;;; Generated autoloads from cedet/ede/custom.el
-(register-definition-prefixes "ede/custom" '("ede-" "eieio-ede-old-variables"))
+(register-definition-prefixes "ede/custom" '("ede-"))
;;; Generated autoloads from vc/cvs-status.el
@@ -6114,7 +6090,7 @@ omitted, a buffer named *Custom Themes* is used.
(autoload 'cvs-status-mode "cvs-status" "\
Mode used for cvs status output.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "cvs-status" '("cvs-"))
@@ -6143,7 +6119,7 @@ evaluate `cwarn-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(put 'global-cwarn-mode 'globalized-minor-mode t)
(defvar global-cwarn-mode nil "\
Non-nil if Global Cwarn mode is enabled.
@@ -6167,7 +6143,7 @@ Cwarn mode is enabled in all buffers where
See `cwarn-mode' for more information on Cwarn mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "cwarn" '("cwarn-" "turn-on-cwarn-mode-if-enabled"))
@@ -6176,11 +6152,11 @@ See `cwarn-mode' for more information on Cwarn mode.
(autoload 'cyrillic-encode-koi8-r-char "cyril-util" "\
Return KOI8-R external character code of CHAR if appropriate.
-(fn CHAR)" nil nil)
+(fn CHAR)")
(autoload 'cyrillic-encode-alternativnyj-char "cyril-util" "\
Return ALTERNATIVNYJ external character code of CHAR if appropriate.
-(fn CHAR)" nil nil)
+(fn CHAR)")
(autoload 'standard-display-cyrillic-translit "cyril-util" "\
Display a Cyrillic buffer using a transliteration.
For readability, the table is slightly
@@ -6192,7 +6168,7 @@ Possible values are listed in `cyrillic-language-alist'.
If the argument is t, we use the default cyrillic transliteration.
If the argument is nil, we return the display table to its standard state.
-(fn &optional CYRILLIC-LANGUAGE)" t nil)
+(fn &optional CYRILLIC-LANGUAGE)" t)
(register-definition-prefixes "cyril-util" '("cyrillic-language-alist"))
@@ -6214,7 +6190,7 @@ completions.
If the prefix argument is 16 (which comes from \\[universal-argument] \\[universal-argument]),
then it searches *all* buffers.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'dabbrev-expand "dabbrev" "\
Expand previous word \"dynamically\".
@@ -6239,7 +6215,7 @@ direction of search to backward if set non-nil.
See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion].
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "dabbrev" '("dabbrev-"))
@@ -6248,7 +6224,7 @@ See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion].
(autoload 'data-debug-new-buffer "data-debug" "\
Create a new data-debug buffer with NAME.
-(fn NAME)" nil nil)
+(fn NAME)")
(register-definition-prefixes "data-debug" '("data-debug-"))
@@ -6264,12 +6240,12 @@ Create a new data-debug buffer with NAME.
;;; Generated autoloads from cedet/semantic/db-ebrowse.el
-(register-definition-prefixes "semantic/db-ebrowse" '("c++-mode" "semanticdb-"))
+(register-definition-prefixes "semantic/db-ebrowse" '("semanticdb-"))
;;; Generated autoloads from cedet/semantic/db-el.el
-(register-definition-prefixes "semantic/db-el" '("emacs-lisp-mode" "semanticdb-"))
+(register-definition-prefixes "semantic/db-el" '("semanticdb-"))
;;; Generated autoloads from cedet/semantic/db-file.el
@@ -6289,7 +6265,7 @@ Create a new data-debug buffer with NAME.
;;; Generated autoloads from cedet/semantic/db-javascript.el
-(register-definition-prefixes "semantic/db-javascript" '("javascript-mode" "semanticdb-"))
+(register-definition-prefixes "semantic/db-javascript" '("semanticdb-"))
;;; Generated autoloads from cedet/semantic/db-mode.el
@@ -6315,14 +6291,14 @@ EVENT is a D-Bus event, see `dbus-check-event'. HANDLER, being
part of the event, is called with arguments ARGS (without type information).
If the HANDLER returns a `dbus-error', it is propagated as return message.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(function-put 'dbus-handle-event 'completion-predicate #'ignore)
(autoload 'dbus-monitor "dbus" "\
Invoke `dbus-register-monitor' interactively, and switch to the buffer.
BUS is either a Lisp keyword, `:system' or `:session', or a
string denoting the bus address. The value nil defaults to `:session'.
-(fn &optional BUS)" t nil)
+(fn &optional BUS)" t)
(register-definition-prefixes "dbus" '("dbus-"))
@@ -6446,7 +6422,7 @@ $
There is some minimal font-lock support (see vars
`dcl-font-lock-defaults' and `dcl-font-lock-keywords').
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "dcl-mode" '("dcl-"))
@@ -6465,7 +6441,7 @@ first will be printed into the backtrace buffer.
If `inhibit-redisplay' is non-nil when this function is called,
the debugger will not be entered.
-(fn &rest ARGS)" t nil)
+(fn &rest ARGS)" t)
(autoload 'debug-on-entry "debug" "\
Request FUNCTION to invoke debugger each time it is called.
@@ -6481,14 +6457,14 @@ primitive functions only works when that function is called from Lisp.
Use \\[cancel-debug-on-entry] to cancel the effect of this command.
Redefining FUNCTION also cancels it.
-(fn FUNCTION)" t nil)
+(fn FUNCTION)" t)
(autoload 'cancel-debug-on-entry "debug" "\
Undo effect of \\[debug-on-entry] on FUNCTION.
If FUNCTION is nil, cancel `debug-on-entry' for all functions.
When called interactively, prompt for FUNCTION in the minibuffer.
To specify a nil argument interactively, exit with an empty minibuffer.
-(fn &optional FUNCTION)" t nil)
+(fn &optional FUNCTION)" t)
(autoload 'debug-on-variable-change "debug" "\
Trigger a debugger invocation when VARIABLE is changed.
@@ -6507,7 +6483,7 @@ Use \\[cancel-debug-on-variable-change] to cancel the effect of
this command. Uninterning VARIABLE or making it an alias of
another symbol also cancels it.
-(fn VARIABLE)" t nil)
+(fn VARIABLE)" t)
(defalias 'debug-watch #'debug-on-variable-change)
(autoload 'cancel-debug-on-variable-change "debug" "\
Undo effect of \\[debug-on-variable-change] on VARIABLE.
@@ -6515,7 +6491,7 @@ If VARIABLE is nil, cancel `debug-on-variable-change' for all variables.
When called interactively, prompt for VARIABLE in the minibuffer.
To specify a nil argument interactively, exit with an empty minibuffer.
-(fn &optional VARIABLE)" t nil)
+(fn &optional VARIABLE)" t)
(defalias 'cancel-debug-watch #'cancel-debug-on-variable-change)
(register-definition-prefixes "debug" '("debug" "inhibit-debug-on-entry"))
@@ -6538,7 +6514,7 @@ To specify a nil argument interactively, exit with an empty minibuffer.
;;; Generated autoloads from play/decipher.el
(autoload 'decipher "decipher" "\
-Format a buffer of ciphertext for cryptanalysis and enter Decipher mode." t nil)
+Format a buffer of ciphertext for cryptanalysis and enter Decipher mode." t)
(autoload 'decipher-mode "decipher" "\
Major mode for decrypting monoalphabetic substitution ciphers.
Lower-case letters enter plaintext.
@@ -6555,7 +6531,7 @@ The most useful commands are:
\\[decipher-make-checkpoint] Save the current cipher alphabet (checkpoint)
\\[decipher-restore-checkpoint] Restore a saved cipher alphabet (checkpoint)
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "decipher" '("decipher-"))
@@ -6567,7 +6543,7 @@ The most useful commands are:
;;; Generated autoloads from delim-col.el
(autoload 'delimit-columns-customize "delim-col" "\
-Customize the `columns' group." t nil)
+Customize the `columns' group." t)
(autoload 'delimit-columns-region "delim-col" "\
Prettify all columns in a text region.
@@ -6591,7 +6567,7 @@ See the `delimit-columns-str-before',
`delimit-columns-extra' variables for customization of the
look.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'delimit-columns-rectangle "delim-col" "\
Prettify all columns in a text rectangle.
@@ -6599,7 +6575,7 @@ See `delimit-columns-region' for what this entails.
START and END delimit the corners of the text rectangle.
-(fn START END)" t nil)
+(fn START END)" t)
(register-definition-prefixes "delim-col" '("delimit-columns-"))
@@ -6639,13 +6615,13 @@ evaluate `(default-value \\='delete-selection-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'delete-active-region "delsel" "\
Delete the active region.
If KILLP is non-nil, or if called interactively with a prefix argument,
the active region is killed instead of deleted.
-(fn &optional KILLP)" t nil)
+(fn &optional KILLP)" t)
(register-definition-prefixes "delsel" '("del" "minibuffer-keyboard-quit"))
@@ -6724,7 +6700,7 @@ Right now, if they don't already exist, set up a blank keymap, an
empty syntax table, and an empty abbrev table -- these will be merged
the first time the mode is used.
-(fn MODE)" nil nil)
+(fn MODE)")
(register-definition-prefixes "derived" '("derived-mode-"))
@@ -6738,7 +6714,7 @@ If optional second argument OUTPUT-BUFFER is non-nil,
insert the output into that buffer, and don't initialize or clear it
otherwise.
-(fn POS &optional OUTPUT-BUFFER BUFFER)" t nil)
+(fn POS &optional OUTPUT-BUFFER BUFFER)" t)
(autoload 'describe-char "descr-text" "\
Describe position POS (interactively, point) and the char after POS.
POS is taken to be in BUFFER, or the current buffer if BUFFER is nil.
@@ -6765,7 +6741,7 @@ The character information includes:
Unicode Data Base;
and widgets, buttons, overlays, and text properties relevant to POS.
-(fn POS &optional BUFFER)" t nil)
+(fn POS &optional BUFFER)" t)
(autoload 'describe-char-eldoc "descr-text" "\
Return a description of character at point for use by ElDoc mode.
@@ -6779,7 +6755,7 @@ minibuffer window for width limit.
This function can be used as a value of
`eldoc-documentation-functions' variable.
-(fn CALLBACK &rest _)" nil nil)
+(fn CALLBACK &rest _)")
(register-definition-prefixes "descr-text" '("describe-"))
@@ -6825,7 +6801,7 @@ evaluate `(default-value \\='desktop-save-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar desktop-locals-to-save '(desktop-locals-to-save truncate-lines case-fold-search case-replace fill-column overwrite-mode change-log-default-name line-number-mode column-number-mode size-indication-mode buffer-file-coding-system buffer-display-time indent-tabs-mode tab-width indicate-buffer-boundaries indicate-empty-lines show-trailing-whitespace) "\
List of local variables to save for each buffer.
The variables are saved only when they really are local. Conventional minor
@@ -6934,7 +6910,7 @@ a regular expression in the list `desktop-clear-preserve-buffers'.
Furthermore, it clears the variables listed in `desktop-globals-to-clear'.
When called interactively and `desktop-restore-frames' is non-nil, it also
deletes all frames except the selected one (and its minibuffer frame,
-if different)." t nil)
+if different)." t)
(autoload 'desktop-save "desktop" "\
Save the state of Emacs in a desktop file in directory DIRNAME.
Optional argument RELEASE non-nil says we're done with this
@@ -6970,10 +6946,10 @@ In a non-interactive call, VERSION can be given as an integer, either
206 or 208, to specify the format version in which to save the file,
no questions asked.
-(fn DIRNAME &optional RELEASE ONLY-IF-CHANGED VERSION)" t nil)
+(fn DIRNAME &optional RELEASE ONLY-IF-CHANGED VERSION)" t)
(autoload 'desktop-remove "desktop" "\
Delete desktop file in `desktop-dirname'.
-This function also sets `desktop-dirname' to nil." t nil)
+This function also sets `desktop-dirname' to nil." t)
(autoload 'desktop-read "desktop" "\
Read and process the desktop file in directory DIRNAME.
Look for a desktop file in DIRNAME, or if DIRNAME is omitted, look in
@@ -6984,18 +6960,18 @@ Interactively, with prefix arg \\[universal-argument], ask for DIRNAME.
This function is a no-op when Emacs is running in batch mode.
It returns t if a desktop file was loaded, nil otherwise.
-(fn DIRNAME)" t nil)
+(fn DIRNAME)" t)
(autoload 'desktop-change-dir "desktop" "\
Change to desktop saved in DIRNAME.
Kill the desktop as specified by variables `desktop-save-mode' and
`desktop-save', then clear the desktop and load the desktop file in
directory DIRNAME.
-(fn DIRNAME)" t nil)
+(fn DIRNAME)" t)
(autoload 'desktop-save-in-desktop-dir "desktop" "\
-Save the desktop in directory `desktop-dirname'." t nil)
+Save the desktop in directory `desktop-dirname'." t)
(autoload 'desktop-revert "desktop" "\
-Revert to the last loaded desktop." t nil)
+Revert to the last loaded desktop." t)
(register-definition-prefixes "desktop" '("desktop-"))
@@ -7013,26 +6989,26 @@ You can control what lines will be unwrapped by frobbing
indicating the minimum and maximum length of an unwrapped citation line. If
NODISPLAY is non-nil, don't redisplay the article buffer.
-(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
+(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode))
(autoload 'gnus-article-outlook-repair-attribution "deuglify" "\
Repair a broken attribution line.
If NODISPLAY is non-nil, don't redisplay the article buffer.
-(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
+(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode))
(autoload 'gnus-article-outlook-rearrange-citation "deuglify" "\
Repair broken citations.
If NODISPLAY is non-nil, don't redisplay the article buffer.
-(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
+(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode))
(autoload 'gnus-outlook-deuglify-article "deuglify" "\
Full deuglify of broken Outlook (Express) articles.
Treat \"smartquotes\", unwrap lines, repair attribution and
rearrange citation. If NODISPLAY is non-nil, don't redisplay the
article buffer.
-(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode) nil)
+(fn &optional NODISPLAY)" '(gnus-article-mode gnus-summary-mode))
(autoload 'gnus-article-outlook-deuglify-article "deuglify" "\
-Deuglify broken Outlook (Express) articles and redisplay." '(gnus-article-mode gnus-summary-mode) nil)
+Deuglify broken Outlook (Express) articles and redisplay." '(gnus-article-mode gnus-summary-mode))
(register-definition-prefixes "deuglify" '("gnus-outlook-"))
@@ -7049,7 +7025,7 @@ If no argument is provided, the number of days of diary entries is governed
by the variable `diary-number-of-entries'. A value of ARG less than 1
does nothing. This function is suitable for execution in an init file.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'diary-mail-entries "diary-lib" "\
Send a mail message showing diary entries for next NDAYS days.
If no prefix argument is given, NDAYS is set to `diary-mail-days'.
@@ -7072,11 +7048,11 @@ ensure that all relevant variables are set.
# diary-rem.el ends here
-(fn &optional NDAYS)" t nil)
+(fn &optional NDAYS)" t)
(autoload 'diary-mode "diary-lib" "\
Major mode for editing the diary file.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "diary-lib" '("calendar-mark-" "diary-"))
@@ -7090,7 +7066,7 @@ protocol defined in RFC 2229.
This is a quick reference to this mode describing the default key bindings:
\\<dictionary-mode-map>
* \\[dictionary-close] close the dictionary buffer
-* \\[dictionary-help] display this help information
+* \\[describe-mode] display this help information
* \\[dictionary-search] ask for a new word to search
* \\[dictionary-lookup-definition] search the word at point
* \\[forward-button] or TAB place point to the next link
@@ -7100,29 +7076,29 @@ This is a quick reference to this mode describing the default key bindings:
* \\[dictionary-select-dictionary] select the default dictionary
* \\[dictionary-select-strategy] select the default search strategy
-* RET or <mouse-2> visit that link" nil nil)
+* \\`RET' or \\`<mouse-2>' visit that link")
(autoload 'dictionary "dictionary" "\
-Create a new dictionary buffer and install `dictionary-mode'." t nil)
+Create a new dictionary buffer and install `dictionary-mode'." t)
(autoload 'dictionary-search "dictionary" "\
Search the WORD in DICTIONARY if given or in all if nil.
It presents the selection or word at point as default input and
allows editing it.
-(fn WORD &optional DICTIONARY)" t nil)
+(fn WORD &optional DICTIONARY)" t)
(autoload 'dictionary-lookup-definition "dictionary" "\
-Unconditionally lookup the word at point." t nil)
+Unconditionally lookup the word at point." t)
(autoload 'dictionary-match-words "dictionary" "\
Search PATTERN in current default dictionary using default strategy.
-(fn &optional PATTERN &rest IGNORED)" t nil)
+(fn &optional PATTERN &rest IGNORED)" t)
(autoload 'dictionary-mouse-popup-matching-words "dictionary" "\
Display entries matching the word at the cursor retrieved using EVENT.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(autoload 'dictionary-popup-matching-words "dictionary" "\
Display entries matching WORD or the current word if not given.
-(fn &optional WORD)" t nil)
+(fn &optional WORD)" t)
(autoload 'dictionary-tooltip-mode "dictionary" "\
Display tooltips for the current word.
@@ -7130,7 +7106,7 @@ This function can be used to enable or disable the tooltip mode
for the current buffer (based on ARG). If global-tooltip-mode is
active it will overwrite that mode for the current buffer.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'global-dictionary-tooltip-mode "dictionary" "\
Enable/disable `dictionary-tooltip-mode' for all buffers.
@@ -7140,14 +7116,14 @@ It can be overwritten for each buffer using `dictionary-tooltip-mode'.
Note: (global-dictionary-tooltip-mode 0) will not disable the mode
any buffer where (dictionary-tooltip-mode 1) has been called.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'dictionary-context-menu "dictionary" "\
Populate MENU with dictionary commands at CLICK.
When you add this function to `context-menu-functions',
the context menu will contain an item that searches
the word at mouse click.
-(fn MENU CLICK)" nil nil)
+(fn MENU CLICK)")
(register-definition-prefixes "dictionary" '("dictionary-" "global-dictionary-tooltip-mode"))
@@ -7188,7 +7164,7 @@ command.
Non-interactively, OLD and NEW may each be a file or a buffer.
-(fn OLD NEW &optional SWITCHES NO-ASYNC)" t nil)
+(fn OLD NEW &optional SWITCHES NO-ASYNC)" t)
(autoload 'diff-backup "diff" "\
Diff this file with its backup file or vice versa.
Uses the latest backup, if there are several numerical backups.
@@ -7196,16 +7172,16 @@ If this file is a backup, diff it with its original.
The backup file is the first file given to `diff'.
With prefix arg SWITCHES, prompt for diff switches.
-(fn FILE &optional SWITCHES)" t nil)
+(fn FILE &optional SWITCHES)" t)
(autoload 'diff-latest-backup-file "diff" "\
Return the latest existing backup of file FN, or nil.
-(fn FN)" nil nil)
+(fn FN)")
(autoload 'diff-buffer-with-file "diff" "\
View the differences between BUFFER and its associated file.
This requires the external program `diff' to be in your `exec-path'.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'diff-buffers "diff" "\
Find and display the differences between OLD and NEW buffers.
@@ -7223,7 +7199,7 @@ OLD and NEW may each be a buffer or a buffer name.
Also see the `diff-entire-buffers' variable.
-(fn OLD NEW &optional SWITCHES NO-ASYNC)" t nil)
+(fn OLD NEW &optional SWITCHES NO-ASYNC)" t)
(register-definition-prefixes "diff" '("diff-"))
@@ -7244,7 +7220,7 @@ a diff with \\[diff-reverse-direction].
\\{diff-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'diff-minor-mode "diff-mode" "\
Toggle Diff minor mode.
@@ -7264,7 +7240,7 @@ evaluate `diff-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "diff-mode" '("diff-"))
@@ -7279,8 +7255,8 @@ If given a \\[universal-argument] prefix, also prompt for the QUERY-TYPE paramet
If given a \\[universal-argument] \\[universal-argument] prefix, also prompt for the SERVER parameter.
-(fn DOMAIN &optional QUERY-TYPE QUERY-CLASS QUERY-OPTION DIG-OPTION SERVER)" t nil)
-(register-definition-prefixes "dig" '("dig-" "query-dig"))
+(fn DOMAIN &optional QUERY-TYPE QUERY-CLASS QUERY-OPTION DIG-OPTION SERVER)" t)
+(register-definition-prefixes "dig" '("dig-"))
;;; Generated autoloads from cedet/ede/dired.el
@@ -7337,26 +7313,26 @@ Type \\[describe-mode] after entering Dired for more info.
If DIRNAME is already in a Dired buffer, that buffer is used without refresh.
-(fn DIRNAME &optional SWITCHES)" t nil)
+(fn DIRNAME &optional SWITCHES)" t)
(define-key ctl-x-4-map "d" 'dired-other-window)
(autoload 'dired-other-window "dired" "\
\"Edit\" directory DIRNAME. Like `dired' but select in another window.
-(fn DIRNAME &optional SWITCHES)" t nil)
+(fn DIRNAME &optional SWITCHES)" t)
(define-key ctl-x-5-map "d" 'dired-other-frame)
(autoload 'dired-other-frame "dired" "\
\"Edit\" directory DIRNAME. Like `dired' but make a new frame.
-(fn DIRNAME &optional SWITCHES)" t nil)
+(fn DIRNAME &optional SWITCHES)" t)
(define-key tab-prefix-map "d" 'dired-other-tab)
(autoload 'dired-other-tab "dired" "\
\"Edit\" directory DIRNAME. Like `dired' but make a new tab.
-(fn DIRNAME &optional SWITCHES)" t nil)
+(fn DIRNAME &optional SWITCHES)" t)
(autoload 'dired-noselect "dired" "\
Like `dired' but return the Dired buffer as value, do not select it.
-(fn DIR-OR-LIST &optional SWITCHES)" nil nil)
+(fn DIR-OR-LIST &optional SWITCHES)")
(autoload 'dired-mode "dired" "\
Mode for \"editing\" directory listings.
In Dired, you are \"editing\" a list of the files in a directory and
@@ -7407,7 +7383,7 @@ This mode runs the following hooks:
Keybindings:
\\{dired-mode-map}
-(fn &optional DIRNAME SWITCHES)" nil nil)
+(fn &optional DIRNAME SWITCHES)")
(put 'dired-find-alternate-file 'disabled t)
(autoload 'dired-jump "dired" "\
Jump to Dired buffer corresponding to current buffer.
@@ -7425,17 +7401,17 @@ When OTHER-WINDOW is non-nil, jump to Dired buffer in other window.
When FILE-NAME is non-nil, jump to its line in Dired.
Interactively with prefix argument, read FILE-NAME.
-(fn &optional OTHER-WINDOW FILE-NAME)" t nil)
+(fn &optional OTHER-WINDOW FILE-NAME)" t)
(autoload 'dired-jump-other-window "dired" "\
Like \\[dired-jump] (`dired-jump') but in other window.
-(fn &optional FILE-NAME)" t nil)
+(fn &optional FILE-NAME)" t)
(register-definition-prefixes "dired" '("dired-"))
;;; Generated autoloads from dired-aux.el
-(register-definition-prefixes "dired-aux" '("dired-" "minibuffer-default-add-dired-shell-commands"))
+(register-definition-prefixes "dired-aux" '("dired-"))
;;; Generated autoloads from dired-x.el
@@ -7470,7 +7446,7 @@ evaluate `dirtrack-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'dirtrack "dirtrack" "\
Determine the current directory from the process output for a prompt.
This filter function is used by `dirtrack-mode'. It looks for
@@ -7478,7 +7454,7 @@ the prompt specified by `dirtrack-list', and calls
`shell-process-cd' if the directory seems to have changed away
from `default-directory'.
-(fn INPUT)" nil nil)
+(fn INPUT)")
(register-definition-prefixes "dirtrack" '("dirtrack-"))
@@ -7491,34 +7467,34 @@ OBJECT can be a symbol defined as a function, or a function itself
If OBJECT is not already compiled, we compile it, but do not
redefine OBJECT if it is a symbol.
-(fn OBJECT &optional BUFFER INDENT INTERACTIVE-P)" t nil)
+(fn OBJECT &optional BUFFER INDENT INTERACTIVE-P)" t)
(register-definition-prefixes "disass" '("disassemble-"))
;;; Generated autoloads from disp-table.el
(autoload 'make-display-table "disp-table" "\
-Return a new, empty display table." nil nil)
+Return a new, empty display table.")
(autoload 'display-table-slot "disp-table" "\
Return the value of the extra slot in DISPLAY-TABLE named SLOT.
SLOT may be a number from 0 to 5 inclusive, or a slot name (symbol).
Valid symbols are `truncation', `wrap', `escape', `control',
`selective-display', and `vertical-border'.
-(fn DISPLAY-TABLE SLOT)" nil nil)
+(fn DISPLAY-TABLE SLOT)")
(autoload 'set-display-table-slot "disp-table" "\
Set the value of the extra slot in DISPLAY-TABLE named SLOT to VALUE.
SLOT may be a number from 0 to 5 inclusive, or a name (symbol).
Valid symbols are `truncation', `wrap', `escape', `control',
`selective-display', and `vertical-border'.
-(fn DISPLAY-TABLE SLOT VALUE)" nil nil)
+(fn DISPLAY-TABLE SLOT VALUE)")
(autoload 'describe-display-table "disp-table" "\
Describe the display table DT in a help buffer.
-(fn DT)" nil nil)
+(fn DT)")
(autoload 'describe-current-display-table "disp-table" "\
-Describe the display table in use in the selected window and buffer." t nil)
+Describe the display table in use in the selected window and buffer." t)
(autoload 'standard-display-8bit "disp-table" "\
Display characters representing raw bytes in the range L to H literally.
@@ -7532,47 +7508,47 @@ byte.
Note that ASCII printable characters (SPC to TILDA) are displayed
in the default way after this call.
-(fn L H)" nil nil)
+(fn L H)")
(autoload 'standard-display-default "disp-table" "\
Display characters in the range L to H using the default notation.
-(fn L H)" nil nil)
+(fn L H)")
(autoload 'standard-display-ascii "disp-table" "\
Display character C using printable string S.
-(fn C S)" nil nil)
+(fn C S)")
(autoload 'standard-display-g1 "disp-table" "\
Display character C as character SC in the g1 character set.
This function assumes that your terminal uses the SO/SI characters;
it is meaningless for a graphical frame.
-(fn C SC)" nil nil)
+(fn C SC)")
(autoload 'standard-display-graphic "disp-table" "\
Display character C as character GC in graphics character set.
This function assumes VT100-compatible escapes; it is meaningless
for a graphical frame.
-(fn C GC)" nil nil)
+(fn C GC)")
(autoload 'standard-display-underline "disp-table" "\
Display character C as character UC plus underlining.
-(fn C UC)" nil nil)
+(fn C UC)")
(autoload 'create-glyph "disp-table" "\
Allocate a glyph code to display by sending STRING to the terminal.
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'make-glyph-code "disp-table" "\
Return a glyph code representing char CHAR with face FACE.
-(fn CHAR &optional FACE)" nil nil)
+(fn CHAR &optional FACE)")
(autoload 'glyph-char "disp-table" "\
Return the character of glyph code GLYPH.
-(fn GLYPH)" nil nil)
+(fn GLYPH)")
(autoload 'glyph-face "disp-table" "\
Return the face of glyph code GLYPH, or nil if glyph has default face.
-(fn GLYPH)" nil nil)
+(fn GLYPH)")
(autoload 'standard-display-european "disp-table" "\
Semi-obsolete way to toggle display of ISO 8859 European characters.
@@ -7592,7 +7568,7 @@ from Lisp code also selects Latin-1 as the language environment.
This provides increased compatibility for users who call this function
in `.emacs'.
-(fn ARG)" nil nil)
+(fn ARG)")
(register-definition-prefixes "disp-table" '("display-table-print-array"))
@@ -7625,7 +7601,7 @@ evaluate `display-fill-column-indicator-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(put 'global-display-fill-column-indicator-mode 'globalized-minor-mode t)
(defvar global-display-fill-column-indicator-mode nil "\
Non-nil if Global Display-Fill-Column-Indicator mode is enabled.
@@ -7653,7 +7629,7 @@ Display-Fill-Column-Indicator mode.
`global-display-fill-column-indicator-modes' is used to control which
modes this minor mode is used in.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar global-display-fill-column-indicator-modes '((not special-mode) t) "\
Which major modes `display-fill-column-indicator-mode' is switched on in.
This variable can be either t (all major modes), nil (no major modes),
@@ -7697,7 +7673,7 @@ evaluate `display-line-numbers-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(put 'global-display-line-numbers-mode 'globalized-minor-mode t)
(defvar global-display-line-numbers-mode nil "\
Non-nil if Global Display-Line-Numbers mode is enabled.
@@ -7722,7 +7698,7 @@ Display-Line-Numbers mode is enabled in all buffers where
See `display-line-numbers-mode' for more information on
Display-Line-Numbers mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar header-line-indent "" "\
String to indent at the start if the header line.
This is used in `header-line-indent-mode', and buffers that have
@@ -7769,7 +7745,7 @@ evaluate `header-line-indent-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "display-line-numbers" '("display-line-numbers-" "header-line-indent--"))
@@ -7784,7 +7760,7 @@ If ARG is positive, require ARG chars of continuity.
If ARG is negative, require -ARG words of continuity.
Default is 2.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
;;; Generated autoloads from dnd.el
@@ -7812,7 +7788,7 @@ Query a DNS server for NAME of TYPE.
If FULL, return the entire record returned.
If REVERSE, look up an IP address.
-(fn NAME &optional TYPE FULL REVERSE)" nil nil)
+(fn NAME &optional TYPE FULL REVERSE)")
(register-definition-prefixes "dns" '("dns-"))
@@ -7828,10 +7804,10 @@ table and its own syntax table.
Turning on DNS mode runs `dns-mode-hook'.
-(fn)" t nil)
+(fn)" t)
(defalias 'zone-mode 'dns-mode)
(autoload 'dns-mode-soa-increment-serial "dns-mode" "\
-Locate SOA record and increment the serial field." t nil)
+Locate SOA record and increment the serial field." t)
(register-definition-prefixes "dns-mode" '("dns-mode-"))
@@ -7847,7 +7823,7 @@ Return non-nil if document type TYPE is available for `doc-view'.
Document types are symbols like `dvi', `ps', `pdf', `epub',
`cbz', `fb2', `xps', `oxps', or`odf' (any OpenDocument format).
-(fn TYPE)" nil nil)
+(fn TYPE)")
(autoload 'doc-view-mode "doc-view" "\
Major mode in DocView buffers.
@@ -7856,11 +7832,11 @@ and DVI files (as PNG images) in Emacs buffers.
You can use \\<doc-view-mode-map>\\[doc-view-toggle-display] to
toggle between displaying the document or editing it as text.
-\\{doc-view-mode-map}" t nil)
+\\{doc-view-mode-map}" t)
(autoload 'doc-view-mode-maybe "doc-view" "\
Switch to `doc-view-mode' if possible.
If the required external tools are not available, then fallback
-to the next best mode." nil nil)
+to the next best mode.")
(autoload 'doc-view-minor-mode "doc-view" "\
Toggle displaying buffer via Doc View (Doc View minor mode).
@@ -7880,19 +7856,19 @@ evaluate `doc-view-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'doc-view-bookmark-jump "doc-view" "\
-(fn BMK)" nil nil)
+(fn BMK)")
(register-definition-prefixes "doc-view" '("doc-view-"))
;;; Generated autoloads from play/doctor.el
(autoload 'doctor "doctor" "\
-Switch to *doctor* buffer and start giving psychotherapy." t nil)
-(register-definition-prefixes "doctor" '("doc" "make-doctor-variables"))
+Switch to *doctor* buffer and start giving psychotherapy." t)
+(register-definition-prefixes "doctor" '("doc"))
;;; Generated autoloads from cedet/srecode/document.el
@@ -7942,14 +7918,14 @@ evaluate `double-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "double" '("double-"))
;;; Generated autoloads from play/dunnet.el
(autoload 'dunnet "dunnet" "\
-Switch to *dungeon* buffer and start game." t nil)
+Switch to *dungeon* buffer and start game." t)
(register-definition-prefixes "dunnet" '("dun" "obj-special"))
@@ -8086,7 +8062,7 @@ Valid keywords and arguments are:
:suppress Non-nil to call `suppress-keymap' on keymap,
`nodigits' to suppress digits as prefix arguments.
-(fn BS &optional NAME M ARGS)" nil nil)
+(fn BS &optional NAME M ARGS)")
(autoload 'easy-mmode-defmap "easy-mmode" "\
Define a constant M whose value is the result of `easy-mmode-define-keymap'.
The M, BS, and ARGS arguments are as per that function. DOC is
@@ -8144,9 +8120,8 @@ CSS contains a list of syntax specifications of the form (CHAR . SYNTAX).
;;; Generated autoloads from progmodes/ebnf2ps.el
-(push (purecopy '(ebnf2ps 4 4)) package--builtin-versions)
(autoload 'ebnf-customize "ebnf2ps" "\
-Customization for ebnf group." t nil)
+Customization for ebnf group." t)
(autoload 'ebnf-print-directory "ebnf2ps" "\
Generate and print a PostScript syntactic chart image of DIRECTORY.
@@ -8157,7 +8132,7 @@ processed.
See also `ebnf-print-buffer'.
-(fn &optional DIRECTORY)" t nil)
+(fn &optional DIRECTORY)" t)
(autoload 'ebnf-print-file "ebnf2ps" "\
Generate and print a PostScript syntactic chart image of the file FILE.
@@ -8166,7 +8141,7 @@ killed after process termination.
See also `ebnf-print-buffer'.
-(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
+(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t)
(autoload 'ebnf-print-buffer "ebnf2ps" "\
Generate and print a PostScript syntactic chart image of the buffer.
@@ -8179,12 +8154,12 @@ is nil, send the image to the printer. If FILENAME is a string, save
the PostScript image in a file with that name. If FILENAME is a
number, prompt the user for the name of the file to save in.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'ebnf-print-region "ebnf2ps" "\
Generate and print a PostScript syntactic chart image of the region.
Like `ebnf-print-buffer', but prints just the current region.
-(fn FROM TO &optional FILENAME)" t nil)
+(fn FROM TO &optional FILENAME)" t)
(autoload 'ebnf-spool-directory "ebnf2ps" "\
Generate and spool a PostScript syntactic chart image of DIRECTORY.
@@ -8195,7 +8170,7 @@ processed.
See also `ebnf-spool-buffer'.
-(fn &optional DIRECTORY)" t nil)
+(fn &optional DIRECTORY)" t)
(autoload 'ebnf-spool-file "ebnf2ps" "\
Generate and spool a PostScript syntactic chart image of the file FILE.
@@ -8204,20 +8179,20 @@ killed after process termination.
See also `ebnf-spool-buffer'.
-(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
+(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t)
(autoload 'ebnf-spool-buffer "ebnf2ps" "\
Generate and spool a PostScript syntactic chart image of the buffer.
Like `ebnf-print-buffer' except that the PostScript image is saved in a
local buffer to be sent to the printer later.
-Use the command `ebnf-despool' to send the spooled images to the printer." t nil)
+Use the command `ebnf-despool' to send the spooled images to the printer." t)
(autoload 'ebnf-spool-region "ebnf2ps" "\
Generate a PostScript syntactic chart image of the region and spool locally.
Like `ebnf-spool-buffer', but spools just the current region.
Use the command `ebnf-despool' to send the spooled images to the printer.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'ebnf-eps-directory "ebnf2ps" "\
Generate EPS files from EBNF files in DIRECTORY.
@@ -8228,7 +8203,7 @@ processed.
See also `ebnf-eps-buffer'.
-(fn &optional DIRECTORY)" t nil)
+(fn &optional DIRECTORY)" t)
(autoload 'ebnf-eps-file "ebnf2ps" "\
Generate an EPS file from EBNF file FILE.
@@ -8237,7 +8212,7 @@ killed after EPS generation.
See also `ebnf-eps-buffer'.
-(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
+(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t)
(autoload 'ebnf-eps-buffer "ebnf2ps" "\
Generate a PostScript syntactic chart image of the buffer in an EPS file.
@@ -8256,7 +8231,7 @@ The EPS file name has the following form:
file name used in this case will be \"ebnf--A_B_+_C.eps\".
WARNING: This function does *NOT* ask any confirmation to override existing
- files." t nil)
+ files." t)
(autoload 'ebnf-eps-region "ebnf2ps" "\
Generate a PostScript syntactic chart image of the region in an EPS file.
@@ -8277,7 +8252,7 @@ The EPS file name has the following form:
WARNING: This function does *NOT* ask any confirmation to override existing
files.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(defalias 'ebnf-despool #'ps-despool)
(autoload 'ebnf-syntax-directory "ebnf2ps" "\
Do a syntactic analysis of the files in DIRECTORY.
@@ -8289,7 +8264,7 @@ are processed.
See also `ebnf-syntax-buffer'.
-(fn &optional DIRECTORY)" t nil)
+(fn &optional DIRECTORY)" t)
(autoload 'ebnf-syntax-file "ebnf2ps" "\
Do a syntactic analysis of the named FILE.
@@ -8298,39 +8273,39 @@ killed after syntax checking.
See also `ebnf-syntax-buffer'.
-(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t nil)
+(fn FILE &optional DO-NOT-KILL-BUFFER-WHEN-DONE)" t)
(autoload 'ebnf-syntax-buffer "ebnf2ps" "\
-Do a syntactic analysis of the current buffer." t nil)
+Do a syntactic analysis of the current buffer." t)
(autoload 'ebnf-syntax-region "ebnf2ps" "\
Do a syntactic analysis of a region.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'ebnf-setup "ebnf2ps" "\
-Return the current ebnf2ps setup." nil nil)
+Return the current ebnf2ps setup.")
(autoload 'ebnf-find-style "ebnf2ps" "\
Return style definition if NAME is already defined; otherwise, return nil.
See `ebnf-style-database' documentation.
-(fn NAME)" t nil)
+(fn NAME)" t)
(autoload 'ebnf-insert-style "ebnf2ps" "\
Insert a new style NAME with inheritance INHERITS and values VALUES.
See `ebnf-style-database' documentation.
-(fn NAME INHERITS &rest VALUES)" t nil)
+(fn NAME INHERITS &rest VALUES)" t)
(autoload 'ebnf-delete-style "ebnf2ps" "\
Delete style NAME.
See `ebnf-style-database' documentation.
-(fn NAME)" t nil)
+(fn NAME)" t)
(autoload 'ebnf-merge-style "ebnf2ps" "\
Merge values of style NAME with style VALUES.
See `ebnf-style-database' documentation.
-(fn NAME &rest VALUES)" t nil)
+(fn NAME &rest VALUES)" t)
(autoload 'ebnf-apply-style "ebnf2ps" "\
Set STYLE as the current style.
@@ -8338,7 +8313,7 @@ Returns the old style symbol.
See `ebnf-style-database' documentation.
-(fn STYLE)" t nil)
+(fn STYLE)" t)
(autoload 'ebnf-reset-style "ebnf2ps" "\
Reset current style.
@@ -8346,7 +8321,7 @@ Returns the old style symbol.
See `ebnf-style-database' documentation.
-(fn &optional STYLE)" t nil)
+(fn &optional STYLE)" t)
(autoload 'ebnf-push-style "ebnf2ps" "\
Push the current style onto a stack and set STYLE as the current style.
@@ -8356,7 +8331,7 @@ See also `ebnf-pop-style'.
See `ebnf-style-database' documentation.
-(fn &optional STYLE)" t nil)
+(fn &optional STYLE)" t)
(autoload 'ebnf-pop-style "ebnf2ps" "\
Pop a style from the stack of pushed styles and set it as the current style.
@@ -8364,7 +8339,7 @@ Returns the old style symbol.
See also `ebnf-push-style'.
-See `ebnf-style-database' documentation." t nil)
+See `ebnf-style-database' documentation." t)
(register-definition-prefixes "ebnf2ps" '("ebnf-"))
@@ -8380,52 +8355,52 @@ E.g. \\[save-buffer] writes the tree to the file it was loaded from.
Tree mode key bindings:
\\{ebrowse-tree-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'ebrowse-electric-choose-tree "ebrowse" "\
-Return a buffer containing a tree or nil if no tree found or canceled." t nil)
+Return a buffer containing a tree or nil if no tree found or canceled." t)
(autoload 'ebrowse-member-mode "ebrowse" "\
Major mode for Ebrowse member buffers.
-(fn)" t nil)
+(fn)" t)
(autoload 'ebrowse-tags-view-declaration "ebrowse" "\
-View declaration of member at point." t nil)
+View declaration of member at point." t)
(autoload 'ebrowse-tags-find-declaration "ebrowse" "\
-Find declaration of member at point." t nil)
+Find declaration of member at point." t)
(autoload 'ebrowse-tags-view-definition "ebrowse" "\
-View definition of member at point." t nil)
+View definition of member at point." t)
(autoload 'ebrowse-tags-find-definition "ebrowse" "\
-Find definition of member at point." t nil)
+Find definition of member at point." t)
(autoload 'ebrowse-tags-find-declaration-other-window "ebrowse" "\
-Find declaration of member at point in other window." t nil)
+Find declaration of member at point in other window." t)
(autoload 'ebrowse-tags-view-definition-other-window "ebrowse" "\
-View definition of member at point in other window." t nil)
+View definition of member at point in other window." t)
(autoload 'ebrowse-tags-find-definition-other-window "ebrowse" "\
-Find definition of member at point in other window." t nil)
+Find definition of member at point in other window." t)
(autoload 'ebrowse-tags-find-declaration-other-frame "ebrowse" "\
-Find definition of member at point in other frame." t nil)
+Find definition of member at point in other frame." t)
(autoload 'ebrowse-tags-view-definition-other-frame "ebrowse" "\
-View definition of member at point in other frame." t nil)
+View definition of member at point in other frame." t)
(autoload 'ebrowse-tags-find-definition-other-frame "ebrowse" "\
-Find definition of member at point in other frame." t nil)
+Find definition of member at point in other frame." t)
(autoload 'ebrowse-tags-complete-symbol "ebrowse" "\
Perform completion on the C++ symbol preceding point.
A second call of this function without changing point inserts the next match.
A call with prefix PREFIX reads the symbol to insert from the minibuffer with
completion.
-(fn PREFIX)" t nil)
+(fn PREFIX)" '("P"))
(autoload 'ebrowse-tags-loop-continue "ebrowse" "\
Repeat last operation on files in tree.
FIRST-TIME non-nil means this is not a repetition, but the first time.
TREE-BUFFER if indirectly specifies which files to loop over.
-(fn &optional FIRST-TIME TREE-BUFFER)" t nil)
+(fn &optional FIRST-TIME TREE-BUFFER)" t)
(autoload 'ebrowse-tags-search "ebrowse" "\
Search for REGEXP in all files in a tree.
If marked classes exist, process marked classes, only.
If regular expression is nil, repeat last search.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(autoload 'ebrowse-tags-query-replace "ebrowse" "\
Query replace FROM with TO in all files of a class tree.
With prefix arg, process files of marked classes only.
@@ -8435,7 +8410,7 @@ what to do with it. Type SPC or `y' to replace the match,
DEL or `n' to skip and go to the next match. For more directions,
type \\[help-command] at that time.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'ebrowse-tags-search-member-use "ebrowse" "\
Search for call sites of a member.
If FIX-NAME is specified, search uses of that member.
@@ -8443,29 +8418,29 @@ Otherwise, read a member name from the minibuffer.
Searches in all files mentioned in a class tree for something that
looks like a function call to the member.
-(fn &optional FIX-NAME)" t nil)
+(fn &optional FIX-NAME)" t)
(autoload 'ebrowse-back-in-position-stack "ebrowse" "\
Move backward in the position stack.
Prefix arg ARG says how much.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'ebrowse-forward-in-position-stack "ebrowse" "\
Move forward in the position stack.
Prefix arg ARG says how much.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'ebrowse-electric-position-menu "ebrowse" "\
-List positions in the position stack in an electric buffer." t nil)
+List positions in the position stack in an electric buffer." t)
(autoload 'ebrowse-save-tree "ebrowse" "\
-Save current tree in same file it was loaded from." t nil)
+Save current tree in same file it was loaded from." t)
(autoload 'ebrowse-save-tree-as "ebrowse" "\
Write the current tree data structure to a file.
Read the file name from the minibuffer if interactive.
Otherwise, FILE-NAME specifies the file to save the tree in.
-(fn &optional FILE-NAME)" t nil)
+(fn &optional FILE-NAME)" t)
(autoload 'ebrowse-statistics "ebrowse" "\
-Display statistics for a class tree." t nil)
+Display statistics for a class tree." t)
(register-definition-prefixes "ebrowse" '("ebrowse-" "electric-buffer-menu-mode-hook"))
@@ -8497,7 +8472,7 @@ Run hooks in `electric-buffer-menu-mode-hook' on entry.
\\[Electric-buffer-menu-mode-view-buffer] -- view buffer, returning when done.
\\[Buffer-menu-backup-unmark] -- back up a line and remove marks.
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "ebuff-menu" '("Electric-buffer-menu-" "electric-buffer-"))
@@ -8507,20 +8482,20 @@ Run hooks in `electric-buffer-menu-mode-hook' on entry.
Edit current history line in minibuffer and execute result.
With prefix arg NOCONFIRM, execute current line as-is without editing.
-(fn &optional NOCONFIRM)" t nil)
+(fn &optional NOCONFIRM)" t)
(register-definition-prefixes "echistory" '("Electric-history-" "electric-"))
;;; Generated autoloads from ecomplete.el
(autoload 'ecomplete-setup "ecomplete" "\
-Read the .ecompleterc file." nil nil)
+Read the .ecompleterc file.")
(register-definition-prefixes "ecomplete" '("ecomplete-"))
;;; Generated autoloads from cedet/ede.el
-(push (purecopy '(ede 1 2)) package--builtin-versions)
+(push (purecopy '(ede 2 0)) package--builtin-versions)
(defvar global-ede-mode nil "\
Non-nil if Global Ede mode is enabled.
See the `global-ede-mode' command
@@ -8549,7 +8524,7 @@ evaluate `(default-value \\='global-ede-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "ede" '("ede" "global-ede-mode-map" "project-try-ede"))
@@ -8584,7 +8559,7 @@ Return t if SPEC uses only extant spec symbols.
An extant spec symbol is a symbol that is not a function and has a
`edebug-form-spec' property.
-(fn SPEC)" nil nil)
+(fn SPEC)")
(defalias 'edebug-defun 'edebug-eval-top-level-form)
(autoload 'edebug-eval-top-level-form "edebug" "\
Evaluate the top level form point is in, stepping through with Edebug.
@@ -8602,12 +8577,12 @@ If the current defun is actually a call to `defvar' or `defcustom',
evaluating it this way resets the variable using its initial value
expression even if the variable already has some other value.
(Normally `defvar' and `defcustom' do not alter the value if there
-already is one.)" t nil)
+already is one.)" t)
(autoload 'edebug-all-defs "edebug" "\
-Toggle edebugging of all definitions." t nil)
+Toggle edebugging of all definitions." t)
(autoload 'edebug-all-forms "edebug" "\
-Toggle edebugging of all forms." t nil)
-(register-definition-prefixes "edebug" '("arglist" "backquote-form" "def-declarations" "edebug" "function-form" "interactive" "lambda-" "name" "nested-backquote-form"))
+Toggle edebugging of all forms." t)
+(register-definition-prefixes "edebug" '("edebug"))
;;; Generated autoloads from vc/ediff.el
@@ -8618,25 +8593,25 @@ Run Ediff on a pair of files, FILE-A and FILE-B.
STARTUP-HOOKS is a list of functions that Emacs calls without
arguments after setting up the Ediff buffers.
-(fn FILE-A FILE-B &optional STARTUP-HOOKS)" t nil)
+(fn FILE-A FILE-B &optional STARTUP-HOOKS)" t)
(autoload 'ediff-files3 "ediff" "\
Run Ediff on three files, FILE-A, FILE-B, and FILE-C.
STARTUP-HOOKS is a list of functions that Emacs calls without
arguments after setting up the Ediff buffers.
-(fn FILE-A FILE-B FILE-C &optional STARTUP-HOOKS)" t nil)
+(fn FILE-A FILE-B FILE-C &optional STARTUP-HOOKS)" t)
(defalias 'ediff3 #'ediff-files3)
(defalias 'ediff #'ediff-files)
(autoload 'ediff-current-file "ediff" "\
Start ediff between current buffer and its file on disk.
This command can be used instead of `revert-buffer'. If there is
-nothing to revert then this command fails." t nil)
+nothing to revert then this command fails." t)
(autoload 'ediff-backup "ediff" "\
Run Ediff on FILE and its backup file.
Uses the latest backup, if there are several numerical backups.
If this file is a backup, `ediff' it with its original.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'ediff-buffers "ediff" "\
Run Ediff on a pair of buffers, BUFFER-A and BUFFER-B.
STARTUP-HOOKS is a list of functions that Emacs calls without
@@ -8647,7 +8622,7 @@ symbol describing the Ediff job type; it defaults to
`ediff-last-dir-C', `ediff-buffers3', `ediff-merge-buffers', or
`ediff-merge-buffers-with-ancestor'.
-(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS JOB-NAME)" t nil)
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS JOB-NAME)" t)
(defalias 'ebuffers #'ediff-buffers)
(autoload 'ediff-buffers3 "ediff" "\
Run Ediff on three buffers, BUFFER-A, BUFFER-B, and BUFFER-C.
@@ -8659,7 +8634,7 @@ symbol describing the Ediff job type; it defaults to
`ediff-last-dir-C', `ediff-buffers', `ediff-merge-buffers', or
`ediff-merge-buffers-with-ancestor'.
-(fn BUFFER-A BUFFER-B BUFFER-C &optional STARTUP-HOOKS JOB-NAME)" t nil)
+(fn BUFFER-A BUFFER-B BUFFER-C &optional STARTUP-HOOKS JOB-NAME)" t)
(defalias 'ebuffers3 #'ediff-buffers3)
(autoload 'ediff-directories "ediff" "\
Run Ediff on directories DIR1 and DIR2, comparing files.
@@ -8668,14 +8643,14 @@ Consider only files that have the same name in both directories.
REGEXP is nil or a regular expression; only file names that match
the regexp are considered.
-(fn DIR1 DIR2 REGEXP)" t nil)
+(fn DIR1 DIR2 REGEXP)" t)
(defalias 'edirs #'ediff-directories)
(autoload 'ediff-directory-revisions "ediff" "\
Run Ediff on a directory, DIR1, comparing its files with their revisions.
The second argument, REGEXP, is a regular expression that filters the file
names. Only the files that are under revision control are taken into account.
-(fn DIR1 REGEXP)" t nil)
+(fn DIR1 REGEXP)" t)
(defalias 'edir-revisions #'ediff-directory-revisions)
(autoload 'ediff-directories3 "ediff" "\
Run Ediff on directories DIR1, DIR2, and DIR3, comparing files.
@@ -8684,7 +8659,7 @@ Consider only files that have the same name in all three directories.
REGEXP is nil or a regular expression; only file names that match
the regexp are considered.
-(fn DIR1 DIR2 DIR3 REGEXP)" t nil)
+(fn DIR1 DIR2 DIR3 REGEXP)" t)
(defalias 'edirs3 #'ediff-directories3)
(autoload 'ediff-merge-directories "ediff" "\
Run Ediff on a pair of directories, DIR1 and DIR2, merging files that have
@@ -8692,7 +8667,7 @@ the same name in both. The third argument, REGEXP, is nil or a regular
expression; only file names that match the regexp are considered.
MERGE-AUTOSTORE-DIR is the directory in which to store merged files.
-(fn DIR1 DIR2 REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
+(fn DIR1 DIR2 REGEXP &optional MERGE-AUTOSTORE-DIR)" t)
(defalias 'edirs-merge #'ediff-merge-directories)
(autoload 'ediff-merge-directories-with-ancestor "ediff" "\
Merge files in DIR1 and DIR2 using files in ANCESTOR-DIR as ancestors.
@@ -8702,14 +8677,14 @@ without ancestor. The fourth argument, REGEXP, is nil or a regular expression;
only file names that match the regexp are considered.
MERGE-AUTOSTORE-DIR is the directory in which to store merged files.
-(fn DIR1 DIR2 ANCESTOR-DIR REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
+(fn DIR1 DIR2 ANCESTOR-DIR REGEXP &optional MERGE-AUTOSTORE-DIR)" t)
(autoload 'ediff-merge-directory-revisions "ediff" "\
Run Ediff on a directory, DIR1, merging its files with their revisions.
The second argument, REGEXP, is a regular expression that filters the file
names. Only the files that are under revision control are taken into account.
MERGE-AUTOSTORE-DIR is the directory in which to store merged files.
-(fn DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
+(fn DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR)" t)
(defalias 'edir-merge-revisions #'ediff-merge-directory-revisions)
(autoload 'ediff-merge-directory-revisions-with-ancestor "ediff" "\
Run Ediff on DIR1 and merge its files with their revisions and ancestors.
@@ -8717,7 +8692,7 @@ The second argument, REGEXP, is a regular expression that filters the file
names. Only the files that are under revision control are taken into account.
MERGE-AUTOSTORE-DIR is the directory in which to store merged files.
-(fn DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR)" t nil)
+(fn DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR)" t)
(defalias 'edir-merge-revisions-with-ancestor 'ediff-merge-directory-revisions-with-ancestor)
(defalias 'edirs-merge-with-ancestor 'ediff-merge-directories-with-ancestor)
(autoload 'ediff-windows-wordwise "ediff" "\
@@ -8730,7 +8705,7 @@ If WIND-B is nil, use window next to WIND-A.
STARTUP-HOOKS is a list of functions that Emacs calls without
arguments after setting up the Ediff buffers.
-(fn DUMB-MODE &optional WIND-A WIND-B STARTUP-HOOKS)" t nil)
+(fn DUMB-MODE &optional WIND-A WIND-B STARTUP-HOOKS)" t)
(autoload 'ediff-windows-linewise "ediff" "\
Compare WIND-A and WIND-B, which are selected by clicking, linewise.
This compares the portions of text visible in each of the two windows.
@@ -8741,7 +8716,7 @@ If WIND-B is nil, use window next to WIND-A.
STARTUP-HOOKS is a list of functions that Emacs calls without
arguments after setting up the Ediff buffers.
-(fn DUMB-MODE &optional WIND-A WIND-B STARTUP-HOOKS)" t nil)
+(fn DUMB-MODE &optional WIND-A WIND-B STARTUP-HOOKS)" t)
(autoload 'ediff-regions-wordwise "ediff" "\
Run Ediff on a pair of regions in specified buffers.
BUFFER-A and BUFFER-B are the buffers to be compared.
@@ -8751,7 +8726,7 @@ use `ediff-regions-linewise' instead.
STARTUP-HOOKS is a list of functions that Emacs calls without
arguments after setting up the Ediff buffers.
-(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS)" t nil)
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS)" t)
(autoload 'ediff-regions-linewise "ediff" "\
Run Ediff on a pair of regions in specified buffers.
BUFFER-A and BUFFER-B are the buffers to be compared.
@@ -8762,7 +8737,7 @@ lines. For small regions, use `ediff-regions-wordwise'.
STARTUP-HOOKS is a list of functions that Emacs calls without
arguments after setting up the Ediff buffers.
-(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS)" t nil)
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS)" t)
(defalias 'ediff-merge 'ediff-merge-files)
(autoload 'ediff-merge-files "ediff" "\
Merge two files without ancestor.
@@ -8771,7 +8746,7 @@ STARTUP-HOOKS is a list of functions that Emacs calls without
arguments after setting up the Ediff buffers. MERGE-BUFFER-FILE
is the name of the file to be associated with the merge buffer..
-(fn FILE-A FILE-B &optional STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
+(fn FILE-A FILE-B &optional STARTUP-HOOKS MERGE-BUFFER-FILE)" t)
(autoload 'ediff-merge-files-with-ancestor "ediff" "\
Merge two files with ancestor.
FILE-A and FILE-B are the names of the files to be merged, and
@@ -8780,7 +8755,7 @@ a list of functions that Emacs calls without arguments after
setting up the Ediff buffers. MERGE-BUFFER-FILE is the name of
the file to be associated with the merge buffer.
-(fn FILE-A FILE-B FILE-ANCESTOR &optional STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
+(fn FILE-A FILE-B FILE-ANCESTOR &optional STARTUP-HOOKS MERGE-BUFFER-FILE)" t)
(defalias 'ediff-merge-with-ancestor 'ediff-merge-files-with-ancestor)
(autoload 'ediff-merge-buffers "ediff" "\
Merge buffers without ancestor.
@@ -8794,7 +8769,7 @@ symbol describing the Ediff job type; it defaults to
`ediff-merge-buffers-with-ancestor'. MERGE-BUFFER-FILE is the
name of the file to be associated with the merge buffer.
-(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS JOB-NAME MERGE-BUFFER-FILE)" t nil)
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS JOB-NAME MERGE-BUFFER-FILE)" t)
(autoload 'ediff-merge-buffers-with-ancestor "ediff" "\
Merge buffers with ancestor.
BUFFER-A and BUFFER-B are the buffers to be merged, and
@@ -8807,7 +8782,7 @@ also be one of `ediff-merge-files-with-ancestor',
`ediff-buffers3', or `ediff-merge-buffers'. MERGE-BUFFER-FILE is
the name of the file to be associated with the merge buffer.
-(fn BUFFER-A BUFFER-B BUFFER-ANCESTOR &optional STARTUP-HOOKS JOB-NAME MERGE-BUFFER-FILE)" t nil)
+(fn BUFFER-A BUFFER-B BUFFER-ANCESTOR &optional STARTUP-HOOKS JOB-NAME MERGE-BUFFER-FILE)" t)
(autoload 'ediff-merge-revisions "ediff" "\
Run Ediff by merging two revisions of a file.
The file is the optional FILE argument or the file visited by the
@@ -8816,7 +8791,7 @@ calls without arguments after setting up the Ediff buffers.
MERGE-BUFFER-FILE is the name of the file to be associated with
the merge buffer.
-(fn &optional FILE STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
+(fn &optional FILE STARTUP-HOOKS MERGE-BUFFER-FILE)" t)
(autoload 'ediff-merge-revisions-with-ancestor "ediff" "\
Run Ediff by merging two revisions of a file with a common ancestor.
The file is the optional FILE argument or the file visited by the
@@ -8825,7 +8800,7 @@ calls without arguments after setting up the Ediff buffers.
MERGE-BUFFER-FILE is the name of the file to be associated with
the merge buffer.
-(fn &optional FILE STARTUP-HOOKS MERGE-BUFFER-FILE)" t nil)
+(fn &optional FILE STARTUP-HOOKS MERGE-BUFFER-FILE)" t)
(autoload 'ediff-patch-file "ediff" "\
Query for a file name, and then run Ediff by patching that file.
If optional PATCH-BUF is given, use the patch in that buffer
@@ -8833,7 +8808,7 @@ and don't ask the user.
If prefix argument ARG, then: if even argument, assume that the
patch is in a buffer. If odd -- assume it is in a file.
-(fn &optional ARG PATCH-BUF)" t nil)
+(fn &optional ARG PATCH-BUF)" t)
(autoload 'ediff-patch-buffer "ediff" "\
Run Ediff by patching the buffer specified at prompt.
Without the optional prefix ARG, asks if the patch is in some buffer and
@@ -8843,7 +8818,7 @@ With ARG=2, assumes the patch is in a buffer and prompts for the buffer.
PATCH-BUF is an optional argument, which specifies the buffer that contains the
patch. If not given, the user is prompted according to the prefix argument.
-(fn &optional ARG PATCH-BUF)" t nil)
+(fn &optional ARG PATCH-BUF)" t)
(defalias 'epatch 'ediff-patch-file)
(defalias 'epatch-buffer 'ediff-patch-buffer)
(autoload 'ediff-revision "ediff" "\
@@ -8854,33 +8829,33 @@ Uses `vc.el' or `rcs.el' depending on `ediff-version-control-package'.
STARTUP-HOOKS is a list of functions that Emacs calls without
arguments after setting up the Ediff buffers.
-(fn &optional FILE STARTUP-HOOKS)" t nil)
+(fn &optional FILE STARTUP-HOOKS)" t)
(defalias 'erevision 'ediff-revision)
(autoload 'ediff-version "ediff" "\
Return string describing the version of Ediff.
-When called interactively, displays the version." t nil)
+When called interactively, displays the version." t)
(autoload 'ediff-documentation "ediff" "\
Display Ediff's manual.
With optional NODE, goes to that node.
-(fn &optional NODE)" t nil)
+(fn &optional NODE)" t)
(autoload 'ediff-files-command "ediff" "\
-Call `ediff-files' with the next two command line arguments." nil nil)
+Call `ediff-files' with the next two command line arguments.")
(autoload 'ediff3-files-command "ediff" "\
-Call `ediff3-files' with the next three command line arguments." nil nil)
+Call `ediff3-files' with the next three command line arguments.")
(autoload 'ediff-merge-command "ediff" "\
-Call `ediff-merge-files' with the next two command line arguments." nil nil)
+Call `ediff-merge-files' with the next two command line arguments.")
(autoload 'ediff-merge-with-ancestor-command "ediff" "\
-Call `ediff-merge-files-with-ancestor' with next three command line arguments." nil nil)
+Call `ediff-merge-files-with-ancestor' with next three command line arguments.")
(autoload 'ediff-directories-command "ediff" "\
-Call `ediff-directories' with the next three command line arguments." nil nil)
+Call `ediff-directories' with the next three command line arguments.")
(autoload 'ediff-directories3-command "ediff" "\
-Call `ediff-directories3' with the next four command line arguments." nil nil)
+Call `ediff-directories3' with the next four command line arguments.")
(autoload 'ediff-merge-directories-command "ediff" "\
-Call `ediff-merge-directories' with the next three command line arguments." nil nil)
+Call `ediff-merge-directories' with the next three command line arguments.")
(autoload 'ediff-merge-directories-with-ancestor-command "ediff" "\
Call `ediff-merge-directories-with-ancestor' with the next four command line
-arguments." nil nil)
+arguments.")
(register-definition-prefixes "ediff" '("ediff-"))
@@ -8891,7 +8866,7 @@ arguments." nil nil)
;;; Generated autoloads from vc/ediff-help.el
-(autoload 'ediff-customize "ediff-help" nil t nil)
+(autoload 'ediff-customize "ediff-help" nil t)
(register-definition-prefixes "ediff-help" '("ediff-"))
@@ -8908,7 +8883,7 @@ arguments." nil nil)
;;; Generated autoloads from vc/ediff-mult.el
(autoload 'ediff-show-registry "ediff-mult" "\
-Display Ediff's registry." t nil)
+Display Ediff's registry." t)
(defalias 'eregistry #'ediff-show-registry)
(register-definition-prefixes "ediff-mult" '("ediff-"))
@@ -8923,11 +8898,11 @@ Display Ediff's registry." t nil)
(autoload 'ediff-toggle-multiframe "ediff-util" "\
Switch from multiframe display to single-frame display and back.
To change the default, set the variable `ediff-window-setup-function',
-which see." t nil)
+which see." t)
(autoload 'ediff-toggle-use-toolbar "ediff-util" "\
Enable or disable Ediff toolbar.
Works only in versions of Emacs that support toolbars.
-To change the default, set the variable `ediff-use-toolbar-p', which see." t nil)
+To change the default, set the variable `ediff-use-toolbar-p', which see." t)
(register-definition-prefixes "ediff-util" '("ediff-"))
@@ -8957,15 +8932,15 @@ keystrokes as a keyboard macro, or `\\[execute-extended-command]'
to edit a macro by its command name.
With a prefix argument, format the macro in a more concise way.
-(fn KEYS &optional PREFIX FINISH-HOOK STORE-HOOK)" t nil)
+(fn KEYS &optional PREFIX FINISH-HOOK STORE-HOOK)" t)
(autoload 'edit-last-kbd-macro "edmacro" "\
Edit the most recently defined keyboard macro.
-(fn &optional PREFIX)" t nil)
+(fn &optional PREFIX)" t)
(autoload 'edit-named-kbd-macro "edmacro" "\
Edit a keyboard macro which has been given a name by `name-last-kbd-macro'.
-(fn &optional PREFIX)" t nil)
+(fn &optional PREFIX)" t)
(autoload 'read-kbd-macro "edmacro" "\
Read the region as a keyboard macro definition.
The region is interpreted as spelled-out keystrokes, e.g., \"M-x abc RET\".
@@ -8978,7 +8953,7 @@ the result is returned rather than being installed as the current macro.
The result will be a string if possible, otherwise an event vector.
Second argument NEED-VECTOR means to return an event vector always.
-(fn START &optional END)" t nil)
+(fn START &optional END)" t)
(autoload 'format-kbd-macro "edmacro" "\
Return the keyboard macro MACRO as a human-readable string.
This string is suitable for passing to `read-kbd-macro'.
@@ -8986,7 +8961,7 @@ Second argument VERBOSE means to put one command per line with comments.
If VERBOSE is `1', put everything on one line. If VERBOSE is omitted
or nil, use a compact 80-column format.
-(fn &optional MACRO VERBOSE)" nil nil)
+(fn &optional MACRO VERBOSE)")
(register-definition-prefixes "edmacro" '("edmacro-"))
@@ -8997,9 +8972,9 @@ Set scroll margins.
Argument TOP is the top margin in number of lines or percent of window.
Argument BOTTOM is the bottom margin in number of lines or percent of window.
-(fn TOP BOTTOM)" t nil)
+(fn TOP BOTTOM)" t)
(autoload 'edt-emulation-on "edt" "\
-Turn on EDT Emulation." t nil)
+Turn on EDT Emulation." t)
(register-definition-prefixes "edt" '("edt-"))
@@ -9049,17 +9024,29 @@ When the user exits (with `electric-help-exit', or otherwise), the help
buffer's window disappears (i.e., we use `save-window-excursion'), and
BUFFER is put back into its original major mode.
-(fn THUNK &optional BUFFER NOERASE MINHEIGHT)" nil nil)
+(fn THUNK &optional BUFFER NOERASE MINHEIGHT)")
(autoload 'electric-helpify "ehelp" "\
-(fn FUN &optional NAME)" nil nil)
+(fn FUN &optional NAME)")
(register-definition-prefixes "ehelp" '("ehelp-" "electric-"))
;;; Generated autoloads from emacs-lisp/eieio.el
(push (purecopy '(eieio 1 4)) package--builtin-versions)
+(autoload 'make-instance "eieio" "\
+Make a new instance of CLASS based on INITARGS.
+For example:
+
+ (make-instance \\='foo)
+
+INITARGS is a property list with keywords based on the `:initarg'
+for each slot. For example:
+
+ (make-instance \\='foo :slot1 value1 :slotN valueN)
+
+(fn CLASS &rest INITARGS)")
(register-definition-prefixes "eieio" '("child-of-class-p" "defclass" "eieio-" "find-class" "obj" "oref" "oset" "same-class-p" "set-slot-value" "slot-" "with-slots"))
@@ -9079,7 +9066,7 @@ This function creates a mock-class for CNAME and adds it into
SUPERCLASSES as children.
It creates an autoload function for CNAME's constructor.
-(fn CNAME SUPERCLASSES FILENAME DOC)" nil nil)
+(fn CNAME SUPERCLASSES FILENAME DOC)")
(register-definition-prefixes "eieio-core" '("class-" "eieio-" "inconsistent-class-hierarchy" "invalid-slot-" "unbound-slot"))
@@ -9089,7 +9076,7 @@ It creates an autoload function for CNAME's constructor.
Customize OBJ in a custom buffer.
Optional argument GROUP is the sub-group of slots to display.
-(fn OBJ &optional GROUP)" nil nil)
+(fn OBJ &optional GROUP)")
(register-definition-prefixes "eieio-custom" '("eieio-"))
@@ -9105,12 +9092,12 @@ Create an object browser window to show all objects.
If optional ROOT-CLASS, then start with that, otherwise start with
variable `eieio-default-superclass'.
-(fn &optional ROOT-CLASS)" t nil)
+(fn &optional ROOT-CLASS)" t)
(define-obsolete-function-alias 'eieio-help-class 'cl--describe-class "25.1")
(autoload 'eieio-help-constructor "eieio-opt" "\
Describe CTR if it is a class constructor.
-(fn CTR)" nil nil)
+(fn CTR)")
(make-obsolete 'eieio-help-constructor '"use `describe-function' or `cl--describe-class'." "29.1")
(register-definition-prefixes "eieio-opt" '("eieio-"))
@@ -9127,12 +9114,12 @@ Describe CTR if it is a class constructor.
;;; Generated autoloads from cedet/semantic/bovine/el.el
-(register-definition-prefixes "semantic/bovine/el" '("emacs-lisp-mode" "semantic-"))
+(register-definition-prefixes "semantic/bovine/el" '("semantic-"))
;;; Generated autoloads from emacs-lisp/eldoc.el
-(push (purecopy '(eldoc 1 12 0)) package--builtin-versions)
+(push (purecopy '(eldoc 1 13 0)) package--builtin-versions)
;;; Generated autoloads from elec-pair.el
@@ -9170,7 +9157,7 @@ evaluate `(default-value \\='electric-pair-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'electric-pair-local-mode "elec-pair" "\
Toggle `electric-pair-mode' only in this buffer.
@@ -9190,7 +9177,7 @@ evaluate `(buffer-local-value \\='electric-pair-mode
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "elec-pair" '("electric-pair-"))
@@ -9219,7 +9206,7 @@ evaluate `elide-head-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'elide-head "elide-head" "\
Hide header material in buffer according to `elide-head-headers-to-hide'.
@@ -9228,7 +9215,7 @@ an elided material again.
This is suitable as an entry on `find-file-hook' or appropriate mode hooks.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(make-obsolete 'elide-head 'elide-head-mode "29.1")
(register-definition-prefixes "elide-head" '("elide-head-"))
@@ -9238,24 +9225,24 @@ This is suitable as an entry on `find-file-hook' or appropriate mode hooks.
(autoload 'elint-file "elint" "\
Lint the file FILE.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'elint-directory "elint" "\
Lint all the .el files in DIRECTORY.
A complicated directory may require a lot of memory.
-(fn DIRECTORY)" t nil)
+(fn DIRECTORY)" t)
(autoload 'elint-current-buffer "elint" "\
Lint the current buffer.
-If necessary, this first calls `elint-initialize'." t nil)
+If necessary, this first calls `elint-initialize'." t)
(autoload 'elint-defun "elint" "\
Lint the function at point.
-If necessary, this first calls `elint-initialize'." t nil)
+If necessary, this first calls `elint-initialize'." t)
(autoload 'elint-initialize "elint" "\
Initialize elint.
If elint is already initialized, this does nothing, unless
optional prefix argument REINIT is non-nil.
-(fn &optional REINIT)" t nil)
+(fn &optional REINIT)" t)
(register-definition-prefixes "elint" '("elint-"))
@@ -9265,14 +9252,14 @@ optional prefix argument REINIT is non-nil.
Instrument FUNSYM for profiling.
FUNSYM must be a symbol of a defined function.
-(fn FUNSYM)" t nil)
+(fn FUNSYM)" t)
(autoload 'elp-instrument-list "elp" "\
Instrument, for profiling, all functions in `elp-function-list'.
Use optional LIST if provided instead.
If called interactively, prompt for LIST in the minibuffer;
type \"nil\" to use `elp-function-list'.
-(fn &optional LIST)" t nil)
+(fn &optional LIST)" t)
(autoload 'elp-instrument-package "elp" "\
Instrument for profiling, all functions which start with PREFIX.
For example, to instrument all ELP functions, do the following:
@@ -9284,12 +9271,12 @@ instrumented. If you run this function, and then later load
further functions that start with PREFIX, they will not be
instrumented automatically.
-(fn PREFIX)" t nil)
+(fn PREFIX)" t)
(autoload 'elp-results "elp" "\
Display current profiling results.
If `elp-reset-after-results' is non-nil, then current profiling
information for all instrumented functions is reset after results are
-displayed." t nil)
+displayed." t)
(register-definition-prefixes "elp" '("elp-"))
@@ -9325,7 +9312,7 @@ displayed." t nil)
;;; Generated autoloads from eshell/em-extpipe.el
-(register-definition-prefixes "em-extpipe" '("em-extpipe--or-with-catch" "eshell-"))
+(register-definition-prefixes "em-extpipe" '("eshell-"))
;;; Generated autoloads from eshell/em-glob.el
@@ -9380,7 +9367,7 @@ displayed." t nil)
;;; Generated autoloads from eshell/em-unix.el
-(register-definition-prefixes "em-unix" '("eshell" "nil-blank-string"))
+(register-definition-prefixes "em-unix" '("eshell"))
;;; Generated autoloads from eshell/em-xtra.el
@@ -9393,6 +9380,17 @@ displayed." t nil)
(register-definition-prefixes "ede/emacs" '("ede-emacs-"))
+;;; Generated autoloads from textmodes/emacs-authors-mode.el
+
+(autoload 'emacs-authors-mode "emacs-authors-mode" "\
+Major mode for viewing \"etc/AUTHORS\" from the Emacs distribution.
+Provides some basic font locking and not much else.
+
+(fn)" t)
+(define-obsolete-function-alias 'etc-authors-mode #'emacs-authors-mode "29.1")
+(register-definition-prefixes "emacs-authors-mode" '("emacs-authors-" "etc-authors-"))
+
+
;;; Generated autoloads from emacs-lock.el
(autoload 'emacs-lock-mode "emacs-lock" "\
@@ -9416,7 +9414,7 @@ Other values are interpreted as usual.
See also `emacs-lock-unlockable-modes', which exempts buffers under
some major modes from being locked under some circumstances.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "emacs-lock" '("emacs-lock-"))
@@ -9425,11 +9423,11 @@ some major modes from being locked under some circumstances.
(autoload 'emacs-news-mode "emacs-news-mode" "\
Major mode for editing the Emacs NEWS file.
-(fn)" t nil)
+(fn)" t)
(autoload 'emacs-news-view-mode "emacs-news-mode" "\
Major mode for viewing the Emacs NEWS file.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "emacs-news-mode" '("emacs-news-"))
@@ -9443,7 +9441,7 @@ Already submitted bugs can be found in the Emacs bug tracker:
https://debbugs.gnu.org/cgi/pkgreport.cgi?package=emacs;max-bugs=100;base-order=1;bug-rev=1
-(fn TOPIC &optional UNUSED)" t nil)
+(fn TOPIC &optional UNUSED)" t)
(set-advertised-calling-convention 'report-emacs-bug '(topic) '"24.5")
(autoload 'submit-emacs-patch "emacsbug" "\
Send an Emacs patch to the Emacs maintainers.
@@ -9451,7 +9449,7 @@ Interactively, you will be prompted for SUBJECT and a patch FILE
name (which will be attached to the mail). You will end up in a
Message buffer where you can explain more about the patch.
-(fn SUBJECT FILE)" t nil)
+(fn SUBJECT FILE)" t)
(register-definition-prefixes "emacsbug" '("emacs-bug--system-description" "report-emacs-bug-"))
@@ -9460,60 +9458,60 @@ Message buffer where you can explain more about the patch.
(autoload 'emerge-files "emerge" "\
Run Emerge on two files FILE-A and FILE-B.
-(fn ARG FILE-A FILE-B FILE-OUT &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
+(fn ARG FILE-A FILE-B FILE-OUT &optional STARTUP-HOOKS QUIT-HOOKS)" t)
(autoload 'emerge-files-with-ancestor "emerge" "\
Run Emerge on two files, giving another file as the ancestor.
-(fn ARG FILE-A FILE-B FILE-ANCESTOR FILE-OUT &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
+(fn ARG FILE-A FILE-B FILE-ANCESTOR FILE-OUT &optional STARTUP-HOOKS QUIT-HOOKS)" t)
(autoload 'emerge-buffers "emerge" "\
Run Emerge on two buffers BUFFER-A and BUFFER-B.
-(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
+(fn BUFFER-A BUFFER-B &optional STARTUP-HOOKS QUIT-HOOKS)" t)
(autoload 'emerge-buffers-with-ancestor "emerge" "\
Run Emerge on two buffers, giving another buffer as the ancestor.
-(fn BUFFER-A BUFFER-B BUFFER-ANCESTOR &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
-(autoload 'emerge-files-command "emerge" nil nil nil)
-(autoload 'emerge-files-with-ancestor-command "emerge" nil nil nil)
+(fn BUFFER-A BUFFER-B BUFFER-ANCESTOR &optional STARTUP-HOOKS QUIT-HOOKS)" t)
+(autoload 'emerge-files-command "emerge")
+(autoload 'emerge-files-with-ancestor-command "emerge")
(autoload 'emerge-files-remote "emerge" "\
-(fn FILE-A FILE-B FILE-OUT)" nil nil)
+(fn FILE-A FILE-B FILE-OUT)")
(autoload 'emerge-files-with-ancestor-remote "emerge" "\
-(fn FILE-A FILE-B FILE-ANC FILE-OUT)" nil nil)
+(fn FILE-A FILE-B FILE-ANC FILE-OUT)")
(autoload 'emerge-revisions "emerge" "\
Emerge two RCS revisions of a file.
-(fn ARG FILE REVISION-A REVISION-B &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
+(fn ARG FILE REVISION-A REVISION-B &optional STARTUP-HOOKS QUIT-HOOKS)" t)
(autoload 'emerge-revisions-with-ancestor "emerge" "\
Emerge two RCS revisions of a file, with another revision as ancestor.
-(fn ARG FILE REVISION-A REVISION-B ANCESTOR &optional STARTUP-HOOKS QUIT-HOOKS)" t nil)
+(fn ARG FILE REVISION-A REVISION-B ANCESTOR &optional STARTUP-HOOKS QUIT-HOOKS)" t)
(autoload 'emerge-merge-directories "emerge" "\
-(fn A-DIR B-DIR ANCESTOR-DIR OUTPUT-DIR)" t nil)
+(fn A-DIR B-DIR ANCESTOR-DIR OUTPUT-DIR)" t)
(register-definition-prefixes "emerge" '("emerge-"))
;;; Generated autoloads from international/emoji.el
(autoload 'emoji-insert "emoji" "\
-Choose and insert an emoji glyph." t nil)
+Choose and insert an emoji glyph." t)
(autoload 'emoji-recent "emoji" "\
-Choose and insert one of the recently-used emoji glyphs." t nil)
+Choose and insert one of the recently-used emoji glyphs." t)
(autoload 'emoji-search "emoji" "\
Choose and insert an emoji glyph by typing its Unicode name.
This command prompts for an emoji name, with completion, and
inserts it. It recognizes the Unicode Standard names of emoji,
-and also consults the `emoji-alternate-names' alist." t nil)
+and also consults the `emoji-alternate-names' alist." t)
(autoload 'emoji-list "emoji" "\
List emojis and insert the one that's selected.
Select the emoji by typing \\<emoji-list-mode-map>\\[emoji-list-select] on its picture.
The glyph will be inserted into the buffer that was current
-when the command was invoked." t nil)
+when the command was invoked." t)
(autoload 'emoji-describe "emoji" "\
Display the name of the grapheme cluster composed from GLYPH.
GLYPH should be a string of one or more characters which together
@@ -9523,14 +9521,14 @@ could also be any character, not just emoji).
If called from Lisp, return the name as a string; return nil if
the name is not known.
-(fn GLYPH &optional INTERACTIVE)" t nil)
+(fn GLYPH &optional INTERACTIVE)" t)
(autoload 'emoji-zoom-increase "emoji" "\
Increase the size of the character under point.
FACTOR is the multiplication factor for the size.
-(fn &optional FACTOR)" t nil)
+(fn &optional FACTOR)" t)
(autoload 'emoji-zoom-decrease "emoji" "\
-Decrease the size of the character under point." t nil)
+Decrease the size of the character under point." t)
(register-definition-prefixes "emoji" '("emoji-"))
@@ -9565,15 +9563,15 @@ evaluate `enriched-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'enriched-encode "enriched" "\
-(fn FROM TO ORIG-BUF)" nil nil)
+(fn FROM TO ORIG-BUF)")
(autoload 'enriched-decode "enriched" "\
-(fn FROM TO)" nil nil)
+(fn FROM TO)")
(register-definition-prefixes "enriched" '("enriched-"))
@@ -9582,11 +9580,11 @@ it is disabled.
(autoload 'epa-list-keys "epa" "\
List all keys matched with NAME from the public keyring.
-(fn &optional NAME)" t nil)
+(fn &optional NAME)" t)
(autoload 'epa-list-secret-keys "epa" "\
List all keys matched with NAME from the private keyring.
-(fn &optional NAME)" t nil)
+(fn &optional NAME)" t)
(autoload 'epa-select-keys "epa" "\
Display a user's keyring and ask him to select keys.
CONTEXT is an `epg-context'.
@@ -9595,24 +9593,24 @@ NAMES is a list of strings to be matched with keys. If it is nil, all
the keys are listed.
If SECRET is non-nil, list secret keys instead of public keys.
-(fn CONTEXT PROMPT &optional NAMES SECRET)" nil nil)
+(fn CONTEXT PROMPT &optional NAMES SECRET)")
(autoload 'epa-decrypt-file "epa" "\
Decrypt DECRYPT-FILE into PLAIN-FILE.
If you do not specify PLAIN-FILE, this functions prompts for the value to use.
-(fn DECRYPT-FILE &optional PLAIN-FILE)" t nil)
+(fn DECRYPT-FILE &optional PLAIN-FILE)" t)
(autoload 'epa-verify-file "epa" "\
Verify FILE.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'epa-sign-file "epa" "\
Sign FILE by SIGNERS keys selected.
-(fn FILE SIGNERS MODE)" t nil)
+(fn FILE SIGNERS MODE)" t)
(autoload 'epa-encrypt-file "epa" "\
Encrypt FILE for RECIPIENTS.
-(fn FILE RECIPIENTS)" t nil)
+(fn FILE RECIPIENTS)" t)
(autoload 'epa-decrypt-region "epa" "\
Decrypt the current region between START and END.
@@ -9636,14 +9634,14 @@ For example:
(epg-decrypt-string context (buffer-substring start end))
\\='utf-8))
-(fn START END &optional MAKE-BUFFER-FUNCTION)" t nil)
+(fn START END &optional MAKE-BUFFER-FUNCTION)" t)
(autoload 'epa-decrypt-armor-in-region "epa" "\
Decrypt OpenPGP armors in the current region between START and END.
Don't use this command in Lisp programs!
See the reason described in the `epa-decrypt-region' documentation.
-(fn START END)" t nil)
+(fn START END)" t)
(function-put 'epa-decrypt-armor-in-region 'interactive-only 't)
(autoload 'epa-verify-region "epa" "\
Verify the current region between START and END.
@@ -9663,7 +9661,7 @@ For example:
(epg-verify-string context (buffer-substring start end))
\\='utf-8))
-(fn START END)" t nil)
+(fn START END)" t)
(function-put 'epa-verify-region 'interactive-only 't)
(autoload 'epa-verify-cleartext-in-region "epa" "\
Verify OpenPGP cleartext signed messages in current region from START to END.
@@ -9671,7 +9669,7 @@ Verify OpenPGP cleartext signed messages in current region from START to END.
Don't use this command in Lisp programs!
See the reason described in the `epa-verify-region' documentation.
-(fn START END)" t nil)
+(fn START END)" t)
(function-put 'epa-verify-cleartext-in-region 'interactive-only 't)
(autoload 'epa-sign-region "epa" "\
Sign the current region between START and END by SIGNERS keys selected.
@@ -9690,7 +9688,7 @@ For example:
context
(encode-coding-string (buffer-substring start end) \\='utf-8)))
-(fn START END SIGNERS MODE)" t nil)
+(fn START END SIGNERS MODE)" t)
(function-put 'epa-sign-region 'interactive-only 't)
(autoload 'epa-encrypt-region "epa" "\
Encrypt the current region between START and END for RECIPIENTS.
@@ -9710,45 +9708,45 @@ For example:
(encode-coding-string (buffer-substring start end) \\='utf-8)
nil))
-(fn START END RECIPIENTS SIGN SIGNERS)" t nil)
+(fn START END RECIPIENTS SIGN SIGNERS)" t)
(function-put 'epa-encrypt-region 'interactive-only 't)
(autoload 'epa-delete-keys "epa" "\
Delete selected KEYS.
-(fn KEYS &optional ALLOW-SECRET)" t nil)
+(fn KEYS &optional ALLOW-SECRET)" t)
(autoload 'epa-import-keys "epa" "\
Import keys from FILE.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'epa-import-keys-region "epa" "\
Import keys from the region.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'epa-import-armor-in-region "epa" "\
Import keys in the OpenPGP armor format in the current region from START to END.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'epa-export-keys "epa" "\
Export selected KEYS to FILE.
-(fn KEYS FILE)" t nil)
+(fn KEYS FILE)" t)
(autoload 'epa-insert-keys "epa" "\
Insert selected KEYS after the point.
-(fn KEYS)" t nil)
+(fn KEYS)" t)
(register-definition-prefixes "epa" '("epa-"))
;;; Generated autoloads from epa-dired.el
(autoload 'epa-dired-do-decrypt "epa-dired" "\
-Decrypt marked files." t nil)
+Decrypt marked files." t)
(autoload 'epa-dired-do-verify "epa-dired" "\
-Verify marked files." t nil)
+Verify marked files." t)
(autoload 'epa-dired-do-sign "epa-dired" "\
-Sign marked files." t nil)
+Sign marked files." t)
(autoload 'epa-dired-do-encrypt "epa-dired" "\
-Encrypt marked files." t nil)
+Encrypt marked files." t)
;;; Generated autoloads from epa-file.el
@@ -9756,9 +9754,9 @@ Encrypt marked files." t nil)
(autoload 'epa-file-handler "epa-file" "\
-(fn OPERATION &rest ARGS)" nil nil)
-(autoload 'epa-file-enable "epa-file" nil t nil)
-(autoload 'epa-file-disable "epa-file" nil t nil)
+(fn OPERATION &rest ARGS)")
+(autoload 'epa-file-enable "epa-file" nil t)
+(autoload 'epa-file-disable "epa-file" nil t)
(register-definition-prefixes "epa-file" '("epa-"))
@@ -9775,7 +9773,7 @@ exact matches.
Note that the request may fail if the query is not specific
enough, since keyservers have strict timeout settings.
-(fn QUERY EXACT)" t nil)
+(fn QUERY EXACT)" t)
(register-definition-prefixes "epa-ks" '("epa-k"))
@@ -9798,14 +9796,14 @@ evaluate `epa-mail-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'epa-mail-decrypt "epa-mail" "\
Decrypt OpenPGP armors in the current buffer.
-The buffer is expected to contain a mail message." t nil)
+The buffer is expected to contain a mail message." t)
(function-put 'epa-mail-decrypt 'interactive-only 't)
(autoload 'epa-mail-verify "epa-mail" "\
Verify OpenPGP cleartext signed messages in the current buffer.
-The buffer is expected to contain a mail message." t nil)
+The buffer is expected to contain a mail message." t)
(function-put 'epa-mail-verify 'interactive-only 't)
(autoload 'epa-mail-sign "epa-mail" "\
Sign the current buffer.
@@ -9814,7 +9812,7 @@ performed with your default key.
With prefix argument, asks you to select interactively the key to
use from your key ring.
-(fn START END SIGNERS MODE)" t nil)
+(fn START END SIGNERS MODE)" t)
(function-put 'epa-mail-sign 'interactive-only 't)
(autoload 'epa-mail-encrypt "epa-mail" "\
Encrypt the outgoing mail message in the current buffer.
@@ -9829,10 +9827,10 @@ or nil meaning use the defaults.
SIGNERS is a list of keys to sign the message with.
-(fn &optional RECIPIENTS SIGNERS)" t nil)
+(fn &optional RECIPIENTS SIGNERS)" t)
(autoload 'epa-mail-import-keys "epa-mail" "\
Import keys in the OpenPGP armor format in the current buffer.
-The buffer is expected to contain a mail message." t nil)
+The buffer is expected to contain a mail message." t)
(function-put 'epa-mail-import-keys 'interactive-only 't)
(defvar epa-global-mail-mode nil "\
Non-nil if Epa-Global-Mail mode is enabled.
@@ -9859,7 +9857,7 @@ evaluate `(default-value \\='epa-global-mail-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "epa-mail" '("epa-mail-"))
@@ -9869,7 +9867,7 @@ it is disabled.
(autoload 'epg-make-context "epg" "\
Return a context object.
-(fn &optional PROTOCOL ARMOR TEXTMODE INCLUDE-CERTS CIPHER-ALGORITHM DIGEST-ALGORITHM COMPRESS-ALGORITHM)" nil nil)
+(fn &optional PROTOCOL ARMOR TEXTMODE INCLUDE-CERTS CIPHER-ALGORITHM DIGEST-ALGORITHM COMPRESS-ALGORITHM)")
(register-definition-prefixes "epg" '("epg-"))
@@ -9886,9 +9884,9 @@ Then it walks through PROGRAM-ALIST or
Otherwise, it tries the programs listed in the entry until the
version requirement is met.
-(fn PROTOCOL &optional NO-CACHE PROGRAM-ALIST)" nil nil)
+(fn PROTOCOL &optional NO-CACHE PROGRAM-ALIST)")
(autoload 'epg-configuration "epg-config" "\
-Return a list of internal configuration parameters of `epg-gpg-program'." nil nil)
+Return a list of internal configuration parameters of `epg-gpg-program'.")
(make-obsolete 'epg-configuration 'epg-find-configuration "25.1")
(autoload 'epg-check-configuration "epg-config" "\
Verify that a sufficient version of GnuPG is installed.
@@ -9898,11 +9896,11 @@ REQ-VERSIONS should be a list with elements of the form (MIN
semi-open range of acceptable versions. REQ-VERSIONS may also be
a single minimum version string.
-(fn CONFIG &optional REQ-VERSIONS)" nil nil)
+(fn CONFIG &optional REQ-VERSIONS)")
(autoload 'epg-expand-group "epg-config" "\
Look at CONFIG and try to expand GROUP.
-(fn CONFIG GROUP)" nil nil)
+(fn CONFIG GROUP)")
(register-definition-prefixes "epg-config" '("epg-"))
@@ -9910,7 +9908,7 @@ Look at CONFIG and try to expand GROUP.
(push (purecopy '(erc 5 4 1)) package--builtin-versions)
(autoload 'erc-select-read-args "erc" "\
-Prompt the user for values of nick, server, port, and password." nil nil)
+Prompt the user for values of nick, server, port, and password.")
(autoload 'erc "erc" "\
ERC is a powerful, modular, and extensible IRC client.
This function is the main entry point for ERC.
@@ -9938,7 +9936,7 @@ When present, ID should be an opaque object used to identify the
connection unequivocally. This is rarely needed and not available
interactively.
-(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK (erc-compute-nick)) (USER (erc-compute-user)) PASSWORD (FULL-NAME (erc-compute-full-name)) ID)" t nil)
+(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK (erc-compute-nick)) (USER (erc-compute-user)) PASSWORD (FULL-NAME (erc-compute-full-name)) ID)" '((erc-select-read-args)))
(defalias 'erc-select #'erc)
(autoload 'erc-tls "erc" "\
ERC is a powerful, modular, and extensible IRC client.
@@ -9985,13 +9983,13 @@ symbol composed of letters from the Latin alphabet.) This option is
generally unneeded, however. See info node `(erc) Connecting' for use
cases. Not available interactively.
-(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK (erc-compute-nick)) (USER (erc-compute-user)) PASSWORD (FULL-NAME (erc-compute-full-name)) CLIENT-CERTIFICATE ID)" t nil)
+(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK (erc-compute-nick)) (USER (erc-compute-user)) PASSWORD (FULL-NAME (erc-compute-full-name)) CLIENT-CERTIFICATE ID)" '((let ((erc-default-port erc-default-port-tls)) (erc-select-read-args))))
(autoload 'erc-handle-irc-url "erc" "\
Use ERC to IRC on HOST:PORT in CHANNEL as USER with PASSWORD.
If ERC is already connected to HOST:PORT, simply /join CHANNEL.
Otherwise, connect to HOST:PORT as USER and /join CHANNEL.
-(fn HOST PORT CHANNEL USER PASSWORD)" nil nil)
+(fn HOST PORT CHANNEL USER PASSWORD)")
(register-definition-prefixes "erc" '("define-erc-module" "erc-"))
@@ -10100,10 +10098,10 @@ Otherwise, connect to HOST:PORT as USER and /join CHANNEL.
(autoload 'erc-determine-network "erc-networks" "\
Return the name of the network or \"Unknown\" as a symbol.
Use the server parameter NETWORK if provided, otherwise parse the
-server name and search for a match in `erc-networks-alist'." nil nil)
+server name and search for a match in `erc-networks-alist'.")
(make-obsolete 'erc-determine-network '"maybe see `erc-networks--determine'" "29.1")
(autoload 'erc-server-select "erc-networks" "\
-Interactively select a server to connect to using `erc-server-alist'." t nil)
+Interactively select a server to connect to using `erc-server-alist'." t)
(register-definition-prefixes "erc-networks" '("erc-"))
@@ -10201,9 +10199,7 @@ it has to be wrapped in `(eval (quote ...))'.
If NAME is already defined as a test and Emacs is running
in batch mode, an error is signalled.
-(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] BODY...)" nil t)
-(function-put 'ert-deftest 'doc-string-elt 3)
-(function-put 'ert-deftest 'lisp-indent-function 2)
+(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] BODY...)" nil 'macro)
(autoload 'ert-run-tests-batch "ert" "\
Run the tests specified by SELECTOR, printing results to the terminal.
@@ -10214,7 +10210,7 @@ ert-run-tests-batch-and-exit\" useful.
Returns the stats object.
-(fn &optional SELECTOR)" nil nil)
+(fn &optional SELECTOR)")
(autoload 'ert-run-tests-batch-and-exit "ert" "\
Like `ert-run-tests-batch', but exits Emacs when done.
@@ -10223,25 +10219,25 @@ on unexpected results, or 2 if the tool detected an error outside
of the tests (e.g. invalid SELECTOR or bug in the code that runs
the tests).
-(fn &optional SELECTOR)" nil nil)
+(fn &optional SELECTOR)")
(autoload 'ert-run-tests-interactively "ert" "\
Run the tests specified by SELECTOR and display the results in a buffer.
SELECTOR works as described in `ert-select-tests'.
-(fn SELECTOR)" t nil)
+(fn SELECTOR)" t)
(defalias 'ert #'ert-run-tests-interactively)
(autoload 'ert-describe-test "ert" "\
Display the documentation for TEST-OR-TEST-NAME (a symbol or ert-test).
-(fn TEST-OR-TEST-NAME)" t nil)
+(fn TEST-OR-TEST-NAME)" t)
(register-definition-prefixes "ert" '("ert-"))
;;; Generated autoloads from emacs-lisp/ert-x.el
(autoload 'ert-kill-all-test-buffers "ert-x" "\
-Kill all test buffers that are still live." t nil)
+Kill all test buffers that are still live." t)
(register-definition-prefixes "ert-x" '("ert-"))
@@ -10253,7 +10249,7 @@ This mode mainly provides some font locking.
\\{erts-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "erts-mode" '("erts-"))
@@ -10282,11 +10278,11 @@ This mode mainly provides some font locking.
(autoload 'eshell-mode "esh-mode" "\
Emacs shell interactive mode.
-(fn)" t nil)
+(fn)" t)
(autoload 'eshell-bookmark-jump "esh-mode" "\
Default bookmark handler for Eshell buffers.
-(fn BOOKMARK)" nil nil)
+(fn BOOKMARK)")
(register-definition-prefixes "esh-mode" '("eshell"))
@@ -10335,12 +10331,12 @@ value of `eshell-buffer-name', which see.
Eshell is a shell-like command interpreter. For more
information on Eshell, see Info node `(eshell)Top'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'eshell-command "eshell" "\
Execute the Eshell command string COMMAND.
With prefix ARG, insert output into the current buffer at point.
-(fn &optional COMMAND ARG)" t nil)
+(fn &optional COMMAND ARG)" t)
(autoload 'eshell-command-result "eshell" "\
Execute the given Eshell COMMAND, and return the result.
The result might be any Lisp object.
@@ -10348,7 +10344,7 @@ If STATUS-VAR is a symbol, it will be set to the exit status of the
command. This is the only way to determine whether the value returned
corresponding to a successful execution.
-(fn COMMAND &optional STATUS-VAR)" nil nil)
+(fn COMMAND &optional STATUS-VAR)")
(register-definition-prefixes "eshell" '("eshell-"))
@@ -10399,7 +10395,7 @@ Otherwise, `find-tag-default' is used.")
(autoload 'tags-table-mode "etags" "\
Major mode for tags table file buffers.
-(fn)" t nil)
+(fn)" t)
(autoload 'visit-tags-table "etags" "\
Tell tags commands to use tags table file FILE.
FILE should be the name of a file created with the `etags' program.
@@ -10412,7 +10408,7 @@ When you find a tag with \\[find-tag], the buffer it finds the tag
in is given a local value of this variable which is the name of the tags
file the tag was in.
-(fn FILE &optional LOCAL)" t nil)
+(fn FILE &optional LOCAL)" t)
(autoload 'visit-tags-table-buffer "etags" "\
Select the buffer containing the current tags table.
Optional arg CONT specifies which tags table to visit.
@@ -10426,13 +10422,13 @@ Optional second arg CBUF, if non-nil, specifies the initial buffer,
which is important if that buffer has a local value of `tags-file-name'.
Returns t if it visits a tags table, or nil if there are no more in the list.
-(fn &optional CONT CBUF)" nil nil)
+(fn &optional CONT CBUF)")
(autoload 'tags-table-files "etags" "\
Return a list of files in the current tags table.
Assumes the tags table is the current buffer. The file names are returned
as they appeared in the `etags' command that created the table, usually
-without directory names." nil nil)
-(autoload 'tags-lazy-completion-table "etags" nil nil nil)
+without directory names.")
+(autoload 'tags-lazy-completion-table "etags")
(defun tags-completion-at-point-function ()
(if (or tags-table-list tags-file-name)
(progn
@@ -10458,7 +10454,7 @@ Contrast this with the ring of marks gone to by the command.
See documentation of variable `tags-file-name'.
-(fn TAGNAME &optional NEXT-P REGEXP-P)" t nil)
+(fn TAGNAME &optional NEXT-P REGEXP-P)" t)
(autoload 'find-tag "etags" "\
Find tag (in current tags table) whose name contains TAGNAME.
Select the buffer containing the tag's definition, and move point there.
@@ -10478,7 +10474,7 @@ Contrast this with the ring of marks gone to by the command.
See documentation of variable `tags-file-name'.
-(fn TAGNAME &optional NEXT-P REGEXP-P)" t nil)
+(fn TAGNAME &optional NEXT-P REGEXP-P)" t)
(make-obsolete 'find-tag 'xref-find-definitions "25.1")
(autoload 'find-tag-other-window "etags" "\
Find tag (in current tags table) whose name contains TAGNAME.
@@ -10500,7 +10496,7 @@ Contrast this with the ring of marks gone to by the command.
See documentation of variable `tags-file-name'.
-(fn TAGNAME &optional NEXT-P REGEXP-P)" t nil)
+(fn TAGNAME &optional NEXT-P REGEXP-P)" t)
(make-obsolete 'find-tag-other-window 'xref-find-definitions-other-window "25.1")
(autoload 'find-tag-other-frame "etags" "\
Find tag (in current tags table) whose name contains TAGNAME.
@@ -10522,7 +10518,7 @@ Contrast this with the ring of marks gone to by the command.
See documentation of variable `tags-file-name'.
-(fn TAGNAME &optional NEXT-P)" t nil)
+(fn TAGNAME &optional NEXT-P)" t)
(make-obsolete 'find-tag-other-frame 'xref-find-definitions-other-frame "25.1")
(autoload 'find-tag-regexp "etags" "\
Find tag (in current tags table) whose name matches REGEXP.
@@ -10542,7 +10538,7 @@ Contrast this with the ring of marks gone to by the command.
See documentation of variable `tags-file-name'.
-(fn REGEXP &optional NEXT-P OTHER-WINDOW)" t nil)
+(fn REGEXP &optional NEXT-P OTHER-WINDOW)" t)
(make-obsolete 'find-tag-regexp 'xref-find-apropos "25.1")
(defalias 'pop-tag-mark 'xref-go-back)
(defalias 'next-file 'tags-next-file)
@@ -10559,13 +10555,13 @@ Non-nil second argument NOVISIT means use a temporary buffer
Value is nil if the file was already visited;
if the file was newly read in, the value is the filename.
-(fn &optional INITIALIZE NOVISIT)" t nil)
+(fn &optional INITIALIZE NOVISIT)" t)
(autoload 'tags-loop-continue "etags" "\
Continue last \\[tags-search] or \\[tags-query-replace] command.
Used noninteractively with non-nil argument to begin such a command (the
argument is passed to `next-file', which see).
-(fn &optional FIRST-TIME)" t nil)
+(fn &optional FIRST-TIME)" t)
(make-obsolete 'tags-loop-continue 'fileloop-continue "27.1")
(autoload 'tags-search "etags" "\
Search through all files listed in tags table for match for REGEXP.
@@ -10577,7 +10573,7 @@ files to search. The search will be restricted to these files.
Also see the documentation of the `tags-file-name' variable.
-(fn REGEXP &optional FILES)" t nil)
+(fn REGEXP &optional FILES)" t)
(autoload 'tags-query-replace "etags" "\
Do `query-replace-regexp' of FROM with TO on all files listed in tags table.
Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
@@ -10591,7 +10587,7 @@ type \\[help-command] at that time.
For non-interactive use, this is superseded by `fileloop-initialize-replace'.
-(fn FROM TO &optional DELIMITED FILES)" t nil)
+(fn FROM TO &optional DELIMITED FILES)" t)
(set-advertised-calling-convention 'tags-query-replace '(from to &optional delimited) '"27.1")
(autoload 'list-tags "etags" "\
Display list of tags in file FILE.
@@ -10601,38 +10597,28 @@ usually without a directory specification. If called
interactively, FILE defaults to the file name of the current
buffer.
-(fn FILE &optional NEXT-MATCH)" t nil)
+(fn FILE &optional NEXT-MATCH)" t)
(autoload 'tags-apropos "etags" "\
Display list of all tags in tags table REGEXP matches.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(make-obsolete 'tags-apropos 'xref-find-apropos "25.1")
(autoload 'select-tags-table "etags" "\
Select a tags table file from a menu of those you have already used.
The list of tags tables to select from is stored in `tags-table-set-list';
-see the doc of that variable if you want to add names to the list." t nil)
+see the doc of that variable if you want to add names to the list." t)
(autoload 'complete-tag "etags" "\
Perform tags completion on the text around point.
Completes to the set of names listed in the current tags table.
The string to complete is chosen in the same way as the default
-for \\[find-tag] (which see)." t nil)
-(autoload 'etags--xref-backend "etags" nil nil nil)
+for \\[find-tag] (which see)." t)
+(autoload 'etags--xref-backend "etags")
(register-definition-prefixes "etags" '("default-tags-table-function" "etags-" "file-of-tag" "find-tag-" "goto-tag-location-function" "initialize-new-tags-table" "last-tag" "list-tags-function" "select-tags-table-" "snarf-tag-function" "tag" "verify-tags-table-function"))
-;;; Generated autoloads from textmodes/etc-authors-mode.el
-
-(autoload 'etc-authors-mode "etc-authors-mode" "\
-Major mode for viewing \"etc/AUTHORS\" from the Emacs distribution.
-Provides some basic font locking and not much else.
-
-(fn)" t nil)
-(register-definition-prefixes "etc-authors-mode" '("etc-authors-"))
-
-
;;; Generated autoloads from language/ethio-util.el
-(autoload 'setup-ethiopic-environment-internal "ethio-util" nil nil nil)
+(autoload 'setup-ethiopic-environment-internal "ethio-util")
(autoload 'ethio-sera-to-fidel-buffer "ethio-util" "\
Convert the current buffer from SERA to FIDEL.
@@ -10649,7 +10635,7 @@ even if the buffer is read-only.
See also the descriptions of the variables
`ethio-use-colon-for-colon' and `ethio-use-three-dot-question'.
-(fn &optional SECONDARY FORCE)" t nil)
+(fn &optional SECONDARY FORCE)" t)
(autoload 'ethio-sera-to-fidel-region "ethio-util" "\
Convert the characters in region from SERA to FIDEL.
@@ -10666,13 +10652,13 @@ conversion even if the buffer is read-only.
See also the descriptions of the variables
`ethio-use-colon-for-colon' and `ethio-use-three-dot-question'.
-(fn BEGIN END &optional SECONDARY FORCE)" t nil)
+(fn BEGIN END &optional SECONDARY FORCE)" t)
(autoload 'ethio-sera-to-fidel-marker "ethio-util" "\
Convert the regions surrounded by \"<sera>\" and \"</sera>\" from SERA to FIDEL.
Assume that each region begins with `ethio-primary-language'.
The markers \"<sera>\" and \"</sera>\" themselves are not deleted.
-(fn &optional FORCE)" t nil)
+(fn &optional FORCE)" t)
(autoload 'ethio-fidel-to-sera-buffer "ethio-util" "\
Replace all the FIDEL characters in the current buffer to the SERA format.
The variable `ethio-primary-language' specifies the primary
@@ -10689,7 +10675,7 @@ See also the descriptions of the variables
`ethio-use-colon-for-colon', `ethio-use-three-dot-question',
`ethio-quote-vowel-always' and `ethio-numeric-reduction'.
-(fn &optional SECONDARY FORCE)" t nil)
+(fn &optional SECONDARY FORCE)" t)
(autoload 'ethio-fidel-to-sera-region "ethio-util" "\
Replace all the FIDEL characters in the region to the SERA format.
@@ -10707,14 +10693,14 @@ See also the descriptions of the variables
`ethio-use-colon-for-colon', `ethio-use-three-dot-question',
`ethio-quote-vowel-always' and `ethio-numeric-reduction'.
-(fn BEGIN END &optional SECONDARY FORCE)" t nil)
+(fn BEGIN END &optional SECONDARY FORCE)" t)
(autoload 'ethio-fidel-to-sera-marker "ethio-util" "\
Convert the regions surrounded by \"<sera>\" and \"</sera>\" from FIDEL to SERA.
The markers \"<sera>\" and \"</sera>\" themselves are not deleted.
-(fn &optional FORCE)" t nil)
+(fn &optional FORCE)" t)
(autoload 'ethio-modify-vowel "ethio-util" "\
-Modify the vowel of the FIDEL that is under the cursor." t nil)
+Modify the vowel of the FIDEL that is under the cursor." t)
(autoload 'ethio-replace-space "ethio-util" "\
Replace ASCII spaces with Ethiopic word separators in the region.
@@ -10728,15 +10714,15 @@ If CH = 3, with the Ethiopic colon-like word separator.
The 2nd and 3rd arguments BEGIN and END specify the region.
-(fn CH BEGIN END)" t nil)
+(fn CH BEGIN END)" t)
(autoload 'ethio-input-special-character "ethio-util" "\
This function is deprecated.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'ethio-fidel-to-tex-buffer "ethio-util" "\
-Convert each fidel characters in the current buffer into a fidel-tex command." t nil)
+Convert each fidel characters in the current buffer into a fidel-tex command." t)
(autoload 'ethio-tex-to-fidel-buffer "ethio-util" "\
-Convert fidel-tex commands in the current buffer into fidel chars." t nil)
+Convert fidel-tex commands in the current buffer into fidel chars." t)
(autoload 'ethio-fidel-to-java-buffer "ethio-util" "\
Convert Ethiopic characters into the Java escape sequences.
@@ -10744,22 +10730,22 @@ Each escape sequence is of the form \\uXXXX, where XXXX is the
character's codepoint (in hex) in Unicode.
If `ethio-java-save-lowercase' is non-nil, use [0-9a-f].
-Otherwise, [0-9A-F]." nil nil)
+Otherwise, [0-9A-F].")
(autoload 'ethio-java-to-fidel-buffer "ethio-util" "\
-Convert the Java escape sequences into corresponding Ethiopic characters." nil nil)
+Convert the Java escape sequences into corresponding Ethiopic characters.")
(autoload 'ethio-find-file "ethio-util" "\
-Transliterate file content into Ethiopic depending on filename suffix." nil nil)
+Transliterate file content into Ethiopic depending on filename suffix.")
(autoload 'ethio-write-file "ethio-util" "\
-Transliterate Ethiopic characters in ASCII depending on the file extension." nil nil)
+Transliterate Ethiopic characters in ASCII depending on the file extension.")
(autoload 'ethio-insert-ethio-space "ethio-util" "\
Insert the Ethiopic word delimiter (the colon-like character).
With ARG, insert that many delimiters.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'ethio-composition-function "ethio-util" "\
-(fn POS TO FONT-OBJECT STRING DIRECTION)" nil nil)
+(fn POS TO FONT-OBJECT STRING DIRECTION)")
(register-definition-prefixes "ethio-util" '("ethio-" "exit-ethiopic-environment"))
@@ -10775,17 +10761,17 @@ Set the directory server to SERVER using PROTOCOL.
Unless NO-SAVE is non-nil, the server is saved as the default
server for future sessions.
-(fn SERVER PROTOCOL &optional NO-SAVE)" t nil)
+(fn SERVER PROTOCOL &optional NO-SAVE)" t)
(autoload 'eudc-get-email "eudc" "\
Get the email field of NAME from the directory server.
If ERROR is non-nil, report an error if there is none.
-(fn NAME &optional ERROR)" t nil)
+(fn NAME &optional ERROR)" t)
(autoload 'eudc-get-phone "eudc" "\
Get the phone field of NAME from the directory server.
If ERROR is non-nil, report an error if there is none.
-(fn NAME &optional ERROR)" t nil)
+(fn NAME &optional ERROR)" t)
(autoload 'eudc-expand-try-all "eudc" "\
Wrap `eudc-expand-inline' with a prefix argument.
If TRY-ALL-SERVERS -- the prefix argument when called
@@ -10793,7 +10779,7 @@ interactively -- is non-nil, collect results from all servers.
If TRY-ALL-SERVERS is nil, do not try subsequent servers after
one server returns any match.
-(fn &optional TRY-ALL-SERVERS)" t nil)
+(fn &optional TRY-ALL-SERVERS)" t)
(autoload 'eudc-expand-inline "eudc" "\
Query the directory server, and expand the query string before point.
The query string consists of the buffer substring from the point back to
@@ -10809,11 +10795,11 @@ Multiple servers can be tried with the same query until one finds a match,
see `eudc-inline-expansion-servers'. If TRY-ALL-SERVERS is
non-nil, collect results from all servers.
-(fn &optional SAVE-QUERY-AS-KILL TRY-ALL-SERVERS)" t nil)
+(fn &optional SAVE-QUERY-AS-KILL TRY-ALL-SERVERS)" t)
(autoload 'eudc-format-inline-expansion-result "eudc" "\
Format a query result according to `eudc-inline-expansion-format'.
-(fn RES QUERY-ATTRS)" nil nil)
+(fn RES QUERY-ATTRS)")
(autoload 'eudc-query-with-words "eudc" "\
Query the directory server, and return the matching responses.
The variable `eudc-inline-query-format' controls how to associate the
@@ -10825,16 +10811,16 @@ Multiple servers can be tried with the same query until one finds a match,
see `eudc-inline-expansion-servers'. When TRY-ALL-SERVERS is non-nil,
keep collecting results from subsequent servers after the first match.
-(fn QUERY-WORDS &optional TRY-ALL-SERVERS)" nil nil)
+(fn QUERY-WORDS &optional TRY-ALL-SERVERS)")
(autoload 'eudc-query-form "eudc" "\
Display a form to query the directory server.
If given a non-nil argument GET-FIELDS-FROM-SERVER, the function first
queries the server for the existing fields and displays a corresponding form.
-(fn &optional GET-FIELDS-FROM-SERVER)" t nil)
+(fn &optional GET-FIELDS-FROM-SERVER)" t)
(autoload 'eudc-load-eudc "eudc" "\
Load the Emacs Unified Directory Client.
-This does nothing except loading eudc by autoload side-effect." t nil)
+This does nothing except loading eudc by autoload side-effect." t)
(defvar eudc-tools-menu (let ((map (make-sparse-keymap "Directory Servers"))) (define-key map [phone] `(menu-item ,(purecopy "Get Phone") eudc-get-phone :help ,(purecopy "Get the phone field of name from the directory server"))) (define-key map [email] `(menu-item ,(purecopy "Get Email") eudc-get-email :help ,(purecopy "Get the email field of NAME from the directory server"))) (define-key map [separator-eudc-email] menu-bar-separator) (define-key map [expand-inline] `(menu-item ,(purecopy "Expand Inline Query") eudc-expand-inline :help ,(purecopy "Query the directory server, and expand the query string before point"))) (define-key map [query] `(menu-item ,(purecopy "Query with Form") eudc-query-form :help ,(purecopy "Display a form to query the directory server"))) (define-key map [separator-eudc-query] menu-bar-separator) (define-key map [new] `(menu-item ,(purecopy "New Server") eudc-set-server :help ,(purecopy "Set the directory server to SERVER using PROTOCOL"))) (define-key map [load] `(menu-item ,(purecopy "Load Hotlist of Servers") eudc-load-eudc :help ,(purecopy "Load the Emacs Unified Directory Client"))) map))
(fset 'eudc-tools-menu (symbol-value 'eudc-tools-menu))
(register-definition-prefixes "eudc" '("eudc-"))
@@ -10845,27 +10831,27 @@ This does nothing except loading eudc by autoload side-effect." t nil)
(autoload 'eudc-display-generic-binary "eudc-bob" "\
Display a button for unidentified binary DATA.
-(fn DATA)" nil nil)
+(fn DATA)")
(autoload 'eudc-display-url "eudc-bob" "\
Display URL and make it clickable.
-(fn URL)" nil nil)
+(fn URL)")
(autoload 'eudc-display-mail "eudc-bob" "\
Display e-mail address and make it clickable.
-(fn MAIL)" nil nil)
+(fn MAIL)")
(autoload 'eudc-display-sound "eudc-bob" "\
Display a button to play the sound DATA.
-(fn DATA)" nil nil)
+(fn DATA)")
(autoload 'eudc-display-jpeg-inline "eudc-bob" "\
Display the JPEG DATA inline at point if possible.
-(fn DATA)" nil nil)
+(fn DATA)")
(autoload 'eudc-display-jpeg-as-button "eudc-bob" "\
Display a button for the JPEG DATA.
-(fn DATA)" nil nil)
+(fn DATA)")
(register-definition-prefixes "eudc-bob" '("eudc-bob-"))
@@ -10883,7 +10869,7 @@ words before point.
The return value is either nil when no match is found, or a
completion table as required for functions listed in
-`completion-at-point-functions'." nil nil)
+`completion-at-point-functions'.")
(autoload 'eudc-capf-message-expand-name "eudc-capf" "\
Email address completion function for `message-completion-alist'.
@@ -10892,7 +10878,7 @@ replacing any existing entry for `message-expand-name' there,
with an appropriate regular expression such as for example
`message-email-recipient-header-regexp', then EUDC will be
queried for email addresses, and the results delivered to
-`completion-at-point'." nil nil)
+`completion-at-point'.")
(register-definition-prefixes "eudc-capf" '("eudc-capf-modes"))
@@ -10900,16 +10886,16 @@ queried for email addresses, and the results delivered to
(autoload 'eudc-insert-record-at-point-into-bbdb "eudc-export" "\
Insert record at point into the BBDB database.
-This function can only be called from a directory query result buffer." t nil)
+This function can only be called from a directory query result buffer." t)
(autoload 'eudc-try-bbdb-insert "eudc-export" "\
-Call `eudc-insert-record-at-point-into-bbdb' if on a record." t nil)
+Call `eudc-insert-record-at-point-into-bbdb' if on a record." t)
(register-definition-prefixes "eudc-export" '("eudc-"))
;;; Generated autoloads from net/eudc-hotlist.el
(autoload 'eudc-edit-hotlist "eudc-hotlist" "\
-Edit the hotlist of directory servers in a specialized buffer." t nil)
+Edit the hotlist of directory servers in a specialized buffer." t)
(register-definition-prefixes "eudc-hotlist" '("eudc-hotlist-"))
@@ -10959,7 +10945,7 @@ Normally, a newline is automatically inserted after the header,
the footer and every node's printed representation. Optional
fourth arg NOSEP non-nil inhibits this.
-(fn PRETTY-PRINTER &optional HEADER FOOTER NOSEP)" nil nil)
+(fn PRETTY-PRINTER &optional HEADER FOOTER NOSEP)")
(register-definition-prefixes "ewoc" '("ewoc-"))
@@ -10983,7 +10969,7 @@ This can also be used on the command line directly:
emacs -f eww-browse https://gnu.org
-will start Emacs and browse the GNU web site." t nil)
+will start Emacs and browse the GNU web site." t)
(autoload 'eww "eww" "\
Fetch URL and render the page.
If the input doesn't look like an URL or a domain name, the
@@ -10998,24 +10984,24 @@ killed after rendering.
For more information, see Info node `(eww) Top'.
-(fn URL &optional NEW-BUFFER BUFFER)" t nil)
+(fn URL &optional NEW-BUFFER BUFFER)" t)
(defalias 'browse-web 'eww)
(autoload 'eww-open-file "eww" "\
Render FILE using EWW.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'eww-search-words "eww" "\
Search the web for the text in the region.
If region is active (and not whitespace), search the web for
the text between region beginning and end. Else, prompt the
user for a search string. See the variable `eww-search-prefix'
-for the search engine used." t nil)
+for the search engine used." t)
(autoload 'eww-mode "eww" "\
Mode for browsing the web.
\\{eww-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'eww-browse-url "eww" "\
Ask the EWW browser to load URL.
@@ -11031,14 +11017,14 @@ in the tab-bar on an existing frame. See more options in
Non-interactively, this uses the optional second argument NEW-WINDOW
instead of `browse-url-new-window-flag'.
-(fn URL &optional NEW-WINDOW)" nil nil)
+(fn URL &optional NEW-WINDOW)")
(autoload 'eww-list-bookmarks "eww" "\
-Display the bookmarks." t nil)
+Display the bookmarks." t)
(autoload 'eww-bookmark-jump "eww" "\
Default bookmark handler for EWW buffers.
-(fn BOOKMARK)" nil nil)
-(register-definition-prefixes "eww" '("erc--download-directory" "eww-"))
+(fn BOOKMARK)")
+(register-definition-prefixes "eww" '("eww-"))
;;; Generated autoloads from progmodes/executable.el
@@ -11047,14 +11033,14 @@ Default bookmark handler for EWW buffers.
Check if PROGRAM handles arguments Posix-style.
If PROGRAM is non-nil, use that instead of \"find\".
-(fn &optional PROGRAM)" nil nil)
+(fn &optional PROGRAM)")
(autoload 'executable-interpret "executable" "\
Run script with user-specified args, and collect output in a buffer.
While script runs asynchronously, you can use the \\[next-error]
command to find the next error. The buffer is also in `comint-mode' and
`compilation-shell-minor-mode', so that you can answer any prompts.
-(fn COMMAND)" t nil)
+(fn COMMAND)" t)
(autoload 'executable-set-magic "executable" "\
Set this buffer's interpreter to INTERPRETER with optional ARGUMENT.
The variables `executable-magicless-file-regexp', `executable-prefix-env',
@@ -11062,11 +11048,11 @@ The variables `executable-magicless-file-regexp', `executable-prefix-env',
when and how magic numbers are inserted or replaced and scripts made
executable.
-(fn INTERPRETER &optional ARGUMENT NO-QUERY-FLAG INSERT-FLAG)" t nil)
+(fn INTERPRETER &optional ARGUMENT NO-QUERY-FLAG INSERT-FLAG)" t)
(autoload 'executable-make-buffer-file-executable-if-script-p "executable" "\
Make file executable according to umask if not already executable.
If file already has any execute bits set at all, do not change existing
-file modes." nil nil)
+file modes.")
(register-definition-prefixes "executable" '("executable-"))
@@ -11099,16 +11085,16 @@ cyclically with the functions `expand-jump-to-previous-slot' and
If ARG is omitted, point is placed at the end of the expanded text.
-(fn TABLE ABBREVS)" nil nil)
+(fn TABLE ABBREVS)")
(autoload 'expand-abbrev-hook "expand" "\
Abbrev hook used to do the expansion job of expand abbrevs.
-See `expand-add-abbrevs'. Value is non-nil if expansion was done." nil nil)
+See `expand-add-abbrevs'. Value is non-nil if expansion was done.")
(autoload 'expand-jump-to-previous-slot "expand" "\
Move the cursor to the previous slot in the last abbrev expansion.
-This is used only in conjunction with `expand-add-abbrevs'." t nil)
+This is used only in conjunction with `expand-add-abbrevs'." t)
(autoload 'expand-jump-to-next-slot "expand" "\
Move the cursor to the next slot in the last abbrev expansion.
-This is used only in conjunction with `expand-add-abbrevs'." t nil)
+This is used only in conjunction with `expand-add-abbrevs'." t)
(define-key abbrev-map "p" 'expand-jump-to-previous-slot)
(define-key abbrev-map "n" 'expand-jump-to-next-slot)
(register-definition-prefixes "expand" '("expand-"))
@@ -11191,7 +11177,7 @@ Variables controlling indentation style and extra features:
Turning on F90 mode calls the value of the variable `f90-mode-hook'
with no args, if that value is non-nil.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "f90" '("f90-"))
@@ -11219,13 +11205,13 @@ attributes.
The base (lowest priority) remapping may be set to something
other than the normal definition of FACE via `face-remap-set-base'.
-(fn FACE &rest SPECS)" nil nil)
+(fn FACE &rest SPECS)")
(autoload 'face-remap-reset-base "face-remap" "\
Set the base remapping of FACE to the normal definition of FACE.
This causes the remappings specified by `face-remap-add-relative'
to apply on top of the normal definition of FACE.
-(fn FACE)" nil nil)
+(fn FACE)")
(autoload 'face-remap-set-base "face-remap" "\
Set the base remapping of FACE in the current buffer to SPECS.
This causes the remappings specified by `face-remap-add-relative'
@@ -11240,7 +11226,7 @@ to use the normal definition of FACE as the base remapping; note that
this is different from SPECS containing a single value nil, which means
not to inherit from the global definition of FACE at all.
-(fn FACE &rest SPECS)" nil nil)
+(fn FACE &rest SPECS)")
(autoload 'text-scale-set "face-remap" "\
Set the scale factor of the default face in the current buffer to LEVEL.
If LEVEL is non-zero, `text-scale-mode' is enabled, otherwise it is disabled.
@@ -11250,7 +11236,7 @@ Each step scales the height of the default face by the variable
`text-scale-mode-step' (a negative number decreases the height by
the same amount).
-(fn LEVEL)" t nil)
+(fn LEVEL)" t)
(autoload 'text-scale-increase "face-remap" "\
Increase the font size of the default face in current buffer by INC steps.
If the new height is other than the default, `text-scale-mode' is enabled.
@@ -11260,12 +11246,12 @@ Each step scales the height of the default face by the variable
height by the same amount). As a special case, an argument of 0
will remove any scaling currently active.
-(fn INC)" t nil)
+(fn INC)" t)
(autoload 'text-scale-decrease "face-remap" "\
Decrease the font size of the default face in the current buffer by DEC steps.
See `text-scale-increase' for more details.
-(fn DEC)" t nil)
+(fn DEC)" t)
(define-key ctl-x-map [(control ?+)] 'text-scale-adjust)
(define-key ctl-x-map [(control ?-)] 'text-scale-adjust)
(define-key ctl-x-map [(control ?=)] 'text-scale-adjust)
@@ -11303,12 +11289,12 @@ scaled even if they have an explicit `:height' setting.
See also the related command `global-text-scale-adjust'.
-(fn INC)" t nil)
+(fn INC)" t)
(define-key global-map [pinch] 'text-scale-pinch)
(autoload 'text-scale-pinch "face-remap" "\
Adjust the height of the default face by the scale in the pinch event EVENT.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(define-key ctl-x-map [(control meta ?+)] 'global-text-scale-adjust)
(define-key ctl-x-map [(control meta ?=)] 'global-text-scale-adjust)
(define-key ctl-x-map [(control meta ?-)] 'global-text-scale-adjust)
@@ -11328,7 +11314,7 @@ used to invoke the command, with all modifiers removed:
After adjusting, further adjust the font size as long as the key,
with all modifiers removed, is one of the above characters.
-Buffer-local face adjustements have higher priority than global
+Buffer-local face adjustments have higher priority than global
face adjustments.
The variable `global-text-scale-adjust-resizes-frames' controls
@@ -11337,7 +11323,7 @@ and characters per line when the font size is adjusted.
See also the related command `text-scale-adjust'.
-(fn INCREMENT)" t nil)
+(fn INCREMENT)" t)
(autoload 'buffer-face-mode "face-remap" "\
Minor mode for a buffer-specific default face.
@@ -11358,7 +11344,7 @@ evaluate `buffer-face-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'buffer-face-set "face-remap" "\
Enable `buffer-face-mode', using face specs SPECS.
Each argument in SPECS should be a face, i.e. either a face name
@@ -11370,7 +11356,7 @@ one face is listed, that specifies an aggregate face, like in a
This function makes the variable `buffer-face-mode-face' buffer
local, and sets it to FACE.
-(fn &rest SPECS)" t nil)
+(fn &rest SPECS)" t)
(autoload 'buffer-face-toggle "face-remap" "\
Toggle `buffer-face-mode', using face specs SPECS.
Each argument in SPECS should be a face, i.e. either a face name
@@ -11386,13 +11372,13 @@ face, then is left enabled, but the face changed to reflect SPECS.
This function will make the variable `buffer-face-mode-face'
buffer local, and set it to SPECS.
-(fn &rest SPECS)" t nil)
+(fn &rest SPECS)" t)
(autoload 'variable-pitch-mode "face-remap" "\
Variable-pitch default-face mode.
An interface to `buffer-face-mode' which uses the `variable-pitch' face.
Besides the choice of face, it is the same as `buffer-face-mode'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "face-remap" '("buffer-face-mode-" "face-" "global-text-scale-adjust-" "internal-lisp-face-attributes" "text-scale-"))
@@ -11415,7 +11401,7 @@ If the optional argument CALLBACK is non-nil, it should be a
function to call each time the user types RET or clicks on a
color. The function should accept a single argument, the color name.
-(fn &optional LIST BUFFER-NAME CALLBACK)" t nil)
+(fn &optional LIST BUFFER-NAME CALLBACK)" t)
(register-definition-prefixes "facemenu" '("facemenu-" "list-colors-"))
@@ -11423,7 +11409,7 @@ color. The function should accept a single argument, the color name.
(push (purecopy '(faceup 0 0 6)) package--builtin-versions)
(autoload 'faceup-view-buffer "faceup" "\
-Display the faceup representation of the current buffer." t nil)
+Display the faceup representation of the current buffer." t)
(autoload 'faceup-write-file "faceup" "\
Save the faceup representation of the current buffer to the file FILE-NAME.
@@ -11434,13 +11420,13 @@ If optional second arg CONFIRM is non-nil, this function
asks for confirmation before overwriting an existing file.
Interactively, confirmation is required unless you supply a prefix argument.
-(fn &optional FILE-NAME CONFIRM)" t nil)
+(fn &optional FILE-NAME CONFIRM)" t)
(autoload 'faceup-render-view-buffer "faceup" "\
Convert BUFFER containing Faceup markup to a new buffer and display it.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'faceup-clean-buffer "faceup" "\
-Remove faceup markup from buffer." t nil)
+Remove faceup markup from buffer." t)
(autoload 'faceup-defexplainer "faceup" "\
Define an Ert explainer function for FUNCTION.
@@ -11462,24 +11448,24 @@ FUNCTION must return an explanation when the test fails and
(autoload 'feedmail-send-it "feedmail" "\
Send the current mail buffer using the Feedmail package.
This is a suitable value for `send-mail-function'. It can be used
-with various lower-level mechanisms to provide features such as queueing." nil nil)
+with various lower-level mechanisms to provide features such as queueing.")
(autoload 'feedmail-run-the-queue-no-prompts "feedmail" "\
Like `feedmail-run-the-queue', but suppress confirmation prompts.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'feedmail-run-the-queue-global-prompt "feedmail" "\
Like `feedmail-run-the-queue', but with a global confirmation prompt.
This is generally most useful if run non-interactively, since you can
bail out with an appropriate answer to the global confirmation prompt.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'feedmail-run-the-queue "feedmail" "\
Visit each message in the feedmail queue directory and send it out.
Return value is a list of three things: number of messages sent, number of
messages skipped, and number of non-message things in the queue (commonly
backup file names and the like).
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'feedmail-queue-reminder "feedmail" "\
Perform some kind of reminder activity about queued and draft messages.
Called with an optional symbol argument which says what kind of event
@@ -11499,13 +11485,13 @@ expected to perform the reminder activity. You can supply your own reminder
functions by redefining `feedmail-queue-reminder-alist'. If you don't want any
reminders, you can set `feedmail-queue-reminder-alist' to nil.
-(fn &optional WHAT-EVENT)" t nil)
+(fn &optional WHAT-EVENT)" t)
(register-definition-prefixes "feedmail" '("feedmail-"))
;;; Generated autoloads from ffap.el
-(defvar ffap-file-finder 'find-file "\
+(defvar ffap-file-finder #'find-file "\
The command called by `find-file-at-point' to find a file.")
(custom-autoload 'ffap-file-finder "ffap" t)
(autoload 'ffap-next "ffap" "\
@@ -11516,24 +11502,24 @@ Interactively: use a single prefix \\[universal-argument] to search backwards,
double prefix to wrap forward, triple to wrap backwards.
Actual search is done by the function `ffap-next-guess'.
-(fn &optional BACK WRAP)" t nil)
+(fn &optional BACK WRAP)" t)
(autoload 'ffap-machine-at-point "ffap" "\
-Return machine name at point if it exists, or nil." nil nil)
+Return machine name at point if it exists, or nil.")
(autoload 'ffap-url-at-point "ffap" "\
Return URL from around point if it exists, or nil.
-Sets the variable `ffap-string-at-point-region' to the bounds of URL, if any." nil nil)
+Sets the variable `ffap-string-at-point-region' to the bounds of URL, if any.")
(autoload 'find-file-at-point "ffap" "\
Find FILENAME, guessing a default from text around point.
If `ffap-url-regexp' is not nil, the FILENAME may also be an URL.
With a prefix, this command behaves exactly like `ffap-file-finder'.
If `ffap-require-prefix' is set, the prefix meaning is reversed.
-See also the variables `ffap-dired-wildcards', `ffap-newfile-prompt',
+See also the variables `ffap-dired-wildcards',
`ffap-url-unwrap-local', `ffap-url-unwrap-remote',
`ffap-file-name-with-spaces', and the functions `ffap-file-at-point'
and `ffap-url-at-point'.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(defalias 'ffap 'find-file-at-point)
(autoload 'ffap-menu "ffap" "\
Put up a menu of files and URLs mentioned in this buffer.
@@ -11542,7 +11528,7 @@ cached in `ffap-menu-alist', and rebuilt by `ffap-menu-rescan'.
The optional RESCAN argument (a prefix, interactively) forces
a rebuild. Searches with `ffap-menu-regexp'.
-(fn &optional RESCAN)" t nil)
+(fn &optional RESCAN)" t)
(autoload 'ffap-at-mouse "ffap" "\
Find file or URL guessed from text around mouse click.
Interactively, calls `ffap-at-mouse-fallback' if no guess is found.
@@ -11551,17 +11537,17 @@ Return value:
* if the fallback is called, return whatever it returns
* otherwise, nil
-(fn E)" t nil)
+(fn E)" t)
(autoload 'dired-at-point "ffap" "\
Start Dired, defaulting to file at point. See `ffap'.
If `dired-at-point-require-prefix' is set, the prefix meaning is reversed.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'ffap-guess-file-name-at-point "ffap" "\
Try to get a file name at point.
-This hook is intended to be put in `file-name-at-point-functions'." nil nil)
+This hook is intended to be put in `file-name-at-point-functions'.")
(autoload 'ffap-bindings "ffap" "\
-Evaluate the forms in variable `ffap-bindings'." t nil)
+Evaluate the forms in variable `ffap-bindings'." t)
(register-definition-prefixes "ffap" '("dired-at-point-" "ffap-" "find-file-literally-at-point"))
@@ -11577,7 +11563,7 @@ Add all files in DIRECTORY to the file cache.
If called from Lisp with a non-nil REGEXP argument is non-nil,
only add files whose names match REGEXP.
-(fn DIRECTORY &optional REGEXP)" t nil)
+(fn DIRECTORY &optional REGEXP)" t)
(autoload 'file-cache-add-directory-list "filecache" "\
Add DIRECTORIES (a list of directory names) to the file cache.
If called interactively, read the directory names one by one.
@@ -11585,21 +11571,21 @@ If the optional REGEXP argument is non-nil, only files which match it
will be added to the cache. Note that the REGEXP is applied to the
files in each directory, not to the directory list itself.
-(fn DIRECTORIES &optional REGEXP)" t nil)
+(fn DIRECTORIES &optional REGEXP)" t)
(autoload 'file-cache-add-file "filecache" "\
Add FILE to the file cache.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'file-cache-add-directory-using-find "filecache" "\
Use the `find' command to add files to the file cache.
Find is run in DIRECTORY.
-(fn DIRECTORY)" t nil)
+(fn DIRECTORY)" t)
(autoload 'file-cache-add-directory-using-locate "filecache" "\
Use the `locate' command to add files to the file cache.
STRING is passed as an argument to the locate command.
-(fn STRING)" t nil)
+(fn STRING)" t)
(autoload 'file-cache-add-directory-recursively "filecache" "\
Add DIR and any subdirectories to the file-cache.
This function does not use any external programs.
@@ -11607,7 +11593,7 @@ If the optional REGEXP argument is non-nil, only files which match it
will be added to the cache. Note that the REGEXP is applied to the
files in each directory, not to the directory list itself.
-(fn DIR &optional REGEXP)" t nil)
+(fn DIR &optional REGEXP)" t)
(autoload 'file-cache-minibuffer-complete "filecache" "\
Complete a filename in the minibuffer using a preloaded cache.
Filecache does two kinds of substitution: it completes on names in
@@ -11616,7 +11602,7 @@ the directories that the name is available in. With a prefix argument,
the name is considered already unique; only the second substitution
(directories) is done.
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "filecache" '("file-cache-"))
@@ -11633,11 +11619,11 @@ to perform the operation on the current file buffer and when done
should return non-nil to mean that we should immediately continue
operating on the next file and nil otherwise.
-(fn FILES SCAN-FUNCTION OPERATE-FUNCTION)" nil nil)
+(fn FILES SCAN-FUNCTION OPERATE-FUNCTION)")
(autoload 'fileloop-initialize-search "fileloop" "\
-(fn REGEXP FILES CASE-FOLD)" nil nil)
+(fn REGEXP FILES CASE-FOLD)")
(autoload 'fileloop-initialize-replace "fileloop" "\
Initialize a new round of query&replace on several files.
FROM is a regexp and TO is the replacement to use.
@@ -11651,7 +11637,7 @@ CASE-FOLD can be t, nil, or `default':
`case-fold-search' instead.
DELIMITED if non-nil means replace only word-delimited matches.
-(fn FROM TO FILES CASE-FOLD &optional DELIMITED)" nil nil)
+(fn FROM TO FILES CASE-FOLD &optional DELIMITED)")
(register-definition-prefixes "fileloop" '("fileloop-"))
@@ -11662,7 +11648,7 @@ Handle a file system monitoring event, coming from backends.
If OBJECT is a filewatch event, call its callback.
Otherwise, signal a `file-notify-error'.
-(fn OBJECT)" t nil)
+(fn OBJECT)" t)
(function-put 'file-notify-handle-event 'completion-predicate #'ignore)
(register-definition-prefixes "filenotify" '("file-notify-"))
@@ -11685,11 +11671,11 @@ If there is no Local Variables list in the current file buffer
then this function adds the first line containing the string
`Local Variables:' and the last line containing the string `End:'.
-(fn VARIABLE VALUE &optional INTERACTIVE)" t nil)
+(fn VARIABLE VALUE &optional INTERACTIVE)" t)
(autoload 'delete-file-local-variable "files-x" "\
Delete all settings of file-local VARIABLE from the Local Variables list.
-(fn VARIABLE &optional INTERACTIVE)" t nil)
+(fn VARIABLE &optional INTERACTIVE)" t)
(autoload 'add-file-local-variable-prop-line "files-x" "\
Add file-local VARIABLE with its VALUE to the -*- line.
@@ -11700,25 +11686,25 @@ the -*- line.
If there is no -*- line at the beginning of the current file buffer
then this function adds it.
-(fn VARIABLE VALUE &optional INTERACTIVE)" t nil)
+(fn VARIABLE VALUE &optional INTERACTIVE)" t)
(autoload 'delete-file-local-variable-prop-line "files-x" "\
Delete all settings of file-local VARIABLE from the -*- line.
-(fn VARIABLE &optional INTERACTIVE)" t nil)
+(fn VARIABLE &optional INTERACTIVE)" t)
(autoload 'add-dir-local-variable "files-x" "\
Add directory-local VARIABLE with its VALUE and MODE to .dir-locals.el.
-(fn MODE VARIABLE VALUE)" t nil)
+(fn MODE VARIABLE VALUE)" t)
(autoload 'delete-dir-local-variable "files-x" "\
Delete all MODE settings of file-local VARIABLE from .dir-locals.el.
-(fn MODE VARIABLE)" t nil)
+(fn MODE VARIABLE)" t)
(autoload 'copy-file-locals-to-dir-locals "files-x" "\
-Copy file-local variables to .dir-locals.el." t nil)
+Copy file-local variables to .dir-locals.el." t)
(autoload 'copy-dir-locals-to-file-locals "files-x" "\
-Copy directory-local variables to the Local Variables list." t nil)
+Copy directory-local variables to the Local Variables list." t)
(autoload 'copy-dir-locals-to-file-locals-prop-line "files-x" "\
-Copy directory-local variables to the -*- line." t nil)
+Copy directory-local variables to the -*- line." t)
(defvar enable-connection-local-variables t "\
Non-nil means enable use of connection-local variables.")
(autoload 'connection-local-set-profiles "files-x" "\
@@ -11733,7 +11719,7 @@ PROFILES are applied to the corresponding process buffer. The
variables for a connection profile are defined using
`connection-local-set-profile-variables'.
-(fn CRITERIA &rest PROFILES)" nil nil)
+(fn CRITERIA &rest PROFILES)")
(autoload 'connection-local-set-profile-variables "files-x" "\
Map the symbol PROFILE to a list of variable settings.
VARIABLES is a list that declares connection-local variables for
@@ -11747,13 +11733,13 @@ variables are set in the server's process buffer according to the
VARIABLES list of the connection profile. The list is processed
in order.
-(fn PROFILE VARIABLES)" nil nil)
+(fn PROFILE VARIABLES)")
(autoload 'hack-connection-local-variables-apply "files-x" "\
Apply connection-local variables identified by CRITERIA.
Other local variables, like file-local and dir-local variables,
will not be changed.
-(fn CRITERIA)" nil nil)
+(fn CRITERIA)")
(autoload 'with-connection-local-variables "files-x" "\
Apply connection-local variables according to `default-directory'.
Execute BODY, and unwind connection-local variables.
@@ -11763,11 +11749,11 @@ Execute BODY, and unwind connection-local variables.
Apply connection-local variables according to `default-directory'.
Call BODY-FUN with no args, and then unwind connection-local variables.
-(fn BODY-FUN)" nil nil)
+(fn BODY-FUN)")
(autoload 'path-separator "files-x" "\
-The connection-local value of `path-separator'." nil nil)
+The connection-local value of `path-separator'.")
(autoload 'null-device "files-x" "\
-The connection-local value of `null-device'." nil nil)
+The connection-local value of `null-device'.")
(register-definition-prefixes "files-x" '("connection-local-" "dir-locals-to-string" "hack-connection-local-variables" "modify-" "read-file-local-variable"))
@@ -11775,7 +11761,7 @@ The connection-local value of `null-device'." nil nil)
(autoload 'filesets-init "filesets" "\
Filesets initialization.
-Set up hooks, load the cache file -- if existing -- and build the menu." nil nil)
+Set up hooks, load the cache file -- if existing -- and build the menu.")
(register-definition-prefixes "filesets" '("filesets-"))
@@ -11814,7 +11800,7 @@ For example:
`default-directory' is used as the initial search path. The
result is a string that should be ready for the command line.
-(fn &rest SUBFINDS)" nil nil)
+(fn &rest SUBFINDS)")
(register-definition-prefixes "find-cmd" '("find-"))
@@ -11837,7 +11823,7 @@ ARGS, see Info node `(find) Finding Files'. If you are not
using GNU findutils (on macOS and *BSD systems), see instead the
man page for \"find\".
-(fn DIR ARGS)" t nil)
+(fn DIR ARGS)" t)
(autoload 'find-dired-with-command "find-dired" "\
Run `find' and go into Dired mode on a buffer of the output.
The user-supplied COMMAND is run after changing into DIR and should look like
@@ -11850,7 +11836,7 @@ use in place of \"-ls\" as the starting input.
Collect output in the \"*Find*\" buffer. To kill the job before
it finishes, type \\[kill-find].
-(fn DIR COMMAND)" t nil)
+(fn DIR COMMAND)" t)
(autoload 'find-name-dired "find-dired" "\
Search DIR recursively for files matching the globbing PATTERN,
and run Dired on those files.
@@ -11861,7 +11847,7 @@ The default command run (after changing into DIR) is
See `find-name-arg' to customize the arguments.
-(fn DIR PATTERN)" t nil)
+(fn DIR PATTERN)" t)
(autoload 'find-grep-dired "find-dired" "\
Find files in DIR that contain matches for REGEXP and start Dired on output.
The command run (after changing into DIR) is
@@ -11872,8 +11858,8 @@ The command run (after changing into DIR) is
where the first string in the value of the variable `find-ls-option'
specifies what to use in place of \"-ls\" as the final argument.
-(fn DIR REGEXP)" t nil)
-(register-definition-prefixes "find-dired" '("find-" "kill-find" "lookfor-dired"))
+(fn DIR REGEXP)" t)
+(register-definition-prefixes "find-dired" '("find-" "kill-find"))
;;; Generated autoloads from find-file.el
@@ -11892,7 +11878,7 @@ See also the documentation for `ff-find-other-file'.
If optional IN-OTHER-WINDOW is non-nil, find the file in another window.
-(fn &optional IN-OTHER-WINDOW)" t nil)
+(fn &optional IN-OTHER-WINDOW)" t)
(defalias 'ff-find-related-file #'ff-find-other-file)
(autoload 'ff-find-other-file "find-file" "\
Find the header or source file corresponding to this file.
@@ -11951,13 +11937,13 @@ Variables of interest include:
- `ff-file-created-hook'
List of functions to be called if the other file has been created.
-(fn &optional IN-OTHER-WINDOW IGNORE-INCLUDE EVENT)" t nil)
+(fn &optional IN-OTHER-WINDOW IGNORE-INCLUDE EVENT)" t)
(define-obsolete-function-alias 'ff-mouse-find-other-file #'ff-find-other-file "28.1")
(define-obsolete-function-alias 'ff-mouse-find-other-file-other-window #'ff-find-other-file-other-window "28.1")
(autoload 'ff-find-other-file-other-window "find-file" "\
Visit the file you point at in another window.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(register-definition-prefixes "find-file" '("cc-" "ff-" "modula2-other-file-alist"))
@@ -11974,25 +11960,25 @@ This function searches `find-library-source-path' if non-nil, and
See the `find-library-include-other-files' user option for
customizing the candidate completions.
-(fn LIBRARY)" t nil)
+(fn LIBRARY)" t)
(autoload 'read-library-name "find-func" "\
Read and return a library name, defaulting to the one near point.
A library name is the filename of an Emacs Lisp library located
in a directory under `load-path' (or `find-library-source-path',
-if non-nil)." nil nil)
+if non-nil).")
(autoload 'find-library-other-window "find-func" "\
Find the Emacs Lisp source of LIBRARY in another window.
See `find-library' for more details.
-(fn LIBRARY)" t nil)
+(fn LIBRARY)" t)
(autoload 'find-library-other-frame "find-func" "\
Find the Emacs Lisp source of LIBRARY in another frame.
See `find-library' for more details.
-(fn LIBRARY)" t nil)
+(fn LIBRARY)" t)
(autoload 'find-function-search-for-symbol "find-func" "\
Search for SYMBOL's definition of type TYPE in LIBRARY.
Visit the library in a buffer, and return a cons cell (BUFFER . POSITION),
@@ -12003,7 +11989,7 @@ Otherwise, TYPE specifies the kind of definition,
and it is interpreted via `find-function-regexp-alist'.
The search is done in the source for library LIBRARY.
-(fn SYMBOL TYPE LIBRARY)" nil nil)
+(fn SYMBOL TYPE LIBRARY)")
(autoload 'find-function-noselect "find-func" "\
Return a pair (BUFFER . POINT) pointing to the definition of FUNCTION.
@@ -12016,7 +12002,7 @@ If FUNCTION is a built-in function, this function normally
attempts to find it in the Emacs C sources; however, if LISP-ONLY
is non-nil, signal an error instead.
-(fn FUNCTION &optional LISP-ONLY)" nil nil)
+(fn FUNCTION &optional LISP-ONLY)")
(autoload 'find-function "find-func" "\
Find the definition of the FUNCTION near point.
@@ -12027,19 +12013,19 @@ Set mark before moving, if the buffer already existed.
See also `find-function-recenter-line' and `find-function-after-hook'.
-(fn FUNCTION)" t nil)
+(fn FUNCTION)" t)
(autoload 'find-function-other-window "find-func" "\
Find, in another window, the definition of FUNCTION near point.
See `find-function' for more details.
-(fn FUNCTION)" t nil)
+(fn FUNCTION)" t)
(autoload 'find-function-other-frame "find-func" "\
Find, in another frame, the definition of FUNCTION near point.
See `find-function' for more details.
-(fn FUNCTION)" t nil)
+(fn FUNCTION)" t)
(autoload 'find-variable-noselect "find-func" "\
Return a pair `(BUFFER . POINT)' pointing to the definition of VARIABLE.
@@ -12047,7 +12033,7 @@ Finds the library containing the definition of VARIABLE in a buffer and
the point of the definition. The buffer is not selected.
If the variable's definition can't be found in the buffer, return (BUFFER).
-(fn VARIABLE &optional FILE)" nil nil)
+(fn VARIABLE &optional FILE)")
(autoload 'find-variable "find-func" "\
Find the definition of the VARIABLE at or before point.
@@ -12059,19 +12045,19 @@ Set mark before moving, if the buffer already existed.
See also `find-function-recenter-line' and `find-function-after-hook'.
-(fn VARIABLE)" t nil)
+(fn VARIABLE)" t)
(autoload 'find-variable-other-window "find-func" "\
Find, in another window, the definition of VARIABLE near point.
See `find-variable' for more details.
-(fn VARIABLE)" t nil)
+(fn VARIABLE)" t)
(autoload 'find-variable-other-frame "find-func" "\
Find, in another frame, the definition of VARIABLE near point.
See `find-variable' for more details.
-(fn VARIABLE)" t nil)
+(fn VARIABLE)" t)
(autoload 'find-definition-noselect "find-func" "\
Return a pair `(BUFFER . POINT)' pointing to the definition of SYMBOL.
If the definition can't be found in the buffer, return (BUFFER).
@@ -12079,7 +12065,7 @@ TYPE says what type of definition: nil for a function, `defvar' for a
variable, `defface' for a face. This function does not switch to the
buffer nor display it.
-(fn SYMBOL TYPE &optional FILE)" nil nil)
+(fn SYMBOL TYPE &optional FILE)")
(autoload 'find-face-definition "find-func" "\
Find the definition of FACE. FACE defaults to the name near point.
@@ -12091,28 +12077,28 @@ Set mark before moving, if the buffer already existed.
See also `find-function-recenter-line' and `find-function-after-hook'.
-(fn FACE)" t nil)
+(fn FACE)" t)
(autoload 'find-function-on-key "find-func" "\
Find the function that KEY invokes. KEY is a string.
Set mark before moving, if the buffer already existed.
-(fn KEY)" t nil)
+(fn KEY)" t)
(autoload 'find-function-on-key-other-window "find-func" "\
Find, in the other window, the function that KEY invokes.
See `find-function-on-key'.
-(fn KEY)" t nil)
+(fn KEY)" t)
(autoload 'find-function-on-key-other-frame "find-func" "\
Find, in the other frame, the function that KEY invokes.
See `find-function-on-key'.
-(fn KEY)" t nil)
+(fn KEY)" t)
(autoload 'find-function-at-point "find-func" "\
-Find directly the function at point in the other window." t nil)
+Find directly the function at point in the other window." t)
(autoload 'find-variable-at-point "find-func" "\
-Find directly the variable at point in the other window." t nil)
+Find directly the variable at point in the other window." t)
(autoload 'find-function-setup-keys "find-func" "\
-Define some key bindings for the `find-function' family of functions." nil nil)
+Define some key bindings for the `find-function' family of functions.")
(register-definition-prefixes "find-func" '("find-" "read-library-name--find-files"))
@@ -12121,29 +12107,29 @@ Define some key bindings for the `find-function' family of functions." nil nil)
(autoload 'find-lisp-find-dired "find-lisp" "\
Find files in DIR, matching REGEXP.
-(fn DIR REGEXP)" t nil)
+(fn DIR REGEXP)" t)
(autoload 'find-lisp-find-dired-subdirectories "find-lisp" "\
Find all subdirectories of DIR.
-(fn DIR)" t nil)
+(fn DIR)" t)
(autoload 'find-lisp-find-dired-filter "find-lisp" "\
Change the filter on a `find-lisp-find-dired' buffer to REGEXP.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(register-definition-prefixes "find-lisp" '("find-lisp-"))
;;; Generated autoloads from finder.el
(autoload 'finder-list-keywords "finder" "\
-Display descriptions of the keywords in the Finder buffer." t nil)
+Display descriptions of the keywords in the Finder buffer." t)
(autoload 'finder-commentary "finder" "\
Display FILE's commentary section.
FILE should be in a form suitable for passing to `locate-library'.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'finder-by-keyword "finder" "\
-Find packages matching a given keyword." t nil)
+Find packages matching a given keyword." t)
(register-definition-prefixes "finder" '("finder-" "generated-finder-keywords-file"))
@@ -12154,7 +12140,7 @@ Toggle flow control handling.
When handling is enabled, user can type C-s as C-\\, and C-q as C-^.
With arg, enable flow control mode if arg is positive, otherwise disable.
-(fn &optional ARGUMENT)" t nil)
+(fn &optional ARGUMENT)" t)
(autoload 'enable-flow-control-on "flow-ctrl" "\
Enable flow control if using one of a specified set of terminal types.
Use `(enable-flow-control-on \"vt100\" \"h19\")' to enable flow control
@@ -12162,7 +12148,7 @@ on VT-100 and H19 terminals. When flow control is enabled,
you must type C-\\ to get the effect of a C-s, and type C-^
to get the effect of a C-q.
-(fn &rest LOSING-TERMINAL-TYPES)" nil nil)
+(fn &rest LOSING-TERMINAL-TYPES)")
(register-definition-prefixes "flow-ctrl" '("flow-control-c-"))
@@ -12171,7 +12157,7 @@ to get the effect of a C-q.
(autoload 'fill-flowed-encode "flow-fill" "\
-(fn &optional BUFFER)" nil nil)
+(fn &optional BUFFER)")
(autoload 'fill-flowed "flow-fill" "\
Apply RFC2646 decoding to BUFFER.
If BUFFER is nil, default to the current buffer.
@@ -12179,7 +12165,7 @@ If BUFFER is nil, default to the current buffer.
If DELETE-SPACE, delete RFC2646 spaces padding at the end of
lines.
-(fn &optional BUFFER DELETE-SPACE)" nil nil)
+(fn &optional BUFFER DELETE-SPACE)")
(register-definition-prefixes "flow-fill" '("fill-flowed-"))
@@ -12215,7 +12201,7 @@ created diagnostic, overriding the default properties and any
properties listed in the `flymake-overlay-control' property of
the diagnostic's type symbol.
-(fn LOCUS BEG END TYPE TEXT &optional DATA OVERLAY-PROPERTIES)" nil nil)
+(fn LOCUS BEG END TYPE TEXT &optional DATA OVERLAY-PROPERTIES)")
(autoload 'flymake-diagnostics "flymake" "\
Get Flymake diagnostics in region determined by BEG and END.
@@ -12223,13 +12209,13 @@ If neither BEG or END is supplied, use whole accessible buffer,
otherwise if BEG is non-nil and END is nil, consider only
diagnostics at BEG.
-(fn &optional BEG END)" nil nil)
+(fn &optional BEG END)")
(autoload 'flymake-diag-region "flymake" "\
Compute BUFFER's region (BEG . END) corresponding to LINE and COL.
If COL is nil, return a region just for LINE. Return nil if the
region is invalid. This function saves match data.
-(fn BUFFER LINE &optional COL)" nil nil)
+(fn BUFFER LINE &optional COL)")
(autoload 'flymake-mode "flymake" "\
Toggle Flymake mode on or off.
@@ -12284,13 +12270,11 @@ evaluate `flymake-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-\\{flymake-mode-map}
-
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'flymake-mode-on "flymake" "\
-Turn Flymake mode on." nil nil)
+Turn Flymake mode on.")
(autoload 'flymake-mode-off "flymake" "\
-Turn Flymake mode off." nil nil)
+Turn Flymake mode off.")
(register-definition-prefixes "flymake" '("flymake-"))
@@ -12302,7 +12286,7 @@ This backend uses `flymake-cc-command' (which see) to launch a
process that is passed the current buffer's contents via stdin.
REPORT-FN is Flymake's callback.
-(fn REPORT-FN &rest ARGS)" nil nil)
+(fn REPORT-FN &rest ARGS)")
(register-definition-prefixes "flymake-cc" '("flymake-cc-"))
@@ -12315,7 +12299,7 @@ REPORT-FN is Flymake's callback.
;;; Generated autoloads from textmodes/flyspell.el
(autoload 'flyspell-prog-mode "flyspell" "\
-Turn on `flyspell-mode' for comments and strings." t nil)
+Turn on `flyspell-mode' for comments and strings." t)
(defvar flyspell-mode nil "Non-nil if Flyspell mode is enabled.")
(autoload 'flyspell-mode "flyspell" "\
Toggle on-the-fly spell checking (Flyspell mode).
@@ -12363,22 +12347,22 @@ evaluate `flyspell-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'turn-on-flyspell "flyspell" "\
-Unconditionally turn on Flyspell mode." nil nil)
+Unconditionally turn on Flyspell mode.")
(autoload 'turn-off-flyspell "flyspell" "\
-Unconditionally turn off Flyspell mode." nil nil)
+Unconditionally turn off Flyspell mode.")
(autoload 'flyspell-mode-off "flyspell" "\
-Turn Flyspell mode off." nil nil)
+Turn Flyspell mode off.")
(autoload 'flyspell-region "flyspell" "\
Flyspell text between BEG and END.
Make sure `flyspell-mode' is turned on if you want the highlight
of a misspelled word removed when you've corrected it.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'flyspell-buffer "flyspell" "\
-Flyspell whole buffer." t nil)
+Flyspell whole buffer." t)
(register-definition-prefixes "flyspell" '("flyspell-" "mail-mode-flyspell-verify" "make-flyspell-overlay" "sgml-mode-flyspell-verify" "tex"))
@@ -12391,9 +12375,9 @@ Flyspell whole buffer." t nil)
;;; Generated autoloads from follow.el
(autoload 'turn-on-follow-mode "follow" "\
-Turn on Follow mode. Please see the function `follow-mode'." nil nil)
+Turn on Follow mode. Please see the function `follow-mode'.")
(autoload 'turn-off-follow-mode "follow" "\
-Turn off Follow mode. Please see the function `follow-mode'." nil nil)
+Turn off Follow mode. Please see the function `follow-mode'.")
(autoload 'follow-mode "follow" "\
Toggle Follow mode.
@@ -12440,7 +12424,7 @@ evaluate `follow-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'follow-scroll-up-window "follow" "\
Scroll text in a Follow mode window up by that window's size.
The other windows in the window chain will scroll synchronously.
@@ -12453,7 +12437,7 @@ Negative ARG means scroll downward.
Works like `scroll-up' when not in Follow mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'follow-scroll-down-window "follow" "\
Scroll text in a Follow mode window down by that window's size.
The other windows in the window chain will scroll synchronously.
@@ -12466,7 +12450,7 @@ Negative ARG means scroll upward.
Works like `scroll-down' when not in Follow mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'follow-scroll-up "follow" "\
Scroll text in a Follow mode window chain up.
@@ -12478,7 +12462,7 @@ Negative ARG means scroll downward.
Works like `scroll-up' when not in Follow mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'follow-scroll-down "follow" "\
Scroll text in a Follow mode window chain down.
@@ -12490,7 +12474,7 @@ Negative ARG means scroll upward.
Works like `scroll-down' when not in Follow mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'follow-delete-other-windows-and-split "follow" "\
Create two side by side windows and enter Follow mode.
@@ -12505,7 +12489,7 @@ If ARG is positive, the leftmost window is selected. If negative,
the rightmost is selected. If ARG is nil, the leftmost window is
selected if the original window is the first one in the frame.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "follow" '("follow-"))
@@ -12538,7 +12522,7 @@ evaluate `footnote-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "footnote" '("footnote-"))
@@ -12597,7 +12581,7 @@ any occurrences of \"%%\" in FORMAT verbatim in the result.
If SPLIT, instead of returning a single string, a list of strings
is returned, where each format spec is its own element.
-(fn FORMAT SPECIFICATION &optional IGNORE-MISSING SPLIT)" nil nil)
+(fn FORMAT SPECIFICATION &optional IGNORE-MISSING SPLIT)")
(register-definition-prefixes "format-spec" '("format-spec-"))
@@ -12622,15 +12606,15 @@ Commands: Equivalent keys in read-only mode:
C-c C-s forms-search-forward s
C-c C-x forms-exit x
-(fn &optional PRIMARY)" t nil)
+(fn &optional PRIMARY)" t)
(autoload 'forms-find-file "forms" "\
Visit a file in Forms mode.
-(fn FN)" t nil)
+(fn FN)" t)
(autoload 'forms-find-file-other-window "forms" "\
Visit a file in Forms mode in other window.
-(fn FN)" t nil)
+(fn FN)" t)
(register-definition-prefixes "forms" '("forms-"))
@@ -12706,7 +12690,7 @@ Variables controlling indentation style and extra features:
Turning on Fortran mode calls the value of the variable `fortran-mode-hook'
with no args, if that value is non-nil.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "fortran" '("fortran-"))
@@ -12718,21 +12702,21 @@ Add STRING to a fortune file FILE.
Interactively, if called with a prefix argument,
read the file name to use. Otherwise use the value of `fortune-file'.
-(fn STRING FILE)" t nil)
+(fn STRING FILE)" t)
(autoload 'fortune-from-region "fortune" "\
Append the current region to a local fortune-like data file.
Interactively, if called with a prefix argument,
read the file name to use. Otherwise use the value of `fortune-file'.
-(fn BEG END FILE)" t nil)
+(fn BEG END FILE)" t)
(autoload 'fortune-compile "fortune" "\
Compile fortune file.
If called with a prefix asks for the FILE to compile, otherwise uses
the value of `fortune-file'. This currently cannot handle directories.
-(fn &optional FILE)" t nil)
+(fn &optional FILE)" t)
(autoload 'fortune-to-signature "fortune" "\
Create signature from output of the fortune program.
@@ -12741,13 +12725,13 @@ otherwise uses the value of `fortune-file'. If you want to have fortune
choose from a set of files in a directory, call interactively with prefix
and choose the directory as the fortune-file.
-(fn &optional FILE)" t nil)
+(fn &optional FILE)" t)
(autoload 'fortune-message "fortune" "\
Display a fortune cookie to the mini-buffer.
If called with a prefix, it has the same behavior as `fortune'.
Optional FILE is a fortune file from which a cookie will be selected.
-(fn &optional FILE)" t nil)
+(fn &optional FILE)" t)
(autoload 'fortune "fortune" "\
Display a fortune cookie.
If called with a prefix asks for the FILE to choose the fortune from,
@@ -12755,7 +12739,7 @@ otherwise uses the value of `fortune-file'. If you want to have fortune
choose from a set of files in a directory, call interactively with prefix
and choose the directory as the fortune-file.
-(fn &optional FILE)" t nil)
+(fn &optional FILE)" t)
(register-definition-prefixes "fortune" '("fortune-"))
@@ -12830,17 +12814,17 @@ invocations, and once assigned is never changed unless the same
frame is duplicated (via `frameset-restore'), in which case the
newest frame keeps the id and the old frame's is set to nil.
-(fn FRAME)" nil nil)
+(fn FRAME)")
(autoload 'frameset-frame-id-equal-p "frameset" "\
Return non-nil if FRAME's id matches ID.
-(fn FRAME ID)" nil nil)
+(fn FRAME ID)")
(autoload 'frameset-frame-with-id "frameset" "\
Return the live frame with id ID, if exists; else nil.
If FRAME-LIST is a list of frames, check these frames only.
If nil, check all live frames.
-(fn ID &optional FRAME-LIST)" nil nil)
+(fn ID &optional FRAME-LIST)")
(autoload 'frameset-save "frameset" "\
Return a frameset for FRAME-LIST, a list of frames.
Dead frames and non-frame objects are silently removed from the list.
@@ -12853,7 +12837,7 @@ PREDICATE is a predicate function, which must return non-nil for frames that
should be saved; if PREDICATE is nil, all frames from FRAME-LIST are saved.
PROPERTIES is a user-defined property list to add to the frameset.
-(fn FRAME-LIST &key APP NAME DESCRIPTION FILTERS PREDICATE PROPERTIES)" nil nil)
+(fn FRAME-LIST &key APP NAME DESCRIPTION FILTERS PREDICATE PROPERTIES)")
(autoload 'frameset-restore "frameset" "\
Restore a FRAMESET into the current display(s).
@@ -12913,7 +12897,7 @@ restoration, including those that have been reused or created anew.
All keyword parameters default to nil.
-(fn FRAMESET &key PREDICATE FILTERS REUSE-FRAMES FORCE-DISPLAY FORCE-ONSCREEN CLEANUP-FRAMES)" nil nil)
+(fn FRAMESET &key PREDICATE FILTERS REUSE-FRAMES FORCE-DISPLAY FORCE-ONSCREEN CLEANUP-FRAMES)")
(autoload 'frameset-to-register "frameset" "\
Store the current frameset in register REGISTER.
Use \\[jump-to-register] to restore the frameset.
@@ -12921,7 +12905,7 @@ Argument is a character, naming the register.
Interactively, reads the register using `register-read-with-preview'.
-(fn REGISTER)" t nil)
+(fn REGISTER)" t)
(register-definition-prefixes "frameset" '("frameset-"))
@@ -12992,7 +12976,7 @@ evaluate `(default-value \\='gdb-enable-debug)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'gdb "gdb-mi" "\
Run gdb passing it COMMAND-LINE as arguments.
@@ -13051,8 +13035,8 @@ detailed description of this mode.
| | D gdb-delete-breakpoint |
+-----------------------------------+----------------------------------+
-(fn COMMAND-LINE)" t nil)
-(register-definition-prefixes "gdb-mi" '("breakpoint" "def-gdb-" "gdb" "gud-" "hollow-right-triangle" "nil"))
+(fn COMMAND-LINE)" t)
+(register-definition-prefixes "gdb-mi" '("breakpoint" "def-gdb-" "gdb" "gud-" "hollow-right-triangle"))
;;; Generated autoloads from emacs-lisp/generator.el
@@ -13110,7 +13094,7 @@ See the file generic-x.el for some examples of `define-generic-mode'.
(autoload 'generic-mode-internal "generic" "\
Go into the generic mode MODE.
-(fn MODE COMMENT-LIST KEYWORD-LIST FONT-LOCK-LIST FUNCTION-LIST)" nil nil)
+(fn MODE COMMENT-LIST KEYWORD-LIST FONT-LOCK-LIST FUNCTION-LIST)")
(autoload 'generic-mode "generic" "\
Enter generic mode MODE.
@@ -13121,7 +13105,7 @@ own mode, but have comment characters, keywords, and the like.)
To define a generic-mode, use the function `define-generic-mode'.
Some generic modes are defined in `generic-x.el'.
-(fn MODE)" t nil)
+(fn MODE)" t)
(autoload 'generic-make-keywords-list "generic" "\
Return a `font-lock-keywords' construct that highlights KEYWORD-LIST.
KEYWORD-LIST is a list of keyword strings that should be
@@ -13131,7 +13115,7 @@ PREFIX and SUFFIX. Then it returns a construct based on this
regular expression that can be used as an element of
`font-lock-keywords'.
-(fn KEYWORD-LIST FACE &optional PREFIX SUFFIX)" nil nil)
+(fn KEYWORD-LIST FACE &optional PREFIX SUFFIX)")
(make-obsolete 'generic-make-keywords-list 'regexp-opt "24.4")
(register-definition-prefixes "generic" '("generic-"))
@@ -13168,7 +13152,7 @@ evaluate `glasses-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "glasses" '("glasses-"))
@@ -13200,7 +13184,7 @@ evaluate `glyphless-display-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "glyphless-mode" '("glyphless-mode-"))
@@ -13210,7 +13194,7 @@ it is disabled.
Potentially concat a list of regexps into a single one.
The concatenation is done with logical ORs.
-(fn REGEXP)" nil nil)
+(fn REGEXP)")
(autoload 'gmm-message "gmm-utils" "\
If LEVEL is lower than `gmm-verbose' print ARGS using `message'.
@@ -13221,16 +13205,16 @@ Guideline for numbers:
7 - not very important messages on stuff
9 - messages inside loops.
-(fn LEVEL &rest ARGS)" nil nil)
+(fn LEVEL &rest ARGS)")
(autoload 'gmm-error "gmm-utils" "\
Beep an error if LEVEL is equal to or less than `gmm-verbose'.
ARGS are passed to `message'.
-(fn LEVEL &rest ARGS)" nil nil)
+(fn LEVEL &rest ARGS)")
(autoload 'gmm-widget-p "gmm-utils" "\
Non-nil if SYMBOL is a widget.
-(fn SYMBOL)" nil nil)
+(fn SYMBOL)")
(autoload 'gmm-tool-bar-from-list "gmm-utils" "\
Make a tool bar from ICON-LIST.
@@ -13249,7 +13233,7 @@ runs the command find-file\", then use `new-file' in ZAP-LIST.
DEFAULT-MAP specifies the default key map for ICON-LIST.
-(fn ICON-LIST ZAP-LIST DEFAULT-MAP)" nil nil)
+(fn ICON-LIST ZAP-LIST DEFAULT-MAP)")
(register-definition-prefixes "gmm-utils" '("defun-gmm" "gmm-"))
@@ -13260,11 +13244,11 @@ DEFAULT-MAP specifies the default key map for ICON-LIST.
(autoload 'gnus-child-no-server "gnus" "\
Read network news as a child, without connecting to the local server.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'gnus-slave-no-server "gnus" "\
Read network news as a child, without connecting to the local server.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'gnus-no-server "gnus" "\
Read network news.
If ARG is a positive number, Gnus will use that as the startup level.
@@ -13274,15 +13258,15 @@ an NNTP server to use.
As opposed to `gnus', this command will not connect to the local
server.
-(fn &optional ARG CHILD)" t nil)
+(fn &optional ARG CHILD)" t)
(autoload 'gnus-child "gnus" "\
Read news as a child.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'gnus-slave "gnus" "\
Read news as a child.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'gnus-other-frame "gnus" "\
Pop up a frame to read news.
This will call one of the Gnus commands which is specified by the user
@@ -13294,31 +13278,31 @@ such as \"unix:0\" to specify where to pop up a frame. If DISPLAY is
omitted or the function `make-frame-on-display' is not available, the
current display is used.
-(fn &optional ARG DISPLAY)" t nil)
+(fn &optional ARG DISPLAY)" t)
(autoload 'gnus "gnus" "\
Read network news.
If ARG is non-nil and a positive number, Gnus will use that as the
startup level. If ARG is non-nil and not a positive number, Gnus will
prompt the user for the name of an NNTP server to use.
-(fn &optional ARG DONT-CONNECT CHILD)" t nil)
+(fn &optional ARG DONT-CONNECT CHILD)" t)
(register-definition-prefixes "gnus" '("gnus-"))
;;; Generated autoloads from gnus/gnus-agent.el
(autoload 'gnus-unplugged "gnus-agent" "\
-Start Gnus unplugged." t nil)
+Start Gnus unplugged." t)
(autoload 'gnus-plugged "gnus-agent" "\
-Start Gnus plugged." t nil)
+Start Gnus plugged." t)
(autoload 'gnus-child-unplugged "gnus-agent" "\
Read news as a child unplugged.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'gnus-slave-unplugged "gnus-agent" "\
Read news as a child unplugged.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'gnus-agentize "gnus-agent" "\
Allow Gnus to be an offline newsreader.
@@ -13328,9 +13312,9 @@ customize `gnus-agent' to nil.
This will modify the `gnus-setup-news-hook', and
`message-send-mail-real-function' variables, and install the Gnus agent
-minor mode in all Gnus buffers." t nil)
+minor mode in all Gnus buffers." t)
(autoload 'gnus-agent-possibly-save-gcc "gnus-agent" "\
-Save GCC if Gnus is unplugged." nil nil)
+Save GCC if Gnus is unplugged.")
(autoload 'gnus-agent-rename-group "gnus-agent" "\
Rename fully-qualified OLD-GROUP as NEW-GROUP.
Always updates the agent, even when disabled, as the old agent
@@ -13338,7 +13322,7 @@ files would corrupt gnus when the agent was next enabled.
Depends upon the caller to determine whether group renaming is
supported.
-(fn OLD-GROUP NEW-GROUP)" nil nil)
+(fn OLD-GROUP NEW-GROUP)")
(autoload 'gnus-agent-delete-group "gnus-agent" "\
Delete fully-qualified GROUP.
Always updates the agent, even when disabled, as the old agent
@@ -13346,37 +13330,37 @@ files would corrupt gnus when the agent was next enabled.
Depends upon the caller to determine whether group deletion is
supported.
-(fn GROUP)" nil nil)
+(fn GROUP)")
(autoload 'gnus-agent-get-undownloaded-list "gnus-agent" "\
-Construct list of articles that have not been downloaded." nil nil)
+Construct list of articles that have not been downloaded.")
(autoload 'gnus-agent-possibly-alter-active "gnus-agent" "\
Possibly expand a group's active range to include articles
downloaded into the agent.
-(fn GROUP ACTIVE &optional INFO)" nil nil)
+(fn GROUP ACTIVE &optional INFO)")
(autoload 'gnus-agent-find-parameter "gnus-agent" "\
Search for GROUPs SYMBOL in the group's parameters, the group's
topic parameters, the group's category, or the customizable
variables. Returns the first non-nil value found.
-(fn GROUP SYMBOL)" nil nil)
+(fn GROUP SYMBOL)")
(autoload 'gnus-agent-batch-fetch "gnus-agent" "\
-Start Gnus and fetch session." t nil)
+Start Gnus and fetch session." t)
(autoload 'gnus-agent-batch "gnus-agent" "\
-Start Gnus, send queue and fetch session." t nil)
+Start Gnus, send queue and fetch session." t)
(autoload 'gnus-agent-regenerate "gnus-agent" "\
Regenerate all agent covered files.
CLEAN is obsolete and ignored.
-(fn &optional CLEAN REREAD)" t nil)
+(fn &optional CLEAN REREAD)" t)
(register-definition-prefixes "gnus-agent" '("gnus-"))
;;; Generated autoloads from gnus/gnus-art.el
(autoload 'gnus-article-prepare-display "gnus-art" "\
-Make the current buffer look like a nice article." nil nil)
-(register-definition-prefixes "gnus-art" '(":keymap" "article-" "gnus-"))
+Make the current buffer look like a nice article.")
+(register-definition-prefixes "gnus-art" '("article-" "gnus-"))
;;; Generated autoloads from gnus/gnus-async.el
@@ -13392,16 +13376,16 @@ Make the current buffer look like a nice article." nil nil)
;;; Generated autoloads from gnus/gnus-bookmark.el
(autoload 'gnus-bookmark-set "gnus-bookmark" "\
-Set a bookmark for this article." '(gnus-article-mode gnus-summary-mode) nil)
+Set a bookmark for this article." '(gnus-article-mode gnus-summary-mode))
(autoload 'gnus-bookmark-jump "gnus-bookmark" "\
Jump to a Gnus bookmark (BMK-NAME).
-(fn &optional BMK-NAME)" t nil)
+(fn &optional BMK-NAME)" t)
(autoload 'gnus-bookmark-bmenu-list "gnus-bookmark" "\
Display a list of existing Gnus bookmarks.
The list is displayed in a buffer named `*Gnus Bookmark List*'.
The leftmost column displays a D if the bookmark is flagged for
-deletion, or > if it is flagged for displaying." t nil)
+deletion, or > if it is flagged for displaying." t)
(register-definition-prefixes "gnus-bookmark" '("gnus-bookmark-"))
@@ -13411,15 +13395,15 @@ deletion, or > if it is flagged for displaying." t nil)
Go through all groups and put the articles into the cache.
Usage:
-$ emacs -batch -l ~/.emacs -l gnus -f gnus-jog-cache" t nil)
+$ emacs -batch -l ~/.emacs -l gnus -f gnus-jog-cache" t)
(autoload 'gnus-cache-generate-active "gnus-cache" "\
Generate the cache active file.
-(fn &optional DIRECTORY)" t nil)
+(fn &optional DIRECTORY)" t)
(autoload 'gnus-cache-generate-nov-databases "gnus-cache" "\
Generate NOV files recursively starting in DIR.
-(fn DIR)" t nil)
+(fn DIR)" t)
(autoload 'gnus-cache-rename-group "gnus-cache" "\
Rename OLD-GROUP as NEW-GROUP.
Always updates the cache, even when disabled, as the old cache
@@ -13427,7 +13411,7 @@ files would corrupt Gnus when the cache was next enabled. It
depends on the caller to determine whether group renaming is
supported.
-(fn OLD-GROUP NEW-GROUP)" nil nil)
+(fn OLD-GROUP NEW-GROUP)")
(autoload 'gnus-cache-delete-group "gnus-cache" "\
Delete GROUP from the cache.
Always updates the cache, even when disabled, as the old cache
@@ -13435,7 +13419,7 @@ files would corrupt gnus when the cache was next enabled.
Depends upon the caller to determine whether group deletion is
supported.
-(fn GROUP)" nil nil)
+(fn GROUP)")
(register-definition-prefixes "gnus-cache" '("gnus-"))
@@ -13478,9 +13462,9 @@ The value of `message-draft-headers' determines which headers are
generated when the article is delayed. Remaining headers are
generated when the article is sent.
-(fn DELAY)" '(message-mode) nil)
+(fn DELAY)" '(message-mode))
(autoload 'gnus-delay-send-queue "gnus-delay" "\
-Send all the delayed messages that are due now." t nil)
+Send all the delayed messages that are due now." t)
(autoload 'gnus-delay-initialize "gnus-delay" "\
Initialize the gnus-delay package.
This sets up a key binding in `message-mode' to delay a message.
@@ -13489,7 +13473,7 @@ This tells Gnus to look for delayed messages after getting new news.
The optional arg NO-KEYMAP is ignored.
Checking delayed messages is skipped if optional arg NO-CHECK is non-nil.
-(fn &optional NO-KEYMAP NO-CHECK)" nil nil)
+(fn &optional NO-KEYMAP NO-CHECK)")
(register-definition-prefixes "gnus-delay" '("gnus-delay-"))
@@ -13503,25 +13487,25 @@ Checking delayed messages is skipped if optional arg NO-CHECK is non-nil.
(autoload 'gnus-user-format-function-d "gnus-diary" "\
-(fn HEADER)" nil nil)
+(fn HEADER)")
(autoload 'gnus-user-format-function-D "gnus-diary" "\
-(fn HEADER)" nil nil)
+(fn HEADER)")
(register-definition-prefixes "gnus-diary" '("gnus-"))
;;; Generated autoloads from gnus/gnus-dired.el
(autoload 'turn-on-gnus-dired-mode "gnus-dired" "\
-Convenience method to turn on `gnus-dired-mode'." t nil)
+Convenience method to turn on `gnus-dired-mode'." t)
(register-definition-prefixes "gnus-dired" '("gnus-dired-"))
;;; Generated autoloads from gnus/gnus-draft.el
(autoload 'gnus-draft-reminder "gnus-draft" "\
-Reminder user if there are unsent drafts." t nil)
+Reminder user if there are unsent drafts." t)
(register-definition-prefixes "gnus-draft" '("gnus-"))
@@ -13541,45 +13525,45 @@ Reminder user if there are unsent drafts." t nil)
Return file from DIR with extension EXT.
Omit matches of OMIT, and process them by FUN.
-(fn DIR EXT OMIT FUN)" nil nil)
+(fn DIR EXT OMIT FUN)")
(autoload 'message-goto-eoh "message" nil t)
(autoload 'gnus-random-x-face "gnus-fun" "\
Return X-Face header data chosen randomly from `gnus-x-face-directory'.
-Files matching `gnus-x-face-omit-files' are not considered." t nil)
+Files matching `gnus-x-face-omit-files' are not considered." t)
(autoload 'gnus-insert-random-x-face-header "gnus-fun" "\
-Insert a random X-Face header from `gnus-x-face-directory'." t nil)
+Insert a random X-Face header from `gnus-x-face-directory'." t)
(autoload 'gnus-x-face-from-file "gnus-fun" "\
Insert an X-Face header based on an image FILE.
Depending on `gnus-convert-image-to-x-face-command' it may accept
different input formats.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'gnus-face-from-file "gnus-fun" "\
Return a Face header based on an image FILE.
Depending on `gnus-convert-image-to-face-command' it may accept
different input formats.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'gnus-convert-face-to-png "gnus-fun" "\
Convert FACE (which is base64-encoded) to a PNG.
The PNG is returned as a string.
-(fn FACE)" nil nil)
+(fn FACE)")
(autoload 'gnus-convert-png-to-face "gnus-fun" "\
Convert FILE to a Face.
FILE should be a PNG file that's 48x48 and smaller than or equal to
726 bytes.
-(fn FILE)" nil nil)
+(fn FILE)")
(autoload 'gnus-random-face "gnus-fun" "\
Return randomly chosen Face from `gnus-face-directory'.
-Files matching `gnus-face-omit-files' are not considered." t nil)
+Files matching `gnus-face-omit-files' are not considered." t)
(autoload 'gnus-insert-random-face-header "gnus-fun" "\
-Insert a random Face header from `gnus-face-directory'." nil nil)
+Insert a random Face header from `gnus-face-directory'.")
(register-definition-prefixes "gnus-fun" '("gnus-"))
@@ -13589,12 +13573,12 @@ Insert a random Face header from `gnus-face-directory'." nil nil)
Display gravatar in the From header.
If gravatar is already displayed, remove it.
-(fn &optional FORCE)" '(gnus-article-mode gnus-summary-mode) nil)
+(fn &optional FORCE)" '(gnus-article-mode gnus-summary-mode))
(autoload 'gnus-treat-mail-gravatar "gnus-gravatar" "\
Display gravatars in the Cc and To headers.
If gravatars are already displayed, remove them.
-(fn &optional FORCE)" '(gnus-article-mode gnus-summary-mode) nil)
+(fn &optional FORCE)" '(gnus-article-mode gnus-summary-mode))
(register-definition-prefixes "gnus-gravatar" '("gnus-gravatar-"))
@@ -13605,18 +13589,18 @@ Start Gnus if necessary and enter GROUP.
If ARTICLES, display those articles.
Returns whether the fetching was successful or not.
-(fn GROUP &optional ARTICLES)" t nil)
+(fn GROUP &optional ARTICLES)" t)
(autoload 'gnus-fetch-group-other-frame "gnus-group" "\
Pop up a frame and enter GROUP.
-(fn GROUP)" t nil)
+(fn GROUP)" t)
(autoload 'gnus-read-ephemeral-emacs-bug-group "gnus-group" "\
Browse Emacs bug reports with IDS in an ephemeral group.
The arguments have the same meaning as those of
`gnus-read-ephemeral-bug-group', which see.
-(fn IDS &optional WINDOW-CONF)" t nil)
-(register-definition-prefixes "gnus-group" '(":keymap" "gnus-"))
+(fn IDS &optional WINDOW-CONF)" t)
+(register-definition-prefixes "gnus-group" '("gnus-"))
;;; Generated autoloads from gnus/gnus-html.el
@@ -13624,11 +13608,11 @@ The arguments have the same meaning as those of
(autoload 'gnus-article-html "gnus-html" "\
-(fn &optional HANDLE)" nil nil)
+(fn &optional HANDLE)")
(autoload 'gnus-html-prefetch-images "gnus-html" "\
-(fn SUMMARY)" nil nil)
+(fn SUMMARY)")
(register-definition-prefixes "gnus-html" '("gnus-"))
@@ -13637,7 +13621,7 @@ The arguments have the same meaning as those of
(autoload 'gnus-icalendar-mm-inline "gnus-icalendar" "\
-(fn HANDLE)" nil nil)
+(fn HANDLE)")
(register-definition-prefixes "gnus-icalendar" '("gnus-icalendar"))
@@ -13651,7 +13635,7 @@ The arguments have the same meaning as those of
(defalias 'gnus-batch-kill 'gnus-batch-score)
(autoload 'gnus-batch-score "gnus-kill" "\
Run batched scoring.
-Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score" t nil)
+Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score" t)
(register-definition-prefixes "gnus-kill" '("gnus-"))
@@ -13667,12 +13651,12 @@ Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score" t nil)
;;; Generated autoloads from gnus/gnus-ml.el
-(autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" nil nil nil)
+(autoload 'turn-on-gnus-mailing-list-mode "gnus-ml")
(autoload 'gnus-mailing-list-insinuate "gnus-ml" "\
Setup group parameters from List-Post header.
If FORCE is non-nil, replace the old ones.
-(fn &optional FORCE)" t nil)
+(fn &optional FORCE)" t)
(autoload 'gnus-mailing-list-mode "gnus-ml" "\
Minor mode for providing mailing-list commands.
@@ -13693,7 +13677,7 @@ evaluate `gnus-mailing-list-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "gnus-ml" '("gnus-mailing-list-"))
@@ -13721,7 +13705,7 @@ elaborate fancy splits may also be useful to split mail that doesn't
match any of the group-specified splitting rules. See
`gnus-group-split-fancy' for details.
-(fn &optional AUTO-UPDATE CATCH-ALL)" t nil)
+(fn &optional AUTO-UPDATE CATCH-ALL)" t)
(autoload 'gnus-group-split-update "gnus-mlspl" "\
Computes `nnmail-split-fancy' from group params and CATCH-ALL.
It does this by calling (gnus-group-split-fancy nil nil CATCH-ALL).
@@ -13729,12 +13713,12 @@ It does this by calling (gnus-group-split-fancy nil nil CATCH-ALL).
If CATCH-ALL is nil, `gnus-group-split-default-catch-all-group' is used
instead. This variable is set by `gnus-group-split-setup'.
-(fn &optional CATCH-ALL)" t nil)
+(fn &optional CATCH-ALL)" t)
(autoload 'gnus-group-split "gnus-mlspl" "\
Use information from group parameters in order to split mail.
See `gnus-group-split-fancy' for more information.
-`gnus-group-split' is a valid value for `nnmail-split-methods'." nil nil)
+`gnus-group-split' is a valid value for `nnmail-split-methods'.")
(autoload 'gnus-group-split-fancy "gnus-mlspl" "\
Uses information from group parameters in order to split mail.
It can be embedded into `nnmail-split-fancy' lists with the SPLIT
@@ -13786,7 +13770,7 @@ Calling (gnus-group-split-fancy nil nil \"mail.others\") returns:
- \"bugs-foo\" - \"rambling-foo\" \"mail.foo\"))
\"mail.others\")
-(fn &optional GROUPS NO-CROSSPOST CATCH-ALL)" nil nil)
+(fn &optional GROUPS NO-CROSSPOST CATCH-ALL)")
(register-definition-prefixes "gnus-mlspl" '("gnus-group-split-"))
@@ -13799,17 +13783,17 @@ Gcc: header for archiving purposes.
If Gnus isn't running, a plain `message-mail' setup is used
instead.
-(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-ACTION YANK-ACTION SEND-ACTIONS RETURN-ACTION)" t nil)
+(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-ACTION YANK-ACTION SEND-ACTIONS RETURN-ACTION)" t)
(autoload 'gnus-button-mailto "gnus-msg" "\
Mail to ADDRESS.
-(fn ADDRESS)" nil nil)
+(fn ADDRESS)")
(autoload 'gnus-button-reply "gnus-msg" "\
Like `message-reply'.
-(fn &optional TO-ADDRESS WIDE)" t nil)
+(fn &optional TO-ADDRESS WIDE)" t)
(define-mail-user-agent 'gnus-user-agent 'gnus-msg-mail 'message-send-and-exit 'message-kill-buffer 'message-send-hook)
-(register-definition-prefixes "gnus-msg" '(":prefix" "gnus-"))
+(register-definition-prefixes "gnus-msg" '("gnus-"))
;;; Generated autoloads from gnus/gnus-notifications.el
@@ -13821,7 +13805,7 @@ or equal to `gnus-notifications-minimum-level' and send a
notification using `notifications-notify' for it.
This is typically a function to add in
-`gnus-after-getting-new-news-hook'" nil nil)
+`gnus-after-getting-new-news-hook'")
(register-definition-prefixes "gnus-notifications" '("gnus-notifications-"))
@@ -13829,13 +13813,13 @@ This is typically a function to add in
(autoload 'gnus-treat-from-picon "gnus-picon" "\
Display picons in the From header.
-If picons are already displayed, remove them." '(gnus-article-mode gnus-summary-mode) nil)
+If picons are already displayed, remove them." '(gnus-article-mode gnus-summary-mode))
(autoload 'gnus-treat-mail-picon "gnus-picon" "\
Display picons in the Cc and To headers.
-If picons are already displayed, remove them." '(gnus-article-mode gnus-summary-mode) nil)
+If picons are already displayed, remove them." '(gnus-article-mode gnus-summary-mode))
(autoload 'gnus-treat-newsgroups-picon "gnus-picon" "\
Display picons in the Newsgroups and Followup-To headers.
-If picons are already displayed, remove them." '(gnus-article-mode gnus-summary-mode) nil)
+If picons are already displayed, remove them." '(gnus-article-mode gnus-summary-mode))
(register-definition-prefixes "gnus-picon" '("gnus-picon-"))
@@ -13846,55 +13830,55 @@ Return a list of elements of LIST1 that do not appear in LIST2.
Both lists have to be sorted over <.
The tail of LIST1 is not copied.
-(fn LIST1 LIST2)" nil nil)
+(fn LIST1 LIST2)")
(autoload 'gnus-sorted-ndifference "gnus-range" "\
Return a list of elements of LIST1 that do not appear in LIST2.
Both lists have to be sorted over <.
LIST1 is modified.
-(fn LIST1 LIST2)" nil nil)
+(fn LIST1 LIST2)")
(autoload 'gnus-sorted-complement "gnus-range" "\
Return a list of elements that are in LIST1 or LIST2 but not both.
Both lists have to be sorted over <.
-(fn LIST1 LIST2)" nil nil)
+(fn LIST1 LIST2)")
(autoload 'gnus-intersection "gnus-range" "\
-(fn LIST1 LIST2)" nil nil)
+(fn LIST1 LIST2)")
(make-obsolete 'gnus-intersection 'seq-intersection "28.1")
(autoload 'gnus-sorted-intersection "gnus-range" "\
Return intersection of LIST1 and LIST2.
LIST1 and LIST2 have to be sorted over <.
-(fn LIST1 LIST2)" nil nil)
+(fn LIST1 LIST2)")
(defalias 'gnus-set-sorted-intersection #'gnus-sorted-nintersection)
(autoload 'gnus-sorted-nintersection "gnus-range" "\
Return intersection of LIST1 and LIST2 by modifying cdr pointers of LIST1.
LIST1 and LIST2 have to be sorted over <.
-(fn LIST1 LIST2)" nil nil)
+(fn LIST1 LIST2)")
(autoload 'gnus-sorted-union "gnus-range" "\
Return union of LIST1 and LIST2.
LIST1 and LIST2 have to be sorted over <.
-(fn LIST1 LIST2)" nil nil)
+(fn LIST1 LIST2)")
(autoload 'gnus-sorted-nunion "gnus-range" "\
Return union of LIST1 and LIST2 by modifying cdr pointers of LIST1.
LIST1 and LIST2 have to be sorted over <.
-(fn LIST1 LIST2)" nil nil)
+(fn LIST1 LIST2)")
(autoload 'gnus-add-to-sorted-list "gnus-range" "\
Add NUM into sorted LIST by side effect.
-(fn LIST NUM)" nil nil)
+(fn LIST NUM)")
(register-definition-prefixes "gnus-range" '("gnus-"))
;;; Generated autoloads from gnus/gnus-registry.el
(autoload 'gnus-registry-initialize "gnus-registry" "\
-Initialize the Gnus registry." t nil)
+Initialize the Gnus registry." t)
(register-definition-prefixes "gnus-registry" '("gnus-"))
@@ -13930,13 +13914,13 @@ Update the Sieve script in gnus-sieve-file, by replacing the region
between gnus-sieve-region-start and gnus-sieve-region-end with
(gnus-sieve-script gnus-sieve-select-method gnus-sieve-crosspost), then
execute gnus-sieve-update-shell-command.
-See the documentation for these variables and functions for details." t nil)
+See the documentation for these variables and functions for details." t)
(autoload 'gnus-sieve-generate "gnus-sieve" "\
Generate the Sieve script in gnus-sieve-file, by replacing the region
between gnus-sieve-region-start and gnus-sieve-region-end with
(gnus-sieve-script gnus-sieve-select-method gnus-sieve-crosspost).
-See the documentation for these variables and functions for details." t nil)
-(autoload 'gnus-sieve-article-add-rule "gnus-sieve" nil '(gnus-article-mode gnus-summary-mode) nil)
+See the documentation for these variables and functions for details." t)
+(autoload 'gnus-sieve-article-add-rule "gnus-sieve" nil '(gnus-article-mode gnus-summary-mode))
(register-definition-prefixes "gnus-sieve" '("gnus-sieve-"))
@@ -13945,7 +13929,7 @@ See the documentation for these variables and functions for details." t nil)
(autoload 'gnus-update-format "gnus-spec" "\
Update the format specification near point.
-(fn VAR)" t nil)
+(fn VAR)" t)
(register-definition-prefixes "gnus-spec" '("gnus-"))
@@ -13959,7 +13943,7 @@ Update the format specification near point.
(autoload 'gnus-declare-backend "gnus-start" "\
Declare back end NAME with ABILITIES as a Gnus back end.
-(fn NAME &rest ABILITIES)" nil nil)
+(fn NAME &rest ABILITIES)")
(register-definition-prefixes "gnus-start" '("gnus-"))
@@ -13969,8 +13953,8 @@ Declare back end NAME with ABILITIES as a Gnus back end.
Handler function for record returned by `gnus-summary-bookmark-make-record'.
BOOKMARK is a bookmark name or a bookmark record.
-(fn BOOKMARK)" nil nil)
-(register-definition-prefixes "gnus-sum" '(":keymap" "gnus-"))
+(fn BOOKMARK)")
+(register-definition-prefixes "gnus-sum" '("gnus-"))
;;; Generated autoloads from gnus/gnus-topic.el
@@ -14003,7 +13987,7 @@ BOOKMARK is a bookmark name or a bookmark record.
(autoload 'gnus-add-configuration "gnus-win" "\
Add the window configuration CONF to `gnus-buffer-configuration'.
-(fn CONF)" nil nil)
+(fn CONF)")
(register-definition-prefixes "gnus-win" '("gnus-"))
@@ -14033,7 +14017,7 @@ Gomoku game, and ought to be upgraded to use the full modern rules.
Use \\[describe-mode] for more info.
-(fn &optional N M)" t nil)
+(fn &optional N M)" t)
(register-definition-prefixes "gomoku" '("gomoku-"))
@@ -14045,7 +14029,7 @@ Send mail to address at point. See documentation for
`goto-address-find-address-at-point'. If no address is found
there, then load the URL at or before point.
-(fn &optional EVENT)" t nil)
+(fn &optional EVENT)" t)
(autoload 'goto-address "goto-addr" "\
Sets up goto-address functionality in the current buffer.
Allows user to use mouse/keyboard command to click to go to a URL
@@ -14054,7 +14038,7 @@ By default, goto-address binds `goto-address-at-point' to mouse-2 and C-c RET
only on URLs and e-mail addresses.
Also fontifies the buffer appropriately (see `goto-address-fontify-p' and
-`goto-address-highlight-p' for more information)." t nil)
+`goto-address-highlight-p' for more information)." t)
(put 'goto-address 'safe-local-eval-function t)
(autoload 'goto-address-mode "goto-addr" "\
Minor mode to buttonize URLs and e-mail addresses in the current buffer.
@@ -14073,7 +14057,7 @@ evaluate `goto-address-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(put 'global-goto-address-mode 'globalized-minor-mode t)
(defvar global-goto-address-mode nil "\
Non-nil if Global Goto-Address mode is enabled.
@@ -14097,7 +14081,7 @@ Goto-Address mode is enabled in all buffers where
See `goto-address-mode' for more information on Goto-Address mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'goto-address-prog-mode "goto-addr" "\
Like `goto-address-mode', but only for comments and strings.
@@ -14116,7 +14100,7 @@ evaluate `goto-address-prog-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "goto-addr" '("goto-addr"))
@@ -14125,7 +14109,7 @@ it is disabled.
(autoload 'wisent-grammar-mode "semantic/wisent/grammar" "\
Major mode for editing Wisent grammars.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "semantic/wisent/grammar" '("semantic-grammar-" "wisent-"))
@@ -14134,7 +14118,7 @@ Major mode for editing Wisent grammars.
(autoload 'bovine-grammar-mode "semantic/bovine/grammar" "\
Major mode for editing Bovine grammars.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "semantic/bovine/grammar" '("bovine-" "semantic-grammar-"))
@@ -14151,13 +14135,13 @@ When finished, call CALLBACK as (apply CALLBACK GRAVATAR CBARGS),
where GRAVATAR is either an image descriptor, or the symbol
`error' if the retrieval failed.
-(fn MAIL-ADDRESS CALLBACK &optional CBARGS)" nil nil)
+(fn MAIL-ADDRESS CALLBACK &optional CBARGS)")
(autoload 'gravatar-retrieve-synchronously "gravatar" "\
Synchronously retrieve a gravatar for MAIL-ADDRESS.
Value is either an image descriptor, or the symbol `error' if the
retrieval failed.
-(fn MAIL-ADDRESS)" nil nil)
+(fn MAIL-ADDRESS)")
(register-definition-prefixes "gravatar" '("gravatar-"))
@@ -14166,6 +14150,33 @@ retrieval failed.
(defvar grep-window-height nil "\
Number of lines in a grep window. If nil, use `compilation-window-height'.")
(custom-autoload 'grep-window-height "grep" t)
+(defvar grep-highlight-matches 'auto-detect "\
+Use special markers to highlight grep matches.
+
+Some grep programs are able to surround matches with special
+markers in grep output. Such markers can be used to highlight
+matches in grep mode. This requires `font-lock-mode' to be active
+in grep buffers, so if you have globally disabled `font-lock-mode',
+you will not get highlighting.
+
+This option sets the environment variable GREP_COLORS to specify
+markers for highlighting and adds the --color option in front of
+any explicit grep options before starting the grep.
+
+When this option is `auto', grep uses `--color=auto' to highlight
+matches only when it outputs to a terminal (when `grep' is the last
+command in the pipe), thus avoiding the use of any potentially-harmful
+escape sequences when standard output goes to a file or pipe.
+
+To make grep highlight matches even into a pipe, you need the option
+`always' that forces grep to use `--color=always' to unconditionally
+output escape sequences.
+
+If the value is `auto-detect' (the default), `grep' will call
+`grep-compute-defaults' to compute the value. To change the
+default value, use \\[customize] or call the function
+`grep-apply-setting'.")
+(custom-autoload 'grep-highlight-matches "grep" nil)
(defvar grep-command nil "\
The default grep command for \\[grep].
If the grep program used supports an option to always include file names
@@ -14190,6 +14201,8 @@ for easier editing.")
(defvar grep-setup-hook nil "\
List of hook functions run by `grep-process-setup' (see `run-hooks').")
(custom-autoload 'grep-setup-hook "grep" t)
+(defvar grep-match-face 'match "\
+Face name to use for grep matches.")
(defconst grep-regexp-alist `((,(concat "^\\(?:" "\\(?1:[^\0\n]+\\)\\(?3:\0\\)\\(?2:[0-9]+\\):" "\\|" "\\(?1:" "\\(?:[a-zA-Z]:\\)?" "[^\n:]+?[^\n/:]\\):[\11 ]*\\(?2:[1-9][0-9]*\\)[\11 ]*:" "\\)") 1 2 (,(lambda nil (when grep-highlight-matches (let* ((beg (match-end 0)) (end (save-excursion (goto-char beg) (line-end-position))) (mbeg (text-property-any beg end 'font-lock-face grep-match-face))) (when mbeg (- mbeg beg))))) \, (lambda nil (when grep-highlight-matches (let* ((beg (match-end 0)) (end (save-excursion (goto-char beg) (line-end-position))) (mbeg (text-property-any beg end 'font-lock-face grep-match-face)) (mend (and mbeg (next-single-property-change mbeg 'font-lock-face nil end)))) (when mend (- mend beg 1)))))) nil nil (3 '(face nil display ":"))) ("^Binary file \\(.+\\) matches" 1 nil nil 0 1)) "\
Regexp used to match grep hits.
See `compilation-error-regexp-alist' for format details.")
@@ -14220,17 +14233,17 @@ History list for grep.")
History list for `grep-find'.")
(autoload 'grep-process-setup "grep" "\
Setup compilation variables and buffer for `grep'.
-Set up `compilation-exit-message-function' and run `grep-setup-hook'." nil nil)
+Set up `compilation-exit-message-function' and run `grep-setup-hook'.")
(autoload 'grep-compute-defaults "grep" "\
Compute the defaults for the `grep' command.
The value depends on `grep-command', `grep-template',
`grep-use-null-device', `grep-find-command', `grep-find-template',
`grep-use-null-filename-separator', `grep-find-use-xargs',
-`grep-highlight-matches', and `grep-quoting-style'." nil nil)
+`grep-highlight-matches', and `grep-quoting-style'.")
(autoload 'grep-mode "grep" "\
Sets `grep-last-buffer' and `compilation-window-height'.
-(fn)" nil nil)
+(fn)")
(autoload 'grep "grep" "\
Run Grep with user-specified COMMAND-ARGS.
The output from the command goes to the \"*grep*\" buffer.
@@ -14253,7 +14266,7 @@ tag the cursor is over, substituting it into the last Grep command
in the Grep command history (or into `grep-command' if that history
list is empty).
-(fn COMMAND-ARGS)" t nil)
+(fn COMMAND-ARGS)" t)
(autoload 'grep-find "grep" "\
Run grep via find, with user-specified args COMMAND-ARGS.
Collect output in the \"*grep*\" buffer.
@@ -14263,7 +14276,7 @@ to find the text that grep hits refer to.
This command uses a special history list for its arguments, so you can
easily repeat a find command.
-(fn COMMAND-ARGS)" t nil)
+(fn COMMAND-ARGS)" t)
(defalias 'find-grep #'grep-find)
(autoload 'lgrep "grep" "\
Run grep, searching for REGEXP in FILES in directory DIR.
@@ -14286,7 +14299,7 @@ This command shares argument histories with \\[rgrep] and \\[grep].
If CONFIRM is non-nil, the user will be given an opportunity to edit the
command before it's run.
-(fn REGEXP &optional FILES DIR CONFIRM)" t nil)
+(fn REGEXP &optional FILES DIR CONFIRM)" t)
(autoload 'rgrep "grep" "\
Recursively grep for REGEXP in FILES in directory tree rooted at DIR.
The search is limited to file names matching shell pattern FILES.
@@ -14316,7 +14329,7 @@ Interactively, the user can use the \\`M-c' command while entering
the regexp to indicate whether the grep should be case sensitive
or not.
-(fn REGEXP &optional FILES DIR CONFIRM)" t nil)
+(fn REGEXP &optional FILES DIR CONFIRM)" t)
(autoload 'zrgrep "grep" "\
Recursively grep for REGEXP in gzipped FILES in tree rooted at DIR.
Like `rgrep' but uses `zgrep' for `grep-program', sets the default
@@ -14325,7 +14338,7 @@ file name to `*.gz', and sets `grep-highlight-matches' to `always'.
If CONFIRM is non-nil, the user will be given an opportunity to edit the
command before it's run.
-(fn REGEXP &optional FILES DIR CONFIRM TEMPLATE)" t nil)
+(fn REGEXP &optional FILES DIR CONFIRM TEMPLATE)" t)
(defalias 'rzgrep #'zrgrep)
(register-definition-prefixes "grep" '("grep-" "kill-grep" "rgrep-"))
@@ -14353,19 +14366,19 @@ will run in *gud-PID*, otherwise it will run in *gud*; in these
cases the initial working directory is the `default-directory' of
the buffer in which this command was invoked.
-(fn COMMAND-LINE)" t nil)
+(fn COMMAND-LINE)" t)
(autoload 'sdb "gud" "\
Run sdb on program FILE in buffer *gud-FILE*.
The directory containing FILE becomes the initial working directory
and source-file directory for your debugger.
-(fn COMMAND-LINE)" t nil)
+(fn COMMAND-LINE)" t)
(autoload 'dbx "gud" "\
Run dbx on program FILE in buffer *gud-FILE*.
The directory containing FILE becomes the initial working directory
and source-file directory for your debugger.
-(fn COMMAND-LINE)" t nil)
+(fn COMMAND-LINE)" t)
(autoload 'xdb "gud" "\
Run xdb on program FILE in buffer *gud-FILE*.
The directory containing FILE becomes the initial working directory
@@ -14374,7 +14387,7 @@ and source-file directory for your debugger.
You can set the variable `gud-xdb-directories' to a list of program source
directories if your program contains sources from more than one directory.
-(fn COMMAND-LINE)" t nil)
+(fn COMMAND-LINE)" t)
(autoload 'perldb "gud" "\
Debug a perl program with gud.
Interactively, this will prompt you for a command line.
@@ -14385,7 +14398,7 @@ Noninteractively, COMMAND-LINE should be on the form
The directory containing the perl program becomes the initial
working directory and source-file directory for your debugger.
-(fn COMMAND-LINE)" t nil)
+(fn COMMAND-LINE)" t)
(autoload 'pdb "gud" "\
Run COMMAND-LINE in the `*gud-FILE*' buffer to debug Python programs.
@@ -14397,13 +14410,13 @@ If called interactively, the command line will be prompted for.
The directory containing this file becomes the initial working
directory and source-file directory for your debugger.
-(fn COMMAND-LINE)" t nil)
+(fn COMMAND-LINE)" t)
(autoload 'guiler "gud" "\
Run guiler on program FILE in buffer `*gud-FILE*'.
The directory containing FILE becomes the initial working directory
and source-file directory for your debugger.
-(fn COMMAND-LINE)" t nil)
+(fn COMMAND-LINE)" t)
(autoload 'jdb "gud" "\
Run jdb with command line COMMAND-LINE in a buffer.
The buffer is named \"*gud*\" if no initial class is given or
@@ -14418,11 +14431,11 @@ original source file access method.
For general information about commands available to control jdb from
gud, see `gud-mode'.
-(fn COMMAND-LINE)" t nil)
+(fn COMMAND-LINE)" t)
(autoload 'gdb-script-mode "gud" "\
Major mode for editing GDB scripts.
-(fn)" t nil)
+(fn)" t)
(defvar gud-tooltip-mode nil "\
Non-nil if Gud-Tooltip mode is enabled.
See the `gud-tooltip-mode' command
@@ -14448,7 +14461,7 @@ evaluate `(default-value \\='gud-tooltip-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "gud" '("gdb-" "gud-"))
@@ -14464,7 +14477,7 @@ with a (not necessarily copyable) Elisp expression that returns the value to
set it to.
DO must return an Elisp expression.
-(fn PLACE DO)" nil nil)
+(fn PLACE DO)")
(autoload 'gv-letplace "gv" "\
Build the code manipulating the generalized variable PLACE.
GETTER will be bound to a copyable expression that returns the value
@@ -14489,7 +14502,7 @@ arguments as NAME. DO is a function as defined in `gv-get'.
(autoload 'gv--defun-declaration "gv" "\
-(fn SYMBOL NAME ARGS HANDLER &optional FIX)" nil nil)
+(fn SYMBOL NAME ARGS HANDLER &optional FIX)")
(defsubst gv--expander-defun-declaration (&rest args) (apply #'gv--defun-declaration 'gv-expander args))
(defsubst gv--setter-defun-declaration (&rest args) (apply #'gv--defun-declaration 'gv-setter args))
(or (assq 'gv-expander defun-declarations-alist) (let ((x (list 'gv-expander #'gv--expander-defun-declaration))) (push x macro-declarations-alist) (push x defun-declarations-alist)))
@@ -14553,7 +14566,7 @@ and `handwrite-13pt' set up for various sizes of output.
Variables: `handwrite-linespace' (default 12)
`handwrite-fontsize' (default 11)
`handwrite-numlines' (default 60)
- `handwrite-pagenumbering' (default nil)" t nil)
+ `handwrite-pagenumbering' (default nil)" t)
(register-definition-prefixes "handwrite" '("handwrite-" "menu-bar-handwrite-map"))
@@ -14564,8 +14577,8 @@ Activate Hangul input method INPUT-METHOD.
FUNC is a function to handle input key.
HELP-TEXT is a text set in `hangul-input-method-help-text'.
-(fn INPUT-METHOD FUNC HELP-TEXT &rest ARGS)" nil nil)
-(register-definition-prefixes "quail/hangul" '("alphabetp" "hangul" "notzerop"))
+(fn INPUT-METHOD FUNC HELP-TEXT &rest ARGS)")
+(register-definition-prefixes "quail/hangul" '("hangul" "notzerop"))
;;; Generated autoloads from language/hanja-util.el
@@ -14578,18 +14591,15 @@ HELP-TEXT is a text set in `hangul-input-method-help-text'.
(autoload 'hanoi "hanoi" "\
Towers of Hanoi diversion. Use NRINGS rings.
-(fn NRINGS)" t nil)
+(fn NRINGS)" t)
(autoload 'hanoi-unix "hanoi" "\
-Towers of Hanoi, UNIX doomsday version.
-Displays 32-ring towers that have been progressing at one move per
-second since 1970-01-01 00:00:00 GMT.
+Towers of Hanoi, 32-bit UNIX doomsday version.
+Display 32-ring towers that have been progressing at one move per
+second since 1970-01-01 00:00:00 UTC.
-Repent before ring 31 moves." t nil)
+Repent before ring 31 moves." t)
(autoload 'hanoi-unix-64 "hanoi" "\
-Like `hanoi-unix', but pretend to have a 64-bit clock.
-This is, necessarily (as of Emacs 20.3), a crock. When the
-`current-time' interface is made s2G-compliant, hanoi.el will need
-to be updated." t nil)
+Like `hanoi-unix', but with a 64-bit clock." t)
(register-definition-prefixes "hanoi" '("hanoi-"))
@@ -14598,34 +14608,34 @@ to be updated." t nil)
(autoload 'hashcash-insert-payment "hashcash" "\
Insert X-Payment and X-Hashcash headers with a payment for ARG.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'hashcash-insert-payment-async "hashcash" "\
Insert X-Payment and X-Hashcash headers with a payment for ARG
Only start calculation. Results are inserted when ready.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'hashcash-verify-payment "hashcash" "\
Verify a hashcash payment.
-(fn TOKEN &optional RESOURCE AMOUNT)" nil nil)
+(fn TOKEN &optional RESOURCE AMOUNT)")
(autoload 'mail-add-payment "hashcash" "\
Add X-Payment: and X-Hashcash: headers with a hashcash payment
for each recipient address. Prefix arg sets default payment temporarily.
Set ASYNC to t to start asynchronous calculation. (See
`mail-add-payment-async').
-(fn &optional ARG ASYNC)" t nil)
+(fn &optional ARG ASYNC)" t)
(autoload 'mail-add-payment-async "hashcash" "\
Add X-Payment: and X-Hashcash: headers with a hashcash payment
for each recipient address. Prefix arg sets default payment temporarily.
Calculation is asynchronous.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'mail-check-payment "hashcash" "\
Look for a valid X-Payment: or X-Hashcash: header.
Prefix arg sets default accept amount temporarily.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "hashcash" '("hashcash-"))
@@ -14639,12 +14649,12 @@ If KBD is non-nil, `kbd-help' is used instead, and any
`help-echo' property is ignored. In this case, the return value
can also be t, if that is the value of the `kbd-help' property.
-(fn &optional KBD)" nil nil)
+(fn &optional KBD)")
(autoload 'help-at-pt-kbd-string "help-at-pt" "\
Return the keyboard help string at point.
If the `kbd-help' text or overlay property at point produces a
string, return it. Otherwise, use the `help-echo' property.
-If this produces no string either, return nil." nil nil)
+If this produces no string either, return nil.")
(autoload 'display-local-help "help-at-pt" "\
Display local help in the echo area.
This command, by default, displays a short help message, namely
@@ -14662,13 +14672,13 @@ If DESCRIBE-BUTTON in non-nil (interactively, the prefix arg), and
there's a button/widget at point, pop a buffer describing that
button/widget instead.
-(fn &optional INHIBIT-WARNING DESCRIBE-BUTTON)" t nil)
+(fn &optional INHIBIT-WARNING DESCRIBE-BUTTON)" t)
(autoload 'help-at-pt-cancel-timer "help-at-pt" "\
Cancel any timer set by `help-at-pt-set-timer'.
-This disables `help-at-pt-display-when-idle'." t nil)
+This disables `help-at-pt-display-when-idle'." t)
(autoload 'help-at-pt-set-timer "help-at-pt" "\
Enable `help-at-pt-display-when-idle'.
-This is done by setting a timer, if none is currently active." t nil)
+This is done by setting a timer, if none is currently active." t)
(defvar help-at-pt-display-when-idle 'never "\
Automatically show local help on point-over.
If the value is t, the string obtained from any `kbd-help' or
@@ -14717,7 +14727,7 @@ do not run HOOK. If there are not enough regions to move over,
an error results and the number of available regions is mentioned
in the error message. Point is not moved and HOOK is not run.
-(fn PROP &optional ARG HOOK)" nil nil)
+(fn PROP &optional ARG HOOK)")
(autoload 'scan-buf-next-region "help-at-pt" "\
Go to the start of the next region with non-nil help-echo.
Print the help found there using `display-local-help'. Adjacent
@@ -14738,7 +14748,7 @@ help-echo region without any local help being available. This is
because `help-echo' can be a function evaluating to nil. This
rarely happens in practice.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'scan-buf-previous-region "help-at-pt" "\
Go to the start of the previous region with non-nil help-echo.
Print the help found there using `display-local-help'. Adjacent
@@ -14746,7 +14756,7 @@ areas with different non-nil help-echo properties are considered
different regions. With numeric argument ARG, behaves like
`scan-buf-next-region' with argument -ARG.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "help-at-pt" '("help-at-pt-" "scan-buf-move-hook"))
@@ -14759,18 +14769,18 @@ When called from Lisp, FUNCTION may also be a function object.
See the `help-enable-symbol-autoload' variable for special
handling of autoloaded functions.
-(fn FUNCTION)" t nil)
+(fn FUNCTION)" t)
(autoload 'describe-command "help-fns" "\
Display the full documentation of COMMAND (a symbol).
When called from Lisp, COMMAND may also be a function object.
-(fn COMMAND)" t nil)
+(fn COMMAND)" t)
(autoload 'help-C-file-name "help-fns" "\
Return the name of the C file where SUBR-OR-VAR is defined.
KIND should be `var' for a variable or `subr' for a subroutine.
If we can't find the file name, nil is returned.
-(fn SUBR-OR-VAR KIND)" nil nil)
+(fn SUBR-OR-VAR KIND)")
(autoload 'find-lisp-object-file-name "help-fns" "\
Guess the file that defined the Lisp object OBJECT, of type TYPE.
OBJECT should be a symbol associated with a function, variable, or face;
@@ -14790,17 +14800,17 @@ If ALSO-C-SOURCE is non-nil, instead of returning `C-source',
this function will attempt to locate the definition of OBJECT in
the C sources, too.
-(fn OBJECT TYPE &optional ALSO-C-SOURCE)" nil nil)
+(fn OBJECT TYPE &optional ALSO-C-SOURCE)")
(autoload 'describe-function-1 "help-fns" "\
-(fn FUNCTION)" nil nil)
+(fn FUNCTION)")
(autoload 'variable-at-point "help-fns" "\
Return the bound variable symbol found at or before point.
Return 0 if there is no such symbol.
If ANY-SYMBOL is non-nil, don't insist the symbol be bound.
-(fn &optional ANY-SYMBOL)" nil nil)
+(fn &optional ANY-SYMBOL)")
(autoload 'describe-variable "help-fns" "\
Display the full documentation of VARIABLE (a symbol).
Returns the documentation as a string, also.
@@ -14808,7 +14818,7 @@ If VARIABLE has a buffer-local value in BUFFER or FRAME
(default to the current buffer and current frame),
it is displayed along with the global value.
-(fn VARIABLE &optional BUFFER FRAME)" t nil)
+(fn VARIABLE &optional BUFFER FRAME)" t)
(autoload 'describe-face "help-fns" "\
Display the properties of face FACE on FRAME.
Interactively, FACE defaults to the faces of the character after point
@@ -14818,7 +14828,7 @@ If the optional argument FRAME is given, report on face FACE in that frame.
If FRAME is t, report on the defaults for face FACE (for new frames).
If FRAME is omitted or nil, use the selected frame.
-(fn FACE &optional FRAME)" t nil)
+(fn FACE &optional FRAME)" t)
(autoload 'describe-symbol "help-fns" "\
Display the full documentation of SYMBOL.
Will show the info of SYMBOL as a function, variable, and/or face.
@@ -14826,26 +14836,26 @@ Optional arguments BUFFER and FRAME specify for which buffer and
frame to show the information about SYMBOL; they default to the
current buffer and the selected frame, respectively.
-(fn SYMBOL &optional BUFFER FRAME)" t nil)
+(fn SYMBOL &optional BUFFER FRAME)" t)
(autoload 'describe-syntax "help-fns" "\
Describe the syntax specifications in the syntax table of BUFFER.
The descriptions are inserted in a help buffer, which is then displayed.
BUFFER defaults to the current buffer.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'describe-categories "help-fns" "\
Describe the category specifications in the current category table.
The descriptions are inserted in a buffer, which is then displayed.
If BUFFER is non-nil, then describe BUFFER's category table instead.
BUFFER should be a buffer or a buffer name.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'describe-keymap "help-fns" "\
Describe key bindings in KEYMAP.
When called interactively, prompt for a variable that has a
keymap value.
-(fn KEYMAP)" t nil)
+(fn KEYMAP)" t)
(autoload 'describe-mode "help-fns" "\
Display documentation of current major mode and minor modes.
A brief summary of the minor modes comes first, followed by the
@@ -14859,7 +14869,7 @@ whose documentation describes the minor mode.
If called from Lisp with a non-nil BUFFER argument, display
documentation for the major and minor modes of that buffer.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'describe-widget "help-fns" "\
Display a buffer with information about a widget.
You can use this command to describe buttons (e.g., the links in a *Help*
@@ -14873,15 +14883,15 @@ When called from Lisp, POS may be a buffer position or a mouse position list.
Calls each function of the list `describe-widget-functions' in turn, until
one of them returns non-nil.
-(fn &optional POS)" t nil)
+(fn &optional POS)" t)
(autoload 'doc-file-to-man "help-fns" "\
Produce an nroff buffer containing the doc-strings from the DOC file.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'doc-file-to-info "help-fns" "\
Produce a texinfo buffer with sorted doc-strings from the DOC file.
-(fn FILE)" t nil)
+(fn FILE)" t)
(register-definition-prefixes "help-fns" '("describe-" "help-" "keymap-name-history"))
@@ -14902,7 +14912,7 @@ gives the window that lists the options.")
(autoload 'help-mode--add-function-link "help-mode" "\
-(fn STR FUN)" nil nil)
+(fn STR FUN)")
(autoload 'help-mode "help-mode" "\
Major mode for viewing help text and navigating references in it.
Also see the `help-enable-variable-value-editing' variable.
@@ -14910,12 +14920,12 @@ Also see the `help-enable-variable-value-editing' variable.
Commands:
\\{help-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'help-mode-setup "help-mode" "\
-Enter Help mode in the current buffer." nil nil)
+Enter Help mode in the current buffer.")
(make-obsolete 'help-mode-setup 'nil "29.1")
(autoload 'help-mode-finish "help-mode" "\
-Finalize Help mode setup in current buffer." nil nil)
+Finalize Help mode setup in current buffer.")
(make-obsolete 'help-mode-finish 'nil "29.1")
(autoload 'help-setup-xref "help-mode" "\
Invoked from commands using the \"*Help*\" buffer to install some xref info.
@@ -14929,14 +14939,14 @@ This should be called very early, before the output buffer is cleared,
because we want to record the \"previous\" position of point so we can
restore it properly when going back.
-(fn ITEM INTERACTIVE-P)" nil nil)
+(fn ITEM INTERACTIVE-P)")
(autoload 'help-buffer "help-mode" "\
Return the name of a buffer for inserting help.
If `help-xref-following' is non-nil and the current buffer is
derived from `help-mode', this is the name of the current buffer.
Otherwise, return \"*Help*\", creating a buffer with that name if
-it does not already exist." nil nil)
+it does not already exist.")
(autoload 'help-make-xrefs "help-mode" "\
Parse and hyperlink documentation cross-references in the given BUFFER.
@@ -14958,7 +14968,7 @@ A special reference `back' is made to return back through a stack of
help buffers. Variable `help-back-label' specifies the text for
that.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'help-xref-button "help-mode" "\
Make a hyperlink for cross-reference text previously matched.
MATCH-NUMBER is the subexpression of interest in the last matched
@@ -14969,34 +14979,34 @@ See `help-make-xrefs'.
This function removes quotes surrounding the match if the
variable `help-clean-buttons' is non-nil.
-(fn MATCH-NUMBER TYPE &rest ARGS)" nil nil)
+(fn MATCH-NUMBER TYPE &rest ARGS)")
(autoload 'help-insert-xref-button "help-mode" "\
Insert STRING and make a hyperlink from cross-reference text on it.
TYPE is the type of button to use. Any remaining arguments are passed
to the button's help-function when it is invoked.
See `help-make-xrefs'.
-(fn STRING TYPE &rest ARGS)" nil nil)
+(fn STRING TYPE &rest ARGS)")
(autoload 'help-xref-on-pp "help-mode" "\
Add xrefs for symbols in `pp's output between FROM and TO.
-(fn FROM TO)" nil nil)
-(define-obsolete-function-alias 'help-xref-interned 'describe-symbol "25.1")
+(fn FROM TO)")
+(define-obsolete-function-alias 'help-xref-interned #'describe-symbol "25.1")
(autoload 'help-bookmark-jump "help-mode" "\
Jump to `help-mode' bookmark BOOKMARK.
Handler function for record returned by `help-bookmark-make-record'.
BOOKMARK is a bookmark name or a bookmark record.
-(fn BOOKMARK)" nil nil)
+(fn BOOKMARK)")
(register-definition-prefixes "help-mode" '("describe-symbol-backends" "help-"))
;;; Generated autoloads from emacs-lisp/helper.el
(autoload 'Helper-describe-bindings "helper" "\
-Describe local key bindings of current mode." t nil)
+Describe local key bindings of current mode." t)
(autoload 'Helper-help "helper" "\
-Provide help for current mode." t nil)
+Provide help for current mode." t)
(register-definition-prefixes "helper" '("Helper-"))
@@ -15089,17 +15099,17 @@ You can use \\[hexl-find-file] to visit a file in Hexl mode.
\\[describe-bindings] for advanced commands.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'hexl-find-file "hexl" "\
Edit file FILENAME as a binary file in hex dump format.
Switch to a buffer visiting file FILENAME, creating one if none exists,
and edit the file in `hexl-mode'. The buffer's coding-system will be
no-conversion, unlike if you visit it normally and then invoke `hexl-mode'.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(autoload 'hexlify-buffer "hexl" "\
Convert a binary buffer to hexl format.
-This discards the buffer's undo information." t nil)
+This discards the buffer's undo information." t)
(register-definition-prefixes "hexl" '("dehexlify-buffer" "hexl-"))
@@ -15111,11 +15121,11 @@ Search `hfy-rgb-load-path' if FILE is not specified.
Loads the variable `hfy-rgb-txt-color-map', which is used by
`hfy-fallback-color-values'.
-(fn &optional FILE)" t nil)
+(fn &optional FILE)" t)
(autoload 'hfy-fallback-color-values "hfy-cmap" "\
Use a fallback method for obtaining the rgb values for a color.
-(fn COLOR-STRING)" nil nil)
+(fn COLOR-STRING)")
(register-definition-prefixes "hfy-cmap" '("hfy-" "htmlfontify-unload-rgb-file"))
@@ -15198,7 +15208,7 @@ evaluate `hi-lock-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(put 'global-hi-lock-mode 'globalized-minor-mode t)
(defvar global-hi-lock-mode nil "\
Non-nil if Global Hi-Lock mode is enabled.
@@ -15222,7 +15232,7 @@ Hi-Lock mode is enabled in all buffers where
See `hi-lock-mode' for more information on Hi-Lock mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defalias 'highlight-lines-matching-regexp 'hi-lock-line-face-buffer)
(autoload 'hi-lock-line-face-buffer "hi-lock" "\
Highlight all lines that match REGEXP using FACE.
@@ -15240,7 +15250,7 @@ Use Font lock mode, if enabled, to highlight REGEXP. Otherwise,
use overlays for highlighting. If overlays are used, the
highlighting will not update as you type.
-(fn REGEXP &optional FACE)" t nil)
+(fn REGEXP &optional FACE)" t)
(defalias 'highlight-regexp 'hi-lock-face-buffer)
(autoload 'hi-lock-face-buffer "hi-lock" "\
Set face of each match of REGEXP to FACE.
@@ -15263,7 +15273,7 @@ is considered \"enabled\" in a buffer if its `major-mode'
causes `font-lock-specified-p' to return non-nil, which means
the major mode specifies support for Font Lock.
-(fn REGEXP &optional FACE SUBEXP LIGHTER)" t nil)
+(fn REGEXP &optional FACE SUBEXP LIGHTER)" t)
(defalias 'highlight-phrase 'hi-lock-face-phrase-buffer)
(autoload 'hi-lock-face-phrase-buffer "hi-lock" "\
Set face of each match of phrase REGEXP to FACE.
@@ -15281,7 +15291,7 @@ is considered \"enabled\" in a buffer if its `major-mode'
causes `font-lock-specified-p' to return non-nil, which means
the major mode specifies support for Font Lock.
-(fn REGEXP &optional FACE)" t nil)
+(fn REGEXP &optional FACE)" t)
(defalias 'highlight-symbol-at-point 'hi-lock-face-symbol-at-point)
(autoload 'hi-lock-face-symbol-at-point "hi-lock" "\
Highlight each instance of the symbol at point.
@@ -15296,7 +15306,7 @@ This uses Font lock mode if it is enabled; otherwise it uses overlays,
in which case the highlighting will not update as you type. The Font
Lock mode is considered \"enabled\" in a buffer if its `major-mode'
causes `font-lock-specified-p' to return non-nil, which means
-the major mode specifies support for Font Lock." t nil)
+the major mode specifies support for Font Lock." t)
(defalias 'unhighlight-regexp 'hi-lock-unface-buffer)
(autoload 'hi-lock-unface-buffer "hi-lock" "\
Remove highlighting of each match to REGEXP set by hi-lock.
@@ -15305,19 +15315,19 @@ previously inserted by hi-lock interactive functions.
If REGEXP is t (or if \\[universal-argument] was specified interactively),
then remove all hi-lock highlighting.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(autoload 'hi-lock-write-interactive-patterns "hi-lock" "\
Write interactively added patterns, if any, into buffer at point.
Interactively added patterns are those normally specified using
`highlight-regexp' and `highlight-lines-matching-regexp'; they can
-be found in variable `hi-lock-interactive-patterns'." t nil)
+be found in variable `hi-lock-interactive-patterns'." t)
(autoload 'hi-lock-find-patterns "hi-lock" "\
-Add patterns from the current buffer to the list of hi-lock patterns." t nil)
+Add patterns from the current buffer to the list of hi-lock patterns." t)
(autoload 'hi-lock-context-menu "hi-lock" "\
Populate MENU with a menu item to highlight symbol at CLICK.
-(fn MENU CLICK)" nil nil)
+(fn MENU CLICK)")
(register-definition-prefixes "hi-lock" '("hi-lock-" "highlight-symbol-at-mouse" "turn-on-hi-lock-if-enabled"))
@@ -15374,7 +15384,7 @@ evaluate `hide-ifdef-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "hideif" '("backward-ifdef" "down-ifdef" "forward-ifdef" "hide-ifdef" "hif-" "intern-safe" "next-ifdef" "previous-ifdef" "show-ifdef" "up-ifdef"))
@@ -15440,9 +15450,9 @@ evaluate `hs-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'turn-off-hideshow "hideshow" "\
-Unconditionally turn off `hs-minor-mode'." nil nil)
+Unconditionally turn off `hs-minor-mode'.")
(register-definition-prefixes "hideshow" '("hs-"))
@@ -15486,7 +15496,7 @@ evaluate `highlight-changes-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'highlight-changes-visible-mode "hilit-chg" "\
Toggle visibility of highlighting due to Highlight Changes mode.
@@ -15514,16 +15524,16 @@ evaluate `highlight-changes-visible-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'highlight-changes-remove-highlight "hilit-chg" "\
Remove the change face from the region between BEG and END.
This allows you to manually remove highlighting from uninteresting changes.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'highlight-changes-next-change "hilit-chg" "\
-Move to the beginning of the next change, if in Highlight Changes mode." t nil)
+Move to the beginning of the next change, if in Highlight Changes mode." t)
(autoload 'highlight-changes-previous-change "hilit-chg" "\
-Move to the beginning of the previous change, if in Highlight Changes mode." t nil)
+Move to the beginning of the previous change, if in Highlight Changes mode." t)
(autoload 'highlight-changes-rotate-faces "hilit-chg" "\
\"Age\" changes if in Highlight Changes mode and the changes are visible.
@@ -15536,7 +15546,7 @@ You can automatically rotate colors when the buffer is saved by adding
this function to `write-file-functions' as a buffer-local value. To do
this, eval the following in the buffer to be saved:
- (add-hook \\='write-file-functions \\='highlight-changes-rotate-faces nil t)" t nil)
+ (add-hook \\='write-file-functions \\='highlight-changes-rotate-faces nil t)" t)
(autoload 'highlight-compare-buffers "hilit-chg" "\
Compare two buffers and highlight the differences.
@@ -15552,7 +15562,7 @@ If a buffer is read-only, differences will be highlighted but no property
changes are made, so \\[highlight-changes-next-change] and
\\[highlight-changes-previous-change] will not work.
-(fn BUF-A BUF-B)" t nil)
+(fn BUF-A BUF-B)" t)
(autoload 'highlight-compare-with-file "hilit-chg" "\
Compare this buffer with a file, and highlight differences.
@@ -15567,7 +15577,7 @@ If the buffer is read-only, differences will be highlighted but no property
changes are made, so \\[highlight-changes-next-change] and
\\[highlight-changes-previous-change] will not work.
-(fn FILE-B)" t nil)
+(fn FILE-B)" t)
(put 'global-highlight-changes-mode 'globalized-minor-mode t)
(defvar global-highlight-changes-mode nil "\
Non-nil if Global Highlight-Changes mode is enabled.
@@ -15592,7 +15602,7 @@ Highlight-Changes mode is enabled in all buffers where
See `highlight-changes-mode' for more information on Highlight-Changes
mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "hilit-chg" '("highlight-" "hilit-chg-"))
@@ -15613,13 +15623,13 @@ With a positive numeric argument, jumps directly to the ARG next
function in this list. With a negative argument or just \\[universal-argument],
undoes the expansion.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'make-hippie-expand-function "hippie-exp" "\
Construct a function similar to `hippie-expand'.
Make it use the expansion functions in TRY-LIST. An optional second
argument VERBOSE non-nil makes the function verbose.
-(fn TRY-LIST &optional VERBOSE)" nil nil)
+(fn TRY-LIST &optional VERBOSE)")
(register-definition-prefixes "hippie-exp" '("he-" "hippie-expand-" "try-"))
@@ -15652,7 +15662,7 @@ evaluate `hl-line-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar global-hl-line-mode nil "\
Non-nil if Global Hl-Line mode is enabled.
See the `global-hl-line-mode' command
@@ -15685,7 +15695,7 @@ evaluate `(default-value \\='global-hl-line-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "hl-line" '("global-hl-line-" "hl-line-"))
@@ -15752,7 +15762,7 @@ Display the holidays for last month, this month, and next month.
If called with an optional prefix argument ARG, prompts for month and year.
This function is suitable for execution in an init file.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'list-holidays "holidays" "\
Display holidays for years Y1 to Y2 (inclusive).
Y2 defaults to Y1. The optional list of holidays L defaults to
@@ -15778,7 +15788,7 @@ The list of holiday lists is computed by the
by redefining that function, or use `add-function' to add
values.
-(fn Y1 &optional Y2 L LABEL)" t nil)
+(fn Y1 &optional Y2 L LABEL)" t)
(defalias 'holiday-list 'list-holidays)
(register-definition-prefixes "holidays" '("calendar-" "holiday-"))
@@ -15809,14 +15819,14 @@ If the SRCDIR and FILE arguments are set, lookup etags derived
entries in the `hfy-tags-cache' and add HTML anchors and
hyperlinks as appropriate.
-(fn &optional SRCDIR FILE)" t nil)
+(fn &optional SRCDIR FILE)" t)
(autoload 'htmlfontify-copy-and-link-dir "htmlfontify" "\
Trawl SRCDIR and write fontified-and-hyperlinked output in DSTDIR.
F-EXT and L-EXT specify values for `hfy-extn' and `hfy-link-extn'.
You may also want to set `hfy-page-header' and `hfy-page-footer'.
-(fn SRCDIR DSTDIR &optional F-EXT L-EXT)" t nil)
+(fn SRCDIR DSTDIR &optional F-EXT L-EXT)" t)
(register-definition-prefixes "htmlfontify" '("hfy-" "htmlfontify-"))
@@ -15860,8 +15870,7 @@ inlined into the compiled format versions. This means that if you
change its definition, you should explicitly call
`ibuffer-recompile-formats'.
-(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil t)
-(function-put 'define-ibuffer-column 'lisp-indent-function 'defun)
+(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil 'macro)
(autoload 'define-ibuffer-sorter "ibuf-macs" "\
Define a method of sorting named NAME.
DOCUMENTATION is the documentation of the function, which will be called
@@ -15872,9 +15881,7 @@ For sorting, the forms in BODY will be evaluated with `a' bound to one
buffer object, and `b' bound to another. BODY should return a non-nil
value if and only if `a' is \"less than\" `b'.
-(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil t)
-(function-put 'define-ibuffer-sorter 'lisp-indent-function 1)
-(function-put 'define-ibuffer-sorter 'doc-string-elt 2)
+(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil 'macro)
(autoload 'define-ibuffer-op "ibuf-macs" "\
Generate a function which operates on a buffer.
OP becomes the name of the function; if it doesn't begin with
@@ -15913,9 +15920,7 @@ BODY define the operation; they are forms to evaluate per each
marked buffer. BODY is evaluated with `buf' bound to the
buffer object.
-(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil t)
-(function-put 'define-ibuffer-op 'lisp-indent-function 2)
-(function-put 'define-ibuffer-op 'doc-string-elt 3)
+(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil 'macro)
(autoload 'define-ibuffer-filter "ibuf-macs" "\
Define a filter named NAME.
DOCUMENTATION is the documentation of the function.
@@ -15930,9 +15935,7 @@ not a particular buffer should be displayed or not. The forms in BODY
will be evaluated with BUF bound to the buffer object, and QUALIFIER
bound to the current value of the filter.
-(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil t)
-(function-put 'define-ibuffer-filter 'lisp-indent-function 2)
-(function-put 'define-ibuffer-filter 'doc-string-elt 2)
+(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil 'macro)
(register-definition-prefixes "ibuf-macs" '("ibuffer-"))
@@ -15943,13 +15946,13 @@ Display a list of buffers, in another window.
If optional argument FILES-ONLY is non-nil, then add a filter for
buffers which are visiting a file.
-(fn &optional FILES-ONLY)" t nil)
+(fn &optional FILES-ONLY)" t)
(autoload 'ibuffer-other-window "ibuffer" "\
Like `ibuffer', but displayed in another window by default.
If optional argument FILES-ONLY is non-nil, then add a filter for
buffers which are visiting a file.
-(fn &optional FILES-ONLY)" t nil)
+(fn &optional FILES-ONLY)" t)
(autoload 'ibuffer "ibuffer" "\
Begin using Ibuffer to edit a list of buffers.
Type \\<ibuffer-mode-map>\\[describe-mode] after entering ibuffer for more information.
@@ -15968,13 +15971,13 @@ FORMATS is the value to use for `ibuffer-formats'.
If specified, then the variable `ibuffer-formats' will have
that value locally in this buffer.
-(fn &optional OTHER-WINDOW-P NAME QUALIFIERS NOSELECT SHRINK FILTER-GROUPS FORMATS)" t nil)
+(fn &optional OTHER-WINDOW-P NAME QUALIFIERS NOSELECT SHRINK FILTER-GROUPS FORMATS)" t)
(autoload 'ibuffer-jump "ibuffer" "\
Call Ibuffer and set point at the line listing the current buffer.
If optional arg OTHER-WINDOW is non-nil, then use another window.
-(fn &optional OTHER-WINDOW)" t nil)
-(register-definition-prefixes "ibuffer" '("filename" "ibuffer-" "locked" "mark" "mod" "name" "process" "read-only" "recency" "size"))
+(fn &optional OTHER-WINDOW)" t)
+(register-definition-prefixes "ibuffer" '("ibuffer-"))
;;; Generated autoloads from calendar/icalendar.el
@@ -15984,7 +15987,7 @@ Export diary file to iCalendar format.
All diary entries in the file DIARY-FILENAME are converted to iCalendar
format. The result is appended to the file ICAL-FILENAME.
-(fn DIARY-FILENAME ICAL-FILENAME)" t nil)
+(fn DIARY-FILENAME ICAL-FILENAME)" t)
(autoload 'icalendar-export-region "icalendar" "\
Export region in diary file to iCalendar format.
All diary entries in the region from MIN to MAX in the current buffer are
@@ -15994,7 +15997,7 @@ This function attempts to return t if something goes wrong. In this
case an error string which describes all the errors and problems is
written into the buffer `*icalendar-errors*'.
-(fn MIN MAX ICAL-FILENAME)" t nil)
+(fn MIN MAX ICAL-FILENAME)" t)
(autoload 'icalendar-import-file "icalendar" "\
Import an iCalendar file and append to a diary file.
Argument ICAL-FILENAME output iCalendar file.
@@ -16002,7 +16005,7 @@ Argument DIARY-FILENAME input `diary-file'.
Optional argument NON-MARKING determines whether events are created as
non-marking or not.
-(fn ICAL-FILENAME DIARY-FILENAME &optional NON-MARKING)" t nil)
+(fn ICAL-FILENAME DIARY-FILENAME &optional NON-MARKING)" t)
(autoload 'icalendar-import-buffer "icalendar" "\
Extract iCalendar events from current buffer.
@@ -16021,7 +16024,7 @@ Return code t means that importing worked well, return code nil
means that an error has occurred. Error messages will be in the
buffer `*icalendar-errors*'.
-(fn &optional DIARY-FILENAME DO-NOT-ASK NON-MARKING)" t nil)
+(fn &optional DIARY-FILENAME DO-NOT-ASK NON-MARKING)" t)
(register-definition-prefixes "icalendar" '("icalendar-"))
@@ -16055,7 +16058,7 @@ evaluate `(default-value \\='fido-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar icomplete-mode nil "\
Non-nil if Icomplete mode is enabled.
See the `icomplete-mode' command
@@ -16094,7 +16097,7 @@ evaluate `(default-value \\='icomplete-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar icomplete-vertical-mode nil "\
Non-nil if Icomplete-Vertical mode is enabled.
See the `icomplete-vertical-mode' command
@@ -16127,7 +16130,7 @@ evaluate `(default-value \\='icomplete-vertical-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar fido-vertical-mode nil "\
Non-nil if Fido-Vertical mode is enabled.
See the `fido-vertical-mode' command
@@ -16156,7 +16159,7 @@ evaluate `(default-value \\='fido-vertical-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(when (locate-library "obsolete/iswitchb")
(autoload 'iswitchb-mode "iswitchb" "Toggle Iswitchb mode." t)
(make-obsolete 'iswitchb-mode
@@ -16199,10 +16202,19 @@ Variables controlling indentation style:
Turning on Icon mode calls the value of the variable `icon-mode-hook'
with no args, if that value is non-nil.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "icon" '("beginning-of-icon-defun" "calculate-icon-indent" "electric-icon-brace" "end-of-icon-defun" "icon-" "indent-icon-exp" "mark-icon-function"))
+;;; Generated autoloads from emacs-lisp/icons.el
+
+(autoload 'describe-icon "icons" "\
+Pop to a buffer to describe ICON.
+
+(fn ICON)" t)
+(register-definition-prefixes "icons" '("button" "define-icon" "icon"))
+
+
;;; Generated autoloads from cedet/semantic/idle.el
(register-definition-prefixes "semantic/idle" '("define-semantic-idle-service" "global-semantic-idle-summary-mode" "semantic-"))
@@ -16238,7 +16250,7 @@ See also the variable `idlwave-shell-prompt-pattern'.
(Type \\[describe-mode] in the shell buffer for a list of commands.)
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "idlw-shell" '("idlwave-"))
@@ -16370,7 +16382,7 @@ The main features of this mode are
\\{idlwave-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "idlwave" '("idlwave-"))
@@ -16398,7 +16410,7 @@ However, if ARG arg equals `files', remap only commands for files, or
if it equals `buffers', remap only commands for buffer switching.
This function also adds a hook to the minibuffer.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'ido-switch-buffer "ido" "\
Switch to another buffer.
The buffer is displayed according to `ido-default-buffer-method' -- the
@@ -16430,11 +16442,11 @@ RET Select the buffer at the front of the list of matches.
\\[ido-completion-help] Show list of matching buffers in separate window.
\\[ido-enter-find-file] Drop into `ido-find-file'.
\\[ido-kill-buffer-at-head] Kill buffer at head of buffer list.
-\\[ido-toggle-ignore] Toggle ignoring buffers listed in `ido-ignore-buffers'." t nil)
+\\[ido-toggle-ignore] Toggle ignoring buffers listed in `ido-ignore-buffers'." t)
(autoload 'ido-switch-buffer-other-window "ido" "\
Switch to another buffer and show it in another window.
The buffer name is selected interactively by typing a substring.
-For details of keybindings, see `ido-switch-buffer'." t nil)
+For details of keybindings, see `ido-switch-buffer'." t)
(autoload 'ido-display-buffer "ido" "\
Display a buffer in another window but don't select it.
@@ -16445,27 +16457,27 @@ window.
The buffer name is selected interactively by typing a substring.
For details of keybindings, see `ido-switch-buffer'.
-(fn &optional ACTION)" t nil)
+(fn &optional ACTION)" t)
(autoload 'ido-display-buffer-other-frame "ido" "\
Display a buffer preferably in another frame.
The buffer name is selected interactively by typing a substring.
-For details of keybindings, see `ido-switch-buffer'." t nil)
+For details of keybindings, see `ido-switch-buffer'." t)
(autoload 'ido-kill-buffer "ido" "\
Kill a buffer.
The buffer name is selected interactively by typing a substring.
-For details of keybindings, see `ido-switch-buffer'." t nil)
+For details of keybindings, see `ido-switch-buffer'." t)
(autoload 'ido-insert-buffer "ido" "\
Insert contents of a buffer in current buffer after point.
The buffer name is selected interactively by typing a substring.
-For details of keybindings, see `ido-switch-buffer'." t nil)
+For details of keybindings, see `ido-switch-buffer'." t)
(autoload 'ido-switch-buffer-other-frame "ido" "\
Switch to another buffer and show it in another frame.
The buffer name is selected interactively by typing a substring.
-For details of keybindings, see `ido-switch-buffer'." t nil)
+For details of keybindings, see `ido-switch-buffer'." t)
(autoload 'ido-find-file-in-dir "ido" "\
Switch to another file starting from DIR.
-(fn DIR)" t nil)
+(fn DIR)" t)
(autoload 'ido-find-file "ido" "\
Edit file with name obtained via minibuffer.
The file is displayed according to `ido-default-file-method' -- the
@@ -16508,59 +16520,59 @@ RET Select the file at the front of the list of matches.
\\[ido-toggle-literal] Toggle literal reading of this file.
\\[ido-completion-help] Show list of matching files in separate window.
\\[ido-toggle-ignore] Toggle ignoring files listed in `ido-ignore-files'.
-\\[ido-reread-directory] Reread the current directory." t nil)
+\\[ido-reread-directory] Reread the current directory." t)
(autoload 'ido-find-file-other-window "ido" "\
Switch to another file and show it in another window.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-find-alternate-file "ido" "\
Find another file, select its buffer, kill previous buffer.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-find-alternate-file-other-window "ido" "\
Find file as a replacement for the file in the next window.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-find-file-read-only "ido" "\
Edit file read-only with name obtained via minibuffer.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-find-file-read-only-other-window "ido" "\
Edit file read-only in other window with name obtained via minibuffer.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-find-file-read-only-other-frame "ido" "\
Edit file read-only in other frame with name obtained via minibuffer.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-display-file "ido" "\
Display a file in another window but don't select it.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-find-file-other-frame "ido" "\
Switch to another file and show it in another frame.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-write-file "ido" "\
Write current buffer to a file.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-insert-file "ido" "\
Insert contents of file in current buffer.
The file name is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-dired "ido" "\
Call `dired' the Ido way.
The directory is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-dired-other-window "ido" "\
\"Edit\" a directory. Like `ido-dired' but select in another window.
The directory is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-dired-other-frame "ido" "\
\"Edit\" a directory. Like `ido-dired' but make a new frame.
The directory is selected interactively by typing a substring.
-For details of keybindings, see `ido-find-file'." t nil)
+For details of keybindings, see `ido-find-file'." t)
(autoload 'ido-read-buffer "ido" "\
Ido replacement for the built-in `read-buffer'.
Return the name of a buffer selected.
@@ -16570,19 +16582,19 @@ If REQUIRE-MATCH is non-nil, an existing buffer must be selected.
Optional arg PREDICATE if non-nil is a function limiting the
buffers that can be considered.
-(fn PROMPT &optional DEFAULT REQUIRE-MATCH PREDICATE)" nil nil)
+(fn PROMPT &optional DEFAULT REQUIRE-MATCH PREDICATE)")
(autoload 'ido-read-file-name "ido" "\
Ido replacement for the built-in `read-file-name'.
Read file name, prompting with PROMPT and completing in directory DIR.
See `read-file-name' for additional parameters.
-(fn PROMPT &optional DIR DEFAULT-FILENAME MUSTMATCH INITIAL PREDICATE)" nil nil)
+(fn PROMPT &optional DIR DEFAULT-FILENAME MUSTMATCH INITIAL PREDICATE)")
(autoload 'ido-read-directory-name "ido" "\
Ido replacement for the built-in `read-directory-name'.
Read directory name, prompting with PROMPT and completing in directory DIR.
See `read-directory-name' for additional parameters.
-(fn PROMPT &optional DIR DEFAULT-DIRNAME MUSTMATCH INITIAL)" nil nil)
+(fn PROMPT &optional DIR DEFAULT-DIRNAME MUSTMATCH INITIAL)")
(autoload 'ido-completing-read "ido" "\
Ido replacement for the built-in `completing-read'.
Read a string in the minibuffer with Ido-style completion.
@@ -16599,7 +16611,7 @@ If INITIAL-INPUT is non-nil, insert it in the minibuffer initially,
HIST, if non-nil, specifies a history list.
DEF, if non-nil, is the default value.
-(fn PROMPT CHOICES &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)" nil nil)
+(fn PROMPT CHOICES &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)")
(register-definition-prefixes "ido" '("ido-"))
@@ -16616,7 +16628,7 @@ Switches to the buffer named BUF-NAME if provided (`*ielm*' by default),
or creates it if it does not exist.
See `inferior-emacs-lisp-mode' for details.
-(fn &optional BUF-NAME)" t nil)
+(fn &optional BUF-NAME)" t)
(register-definition-prefixes "ielm" '("ielm-" "inferior-emacs-lisp-mode"))
@@ -16649,7 +16661,7 @@ evaluate `iimage-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "iimage" '("iimage-" "turn-off-iimage-mode"))
@@ -16660,23 +16672,23 @@ Determine the image type from image data DATA.
Value is a symbol specifying the image type or nil if type cannot
be determined.
-(fn DATA)" nil nil)
+(fn DATA)")
(autoload 'image-type-from-buffer "image" "\
Determine the image type from data in the current buffer.
Value is a symbol specifying the image type or nil if type cannot
-be determined." nil nil)
+be determined.")
(autoload 'image-type-from-file-header "image" "\
Determine the type of image file FILE from its first few bytes.
Value is a symbol specifying the image type, or nil if type cannot
be determined.
-(fn FILE)" nil nil)
+(fn FILE)")
(autoload 'image-type-from-file-name "image" "\
Determine the type of image file FILE from its name.
Value is a symbol specifying the image type, or nil if type cannot
be determined.
-(fn FILE)" nil nil)
+(fn FILE)")
(make-obsolete 'image-type-from-file-name 'image-supported-file-p "29.1")
(autoload 'image-type "image" "\
Determine and return image type.
@@ -16691,12 +16703,12 @@ data. If DATA-P is a symbol with a name on the format
`image/jpeg', that may be used as a hint to determine the image
type if we can't otherwise guess it.
-(fn SOURCE &optional TYPE DATA-P)" nil nil)
+(fn SOURCE &optional TYPE DATA-P)")
(autoload 'image-type-available-p "image" "\
Return t if image type TYPE is available.
Image types are symbols like `xbm' or `jpeg'.
-(fn TYPE)" nil nil)
+(fn TYPE)")
(autoload 'image-type-auto-detected-p "image" "\
Return t if the current buffer contains an auto-detectable image.
This function is intended to be used from `magic-fallback-mode-alist'.
@@ -16705,7 +16717,7 @@ The buffer is considered to contain an auto-detectable image if
its beginning matches an image type in `image-type-header-regexps',
and that image type is present in `image-type-auto-detectable' with a
non-nil value. If that value is non-nil, but not t, then the image type
-must be available." nil nil)
+must be available.")
(autoload 'create-image "image" "\
Create an image.
FILE-OR-DATA is an image file name or image data.
@@ -16731,7 +16743,7 @@ Image file names that are not absolute are searched for in the
\"images\" sub-directory of `data-directory' and
`x-bitmap-file-path' (in that order).
-(fn FILE-OR-DATA &optional TYPE DATA-P &rest PROPS)" nil nil)
+(fn FILE-OR-DATA &optional TYPE DATA-P &rest PROPS)")
(autoload 'put-image "image" "\
Put image IMAGE in front of POS in the current buffer.
IMAGE must be an image created with `create-image' or `defimage'.
@@ -16745,7 +16757,7 @@ display it in the text area, a value of `left-margin' means
display it in the left marginal area, a value of `right-margin'
means display it in the right marginal area.
-(fn IMAGE POS &optional STRING AREA)" nil nil)
+(fn IMAGE POS &optional STRING AREA)")
(autoload 'insert-image "image" "\
Insert IMAGE into current buffer at point.
IMAGE is displayed by inserting STRING into the current buffer
@@ -16769,7 +16781,7 @@ Normally `isearch' is able to search for STRING in the buffer
even if it's hidden behind a displayed image. If INHIBIT-ISEARCH
is non-nil, this is inhibited.
-(fn IMAGE &optional STRING AREA SLICE INHIBIT-ISEARCH)" nil nil)
+(fn IMAGE &optional STRING AREA SLICE INHIBIT-ISEARCH)")
(autoload 'insert-sliced-image "image" "\
Insert IMAGE into current buffer at point.
IMAGE is displayed by inserting STRING into the current buffer
@@ -16781,13 +16793,13 @@ display it in the left marginal area, a value of `right-margin'
means display it in the right marginal area.
The image is automatically split into ROWS x COLS slices.
-(fn IMAGE &optional STRING AREA ROWS COLS)" nil nil)
+(fn IMAGE &optional STRING AREA ROWS COLS)")
(autoload 'remove-images "image" "\
Remove images between START and END in BUFFER.
Remove only images that were put in BUFFER with calls to `put-image'.
BUFFER nil or omitted means use the current buffer.
-(fn START END &optional BUFFER)" nil nil)
+(fn START END &optional BUFFER)")
(autoload 'find-image "image" "\
Find an image, choosing one of a list of image specifications.
@@ -16811,7 +16823,7 @@ The image is looked for in `image-load-path'.
Image files should not be larger than specified by `max-image-size'.
-(fn SPECS &optional CACHE)" nil nil)
+(fn SPECS &optional CACHE)")
(autoload 'defimage "image" "\
Define SYMBOL as an image, and return SYMBOL.
@@ -16845,9 +16857,9 @@ Emacs visits them in Image mode. They are also added to
`image-type-file-name-regexps', so that the `image-type' function
recognizes these files as having image type `imagemagick'.
-If Emacs is compiled without ImageMagick support, this does nothing." nil nil)
+If Emacs is compiled without ImageMagick support, this does nothing.")
(autoload 'image-at-point-p "image" "\
-Return non-nil if there is an image at point." nil nil)
+Return non-nil if there is an image at point.")
(register-definition-prefixes "image" '("find-image--cache" "image" "unknown-image-type"))
@@ -16861,7 +16873,7 @@ non-nil if the first parameter is image data. The converter
should output the image in the current buffer, converted to
`image-convert-to-format'.
-(fn SUFFIX CONVERTER)" nil nil)
+(fn SUFFIX CONVERTER)")
(register-definition-prefixes "image-converter" '("image-convert"))
@@ -16875,7 +16887,7 @@ current line. ARG, if non-nil, specifies the files to use instead
of the marked files. If ARG is an integer, use the next ARG (or
previous -ARG, if ARG<0) files.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'image-dired-dired-with-window-configuration "image-dired" "\
Open directory DIR and create a default window configuration.
@@ -16894,7 +16906,7 @@ If called with prefix argument ARG, skip splitting of windows.
The current window configuration is saved and can be restored by
calling `image-dired-restore-window-configuration'.
-(fn DIR &optional ARG)" t nil)
+(fn DIR &optional ARG)" t)
(autoload 'image-dired-display-thumbs "image-dired" "\
Display thumbnails of all marked files, in `image-dired-thumbnail-buffer'.
If a thumbnail image does not exist for a file, it is created on the
@@ -16916,7 +16928,7 @@ used or not. If non-nil, use `display-buffer' instead of
`image-dired-previous-line-and-display' where we do not want the
thumbnail buffer to be selected.
-(fn &optional ARG APPEND DO-NOT-POP)" t nil)
+(fn &optional ARG APPEND DO-NOT-POP)" t)
(autoload 'image-dired-show-all-from-dir "image-dired" "\
Make a thumbnail buffer for all images in DIR and display it.
Any file matching `image-file-name-regexp' is considered an image
@@ -16927,19 +16939,19 @@ If the number of image files in DIR exceeds
before creating the thumbnail buffer. If that variable is nil,
never ask for confirmation.
-(fn DIR)" t nil)
+(fn DIR)" t)
(defalias 'image-dired 'image-dired-show-all-from-dir)
(autoload 'image-dired-tag-files "image-dired" "\
Tag marked file(s) in Dired. With prefix ARG, tag file at point.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'image-dired-delete-tag "image-dired" "\
Remove tag for selected file(s).
With prefix argument ARG, remove tag from file at point.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'image-dired-jump-thumbnail-buffer "image-dired" "\
-Jump to thumbnail buffer." t nil)
+Jump to thumbnail buffer." t)
(autoload 'image-dired-minor-mode "image-dired" "\
Setup easy-to-use keybindings for the commands to be used in Dired mode.
@@ -16961,21 +16973,21 @@ evaluate `image-dired-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'image-dired-display-thumbs-append "image-dired" "\
-Append thumbnails to `image-dired-thumbnail-buffer'." t nil)
+Append thumbnails to `image-dired-thumbnail-buffer'." t)
(autoload 'image-dired-display-thumb "image-dired" "\
-Shorthand for `image-dired-display-thumbs' with prefix argument." t nil)
+Shorthand for `image-dired-display-thumbs' with prefix argument." t)
(autoload 'image-dired-dired-display-external "image-dired" "\
-Display file at point using an external viewer." t nil)
+Display file at point using an external viewer." t)
(autoload 'image-dired-dired-display-image "image-dired" "\
Display current image file.
See documentation for `image-dired-display-image' for more information.
With prefix argument ARG, display image in its original size.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'image-dired-dired-comment-files "image-dired" "\
-Add comment to current or marked files in Dired." t nil)
+Add comment to current or marked files in Dired." t)
(autoload 'image-dired-mark-tagged-files "image-dired" "\
Use REGEXP to mark files with matching tag.
A `tag' is a keyword, a piece of meta data, associated with an
@@ -16984,15 +16996,15 @@ lets you input a regexp and this will be matched against all tags
on all image files in the database file. The files that have a
matching tag will be marked in the Dired buffer.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(autoload 'image-dired-dired-edit-comment-and-tags "image-dired" "\
Edit comment and tags of current or marked image files.
Edit comment and tags for all marked image files in an
-easy-to-use form." t nil)
+easy-to-use form." t)
(autoload 'image-dired-bookmark-jump "image-dired" "\
Default bookmark handler for Image-Dired buffers.
-(fn BOOKMARK)" nil nil)
+(fn BOOKMARK)")
(define-obsolete-function-alias 'tumme #'image-dired "24.4")
(define-obsolete-function-alias 'image-dired-setup-dired-keybindings #'image-dired-minor-mode "26.1")
(register-definition-prefixes "image-dired" '("image-dired-"))
@@ -17021,14 +17033,14 @@ enabled, setting this variable directly does not take effect unless
the variable is set using \\[customize].")
(custom-autoload 'image-file-name-regexps "image-file" nil)
(autoload 'image-file-name-regexp "image-file" "\
-Return a regular expression matching image-file filenames." nil nil)
+Return a regular expression matching image-file filenames.")
(autoload 'insert-image-file "image-file" "\
Insert the image file FILE into the current buffer.
Optional arguments VISIT, BEG, END, and REPLACE are interpreted
as for the command `insert-file-contents'. Return list of
absolute file name and number of characters inserted.
-(fn FILE &optional VISIT BEG END REPLACE)" nil nil)
+(fn FILE &optional VISIT BEG END REPLACE)")
(defvar auto-image-file-mode nil "\
Non-nil if Auto-Image-File mode is enabled.
See the `auto-image-file-mode' command
@@ -17058,7 +17070,7 @@ evaluate `(default-value \\='auto-image-file-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "image-file" '("image-file-"))
@@ -17070,7 +17082,7 @@ You can use \\<image-mode-map>\\[image-toggle-display] or \\[image-toggle-hex-di
as an image and display as text or hex.
Key bindings:
-\\{image-mode-map}" t nil)
+\\{image-mode-map}" t)
(autoload 'image-minor-mode "image-mode" "\
Toggle Image minor mode in this buffer.
@@ -17092,15 +17104,15 @@ evaluate `image-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'image-mode-to-text "image-mode" "\
Set a non-image mode as major mode in combination with image minor mode.
A non-mage major mode found from `auto-mode-alist' or fundamental mode
-displays an image file as text." nil nil)
+displays an image file as text.")
(autoload 'image-bookmark-jump "image-mode" "\
-(fn BMK)" nil nil)
+(fn BMK)")
(register-definition-prefixes "image-mode" '("image-"))
@@ -17225,17 +17237,17 @@ Add an `imenu' entry to the menu bar for the current buffer.
NAME is a string used to name the menu bar item.
See the command `imenu' for more information.
-(fn NAME)" t nil)
+(fn NAME)" t)
(autoload 'imenu-add-menubar-index "imenu" "\
Add an Imenu \"Index\" entry on the menu bar for the current buffer.
-A trivial interface to `imenu-add-to-menubar' suitable for use in a hook." t nil)
+A trivial interface to `imenu-add-to-menubar' suitable for use in a hook." t)
(autoload 'imenu "imenu" "\
Jump to a place in the buffer chosen using a buffer menu or mouse menu.
INDEX-ITEM specifies the position. See `imenu-choose-buffer-index'
for more information.
-(fn INDEX-ITEM)" t nil)
+(fn INDEX-ITEM)" t)
(register-definition-prefixes "imenu" '("imenu-"))
@@ -17249,29 +17261,29 @@ for more information.
(autoload 'indian-compose-region "ind-util" "\
Compose the region according to `composition-function-table'.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'indian-compose-string "ind-util" "\
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'in-is13194-post-read-conversion "ind-util" "\
-(fn LEN)" nil nil)
+(fn LEN)")
(autoload 'in-is13194-pre-write-conversion "ind-util" "\
-(fn FROM TO)" nil nil)
+(fn FROM TO)")
(autoload 'indian-2-column-to-ucs-region "ind-util" "\
Convert old Emacs Devanagari characters to UCS.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(register-definition-prefixes "ind-util" '("combinatorial" "indian-" "is13194-"))
;;; Generated autoloads from leim/quail/indian.el
-(register-definition-prefixes "quail/indian" '("indian-mlm-mozhi-u" "inscript-" "quail-"))
+(register-definition-prefixes "quail/indian" '("indian-mlm-mozhi-u" "inscript-" "quail-" "tamil-"))
;;; Generated autoloads from progmodes/inf-lisp.el
@@ -17290,7 +17302,7 @@ quoted using shell quote syntax.
(Type \\[describe-mode] in the process buffer for a list of commands.)
-(fn CMD)" t nil)
+(fn CMD)" t)
(defalias 'run-lisp 'inferior-lisp)
(register-definition-prefixes "inf-lisp" '("inferior-lisp-" "lisp-" "switch-to-lisp"))
@@ -17316,7 +17328,7 @@ environment variable INFOPATH is set.")
(autoload 'info-other-window "info" "\
Like `info' but show the Info buffer in another window.
-(fn &optional FILE-OR-NODE BUFFER)" t nil)
+(fn &optional FILE-OR-NODE BUFFER)" t)
(put 'info 'info-file (purecopy "emacs"))
(autoload 'info "info" "\
Enter Info, the documentation browser.
@@ -17340,23 +17352,23 @@ in all the directories in that path.
See a list of available Info commands in `Info-mode'.
-(fn &optional FILE-OR-NODE BUFFER)" t nil)
+(fn &optional FILE-OR-NODE BUFFER)" t)
(autoload 'info-emacs-manual "info" "\
-Display the Emacs manual in Info mode." t nil)
+Display the Emacs manual in Info mode." t)
(autoload 'info-emacs-bug "info" "\
-Display the \"Reporting Bugs\" section of the Emacs manual in Info mode." t nil)
+Display the \"Reporting Bugs\" section of the Emacs manual in Info mode." t)
(autoload 'info-standalone "info" "\
Run Emacs as a standalone Info reader.
Usage: emacs -f info-standalone [filename]
-In standalone mode, \\<Info-mode-map>\\[quit-window] exits Emacs itself." nil nil)
+In standalone mode, \\<Info-mode-map>\\[quit-window] exits Emacs itself.")
(autoload 'Info-on-current-buffer "info" "\
Use Info mode to browse the current Info buffer.
With a prefix arg, this queries for the node name to visit first;
otherwise, that defaults to `Top'.
-(fn &optional NODENAME)" t nil)
+(fn &optional NODENAME)" t)
(autoload 'Info-directory "info" "\
-Go to the Info directory node." t nil)
+Go to the Info directory node." t)
(autoload 'Info-index "info" "\
Look up a string TOPIC in the index for this manual and go to that entry.
If there are no exact matches to the specified topic, this chooses
@@ -17364,21 +17376,21 @@ the first match which is a case-insensitive substring of a topic.
Use the \\<Info-mode-map>\\[Info-index-next] command to see the other matches.
Give an empty topic name to go to the Index node itself.
-(fn TOPIC)" t nil)
+(fn TOPIC)" t)
(autoload 'info-apropos "info" "\
Search indices of all known Info files on your system for STRING.
If REGEXP (interactively, the prefix), use a regexp match.
Display a menu of the possible matches.
-(fn STRING &optional REGEXP)" t nil)
+(fn STRING &optional REGEXP)" t)
(autoload 'info-finder "info" "\
Display descriptions of the keywords in the Finder virtual manual.
In interactive use, a prefix argument directs this command to read
a list of keywords separated by comma. After that, it displays a node
with a list of packages that contain all specified keywords.
-(fn &optional KEYWORDS)" t nil)
+(fn &optional KEYWORDS)" t)
(autoload 'Info-mode "info" "\
Info mode provides commands for browsing through the Info documentation tree.
Documentation in Info is divided into \"nodes\", each of which discusses
@@ -17442,7 +17454,7 @@ Advanced commands:
\\[universal-argument] \\[info] Move to new Info file with completion.
\\[universal-argument] N \\[info] Select Info buffer with prefix number in the name *info*<N>.
-(fn)" t nil)
+(fn)" t)
(put 'Info-goto-emacs-command-node 'info-file (purecopy "emacs"))
(autoload 'Info-goto-emacs-command-node "info" "\
Go to the Info node in the Emacs manual for command COMMAND.
@@ -17451,7 +17463,7 @@ or in another manual found via COMMAND's `info-file' property or
the variable `Info-file-list-for-emacs'.
COMMAND must be a symbol or string.
-(fn COMMAND)" t nil)
+(fn COMMAND)" t)
(put 'Info-goto-emacs-key-command-node 'info-file (purecopy "emacs"))
(autoload 'Info-goto-emacs-key-command-node "info" "\
Go to the node in the Emacs manual which describes the command bound to KEY.
@@ -17461,15 +17473,15 @@ The command is found by looking up in Emacs manual's indices
or in another manual found via COMMAND's `info-file' property or
the variable `Info-file-list-for-emacs'.
-(fn KEY)" t nil)
+(fn KEY)" t)
(autoload 'Info-speedbar-browser "info" "\
Initialize speedbar to display an Info node browser.
-This will add a speedbar major display mode." t nil)
+This will add a speedbar major display mode." t)
(autoload 'Info-bookmark-jump "info" "\
This implements the `handler' function interface for the record
type returned by `Info-bookmark-make-record', which see.
-(fn BMK)" nil nil)
+(fn BMK)")
(autoload 'info-display-manual "info" "\
Display an Info buffer displaying MANUAL.
If there is an existing Info buffer for MANUAL, display it.
@@ -17477,7 +17489,7 @@ Otherwise, visit the manual in a new Info buffer. In interactive
use, a prefix argument directs this command to limit the
completion alternatives to currently visited manuals.
-(fn MANUAL)" t nil)
+(fn MANUAL)" t)
(register-definition-prefixes "info" '("Info-" "info-"))
@@ -17487,7 +17499,7 @@ completion alternatives to currently visited manuals.
Throw away all cached data.
This command is useful if the user wants to start at the beginning without
quitting Emacs, for example, after some Info documents were updated on the
-system." t nil)
+system." t)
(put 'info-lookup-symbol 'info-file "emacs")
(autoload 'info-lookup-symbol "info-look" "\
Look up and display documentation of SYMBOL in the relevant Info manual.
@@ -17507,7 +17519,7 @@ always prompts for MODE.
Is SAME-WINDOW, try to reuse the current window instead of
popping up a new one.
-(fn SYMBOL &optional MODE SAME-WINDOW)" t nil)
+(fn SYMBOL &optional MODE SAME-WINDOW)" t)
(put 'info-lookup-file 'info-file "emacs")
(autoload 'info-lookup-file "info-look" "\
Look up and display documentation of FILE in the relevant Info manual.
@@ -17524,15 +17536,15 @@ mode doesn't have any Info manuals known to Emacs, the command will
prompt for MODE to use, with completion. With prefix arg, the command
always prompts for MODE.
-(fn FILE &optional MODE)" t nil)
+(fn FILE &optional MODE)" t)
(autoload 'info-complete-symbol "info-look" "\
Perform completion on symbol preceding point.
-(fn &optional MODE)" t nil)
+(fn &optional MODE)" t)
(autoload 'info-complete-file "info-look" "\
Perform completion on file preceding point.
-(fn &optional MODE)" t nil)
+(fn &optional MODE)" t)
(register-definition-prefixes "info-look" '("info-"))
@@ -17565,7 +17577,7 @@ not external references, which makes it rather easy for mistakes
to creep in or node name changes to go unnoticed.
`Info-validate' doesn't check external references either.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(autoload 'info-xref-check-all "info-xref" "\
Check external references in all info documents in the info path.
`Info-directory-list' and `Info-additional-directory-list' are
@@ -17577,7 +17589,7 @@ info files don't necessarily have a \".info\" extension and in
particular the Emacs manuals normally don't. If you have a
source code directory in `Info-directory-list' then a lot of
extraneous files might be read. This will be time consuming but
-should be harmless." t nil)
+should be harmless." t)
(autoload 'info-xref-check-all-custom "info-xref" "\
Check info references in all customize groups and variables.
Info references can be in `custom-manual' or `info-link' entries
@@ -17585,7 +17597,7 @@ of the `custom-links' for a variable.
Any `custom-load' autoloads in variables are loaded in order to
get full link information. This will be a lot of Lisp packages
-and can take a long time." t nil)
+and can take a long time." t)
(autoload 'info-xref-docstrings "info-xref" "\
Check docstring info node references in source files.
The given files are searched for docstring hyperlinks like
@@ -17607,7 +17619,7 @@ and links can be in the file commentary or elsewhere too. Even
.elc files can usually be checked successfully if you don't have
the sources handy.
-(fn FILENAME-LIST)" t nil)
+(fn FILENAME-LIST)" t)
(register-definition-prefixes "info-xref" '("info-xref-"))
@@ -17616,7 +17628,7 @@ the sources handy.
(autoload 'Info-tagify "informat" "\
Create or update Info file tag table in current buffer or in a region.
-(fn &optional INPUT-BUFFER-NAME)" t nil)
+(fn &optional INPUT-BUFFER-NAME)" t)
(defvar Info-split-threshold 262144 "\
The number of characters by which `Info-split' splits an info file.")
(custom-autoload 'Info-split-threshold "informat" t)
@@ -17632,15 +17644,15 @@ should be saved in place of the original visited file.
The subfiles are written in the same directory the original file is
in, with names generated by appending `-' and a number to the original
file name. The indirect file still functions as an Info file, but it
-contains just the tag table and a directory of subfiles." t nil)
+contains just the tag table and a directory of subfiles." t)
(autoload 'Info-validate "informat" "\
Check current buffer for validity as an Info file.
-Check that every node pointer points to an existing node." t nil)
+Check that every node pointer points to an existing node." t)
(autoload 'batch-info-validate "informat" "\
Run `Info-validate' on the files remaining on the command line.
Must be used only with -batch, and kills Emacs on completion.
Each file will be processed even if an error occurred previously.
-For example, invoke \"emacs -batch -f batch-info-validate $info/ ~/*.info\"" nil nil)
+For example, invoke \"emacs -batch -f batch-info-validate $info/ ~/*.info\"")
(register-definition-prefixes "informat" '("Info-validate-"))
@@ -17671,15 +17683,15 @@ See Info node `(elisp)Defining Functions' for more details.
;;; Generated autoloads from international/isearch-x.el
(autoload 'isearch-toggle-specified-input-method "isearch-x" "\
-Select an input method and turn it on in interactive search." t nil)
+Select an input method and turn it on in interactive search." t)
(autoload 'isearch-toggle-input-method "isearch-x" "\
-Toggle input method in interactive search." t nil)
+Toggle input method in interactive search." t)
(autoload 'isearch-transient-input-method "isearch-x" "\
-Activate transient input method in interactive search." t nil)
+Activate transient input method in interactive search." t)
(autoload 'isearch-process-search-multibyte-characters "isearch-x" "\
-(fn LAST-CHAR &optional COUNT)" nil nil)
+(fn LAST-CHAR &optional COUNT)")
(register-definition-prefixes "isearch-x" '("isearch-"))
@@ -17690,7 +17702,7 @@ Activate transient input method in interactive search." t nil)
Active isearchb mode for subsequent alphanumeric keystrokes.
Executing this command again will terminate the search; or, if
the search has not yet begun, will toggle to the last buffer
-accessed via isearchb." t nil)
+accessed via isearchb." t)
(register-definition-prefixes "isearchb" '("isearchb"))
@@ -17707,71 +17719,71 @@ Translate the region between FROM and TO using the table
`iso-spanish-trans-tab'.
Optional arg BUFFER is ignored (for use in `format-alist').
-(fn FROM TO &optional BUFFER)" t nil)
+(fn FROM TO &optional BUFFER)" t)
(autoload 'iso-german "iso-cvt" "\
Translate net conventions for German to ISO 8859-1.
Translate the region FROM and TO using the table
`iso-german-trans-tab'.
Optional arg BUFFER is ignored (for use in `format-alist').
-(fn FROM TO &optional BUFFER)" t nil)
+(fn FROM TO &optional BUFFER)" t)
(autoload 'iso-iso2tex "iso-cvt" "\
Translate ISO 8859-1 characters to TeX sequences.
Translate the region between FROM and TO using the table
`iso-iso2tex-trans-tab'.
Optional arg BUFFER is ignored (for use in `format-alist').
-(fn FROM TO &optional BUFFER)" t nil)
+(fn FROM TO &optional BUFFER)" t)
(autoload 'iso-tex2iso "iso-cvt" "\
Translate TeX sequences to ISO 8859-1 characters.
Translate the region between FROM and TO using the table
`iso-tex2iso-trans-tab'.
Optional arg BUFFER is ignored (for use in `format-alist').
-(fn FROM TO &optional BUFFER)" t nil)
+(fn FROM TO &optional BUFFER)" t)
(autoload 'iso-gtex2iso "iso-cvt" "\
Translate German TeX sequences to ISO 8859-1 characters.
Translate the region between FROM and TO using the table
`iso-gtex2iso-trans-tab'.
Optional arg BUFFER is ignored (for use in `format-alist').
-(fn FROM TO &optional BUFFER)" t nil)
+(fn FROM TO &optional BUFFER)" t)
(autoload 'iso-iso2gtex "iso-cvt" "\
Translate ISO 8859-1 characters to German TeX sequences.
Translate the region between FROM and TO using the table
`iso-iso2gtex-trans-tab'.
Optional arg BUFFER is ignored (for use in `format-alist').
-(fn FROM TO &optional BUFFER)" t nil)
+(fn FROM TO &optional BUFFER)" t)
(autoload 'iso-iso2duden "iso-cvt" "\
Translate ISO 8859-1 characters to Duden sequences.
Translate the region between FROM and TO using the table
`iso-iso2duden-trans-tab'.
Optional arg BUFFER is ignored (for use in `format-alist').
-(fn FROM TO &optional BUFFER)" t nil)
+(fn FROM TO &optional BUFFER)" t)
(autoload 'iso-iso2sgml "iso-cvt" "\
Translate ISO 8859-1 characters in the region to SGML entities.
Use entities from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
Optional arg BUFFER is ignored (for use in `format-alist').
-(fn FROM TO &optional BUFFER)" t nil)
+(fn FROM TO &optional BUFFER)" t)
(autoload 'iso-sgml2iso "iso-cvt" "\
Translate SGML entities in the region to ISO 8859-1 characters.
Use entities from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
Optional arg BUFFER is ignored (for use in `format-alist').
-(fn FROM TO &optional BUFFER)" t nil)
+(fn FROM TO &optional BUFFER)" t)
(autoload 'iso-cvt-read-only "iso-cvt" "\
Warn that format is read-only.
-(fn &rest IGNORE)" t nil)
+(fn &rest IGNORE)" t)
(autoload 'iso-cvt-write-only "iso-cvt" "\
Warn that format is write-only.
-(fn &rest IGNORE)" t nil)
+(fn &rest IGNORE)" t)
(autoload 'iso-cvt-define-menu "iso-cvt" "\
-Add submenus to the File menu, to convert to and from various formats." t nil)
+Add submenus to the File menu, to convert to and from various formats." t)
(register-definition-prefixes "iso-cvt" '("iso-"))
@@ -17843,12 +17855,12 @@ nil word is correct or spelling is accepted.
(\"word\" arg) word is hand entered.
quit spell session exited.
-(fn &optional FOLLOWING QUIETLY CONTINUE REGION)" t nil)
+(fn &optional FOLLOWING QUIETLY CONTINUE REGION)" t)
(autoload 'ispell-pdict-save "ispell" "\
Check to see if the personal dictionary has been modified.
If so, ask if it needs to be saved.
-(fn &optional NO-QUERY FORCE-SAVE)" t nil)
+(fn &optional NO-QUERY FORCE-SAVE)" t)
(autoload 'ispell-help "ispell" "\
Display a list of the options available when a misspelling is encountered.
@@ -17871,13 +17883,13 @@ Selections are:
\\`m' Place typed-in value in personal dictionary, then recheck current word.
\\`C-l' Redraw screen.
\\`C-r' Recursive edit.
-\\`C-z' Suspend Emacs or iconify frame." nil nil)
+\\`C-z' Suspend Emacs or iconify frame.")
(autoload 'ispell-kill-ispell "ispell" "\
Kill current Ispell process (so that you may start a fresh one).
With NO-ERROR, just return non-nil if there was no Ispell running.
With CLEAR, buffer session localwords are cleaned.
-(fn &optional NO-ERROR CLEAR)" t nil)
+(fn &optional NO-ERROR CLEAR)" t)
(autoload 'ispell-change-dictionary "ispell" "\
Change to dictionary DICT for Ispell.
With a prefix arg, set it \"globally\", for all buffers.
@@ -17885,7 +17897,7 @@ Without a prefix arg, set it \"locally\", just for this buffer.
By just answering RET you can find out what the current dictionary is.
-(fn DICT &optional ARG)" t nil)
+(fn DICT &optional ARG)" t)
(autoload 'ispell-region "ispell" "\
Interactively check a region for spelling errors.
Leave the mark at the last misspelled word that the user was queried about.
@@ -17893,7 +17905,7 @@ Leave the mark at the last misspelled word that the user was queried about.
Return nil if spell session was terminated, otherwise returns shift offset
amount for last line processed.
-(fn REG-START REG-END &optional RECHECKP SHIFT)" t nil)
+(fn REG-START REG-END &optional RECHECKP SHIFT)" t)
(autoload 'ispell-comments-and-strings "ispell" "\
Check comments and strings in the current buffer for spelling errors.
If called interactively with an active region, check only comments and
@@ -17901,19 +17913,19 @@ strings in the region.
When called from Lisp, START and END buffer positions can be provided
to limit the check.
-(fn &optional START END)" t nil)
+(fn &optional START END)" t)
(autoload 'ispell-comment-or-string-at-point "ispell" "\
-Check the comment or string containing point for spelling errors." t nil)
+Check the comment or string containing point for spelling errors." t)
(autoload 'ispell-buffer "ispell" "\
Check the current buffer for spelling errors interactively.
-Leave the mark at the last misspelled word that the user was queried about." t nil)
+Leave the mark at the last misspelled word that the user was queried about." t)
(autoload 'ispell-buffer-with-debug "ispell" "\
`ispell-buffer' with some output sent to `ispell-debug-buffer'.
If APPEND is non-nil, don't erase previous debugging output.
-(fn &optional APPEND)" t nil)
+(fn &optional APPEND)" t)
(autoload 'ispell-continue "ispell" "\
-Continue a halted spelling session beginning with the current word." t nil)
+Continue a halted spelling session beginning with the current word." t)
(autoload 'ispell-complete-word "ispell" "\
Try to complete the word before or at point.
If optional INTERIOR-FRAG is non-nil, then the word may be a character
@@ -17921,9 +17933,9 @@ sequence inside of a word.
Standard ispell choices are then available.
-(fn &optional INTERIOR-FRAG)" t nil)
+(fn &optional INTERIOR-FRAG)" t)
(autoload 'ispell-complete-word-interior-frag "ispell" "\
-Completes word matching character sequence inside a word." t nil)
+Completes word matching character sequence inside a word." t)
(autoload 'ispell "ispell" "\
Interactively check a region or buffer for spelling errors.
If `transient-mark-mode' is on, and a region is active, spell-check
@@ -17932,7 +17944,7 @@ that region. Otherwise spell-check the buffer.
Ispell dictionaries are not distributed with Emacs. If you are
looking for a dictionary, please see the distribution of the GNU ispell
program, or do an Internet search; there are various dictionaries
-available on the net." t nil)
+available on the net." t)
(autoload 'ispell-minor-mode "ispell" "\
Toggle last-word spell checking (Ispell minor mode).
@@ -17961,7 +17973,7 @@ evaluate `ispell-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'ispell-message "ispell" "\
Check the spelling of a mail message or news post.
Don't check spelling of message headers except the Subject field.
@@ -17980,7 +17992,7 @@ in your init file:
You can bind this to the key C-c i in GNUS or mail by adding to
`news-reply-mode-hook' or `mail-mode-hook' the following lambda expression:
- (lambda () (local-set-key \"\\C-ci\" \\='ispell-message))" t nil)
+ (lambda () (local-set-key \"\\C-ci\" \\='ispell-message))" t)
(register-definition-prefixes "ispell" '("check-ispell-version" "ispell-"))
@@ -17996,7 +18008,7 @@ You can bind this to the key C-c i in GNUS or mail by adding to
;;; Generated autoloads from language/japan-util.el
-(autoload 'setup-japanese-environment-internal "japan-util" nil nil nil)
+(autoload 'setup-japanese-environment-internal "japan-util")
(autoload 'japanese-katakana "japan-util" "\
Convert argument to Katakana and return that.
The argument may be a character or string. The result has the same type.
@@ -18006,55 +18018,55 @@ Optional argument HANKAKU t means to convert to `hankaku' Katakana
may be a string even if OBJ is a character if two Katakanas are
necessary to represent OBJ.
-(fn OBJ &optional HANKAKU)" nil nil)
+(fn OBJ &optional HANKAKU)")
(autoload 'japanese-hiragana "japan-util" "\
Convert argument to Hiragana and return that.
The argument may be a character or string. The result has the same type.
The argument object is not altered--the value is a copy.
-(fn OBJ)" nil nil)
+(fn OBJ)")
(autoload 'japanese-hankaku "japan-util" "\
Convert argument to `hankaku' and return that.
The argument may be a character or string. The result has the same type.
The argument object is not altered--the value is a copy.
Optional argument ASCII-ONLY non-nil means to return only ASCII character.
-(fn OBJ &optional ASCII-ONLY)" nil nil)
+(fn OBJ &optional ASCII-ONLY)")
(autoload 'japanese-zenkaku "japan-util" "\
Convert argument to `zenkaku' and return that.
The argument may be a character or string. The result has the same type.
The argument object is not altered--the value is a copy.
-(fn OBJ)" nil nil)
+(fn OBJ)")
(autoload 'japanese-katakana-region "japan-util" "\
Convert Japanese `hiragana' chars in the region to `katakana' chars.
Optional argument HANKAKU t means to convert to `hankaku katakana' character
of which charset is `japanese-jisx0201-kana'.
-(fn FROM TO &optional HANKAKU)" t nil)
+(fn FROM TO &optional HANKAKU)" t)
(autoload 'japanese-hiragana-region "japan-util" "\
Convert Japanese `katakana' chars in the region to `hiragana' chars.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'japanese-hankaku-region "japan-util" "\
Convert Japanese `zenkaku' chars in the region to `hankaku' chars.
`Zenkaku' chars belong to `japanese-jisx0208'
`Hankaku' chars belong to `ascii' or `japanese-jisx0201-kana'.
Optional argument ASCII-ONLY non-nil means to convert only to ASCII char.
-(fn FROM TO &optional ASCII-ONLY)" t nil)
+(fn FROM TO &optional ASCII-ONLY)" t)
(autoload 'japanese-zenkaku-region "japan-util" "\
Convert hankaku' chars in the region to Japanese `zenkaku' chars.
`Zenkaku' chars belong to `japanese-jisx0208'
`Hankaku' chars belong to `ascii' or `japanese-jisx0201-kana'.
Optional argument KATAKANA-ONLY non-nil means to convert only KATAKANA char.
-(fn FROM TO &optional KATAKANA-ONLY)" t nil)
+(fn FROM TO &optional KATAKANA-ONLY)" t)
(autoload 'read-hiragana-string "japan-util" "\
Read a Hiragana string from the minibuffer, prompting with string PROMPT.
If non-nil, second arg INITIAL-INPUT is a string to insert before reading.
-(fn PROMPT &optional INITIAL-INPUT)" nil nil)
+(fn PROMPT &optional INITIAL-INPUT)")
(register-definition-prefixes "japan-util" '("japanese-"))
@@ -18087,12 +18099,12 @@ It is not recommended to set this variable permanently to anything but nil.")
(autoload 'jka-compr-handler "jka-compr" "\
-(fn OPERATION &rest ARGS)" nil nil)
+(fn OPERATION &rest ARGS)")
(autoload 'jka-compr-uninstall "jka-compr" "\
Uninstall jka-compr.
This removes the entries in `file-name-handler-alist' and `auto-mode-alist'
and `inhibit-local-variables-suffixes' that were added
-by `jka-compr-install'." nil nil)
+by `jka-compr-install'.")
(register-definition-prefixes "jka-compr" '("compression-error" "jka-compr-"))
@@ -18102,7 +18114,11 @@ by `jka-compr-install'." nil nil)
(autoload 'js-mode "js" "\
Major mode for editing JavaScript.
-(fn)" t nil)
+(fn)" t)
+(autoload 'js-json-mode "js" "\
+
+
+(fn)" t)
(autoload 'js-jsx-mode "js" "\
Major mode for editing JavaScript+JSX.
@@ -18116,7 +18132,7 @@ could set `js-jsx-syntax' to t in your init file, or in a
`js-jsx-enable' in `js-mode-hook'. You may be better served by
one of the aforementioned options instead of using this mode.
-(fn)" t nil)
+(fn)" t)
(defalias 'javascript-mode 'js-mode)
(dolist (name (list "node" "nodejs" "gjs" "rhino")) (add-to-list 'interpreter-mode-alist (cons (purecopy name) 'js-mode)))
(register-definition-prefixes "js" '("js-"))
@@ -18181,7 +18197,7 @@ keys are bound.
If SETUP is `numeric' and the optional fourth argument DECIMAL is non-nil,
the decimal key on the keypad is mapped to DECIMAL instead of `.'
-(fn SETUP &optional NUMLOCK SHIFT DECIMAL)" nil nil)
+(fn SETUP &optional NUMLOCK SHIFT DECIMAL)")
;;; Generated autoloads from international/kinsoku.el
@@ -18200,7 +18216,7 @@ shorter.
in one place, and is used for the text processing described above in
the context of text formatting.
-(fn LINEBEG)" nil nil)
+(fn LINEBEG)")
(register-definition-prefixes "kinsoku" '("kinsoku-"))
@@ -18220,7 +18236,7 @@ positions FROM and TO (integers or markers) specifying the target region.
When it returns, the point is at the tail of the selected conversion,
and the return value is the length of the conversion.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(register-definition-prefixes "kkc" '("kkc-"))
@@ -18258,7 +18274,7 @@ Use \\[kmacro-name-last-macro] to give it a name that will remain valid even
after another macro is defined.
Use \\[kmacro-bind-to-key] to bind it to a key sequence.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'kmacro-end-macro "kmacro" "\
Finish defining a keyboard macro.
The definition was started by \\[kmacro-start-macro].
@@ -18270,7 +18286,7 @@ With numeric arg, repeat macro now that many times,
counting the definition just completed as the first repetition.
An argument of zero means repeat until error.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'kmacro-call-macro "kmacro" "\
Call the keyboard MACRO that you defined with \\[kmacro-start-macro].
A prefix argument serves as a repeat count. Zero means repeat until error.
@@ -18284,7 +18300,7 @@ for details on how to adjust or disable this behavior.
To give a macro a name so you can call it even after defining others,
use \\[kmacro-name-last-macro].
-(fn ARG &optional NO-REPEAT END-MACRO MACRO)" t nil)
+(fn ARG &optional NO-REPEAT END-MACRO MACRO)" t)
(autoload 'kmacro-start-macro-or-insert-counter "kmacro" "\
Record subsequent keyboard input, defining a keyboard macro.
The commands are recorded even as they are executed.
@@ -18306,13 +18322,13 @@ The macro counter can be set directly via \\[kmacro-set-counter] and \\[kmacro-a
The format of the inserted value of the counter can be controlled
via \\[kmacro-set-format].
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'kmacro-end-or-call-macro "kmacro" "\
End kbd macro if currently being defined; else call last kbd macro.
With numeric prefix ARG, repeat macro that many times.
With \\[universal-argument], call second macro in macro ring.
-(fn ARG &optional NO-REPEAT)" t nil)
+(fn ARG &optional NO-REPEAT)" t)
(autoload 'kmacro-end-and-call-macro "kmacro" "\
Call last keyboard macro, ending it first if currently being defined.
With numeric prefix ARG, repeat macro that many times.
@@ -18321,22 +18337,29 @@ Zero argument means repeat until there is an error.
To give a macro a name, so you can call it even after defining other
macros, use \\[kmacro-name-last-macro].
-(fn ARG &optional NO-REPEAT)" t nil)
+(fn ARG &optional NO-REPEAT)" t)
(autoload 'kmacro-end-call-mouse "kmacro" "\
Move point to the position clicked with the mouse and call last kbd macro.
If kbd macro currently being defined end it before activating it.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(autoload 'kmacro "kmacro" "\
Create a `kmacro' for macro bound to symbol or key.
KEYS should be a vector or a string that obeys `key-valid-p'.
-(fn KEYS &optional COUNTER FORMAT)" nil nil)
+(fn KEYS &optional COUNTER FORMAT)")
(autoload 'kmacro-lambda-form "kmacro" "\
-(fn MAC &optional COUNTER FORMAT)" nil nil)
+(fn MAC &optional COUNTER FORMAT)")
(make-obsolete 'kmacro-lambda-form 'kmacro "29.1")
+(autoload 'kmacro-name-last-macro "kmacro" "\
+Assign a name to the last keyboard macro defined.
+Argument SYMBOL is the name to define.
+The symbol's function definition becomes the keyboard macro string.
+Such a \"function\" cannot be called from Lisp, but it is a valid editor command.
+
+(fn SYMBOL)" t)
(register-definition-prefixes "kmacro" '("kmacro-"))
@@ -18345,7 +18368,7 @@ KEYS should be a vector or a string that obeys `key-valid-p'.
(defvar default-korean-keyboard (purecopy (if (string-search "3" (or (getenv "HANGUL_KEYBOARD_TYPE") "")) "3" "")) "\
The kind of Korean keyboard for Korean (Hangul) input method.
\"\" for 2, \"3\" for 3, and \"3f\" for 3f.")
-(autoload 'setup-korean-environment-internal "korea-util" nil nil nil)
+(autoload 'setup-korean-environment-internal "korea-util")
(register-definition-prefixes "korea-util" '("exit-korean-environment" "isearch-" "korean-key-bindings" "quail-hangul-switch-" "toggle-korean-input-method"))
@@ -18359,7 +18382,7 @@ The kind of Korean keyboard for Korean (Hangul) input method.
(autoload 'lao-compose-string "lao-util" "\
-(fn STR)" nil nil)
+(fn STR)")
(autoload 'lao-transcribe-single-roman-syllable-to-lao "lao-util" "\
Transcribe a Romanized Lao syllable in the region FROM and TO to Lao string.
Only the first syllable is transcribed.
@@ -18370,19 +18393,19 @@ LAO-STRING is the Lao character transcription of it.
Optional 3rd arg STR, if non-nil, is a string to search for Roman Lao
syllable. In that case, FROM and TO are indexes to STR.
-(fn FROM TO &optional STR)" nil nil)
+(fn FROM TO &optional STR)")
(autoload 'lao-transcribe-roman-to-lao-string "lao-util" "\
Transcribe Romanized Lao string STR to Lao character string.
-(fn STR)" nil nil)
+(fn STR)")
(autoload 'lao-composition-function "lao-util" "\
-(fn GSTRING DIRECTION)" nil nil)
+(fn GSTRING DIRECTION)")
(autoload 'lao-compose-region "lao-util" "\
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(register-definition-prefixes "lao-util" '("lao-"))
@@ -18397,18 +18420,18 @@ Used by the function `latexenc-find-file-coding-system'.")
Return the corresponding coding-system for the specified input encoding.
Return nil if no matching coding system can be found.
-(fn INPUTENC)" nil nil)
+(fn INPUTENC)")
(autoload 'latexenc-coding-system-to-inputenc "latexenc" "\
Return the corresponding input encoding for the specified coding system.
Return nil if no matching input encoding can be found.
-(fn CS)" nil nil)
+(fn CS)")
(autoload 'latexenc-find-file-coding-system "latexenc" "\
Determine the coding system of a LaTeX file if it uses \"inputenc.sty\".
The mapping from LaTeX's \"inputenc.sty\" encoding names to Emacs
coding system names is determined from `latex-inputenc-coding-alist'.
-(fn ARG-LIST)" nil nil)
+(fn ARG-LIST)")
(register-definition-prefixes "latexenc" '("latexenc-dont-use-"))
@@ -18436,7 +18459,7 @@ must be in `latin1-display-sets'. With no arguments, reset the
display for all of `latin1-display-sets'. See also
`latin1-display-setup'.
-(fn &rest SETS)" nil nil)
+(fn &rest SETS)")
(defvar latin1-display-ucs-per-lynx nil "\
Set up Latin-1/ASCII display for Unicode characters.
This uses the transliterations of the Lynx browser. The display isn't
@@ -18453,7 +18476,7 @@ use either \\[customize] or the function `latin1-display'.")
(autoload 'ld-script-mode "ld-script" "\
A major mode to edit GNU ld script files.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "ld-script" '("ld-script-"))
@@ -18479,7 +18502,7 @@ Major mode for editing Less files (http://lesscss.org/).
Special commands:
\\{less-css-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "less-css-mode" '("less-css-"))
@@ -18542,7 +18565,7 @@ generations (the default is `life-step-time').
When called from Lisp, optional argument STEP-TIME is the time to
sleep in seconds.
-(fn &optional STEP-TIME)" t nil)
+(fn &optional STEP-TIME)" t)
(register-definition-prefixes "life" '("life-"))
@@ -18571,7 +18594,7 @@ evaluate `linum-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(put 'global-linum-mode 'globalized-minor-mode t)
(defvar global-linum-mode nil "\
Non-nil if Global Linum mode is enabled.
@@ -18594,7 +18617,7 @@ Linum mode is enabled in all buffers where `linum-on' would do it.
See `linum-mode' for more information on Linum mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "linum" '("linum-"))
@@ -18626,25 +18649,31 @@ binds `generated-autoload-file' as a file-local variable, write
its autoloads into the specified file instead.
The function does NOT recursively descend into subdirectories of the
-directory or directories specified.
+directory or directories specified by DIRS.
-If EXTRA-DATA, include this string at the start of the generated
-file. This will also force generation of OUTPUT-FILE even if
-there are no autoloads to put into the file.
+Optional argument EXCLUDED-FILES, if non-nil, should be a list of
+files, such as preloaded files, whose autoloads should not be written
+to OUTPUT-FILE.
-If INCLUDE-PACKAGE-VERSION, include package version data.
+If EXTRA-DATA is non-nil, it should be a string; include that string
+at the beginning of the generated file. This will also force the
+generation of OUTPUT-FILE even if there are no autoloads to put into
+that file.
-If GENERATE-FULL, don't update, but regenerate all the loaddefs files.
+If INCLUDE-PACKAGE-VERSION is non-nil, include package version data.
-(fn DIR OUTPUT-FILE &optional EXCLUDED-FILES EXTRA-DATA INCLUDE-PACKAGE-VERSION GENERATE-FULL)" nil nil)
+If GENERATE-FULL is non-nil, regenerate all the loaddefs files anew,
+instead of just updating them with the new/changed autoloads.
+
+(fn DIR OUTPUT-FILE &optional EXCLUDED-FILES EXTRA-DATA INCLUDE-PACKAGE-VERSION GENERATE-FULL)")
(autoload 'loaddefs-generate-batch "loaddefs-gen" "\
Generate loaddefs.el files in batch mode.
This scans for ;;;###autoload forms and related things.
The first element on the command line should be the (main)
loaddefs.el output file, and the rest are the directories to
-use." nil nil)
-(register-definition-prefixes "loaddefs-gen" '("autoload-" "generated-autoload-" "loaddefs-generate--"))
+use.")
+(register-definition-prefixes "loaddefs-gen" '("autoload-" "generated-autoload-" "loaddefs-generate--" "no-update-autoloads"))
;;; Generated autoloads from loadhist.el
@@ -18672,7 +18701,7 @@ definitions in the variable `unload-function-defs-list' and could
remove symbols from it in the event that the package has done
something strange, such as redefining an Emacs function.
-(fn FEATURE &optional FORCE)" t nil)
+(fn FEATURE &optional FORCE)" t)
(register-definition-prefixes "loadhist" '("feature-" "file-" "loadhist-" "read-feature" "unload-"))
@@ -18709,7 +18738,7 @@ the docstring of that function for its meaning.
After preparing the results buffer, this runs `dired-mode-hook' and
then `locate-post-command-hook'.
-(fn SEARCH-STRING &optional FILTER ARG)" t nil)
+(fn SEARCH-STRING &optional FILTER ARG)" t)
(autoload 'locate-with-filter "locate" "\
Run the executable program `locate' with a filter.
This function is similar to the function `locate', which see.
@@ -18725,7 +18754,7 @@ ARG is the interactive prefix arg, which has the same effect as in `locate'.
When called from Lisp, this function is identical with `locate',
except that FILTER is not optional.
-(fn SEARCH-STRING FILTER &optional ARG)" t nil)
+(fn SEARCH-STRING FILTER &optional ARG)" t)
(register-definition-prefixes "locate" '("locate-"))
@@ -18755,7 +18784,7 @@ If BUFFER is non-nil, `log-edit' will switch to that buffer, use it
to edit the log message and go back to the current buffer when
done. Otherwise, this function will use the current buffer.
-(fn CALLBACK &optional SETUP PARAMS BUFFER MODE &rest IGNORE)" nil nil)
+(fn CALLBACK &optional SETUP PARAMS BUFFER MODE &rest IGNORE)")
(register-definition-prefixes "log-edit" '("log-edit-"))
@@ -18764,45 +18793,10 @@ done. Otherwise, this function will use the current buffer.
(autoload 'log-view-mode "log-view" "\
Major mode for browsing CVS log output.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "log-view" '("log-view-"))
-;;; Generated autoloads from longlines.el
-
-(autoload 'longlines-mode "longlines" "\
-Toggle Long Lines mode in this buffer.
-
-When Long Lines mode is enabled, long lines are wrapped if they
-extend beyond `fill-column'. The soft newlines used for line
-wrapping will not show up when the text is yanked or saved to
-disk.
-
-If the variable `longlines-auto-wrap' is non-nil, lines are
-automatically wrapped whenever the buffer is changed. You can
-always call `fill-paragraph' to fill individual paragraphs.
-
-If the variable `longlines-show-hard-newlines' is non-nil, hard
-newlines are indicated with a symbol.
-
-This is a minor mode. If called interactively, toggle the
-`Longlines mode' mode. If the prefix argument is positive,
-enable the mode, and if it is zero or negative, disable the mode.
-
-If called from Lisp, toggle the mode if ARG is `toggle'. Enable
-the mode if ARG is nil, omitted, or is a positive number.
-Disable the mode if ARG is a negative number.
-
-To check whether the minor mode is enabled in the current buffer,
-evaluate `longlines-mode'.
-
-The mode's hook is called both when the mode is enabled and when
-it is disabled.
-
-(fn &optional ARG)" t nil)
-(register-definition-prefixes "longlines" '("longlines-"))
-
-
;;; Generated autoloads from lpr.el
(defvar lpr-windows-system (memq system-type '(ms-dos windows-nt)) "\
@@ -18844,7 +18838,7 @@ argument.")
(autoload 'lpr-buffer "lpr" "\
Print buffer contents without pagination or page headers.
See the variables `lpr-switches' and `lpr-command'
-for customization of the printer command." t nil)
+for customization of the printer command." t)
(autoload 'print-buffer "lpr" "\
Paginate and print buffer contents.
@@ -18857,13 +18851,13 @@ Otherwise, the switches in `lpr-headers-switches' are used
in the print command itself; we expect them to request pagination.
See the variables `lpr-switches' and `lpr-command'
-for further customization of the printer command." t nil)
+for further customization of the printer command." t)
(autoload 'lpr-region "lpr" "\
Print region contents without pagination or page headers.
See the variables `lpr-switches' and `lpr-command'
for customization of the printer command.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'print-region "lpr" "\
Paginate and print the region contents.
@@ -18878,7 +18872,7 @@ in the print command itself; we expect them to request pagination.
See the variables `lpr-switches' and `lpr-command'
for further customization of the printer command.
-(fn START END)" t nil)
+(fn START END)" t)
(register-definition-prefixes "lpr" '("lpr-" "print"))
@@ -18903,7 +18897,7 @@ Display the quarters of the moon for last month, this month, and next month.
If called with an optional prefix argument ARG, prompts for month and year.
This function is suitable for execution in an init file.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "lunar" '("calendar-lunar-phases" "diary-lunar-phases" "eclipse-check" "lunar-"))
@@ -18912,7 +18906,7 @@ This function is suitable for execution in an init file.
(autoload 'm4-mode "m4-mode" "\
A major mode to edit m4 macro files.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "m4-mode" '("m4-"))
@@ -18934,7 +18928,7 @@ bindings.
To save a kbd macro, visit a file of Lisp code such as your `~/.emacs',
use this command, and then save the file.
-(fn MACRONAME &optional KEYS)" t nil)
+(fn MACRONAME &optional KEYS)" t)
(autoload 'kbd-macro-query "macros" "\
Query user during kbd macro execution.
@@ -18953,7 +18947,7 @@ Your options are: \\<query-replace-map>
\\[recenter] Redisplay the screen, then ask again.
\\[edit] Enter recursive edit; ask again when you exit from that.
-(fn FLAG)" t nil)
+(fn FLAG)" t)
(autoload 'apply-macro-to-region-lines "macros" "\
Apply last keyboard macro to all lines in the region.
For each line that begins in the region, move to the beginning of
@@ -18995,7 +18989,7 @@ and write a macro to massage a word into a table entry:
and then select the region of un-tablified names and use
`\\[apply-macro-to-region-lines]' to build the table from the names.
-(fn TOP BOTTOM &optional MACRO)" t nil)
+(fn TOP BOTTOM &optional MACRO)" t)
(define-key ctl-x-map "q" 'kbd-macro-query)
(register-definition-prefixes "macros" '("macro"))
@@ -19030,19 +19024,19 @@ non-display use, you should probably use
than `mail-header-parse-address', but does less post-processing
to the results.
-(fn ADDRESS &optional ALL)" nil nil)
+(fn ADDRESS &optional ALL)")
(autoload 'what-domain "mail-extr" "\
Convert mail domain DOMAIN to the country it corresponds to.
-(fn DOMAIN)" t nil)
+(fn DOMAIN)" t)
(register-definition-prefixes "mail-extr" '("mail-extr-"))
;;; Generated autoloads from mail/mail-hist.el
(autoload 'mail-hist-define-keys "mail-hist" "\
-Define keys for accessing mail header history. For use in hooks." nil nil)
-(autoload 'mail-hist-enable "mail-hist" nil nil nil)
+Define keys for accessing mail header history. For use in hooks.")
+(autoload 'mail-hist-enable "mail-hist")
(defvar mail-hist-keep-history t "\
Non-nil means keep a history for headers and text of outgoing mail.")
(custom-autoload 'mail-hist-keep-history "mail-hist" t)
@@ -19051,7 +19045,7 @@ Put headers and contents of this message into mail header history.
Each header has its own independent history, as does the body of the
message.
-This function normally would be called when the message is sent." nil nil)
+This function normally would be called when the message is sent.")
(register-definition-prefixes "mail-hist" '("mail-hist-"))
@@ -19088,7 +19082,7 @@ also the To field, unless this would leave an empty To field.")
(autoload 'mail-file-babyl-p "mail-utils" "\
Return non-nil if FILE is a Babyl file.
-(fn FILE)" nil nil)
+(fn FILE)")
(autoload 'mail-quote-printable "mail-utils" "\
Convert a string to the \"quoted printable\" Q encoding if necessary.
If the string contains only ASCII characters and no troublesome ones,
@@ -19097,19 +19091,19 @@ we return it unconverted.
If the optional argument WRAPPER is non-nil,
we add the wrapper characters =?ISO-8859-1?Q?....?=.
-(fn STRING &optional WRAPPER)" nil nil)
+(fn STRING &optional WRAPPER)")
(autoload 'mail-quote-printable-region "mail-utils" "\
Convert the region to the \"quoted printable\" Q encoding.
If the optional argument WRAPPER is non-nil,
we add the wrapper characters =?ISO-8859-1?Q?....?=.
-(fn BEG END &optional WRAPPER)" t nil)
+(fn BEG END &optional WRAPPER)" t)
(autoload 'mail-unquote-printable "mail-utils" "\
Undo the \"quoted printable\" encoding.
If the optional argument WRAPPER is non-nil,
we expect to find and remove the wrapper characters =?ISO-8859-1?Q?....?=.
-(fn STRING &optional WRAPPER)" nil nil)
+(fn STRING &optional WRAPPER)")
(autoload 'mail-unquote-printable-region "mail-utils" "\
Undo the \"quoted printable\" encoding in buffer from BEG to END.
If the optional argument WRAPPER is non-nil,
@@ -19121,7 +19115,7 @@ If UNIBYTE is non-nil, insert converted characters as unibyte.
That is useful if you are going to character code decoding afterward,
as Rmail does.
-(fn BEG END &optional WRAPPER NOERROR UNIBYTE)" t nil)
+(fn BEG END &optional WRAPPER NOERROR UNIBYTE)" t)
(autoload 'mail-fetch-field "mail-utils" "\
Return the value of the header field whose type is FIELD-NAME.
If second arg LAST is non-nil, use the last field of type FIELD-NAME.
@@ -19132,7 +19126,7 @@ included in the result.
The buffer should be narrowed to just the header, else false
matches may be returned from the message body.
-(fn FIELD-NAME &optional LAST ALL LIST DELETE)" nil nil)
+(fn FIELD-NAME &optional LAST ALL LIST DELETE)")
(register-definition-prefixes "mail-utils" '("mail-"))
@@ -19168,14 +19162,14 @@ evaluate `(default-value \\='mail-abbrevs-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'mail-abbrevs-setup "mailabbrev" "\
-Initialize use of the `mailabbrev' package." nil nil)
+Initialize use of the `mailabbrev' package.")
(autoload 'build-mail-abbrevs "mailabbrev" "\
Read mail aliases from personal mail alias file and set `mail-abbrevs'.
By default this is the file specified by `mail-personal-alias-file'.
-(fn &optional FILE RECURSIVEP)" nil nil)
+(fn &optional FILE RECURSIVEP)")
(autoload 'define-mail-abbrev "mailabbrev" "\
Define NAME as a mail alias abbrev that translates to DEFINITION.
If DEFINITION contains multiple addresses, separate them with commas.
@@ -19185,7 +19179,7 @@ from a mailrc file. In that case, addresses are separated with
spaces and addresses with embedded spaces are surrounded by
double-quotes.
-(fn NAME DEFINITION &optional FROM-MAILRC-FILE)" t nil)
+(fn NAME DEFINITION &optional FROM-MAILRC-FILE)" t)
(register-definition-prefixes "mailabbrev" '("mail-" "merge-mail-abbrevs" "rebuild-mail-abbrevs"))
@@ -19209,7 +19203,7 @@ their `Resent-' variants.
Optional second arg EXCLUDE may be a regular expression defining text to be
removed from alias expansions.
-(fn BEG END &optional EXCLUDE)" t nil)
+(fn BEG END &optional EXCLUDE)" t)
(autoload 'define-mail-alias "mailalias" "\
Define NAME as a mail alias that translates to DEFINITION.
This means that sending a message to NAME will actually send to DEFINITION.
@@ -19219,10 +19213,10 @@ If FROM-MAILRC-FILE is non-nil, then addresses in DEFINITION
can be separated by spaces; an address can contain spaces
if it is quoted with double-quotes.
-(fn NAME DEFINITION &optional FROM-MAILRC-FILE)" t nil)
+(fn NAME DEFINITION &optional FROM-MAILRC-FILE)" t)
(autoload 'mail-completion-at-point-function "mailalias" "\
Compute completion data for mail aliases.
-For use on `completion-at-point-functions'." nil nil)
+For use on `completion-at-point-functions'.")
(register-definition-prefixes "mailalias" '("build-mail-aliases" "mail-"))
@@ -19232,7 +19226,7 @@ For use on `completion-at-point-functions'." nil nil)
Return a file name extension based on a MIME-TYPE.
For instance, `image/png' will result in `png'.
-(fn MIME-TYPE)" nil nil)
+(fn MIME-TYPE)")
(register-definition-prefixes "mailcap" '("mailcap-"))
@@ -19241,7 +19235,7 @@ For instance, `image/png' will result in `png'.
(autoload 'mailclient-send-it "mailclient" "\
Pass current buffer on to the system's mail client.
Suitable value for `send-mail-function'.
-The mail client is taken to be the handler of mailto URLs." nil nil)
+The mail client is taken to be the handler of mailto URLs.")
(register-definition-prefixes "mailclient" '("mailclient-"))
@@ -19257,42 +19251,42 @@ Call Mairix with SEARCH.
If THREADS is non-nil, also display whole threads of found
messages. Results will be put into the default search file.
-(fn SEARCH THREADS)" t nil)
+(fn SEARCH THREADS)" t)
(autoload 'mairix-use-saved-search "mairix" "\
-Use a saved search for querying Mairix." t nil)
+Use a saved search for querying Mairix." t)
(autoload 'mairix-edit-saved-searches-customize "mairix" "\
-Edit the list of saved searches in a customization buffer." t nil)
+Edit the list of saved searches in a customization buffer." t)
(autoload 'mairix-search-from-this-article "mairix" "\
Search messages from sender of the current article.
This is effectively a shortcut for calling `mairix-search' with
f:current_from. If prefix THREADS is non-nil, include whole
threads.
-(fn THREADS)" t nil)
+(fn THREADS)" t)
(autoload 'mairix-search-thread-this-article "mairix" "\
Search thread for the current article.
This is effectively a shortcut for calling `mairix-search'
-with m:msgid of the current article and enabled threads." t nil)
+with m:msgid of the current article and enabled threads." t)
(autoload 'mairix-widget-search-based-on-article "mairix" "\
-Create mairix query based on current article using widgets." t nil)
+Create mairix query based on current article using widgets." t)
(autoload 'mairix-edit-saved-searches "mairix" "\
-Edit current mairix searches." t nil)
+Edit current mairix searches." t)
(autoload 'mairix-widget-search "mairix" "\
Create mairix query interactively using graphical widgets.
MVALUES may contain values from current article.
-(fn &optional MVALUES)" t nil)
+(fn &optional MVALUES)" t)
(autoload 'mairix-update-database "mairix" "\
Call mairix for updating the database for SERVERS.
Mairix will be called asynchronously unless
`mairix-synchronous-update' is t. Mairix will be called with
-`mairix-update-options'." t nil)
+`mairix-update-options'." t)
(register-definition-prefixes "mairix" '("mairix-"))
;;; Generated autoloads from cedet/semantic/bovine/make.el
-(register-definition-prefixes "semantic/bovine/make" '("makefile-mode" "semantic-"))
+(register-definition-prefixes "semantic/bovine/make" '("semantic-"))
;;; Generated autoloads from cedet/ede/make.el
@@ -19387,27 +19381,27 @@ Makefile mode can be configured by modifying the following variables:
on one of those in the minibuffer whenever you enter a `.'.
at the beginning of a line in Makefile mode.
-(fn)" t nil)
+(fn)" t)
(autoload 'makefile-automake-mode "make-mode" "\
An adapted `makefile-mode' that knows about automake.
-(fn)" t nil)
+(fn)" t)
(autoload 'makefile-gmake-mode "make-mode" "\
An adapted `makefile-mode' that knows about gmake.
-(fn)" t nil)
+(fn)" t)
(autoload 'makefile-makepp-mode "make-mode" "\
An adapted `makefile-mode' that knows about makepp.
-(fn)" t nil)
+(fn)" t)
(autoload 'makefile-bsdmake-mode "make-mode" "\
An adapted `makefile-mode' that knows about BSD make.
-(fn)" t nil)
+(fn)" t)
(autoload 'makefile-imake-mode "make-mode" "\
An adapted `makefile-mode' that knows about imake.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "make-mode" '("makefile-"))
@@ -19421,14 +19415,6 @@ An adapted `makefile-mode' that knows about imake.
(register-definition-prefixes "makeinfo" '("makeinfo-"))
-;;; Generated autoloads from makesum.el
-
-(autoload 'make-command-summary "makesum" "\
-Make a summary of current key bindings in the buffer *Summary*.
-Previous contents of that buffer are killed first." t nil)
-(register-definition-prefixes "makesum" '("double-column"))
-
-
;;; Generated autoloads from man.el
(defalias 'manual-entry 'man)
@@ -19473,19 +19459,19 @@ Note that in some cases you will need to use \\[quoted-insert] to quote the
SPC character in the above examples, because this command attempts
to auto-complete your input based on the installed manual pages.
-(fn MAN-ARGS)" t nil)
+(fn MAN-ARGS)" t)
(autoload 'man-follow "man" "\
Get a Un*x manual page of the item under point and put it in a buffer.
-(fn MAN-ARGS)" '(man-common) nil)
+(fn MAN-ARGS)" '(man-common))
(autoload 'Man-bookmark-jump "man" "\
Default bookmark handler for Man buffers.
-(fn BOOKMARK)" nil nil)
+(fn BOOKMARK)")
(autoload 'Man-context-menu "man" "\
Populate MENU with commands that open a man page at point.
-(fn MENU CLICK)" nil nil)
+(fn MENU CLICK)")
(register-definition-prefixes "man" '("Man-" "man"))
@@ -19528,7 +19514,7 @@ evaluate `master-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "master" '("master-"))
@@ -19565,7 +19551,7 @@ evaluate `(default-value \\='minibuffer-depth-indicate-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "mb-depth" '("minibuffer-depth-"))
@@ -19581,7 +19567,7 @@ Generate a report of how Emacs is using memory.
This report is approximate, and will commonly over-count memory
usage by variables, because shared data structures will usually
-by counted more than once." t nil)
+by counted more than once." t)
(register-definition-prefixes "memory-report" '("memory-report-"))
@@ -19594,96 +19580,96 @@ Like `text-mode', but with these additional commands:
\\{message-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'message-mail "message" "\
Start editing a mail message to be sent.
OTHER-HEADERS is an alist of header/value pairs. CONTINUE says whether
to continue editing a message already being composed. SWITCH-FUNCTION
is a function used to switch to and display the mail buffer.
-(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION SEND-ACTIONS RETURN-ACTION &rest _)" t nil)
+(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION SEND-ACTIONS RETURN-ACTION &rest _)" t)
(autoload 'message-news "message" "\
Start editing a news article to be sent.
-(fn &optional NEWSGROUPS SUBJECT)" t nil)
+(fn &optional NEWSGROUPS SUBJECT)" t)
(autoload 'message-reply "message" "\
Start editing a reply to the article in the current buffer.
-(fn &optional TO-ADDRESS WIDE SWITCH-FUNCTION)" t nil)
+(fn &optional TO-ADDRESS WIDE SWITCH-FUNCTION)" t)
(autoload 'message-wide-reply "message" "\
Make a \"wide\" reply to the message in the current buffer.
-(fn &optional TO-ADDRESS)" t nil)
+(fn &optional TO-ADDRESS)" t)
(autoload 'message-followup "message" "\
Follow up to the message in the current buffer.
If TO-NEWSGROUPS, use that as the new Newsgroups line.
-(fn &optional TO-NEWSGROUPS)" t nil)
+(fn &optional TO-NEWSGROUPS)" t)
(autoload 'message-cancel-news "message" "\
Cancel an article you posted.
If ARG, allow editing of the cancellation message.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'message-supersede "message" "\
Start composing a message to supersede the current message.
This is done simply by taking the old article and adding a Supersedes
-header line with the old Message-ID." t nil)
+header line with the old Message-ID." t)
(autoload 'message-recover "message" "\
-Reread contents of current buffer from its last auto-save file." t nil)
+Reread contents of current buffer from its last auto-save file." t)
(autoload 'message-forward "message" "\
Forward the current message via mail.
Optional NEWS will use news to forward instead of mail.
Optional DIGEST will use digest to forward.
-(fn &optional NEWS DIGEST)" t nil)
+(fn &optional NEWS DIGEST)" t)
(autoload 'message-forward-make-body "message" "\
-(fn FORWARD-BUFFER &optional DIGEST)" nil nil)
+(fn FORWARD-BUFFER &optional DIGEST)")
(autoload 'message-forward-rmail-make-body "message" "\
-(fn FORWARD-BUFFER)" nil nil)
+(fn FORWARD-BUFFER)")
(autoload 'message-insinuate-rmail "message" "\
-Let RMAIL use message to forward." t nil)
+Let RMAIL use message to forward." t)
(autoload 'message-resend "message" "\
Resend the current article to ADDRESS.
-(fn ADDRESS)" t nil)
+(fn ADDRESS)" t)
(autoload 'message-bounce "message" "\
Re-mail the current message.
This only makes sense if the current message is a bounce message that
contains some mail you have written which has been bounced back to
-you." t nil)
+you." t)
(autoload 'message-mail-other-window "message" "\
Like `message-mail' command, but display mail buffer in another window.
-(fn &optional TO SUBJECT)" t nil)
+(fn &optional TO SUBJECT)" t)
(autoload 'message-mail-other-frame "message" "\
Like `message-mail' command, but display mail buffer in another frame.
-(fn &optional TO SUBJECT)" t nil)
+(fn &optional TO SUBJECT)" t)
(autoload 'message-news-other-window "message" "\
Start editing a news article to be sent.
-(fn &optional NEWSGROUPS SUBJECT)" t nil)
+(fn &optional NEWSGROUPS SUBJECT)" t)
(autoload 'message-news-other-frame "message" "\
Start editing a news article to be sent.
-(fn &optional NEWSGROUPS SUBJECT)" t nil)
+(fn &optional NEWSGROUPS SUBJECT)" t)
(autoload 'message-bold-region "message" "\
Bold all nonblank characters in the region.
Works by overstriking characters.
Called from program, takes two arguments START and END
which specify the range to operate on.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'message-unbold-region "message" "\
Remove all boldness (overstruck characters) in the region.
Called from program, takes two arguments START and END
which specify the range to operate on.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'message-mailto "message" "\
Command to parse command line mailto: links.
This is meant to be used for MIME handlers: Setting the handler
@@ -19691,7 +19677,7 @@ for \"x-scheme-handler/mailto;\" to \"emacs -f message-mailto %u\"
will then start up Emacs ready to compose mail. For emacsclient use
emacsclient -e \\='(message-mailto \"%u\")'
-(fn &optional URL)" t nil)
+(fn &optional URL)" t)
(register-definition-prefixes "message" '("message-"))
@@ -19701,12 +19687,12 @@ will then start up Emacs ready to compose mail. For emacsclient use
(autoload 'metafont-mode "meta-mode" "\
Major mode for editing Metafont sources.
-(fn)" t nil)
+(fn)" t)
(autoload 'metapost-mode "meta-mode" "\
Major mode for editing MetaPost sources.
-(fn)" t nil)
-(register-definition-prefixes "meta-mode" '("font-lock-match-meta-declaration-item-and-skip-to-next" "meta"))
+(fn)" t)
+(register-definition-prefixes "meta-mode" '("meta"))
;;; Generated autoloads from mh-e/mh-acros.el
@@ -19728,10 +19714,10 @@ Major mode for editing MetaPost sources.
(autoload 'mh-smail "mh-comp" "\
Compose a message with the MH mail system.
-See `mh-send' for more details on composing mail." t nil)
+See `mh-send' for more details on composing mail." t)
(autoload 'mh-smail-other-window "mh-comp" "\
Compose a message with the MH mail system in other window.
-See `mh-send' for more details on composing mail." t nil)
+See `mh-send' for more details on composing mail." t)
(autoload 'mh-smail-batch "mh-comp" "\
Compose a message with the MH mail system.
@@ -19745,7 +19731,7 @@ SUBJECT, and OTHER-HEADERS. Additional arguments are IGNORED.
This function remains for Emacs 21 compatibility. New
applications should use `mh-user-agent-compose'.
-(fn &optional TO SUBJECT OTHER-HEADERS &rest IGNORED)" nil nil)
+(fn &optional TO SUBJECT OTHER-HEADERS &rest IGNORED)")
(define-mail-user-agent 'mh-e-user-agent 'mh-user-agent-compose 'mh-send-letter 'mh-fully-kill-draft 'mh-before-send-letter-hook)
(autoload 'mh-user-agent-compose "mh-comp" "\
Set up mail composition draft with the MH mail system.
@@ -19763,7 +19749,7 @@ are strings.
Any additional arguments are IGNORED.
-(fn &optional TO SUBJECT OTHER-HEADERS &rest IGNORED)" nil nil)
+(fn &optional TO SUBJECT OTHER-HEADERS &rest IGNORED)")
(autoload 'mh-send-letter "mh-comp" "\
Save draft and send message.
@@ -19789,22 +19775,17 @@ use `mh-send-prog' to tell MH-E the name.
The hook `mh-annotate-msg-hook' is run after annotating the
message and scan line.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'mh-fully-kill-draft "mh-comp" "\
Quit editing and delete draft message.
If for some reason you are not happy with the draft, you can use
this command to kill the draft buffer and delete the draft
message. Use the command \\[kill-buffer] if you don't want to
-delete the draft message." t nil)
+delete the draft message." t)
(register-definition-prefixes "mh-comp" '("mh-"))
-;;; Generated autoloads from mh-e/mh-compat.el
-
-(register-definition-prefixes "mh-compat" '("mh-"))
-
-
;;; Generated autoloads from mh-e/mh-e.el
(push (purecopy '(mh-e 8 6 -4)) package--builtin-versions)
@@ -19812,7 +19793,7 @@ delete the draft message." t nil)
(put 'mh-lib 'risky-local-variable t)
(put 'mh-lib-progs 'risky-local-variable t)
(autoload 'mh-version "mh-e" "\
-Display version information about MH-E and the MH mail handling system." t nil)
+Display version information about MH-E and the MH mail handling system." t)
(register-definition-prefixes "mh-e" '("defcustom-mh" "defface-mh" "defgroup-mh" "mh-"))
@@ -19825,7 +19806,7 @@ Scan an MH folder if ARG is non-nil.
This function is an entry point to MH-E, the Emacs interface to
the MH mail system.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'mh-nmail "mh-folder" "\
Check for new mail in inbox folder.
Scan an MH folder if ARG is non-nil.
@@ -19833,7 +19814,7 @@ Scan an MH folder if ARG is non-nil.
This function is an entry point to MH-E, the Emacs interface to
the MH mail system.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'mh-folder-mode "mh-folder" "\
Major MH-E mode for \"editing\" an MH folder scan listing.\\<mh-folder-mode-map>
@@ -19890,8 +19871,8 @@ perform the operation on all messages in that region.
\\{mh-folder-mode-map}
-(fn)" t nil)
-(register-definition-prefixes "mh-folder" '(":keymap" "mh-"))
+(fn)" t)
+(register-definition-prefixes "mh-folder" '("mh-"))
;;; Generated autoloads from mh-e/mh-funcs.el
@@ -19916,7 +19897,7 @@ perform the operation on all messages in that region.
;;; Generated autoloads from mh-e/mh-letter.el
-(register-definition-prefixes "mh-letter" '(":keymap" "mh-"))
+(register-definition-prefixes "mh-letter" '("mh-"))
;;; Generated autoloads from mh-e/mh-limit.el
@@ -19941,7 +19922,7 @@ perform the operation on all messages in that region.
;;; Generated autoloads from mh-e/mh-search.el
-(register-definition-prefixes "mh-search" '(":keymap" "mh-"))
+(register-definition-prefixes "mh-search" '("mh-"))
;;; Generated autoloads from mh-e/mh-seq.el
@@ -19951,12 +19932,12 @@ perform the operation on all messages in that region.
;;; Generated autoloads from mh-e/mh-show.el
-(register-definition-prefixes "mh-show" '(":keymap" "mh-"))
+(register-definition-prefixes "mh-show" '("mh-"))
;;; Generated autoloads from mh-e/mh-speed.el
-(register-definition-prefixes "mh-speed" '(":keymap" "mh-"))
+(register-definition-prefixes "mh-speed" '("mh-"))
;;; Generated autoloads from mh-e/mh-thread.el
@@ -19988,7 +19969,7 @@ Code inside a <script> element is indented using the rules from
`js-mode'; and code inside a <style> element is indented using
the rules from `css-mode'.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "mhtml-mode" '("mhtml-"))
@@ -20019,7 +20000,7 @@ evaluate `(default-value \\='midnight-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'clean-buffer-list "midnight" "\
Kill old buffers that have not been displayed recently.
The relevant variables are `clean-buffer-list-delay-general',
@@ -20030,13 +20011,13 @@ The relevant variables are `clean-buffer-list-delay-general',
While processing buffers, this procedure displays messages containing
the current date/time, buffer name, how many seconds ago it was
displayed (can be nil if the buffer was never displayed) and its
-lifetime, i.e., its \"age\" when it will be purged." t nil)
+lifetime, i.e., its \"age\" when it will be purged." t)
(autoload 'midnight-delay-set "midnight" "\
Modify `midnight-timer' according to `midnight-delay'.
Sets the first argument SYMB (which must be symbol `midnight-delay')
to its second argument TM.
-(fn SYMB TM)" nil nil)
+(fn SYMB TM)")
(register-definition-prefixes "midnight" '("clean-buffer-list-" "midnight-"))
@@ -20075,7 +20056,7 @@ evaluate `(default-value \\='minibuffer-electric-default-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "minibuf-eldef" '("minibuf"))
@@ -20089,13 +20070,21 @@ The characters copied are inserted in the buffer before point.
Also see the `duplicate-line' command.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'duplicate-line "misc" "\
Duplicate the current line N times.
Interactively, N is the prefix numeric argument, and defaults to 1.
Also see the `copy-from-above-command' command.
-(fn &optional N)" t nil)
+(fn &optional N)" t)
+(autoload 'duplicate-dwim "misc" "\
+Duplicate the current line or region N times.
+If the region is inactive, duplicate the current line (like `duplicate-line').
+Otherwise, duplicate the region, which remains active afterwards.
+If the region is rectangular, duplicate on its right-hand side.
+Interactively, N is the prefix numeric argument, and defaults to 1.
+
+(fn &optional N)" t)
(autoload 'zap-up-to-char "misc" "\
Kill up to, but not including ARGth occurrence of CHAR.
When run interactively, the argument INTERACTIVE is non-nil.
@@ -20105,25 +20094,25 @@ Ignores CHAR at point.
If called interactively, do a case sensitive search if CHAR
is an upper-case character.
-(fn ARG CHAR &optional INTERACTIVE)" t nil)
+(fn ARG CHAR &optional INTERACTIVE)" t)
(autoload 'mark-beginning-of-buffer "misc" "\
-Set mark at the beginning of the buffer." t nil)
+Set mark at the beginning of the buffer." t)
(autoload 'mark-end-of-buffer "misc" "\
-Set mark at the end of the buffer." t nil)
+Set mark at the end of the buffer." t)
(autoload 'upcase-char "misc" "\
Uppercasify ARG chars starting from point. Point doesn't move.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'forward-to-word "misc" "\
Move forward until encountering the beginning of a word.
With argument, do this that many times.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'backward-to-word "misc" "\
Move backward until encountering the end of a word.
With argument, do this that many times.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'butterfly "misc" "\
Use butterflies to flip the desired bit on the drive platter.
Open hands and let the delicate wings flap once. The disturbance
@@ -20132,7 +20121,7 @@ upper atmosphere. These cause momentary pockets of higher-pressure
air to form, which act as lenses that deflect incoming cosmic rays,
focusing them to strike the drive platter and flip the desired bit.
You can type \\`M-x butterfly C-M-c' to run it. This is a permuted
-variation of `C-x M-c M-butterfly' from url `https://xkcd.com/378/'." t nil)
+variation of `C-x M-c M-butterfly' from url `https://xkcd.com/378/'." t)
(autoload 'list-dynamic-libraries "misc" "\
Display a list of all dynamic libraries known to Emacs.
(These are the libraries listed in `dynamic-library-alist'.)
@@ -20142,7 +20131,7 @@ Optional argument BUFFER specifies a buffer to use, instead of
\"*Dynamic Libraries*\".
The return value is always nil.
-(fn &optional LOADED-ONLY-P BUFFER)" t nil)
+(fn &optional LOADED-ONLY-P BUFFER)" t)
(register-definition-prefixes "misc" '("list-dynamic-libraries--"))
@@ -20184,9 +20173,9 @@ This is nil if Isearch is not currently searching more than one buffer.")
Sequence of files visited by multiple file buffers Isearch.")
(autoload 'multi-isearch-setup "misearch" "\
Set up isearch to search multiple buffers.
-Intended to be added to `isearch-mode-hook'." nil nil)
+Intended to be added to `isearch-mode-hook'.")
(autoload 'multi-isearch-switch-buffer "misearch" "\
-Switch to the next buffer in multi-buffer search." nil nil)
+Switch to the next buffer in multi-buffer search.")
(autoload 'multi-isearch-buffers "misearch" "\
Start multi-buffer Isearch on a list of BUFFERS.
This list can contain live buffers or their names.
@@ -20194,7 +20183,7 @@ Interactively read buffer names to search, one by one, ended with RET.
With a prefix argument, ask for a regexp, and search in buffers
whose names match the specified regexp.
-(fn BUFFERS)" t nil)
+(fn BUFFERS)" t)
(autoload 'multi-isearch-buffers-regexp "misearch" "\
Start multi-buffer regexp Isearch on a list of BUFFERS.
This list can contain live buffers or their names.
@@ -20202,7 +20191,7 @@ Interactively read buffer names to search, one by one, ended with RET.
With a prefix argument, ask for a regexp, and search in buffers
whose names match the specified regexp.
-(fn BUFFERS)" t nil)
+(fn BUFFERS)" t)
(autoload 'multi-isearch-files "misearch" "\
Start multi-buffer Isearch on a list of FILES.
Relative file names in this list are expanded to absolute
@@ -20211,7 +20200,7 @@ Interactively read file names to search, one by one, ended with RET.
With a prefix argument, ask for a wildcard, and search in file buffers
whose file names match the specified wildcard.
-(fn FILES)" t nil)
+(fn FILES)" t)
(autoload 'multi-isearch-files-regexp "misearch" "\
Start multi-buffer regexp Isearch on a list of FILES.
Relative file names in this list are expanded to absolute
@@ -20220,7 +20209,7 @@ Interactively read file names to search, one by one, ended with RET.
With a prefix argument, ask for a wildcard, and search in file buffers
whose file names match the specified wildcard.
-(fn FILES)" t nil)
+(fn FILES)" t)
(register-definition-prefixes "misearch" '("misearch-unload-function" "multi-isearch-"))
@@ -20230,7 +20219,7 @@ whose file names match the specified wildcard.
(autoload 'mixal-mode "mixal-mode" "\
Major mode for the mixal asm language.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "mixal-mode" '("mixal-"))
@@ -20255,7 +20244,7 @@ Major mode for the mixal asm language.
(autoload 'mm-default-file-type "mm-encode" "\
Return a default content type for FILE.
-(fn FILE)" nil nil)
+(fn FILE)")
(register-definition-prefixes "mm-encode" '("mm-"))
@@ -20264,14 +20253,14 @@ Return a default content type for FILE.
(autoload 'mm-extern-cache-contents "mm-extern" "\
Put the external-body part of HANDLE into its cache.
-(fn HANDLE)" nil nil)
+(fn HANDLE)")
(autoload 'mm-inline-external-body "mm-extern" "\
Show the external-body part of HANDLE.
This function replaces the buffer of HANDLE with a buffer contains
the entire message.
If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
-(fn HANDLE &optional NO-DISPLAY)" nil nil)
+(fn HANDLE &optional NO-DISPLAY)")
(register-definition-prefixes "mm-extern" '("mm-extern-"))
@@ -20283,7 +20272,7 @@ This function replaces the buffer of HANDLE with a buffer contains
the entire message.
If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
-(fn HANDLE &optional NO-DISPLAY)" nil nil)
+(fn HANDLE &optional NO-DISPLAY)")
(register-definition-prefixes "mm-partial" '("mm-partial-find-parts"))
@@ -20293,11 +20282,11 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
Insert file contents of URL.
If `mm-url-use-external' is non-nil, use `mm-url-program'.
-(fn URL)" nil nil)
+(fn URL)")
(autoload 'mm-url-insert-file-contents-external "mm-url" "\
Insert file contents of URL using `mm-url-program'.
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "mm-url" '("mm-url-"))
@@ -20314,12 +20303,12 @@ The optional NOHEADER means there's no header in the buffer.
MIME-TYPE specifies a MIME type and parameters, which defaults to the
value of `mm-uu-text-plain-type'.
-(fn &optional NOHEADER MIME-TYPE)" nil nil)
+(fn &optional NOHEADER MIME-TYPE)")
(autoload 'mm-uu-dissect-text-parts "mm-uu" "\
Dissect text parts and put uu handles into HANDLE.
Assume text has been decoded if DECODED is non-nil.
-(fn HANDLE &optional DECODED)" nil nil)
+(fn HANDLE &optional DECODED)")
(register-definition-prefixes "mm-uu" '("mm-"))
@@ -20331,7 +20320,7 @@ Assume text has been decoded if DECODED is non-nil.
;;; Generated autoloads from gnus/mml.el
(autoload 'mml-to-mime "mml" "\
-Translate the current buffer from MML to MIME." nil nil)
+Translate the current buffer from MML to MIME.")
(autoload 'mml-attach-file "mml" "\
Attach a file to the outgoing MIME message.
The file is not inserted or encoded until you send the message with
@@ -20351,7 +20340,7 @@ If given a prefix interactively, no prompting will be done for
the TYPE, DESCRIPTION or DISPOSITION values. Instead defaults
will be computed and used.
-(fn FILE &optional TYPE DESCRIPTION DISPOSITION)" t nil)
+(fn FILE &optional TYPE DESCRIPTION DISPOSITION)" t)
(register-definition-prefixes "mml" '("mime-to-mml" "mml-"))
@@ -20370,11 +20359,11 @@ will be computed and used.
(autoload 'mml1991-encrypt "mml1991" "\
-(fn CONT &optional SIGN)" nil nil)
+(fn CONT &optional SIGN)")
(autoload 'mml1991-sign "mml1991" "\
-(fn CONT)" nil nil)
+(fn CONT)")
(register-definition-prefixes "mml1991" '("mml1991-"))
@@ -20383,28 +20372,28 @@ will be computed and used.
(autoload 'mml2015-decrypt "mml2015" "\
-(fn HANDLE CTL)" nil nil)
+(fn HANDLE CTL)")
(autoload 'mml2015-decrypt-test "mml2015" "\
-(fn HANDLE CTL)" nil nil)
+(fn HANDLE CTL)")
(autoload 'mml2015-verify "mml2015" "\
-(fn HANDLE CTL)" nil nil)
+(fn HANDLE CTL)")
(autoload 'mml2015-verify-test "mml2015" "\
-(fn HANDLE CTL)" nil nil)
+(fn HANDLE CTL)")
(autoload 'mml2015-encrypt "mml2015" "\
-(fn CONT &optional SIGN)" nil nil)
+(fn CONT &optional SIGN)")
(autoload 'mml2015-sign "mml2015" "\
-(fn CONT)" nil nil)
-(autoload 'mml2015-self-encrypt "mml2015" nil nil nil)
+(fn CONT)")
+(autoload 'mml2015-self-encrypt "mml2015")
(register-definition-prefixes "mml2015" '("mml2015-"))
@@ -20451,7 +20440,7 @@ followed by the first character of the construct.
`m2-compile-command' holds the command to compile a Modula-2 program.
`m2-link-command' holds the command to link a Modula-2 program.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "modula2" '("m2-" "m3-font-lock-keywords"))
@@ -20461,19 +20450,19 @@ followed by the first character of the construct.
Convert plain text in region to Morse code.
See <https://en.wikipedia.org/wiki/Morse_code>.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'unmorse-region "morse" "\
Convert Morse coded text in region to plain text.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'nato-region "morse" "\
Convert plain text in region to NATO spelling alphabet.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'denato-region "morse" "\
Convert NATO spelling alphabet text in region to plain text.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(register-definition-prefixes "morse" '("morse-code" "nato-alphabet"))
@@ -20506,7 +20495,7 @@ hemisphere you're in.)
To test this function, evaluate:
(global-set-key [down-mouse-2] \\='mouse-drag-throw)
-(fn START-EVENT)" t nil)
+(fn START-EVENT)" t)
(autoload 'mouse-drag-drag "mouse-drag" "\
\"Drag\" the page according to a mouse drag.
@@ -20523,21 +20512,21 @@ middle button in Tk text widgets.
To test this function, evaluate:
(global-set-key [down-mouse-2] \\='mouse-drag-drag)
-(fn START-EVENT)" t nil)
+(fn START-EVENT)" t)
(register-definition-prefixes "mouse-drag" '("mouse-"))
;;; Generated autoloads from mpc.el
(autoload 'mpc "mpc" "\
-Main entry point for MPC." t nil)
-(register-definition-prefixes "mpc" '("mpc-" "tag-browser-tagtypes"))
+Main entry point for MPC." t)
+(register-definition-prefixes "mpc" '("mpc-"))
;;; Generated autoloads from play/mpuz.el
(autoload 'mpuz "mpuz" "\
-Multiplication puzzle with GNU Emacs." t nil)
+Multiplication puzzle with GNU Emacs." t)
(register-definition-prefixes "mpuz" '("mpuz-"))
@@ -20576,7 +20565,7 @@ evaluate `(default-value \\='msb-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "msb" '("mouse-select-buffer" "msb"))
@@ -20586,7 +20575,7 @@ it is disabled.
Show the list of non-empty spool files in the *spools* buffer.
Buffer is not displayed if SHOW is non-nil.
-(fn &optional NOSHOW)" t nil)
+(fn &optional NOSHOW)" t)
(register-definition-prefixes "mspools" '("mspools-"))
@@ -20604,7 +20593,7 @@ ISO-2022-based coding systems.
With prefix ARG, the output format gets more cryptic,
but still shows the full information.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'read-charset "mule-diag" "\
Read a character set from the minibuffer, prompting with string PROMPT.
It must be an Emacs character set listed in the variable `charset-list'.
@@ -20615,19 +20604,19 @@ INITIAL-INPUT, if non-nil, is a string inserted in the minibuffer initially.
See the documentation of the function `completing-read' for the detailed
meanings of these arguments.
-(fn PROMPT &optional DEFAULT-VALUE INITIAL-INPUT)" nil nil)
+(fn PROMPT &optional DEFAULT-VALUE INITIAL-INPUT)")
(autoload 'list-charset-chars "mule-diag" "\
Display a list of characters in character set CHARSET.
-(fn CHARSET)" t nil)
+(fn CHARSET)" t)
(autoload 'describe-character-set "mule-diag" "\
Display information about built-in character set CHARSET.
-(fn CHARSET)" t nil)
+(fn CHARSET)" t)
(autoload 'describe-coding-system "mule-diag" "\
Display information about CODING-SYSTEM.
-(fn CODING-SYSTEM)" t nil)
+(fn CODING-SYSTEM)" t)
(autoload 'describe-current-coding-system-briefly "mule-diag" "\
Display coding systems currently used in a brief format in echo area.
@@ -20649,9 +20638,9 @@ in place of `..':
`default-process-coding-system' for read
eol-type of `default-process-coding-system' for read
`default-process-coding-system' for write
- eol-type of `default-process-coding-system'" t nil)
+ eol-type of `default-process-coding-system'" t)
(autoload 'describe-current-coding-system "mule-diag" "\
-Display coding systems currently used, in detail." t nil)
+Display coding systems currently used, in detail." t)
(autoload 'list-coding-systems "mule-diag" "\
Display a list of all coding systems.
This shows the mnemonic letter, name, and description of each coding system.
@@ -20659,40 +20648,40 @@ This shows the mnemonic letter, name, and description of each coding system.
With prefix ARG, the output format gets more cryptic,
but still contains full information about each coding system.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'list-coding-categories "mule-diag" "\
-Display a list of all coding categories." nil nil)
+Display a list of all coding categories.")
(autoload 'describe-font "mule-diag" "\
Display information about a font whose name is FONTNAME.
-(fn FONTNAME)" t nil)
+(fn FONTNAME)" t)
(autoload 'describe-fontset "mule-diag" "\
Display information about FONTSET.
This shows which font is used for which character(s).
-(fn FONTSET)" t nil)
+(fn FONTSET)" t)
(autoload 'list-fontsets "mule-diag" "\
Display a list of all fontsets.
This shows the name, size, and style of each fontset.
With prefix arg, also list the fonts contained in each fontset;
see the function `describe-fontset' for the format of the list.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'list-input-methods "mule-diag" "\
-Display information about all input methods." t nil)
+Display information about all input methods." t)
(autoload 'mule-diag "mule-diag" "\
Display diagnosis of the multilingual environment (Mule).
This shows various information related to the current multilingual
environment, including lists of input methods, coding systems,
character sets, and fontsets (if Emacs is running under a window
-system which uses fontsets)." t nil)
+system which uses fontsets)." t)
(autoload 'font-show-log "mule-diag" "\
Show log of font listing and opening.
Prefix arg LIMIT says how many fonts to show for each listing.
The default is 20. If LIMIT is negative, do not limit the listing.
-(fn &optional LIMIT)" t nil)
+(fn &optional LIMIT)" t)
(register-definition-prefixes "mule-diag" '("charset-history" "describe-font-internal" "insert-section" "list-" "mule--kbd-at" "print-" "sort-listed-character-sets"))
@@ -20701,7 +20690,7 @@ The default is 20. If LIMIT is negative, do not limit the listing.
(autoload 'store-substring "mule-util" "\
Embed OBJ (string or character) at index IDX of STRING.
-(fn STRING IDX OBJ)" nil nil)
+(fn STRING IDX OBJ)")
(autoload 'truncate-string-to-width "mule-util" "\
Truncate string STR to end at column END-COLUMN.
The optional 3rd arg START-COLUMN, if non-nil, specifies the starting
@@ -20735,7 +20724,7 @@ If ELLIPSIS-TEXT-PROPERTY is non-nil, a too-long string will not
be truncated, but instead the elided parts will be covered by a
`display' text property showing the ellipsis.
-(fn STR END-COLUMN &optional START-COLUMN PADDING ELLIPSIS ELLIPSIS-TEXT-PROPERTY)" nil nil)
+(fn STR END-COLUMN &optional START-COLUMN PADDING ELLIPSIS ELLIPSIS-TEXT-PROPERTY)")
(defsubst nested-alist-p (obj) "\
Return t if OBJ is a nested alist.
@@ -20754,7 +20743,7 @@ Optional 5th argument BRANCHES if non-nil is branches for a keyseq
longer than KEYSEQ.
See the documentation of `nested-alist-p' for more detail.
-(fn KEYSEQ ENTRY ALIST &optional LEN BRANCHES)" nil nil)
+(fn KEYSEQ ENTRY ALIST &optional LEN BRANCHES)")
(autoload 'lookup-nested-alist "mule-util" "\
Look up key sequence KEYSEQ in nested alist ALIST. Return the definition.
Optional 3rd argument LEN specifies the length of KEYSEQ.
@@ -20767,23 +20756,23 @@ If ALIST is not deep enough for KEYSEQ, return number which is
Optional 5th argument NIL-FOR-TOO-LONG non-nil means return nil
even if ALIST is not deep enough.
-(fn KEYSEQ ALIST &optional LEN START NIL-FOR-TOO-LONG)" nil nil)
+(fn KEYSEQ ALIST &optional LEN START NIL-FOR-TOO-LONG)")
(autoload 'coding-system-post-read-conversion "mule-util" "\
Return the value of CODING-SYSTEM's `post-read-conversion' property.
-(fn CODING-SYSTEM)" nil nil)
+(fn CODING-SYSTEM)")
(autoload 'coding-system-pre-write-conversion "mule-util" "\
Return the value of CODING-SYSTEM's `pre-write-conversion' property.
-(fn CODING-SYSTEM)" nil nil)
+(fn CODING-SYSTEM)")
(autoload 'coding-system-translation-table-for-decode "mule-util" "\
Return the value of CODING-SYSTEM's `decode-translation-table' property.
-(fn CODING-SYSTEM)" nil nil)
+(fn CODING-SYSTEM)")
(autoload 'coding-system-translation-table-for-encode "mule-util" "\
Return the value of CODING-SYSTEM's `encode-translation-table' property.
-(fn CODING-SYSTEM)" nil nil)
+(fn CODING-SYSTEM)")
(autoload 'with-coding-priority "mule-util" "\
Execute BODY like `progn' with CODING-SYSTEMS at the front of priority list.
CODING-SYSTEMS is a list of coding systems. See `set-coding-system-priority'.
@@ -20797,7 +20786,7 @@ Detect a coding system for the text between FROM and TO with LANG-ENV.
The detection takes into account the coding system priorities for the
language environment LANG-ENV.
-(fn FROM TO LANG-ENV)" nil nil)
+(fn FROM TO LANG-ENV)")
(autoload 'filepos-to-bufferpos "mule-util" "\
Try to return the buffer position corresponding to a particular file position.
The file position is given as a (0-based) BYTE count.
@@ -20812,7 +20801,7 @@ QUALITY can be:
EOL format is not yet decided.)
nil, in which case we may return nil rather than an approximation.
-(fn BYTE &optional QUALITY CODING-SYSTEM)" nil nil)
+(fn BYTE &optional QUALITY CODING-SYSTEM)")
(autoload 'bufferpos-to-filepos "mule-util" "\
Try to return the file byte corresponding to a particular buffer POSITION.
Value is the file position given as a (0-based) byte count.
@@ -20827,7 +20816,7 @@ QUALITY can be:
EOL format is not yet decided.)
nil, in which case we may return nil rather than an approximation.
-(fn POSITION &optional QUALITY CODING-SYSTEM)" nil nil)
+(fn POSITION &optional QUALITY CODING-SYSTEM)")
(register-definition-prefixes "mule-util" '("filepos-to-bufferpos--dos" "truncate-string-ellipsis"))
@@ -20845,7 +20834,7 @@ List all values in the \"multisession\" database.
If CHOOSE-STORAGE (interactively, the prefix), query for the
storage method to list.
-(fn &optional CHOOSE-STORAGE)" t nil)
+(fn &optional CHOOSE-STORAGE)" t)
(register-definition-prefixes "multisession" '("multisession-"))
@@ -20876,32 +20865,32 @@ evaluate `(default-value \\='mouse-wheel-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "mwheel" '("mouse-wheel-" "mwheel-"))
;;; Generated autoloads from net/net-utils.el
(autoload 'ifconfig "net-utils" "\
-Run `ifconfig-program' and display diagnostic output." t nil)
+Run `ifconfig-program' and display diagnostic output." t)
(autoload 'iwconfig "net-utils" "\
-Run `iwconfig-program' and display diagnostic output." t nil)
+Run `iwconfig-program' and display diagnostic output." t)
(autoload 'netstat "net-utils" "\
-Run `netstat-program' and display diagnostic output." t nil)
+Run `netstat-program' and display diagnostic output." t)
(autoload 'arp "net-utils" "\
-Run `arp-program' and display diagnostic output." t nil)
+Run `arp-program' and display diagnostic output." t)
(autoload 'route "net-utils" "\
-Run `route-program' and display diagnostic output." t nil)
+Run `route-program' and display diagnostic output." t)
(autoload 'traceroute "net-utils" "\
Run `traceroute-program' for TARGET.
-(fn TARGET)" t nil)
+(fn TARGET)" t)
(autoload 'ping "net-utils" "\
Ping HOST.
If your system's ping continues until interrupted, you can try setting
`ping-program-options'.
-(fn HOST)" t nil)
+(fn HOST)" t)
(autoload 'nslookup-host "net-utils" "\
Look up the DNS information for HOST (name or IP address).
Optional argument NAME-SERVER says which server to use for
@@ -20914,7 +20903,7 @@ See also: `nslookup-host-ipv4', `nslookup-host-ipv6' for
non-interactive versions of this function more suitable for use
in Lisp code.
-(fn HOST &optional NAME-SERVER)" t nil)
+(fn HOST &optional NAME-SERVER)" t)
(autoload 'nslookup-host-ipv4 "net-utils" "\
Return the IPv4 address for HOST (name or IP address).
Optional argument NAME-SERVER says which server to use for DNS
@@ -20926,7 +20915,7 @@ vector of octets.
This command uses `nslookup-program' to look up DNS records.
-(fn HOST &optional NAME-SERVER FORMAT)" nil nil)
+(fn HOST &optional NAME-SERVER FORMAT)")
(autoload 'nslookup-host-ipv6 "net-utils" "\
Return the IPv6 address for HOST (name or IP address).
Optional argument NAME-SERVER says which server to use for DNS
@@ -20938,9 +20927,9 @@ vector of hextets.
This command uses `nslookup-program' to look up DNS records.
-(fn HOST &optional NAME-SERVER FORMAT)" nil nil)
+(fn HOST &optional NAME-SERVER FORMAT)")
(autoload 'nslookup "net-utils" "\
-Run `nslookup-program'." t nil)
+Run `nslookup-program'." t)
(autoload 'dns-lookup-host "net-utils" "\
Look up the DNS information for HOST (name or IP address).
Optional argument NAME-SERVER says which server to use for
@@ -20949,7 +20938,7 @@ Interactively, prompt for NAME-SERVER if invoked with prefix argument.
This command uses `dns-lookup-program' for looking up the DNS information.
-(fn HOST &optional NAME-SERVER)" t nil)
+(fn HOST &optional NAME-SERVER)" t)
(autoload 'run-dig "net-utils" "\
Look up DNS information for HOST (name or IP address).
Optional argument NAME-SERVER says which server to use for
@@ -20958,49 +20947,38 @@ Interactively, prompt for NAME-SERVER if invoked with prefix argument.
This command uses `dig-program' for looking up the DNS information.
-(fn HOST &optional NAME-SERVER)" t nil)
+(fn HOST &optional NAME-SERVER)" t)
(make-obsolete 'run-dig 'dig "29.1")
(autoload 'ftp "net-utils" "\
Run `ftp-program' to connect to HOST.
-(fn HOST)" t nil)
+(fn HOST)" t)
(autoload 'finger "net-utils" "\
Finger USER on HOST.
This command uses `finger-X.500-host-regexps'
and `network-connection-service-alist', which see.
-(fn USER HOST)" t nil)
+(fn USER HOST)" t)
(autoload 'whois "net-utils" "\
Send SEARCH-STRING to server defined by the `whois-server-name' variable.
If `whois-guess-server' is non-nil, then try to deduce the correct server
from SEARCH-STRING. With argument, prompt for whois server.
The port is deduced from `network-connection-service-alist'.
-(fn ARG SEARCH-STRING)" t nil)
-(autoload 'whois-reverse-lookup "net-utils" nil t nil)
+(fn ARG SEARCH-STRING)" t)
+(autoload 'whois-reverse-lookup "net-utils" nil t)
(autoload 'network-connection-to-service "net-utils" "\
Open a network connection to SERVICE on HOST.
This command uses `network-connection-service-alist', which see.
-(fn HOST SERVICE)" t nil)
+(fn HOST SERVICE)" t)
(autoload 'network-connection "net-utils" "\
Open a network connection to HOST on PORT.
-(fn HOST PORT)" t nil)
+(fn HOST PORT)" t)
(register-definition-prefixes "net-utils" '("arp-program" "dns-lookup-program" "finger-X.500-host-regexps" "ftp-" "ifconfig-program" "ipconfig" "iwconfig-program" "net" "nslookup-" "ping-program" "route-program" "run-network-program" "smbclient" "traceroute-program" "whois-"))
-;;; Generated autoloads from net/netrc.el
-
-(autoload 'netrc-credentials "netrc" "\
-Return a user name/password pair.
-Port specifications will be prioritized in the order they are
-listed in the PORTS list.
-
-(fn MACHINE &rest PORTS)" nil nil)
-(register-definition-prefixes "netrc" '("netrc-"))
-
-
;;; Generated autoloads from net/network-stream.el
(autoload 'open-network-stream "network-stream" "\
@@ -21109,7 +21087,7 @@ type (either `gnutls-x509pki' or `gnutls-anon'), and the
remaining elements should be a keyword list accepted by
gnutls-boot (as returned by `gnutls-boot-parameters').
-(fn NAME BUFFER HOST SERVICE &rest PARAMETERS)" nil nil)
+(fn NAME BUFFER HOST SERVICE &rest PARAMETERS)")
(define-obsolete-function-alias 'open-protocol-stream #'open-network-stream "26.1")
(register-definition-prefixes "network-stream" '("network-stream-"))
@@ -21119,7 +21097,7 @@ gnutls-boot (as returned by `gnutls-boot-parameters').
(autoload 'newsticker-running-p "newst-backend" "\
Check whether newsticker is running.
Return t if newsticker is running, nil otherwise. Newsticker is
-considered to be running if the newsticker timer list is not empty." nil nil)
+considered to be running if the newsticker timer list is not empty.")
(autoload 'newsticker-start "newst-backend" "\
Start the newsticker.
Start the timers for display and retrieval. If the newsticker, i.e. the
@@ -21127,21 +21105,21 @@ timers, are running already a warning message is printed unless
DO-NOT-COMPLAIN-IF-RUNNING is not nil.
Run `newsticker-start-hook' if newsticker was not running already.
-(fn &optional DO-NOT-COMPLAIN-IF-RUNNING)" t nil)
+(fn &optional DO-NOT-COMPLAIN-IF-RUNNING)" t)
(register-definition-prefixes "newst-backend" '("newsticker-"))
;;; Generated autoloads from net/newst-plainview.el
(autoload 'newsticker-plainview "newst-plainview" "\
-Start newsticker plainview." t nil)
+Start newsticker plainview." t)
(register-definition-prefixes "newst-plainview" '("newsticker-"))
;;; Generated autoloads from net/newst-reader.el
(autoload 'newsticker-show-news "newst-reader" "\
-Start reading news. You may want to bind this to a key." t nil)
+Start reading news. You may want to bind this to a key." t)
(register-definition-prefixes "newst-reader" '("newsticker-"))
@@ -21151,18 +21129,18 @@ Start reading news. You may want to bind this to a key." t nil)
Check whether newsticker's actual ticker is running.
Return t if ticker is running, nil otherwise. Newsticker is
considered to be running if the newsticker timer list is not
-empty." nil nil)
+empty.")
(autoload 'newsticker-start-ticker "newst-ticker" "\
Start newsticker's ticker (but not the news retrieval).
Start display timer for the actual ticker if wanted and not
-running already." t nil)
+running already." t)
(register-definition-prefixes "newst-ticker" '("newsticker-"))
;;; Generated autoloads from net/newst-treeview.el
(autoload 'newsticker-treeview "newst-treeview" "\
-Start newsticker treeview." t nil)
+Start newsticker treeview." t)
(register-definition-prefixes "newst-treeview" '("newsticker-"))
@@ -21186,7 +21164,7 @@ Start newsticker treeview." t nil)
(autoload 'nndiary-generate-nov-databases "nndiary" "\
Generate NOV databases in all nndiary directories.
-(fn &optional SERVER)" t nil)
+(fn &optional SERVER)" t)
(register-definition-prefixes "nndiary" '("nndiary-"))
@@ -21204,7 +21182,7 @@ as the last checked definition, if t or `first', add as the
first definition, and if any other symbol, add after that
symbol in the alist.
-(fn DEFINITION &optional POSITION)" nil nil)
+(fn DEFINITION &optional POSITION)")
(register-definition-prefixes "nndoc" '("nndoc-"))
@@ -21222,7 +21200,7 @@ symbol in the alist.
(autoload 'nnfolder-generate-active-file "nnfolder" "\
Look for mbox folders in the nnfolder directory and make them into groups.
-This command does not work if you use short group names." t nil)
+This command does not work if you use short group names." t)
(register-definition-prefixes "nnfolder" '("nnfolder-"))
@@ -21271,7 +21249,7 @@ This command does not work if you use short group names." t nil)
(autoload 'nnml-generate-nov-databases "nnml" "\
Generate NOV databases in all nnml directories.
-(fn &optional SERVER)" t nil)
+(fn &optional SERVER)" t)
(register-definition-prefixes "nnml" '("nnml-"))
@@ -21333,21 +21311,21 @@ If nil, the feature is disabled, i.e., all commands work normally.")
(autoload 'disabled-command-function "novice" "\
-(fn &optional CMD KEYS)" nil nil)
+(fn &optional CMD KEYS)")
(autoload 'enable-command "novice" "\
Allow COMMAND to be executed without special confirmation from now on.
COMMAND must be a symbol.
This command alters the user's .emacs file so that this will apply
to future sessions.
-(fn COMMAND)" t nil)
+(fn COMMAND)" t)
(autoload 'disable-command "novice" "\
Require special confirmation to execute COMMAND from now on.
COMMAND must be a symbol.
This command alters your init file so that this choice applies to
future sessions.
-(fn COMMAND)" t nil)
+(fn COMMAND)" t)
(register-definition-prefixes "novice" '("en/disable-command"))
@@ -21360,7 +21338,7 @@ Turning on Nroff mode runs `text-mode-hook', then `nroff-mode-hook'.
Also, try `nroff-electric-mode', for automatically inserting
closing requests for requests that are used in matched pairs.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "nroff-mode" '("nroff-"))
@@ -21439,7 +21417,7 @@ to nil. For more details, see the function `nxml-forward-balanced-item'.
Many aspects this mode can be customized using
\\[customize-group] nxml RET.
-(fn)" t nil)
+(fn)" t)
(defalias 'xml-mode 'nxml-mode)
(register-definition-prefixes "nxml-mode" '("nxml-"))
@@ -21711,7 +21689,7 @@ Insert a citation at point.
Insertion is done according to the processor set in `org-cite-insert-processor'.
ARG is the prefix argument received when calling interactively the function.
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "oc" '("org-cite-"))
@@ -21739,7 +21717,7 @@ ARG is the prefix argument received when calling interactively the function.
(add-to-list 'auto-mode-alist '("\\.m\\'" . octave-maybe-mode))
(autoload 'octave-maybe-mode "octave" "\
-Select `octave-mode' if the current buffer seems to hold Octave code." nil nil)
+Select `octave-mode' if the current buffer seems to hold Octave code.")
(autoload 'octave-mode "octave" "\
Major mode for editing Octave code.
@@ -21753,7 +21731,7 @@ See Info node `(octave-mode) Using Octave Mode' for more details.
Key bindings:
\\{octave-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'inferior-octave "octave" "\
Run an inferior Octave process, I/O via `inferior-octave-buffer'.
This buffer is put in Inferior Octave mode. See `inferior-octave-mode'.
@@ -21767,7 +21745,7 @@ Additional commands to be executed on startup can be provided either in
the file specified by `inferior-octave-startup-file' or by the default
startup file, `~/.emacs-octave'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defalias 'run-octave 'inferior-octave)
(register-definition-prefixes "octave" '("inferior-octave-" "octave-"))
@@ -21877,7 +21855,7 @@ Coloring:
`opascal-keyword-face' (default `font-lock-keyword-face')
Face used to color OPascal keywords.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "opascal" '("opascal-"))
@@ -21887,7 +21865,7 @@ Coloring:
(autoload 'org-babel-do-load-languages "org" "\
Load the languages defined in `org-babel-load-languages'.
-(fn SYM VALUE)" nil nil)
+(fn SYM VALUE)")
(autoload 'org-babel-load-file "org" "\
Load Emacs Lisp source code blocks in the Org FILE.
This function exports the source code using `org-babel-tangle'
@@ -21895,7 +21873,7 @@ and then loads the resulting file using `load-file'. With
optional prefix argument COMPILE, the tangled Emacs Lisp file is
byte-compiled before it is loaded.
-(fn FILE &optional COMPILE)" t nil)
+(fn FILE &optional COMPILE)" t)
(autoload 'org-version "org" "\
Show the Org version.
Interactively, or when MESSAGE is non-nil, show it in echo area.
@@ -21903,13 +21881,13 @@ With prefix argument, or when HERE is non-nil, insert it at point.
In non-interactive uses, a reduced version string is output unless
FULL is given.
-(fn &optional HERE FULL MESSAGE)" t nil)
+(fn &optional HERE FULL MESSAGE)" t)
(autoload 'org-load-modules-maybe "org" "\
Load all extensions listed in `org-modules'.
-(fn &optional FORCE)" nil nil)
+(fn &optional FORCE)")
(autoload 'org-clock-persistence-insinuate "org" "\
-Set up hooks for clock persistence." nil nil)
+Set up hooks for clock persistence.")
(autoload 'org-mode "org" "\
Outline-based notes management and organizer, alias
\"Carsten's outline-mode for keeping track of everything.\"
@@ -21929,7 +21907,7 @@ The following commands are available:
\\{org-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'org-cycle "org" "\
TAB-action and visibility cycling for Org mode.
@@ -21980,20 +21958,20 @@ there is no headline there, and if the variable `org-cycle-global-at-bob'
is non-nil, this function acts as if called with prefix argument (`\\[universal-argument] TAB',
same as `S-TAB') also when called without prefix argument.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'org-global-cycle "org" "\
Cycle the global visibility. For details see `org-cycle'.
With `\\[universal-argument]' prefix ARG, switch to startup visibility.
With a numeric prefix, show all headlines up to that level.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'org-run-like-in-org-mode "org" "\
Run a command, pretending that the current buffer is in Org mode.
This will temporarily bind local variables that are typically bound in
Org mode to the values they have in Org mode, and then interactively
call CMD.
-(fn CMD)" nil nil)
+(fn CMD)")
(autoload 'org-open-file "org" "\
Open the file at PATH.
First, this expands any special file name abbreviations. Then the
@@ -22016,14 +21994,14 @@ link, please customize `org-link-frame-setup'.
If the file does not exist, throw an error.
-(fn PATH &optional IN-EMACS LINE SEARCH)" nil nil)
+(fn PATH &optional IN-EMACS LINE SEARCH)")
(autoload 'org-open-at-point-global "org" "\
Follow a link or a time-stamp like Org mode does.
Also follow links and emails as seen by `thing-at-point'.
This command can be called in any mode to follow an external
link or a time-stamp that has Org mode syntax. Its behavior
is undefined when called on internal links like fuzzy links.
-Raise a user error when there is nothing to follow." t nil)
+Raise a user error when there is nothing to follow." t)
(autoload 'org-offer-links-in-entry "org" "\
Offer links in the current entry and return the selected link.
If there is only one link, return it.
@@ -22031,7 +22009,7 @@ If NTH is an integer, return the NTH link found.
If ZERO is a string, check also this string for a link, and if
there is one, return it.
-(fn BUFFER MARKER &optional NTH ZERO)" nil nil)
+(fn BUFFER MARKER &optional NTH ZERO)")
(autoload 'org-switchb "org" "\
Switch between Org buffers.
@@ -22039,11 +22017,11 @@ With `\\[universal-argument]' prefix, restrict available buffers to files.
With `\\[universal-argument] \\[universal-argument]' prefix, restrict available buffers to agenda files.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'org-cycle-agenda-files "org" "\
Cycle through the files in `org-agenda-files'.
If the current buffer visits an agenda file, find the next one in the list.
-If the current buffer does not, find the first agenda file." t nil)
+If the current buffer does not, find the first agenda file." t)
(autoload 'org-submit-bug-report "org" "\
Submit a bug report on Org via mail.
@@ -22051,14 +22029,14 @@ Don't hesitate to report any problems or inaccurate documentation.
If you don't have setup sending mail from (X)Emacs, please copy the
output buffer into your mail program, as it gives us important
-information about your Org version and configuration." t nil)
+information about your Org version and configuration." t)
(autoload 'org-reload "org" "\
Reload all Org Lisp files.
With prefix arg UNCOMPILED, load the uncompiled versions.
-(fn &optional UNCOMPILED)" t nil)
+(fn &optional UNCOMPILED)" t)
(autoload 'org-customize "org" "\
-Call the customize function with org as argument." t nil)
+Call the customize function with org as argument." t)
(register-definition-prefixes "org" '("org-" "turn-on-org-cdlatex"))
@@ -22067,7 +22045,7 @@ Call the customize function with org as argument." t nil)
(autoload 'org-toggle-sticky-agenda "org-agenda" "\
Toggle `org-agenda-sticky'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'org-agenda "org-agenda" "\
Dispatch agenda commands to collect entries to the agenda buffer.
Prompts for a command to execute. Any prefix arg will be passed
@@ -22102,7 +22080,7 @@ first press `<' once to indicate that the agenda should be temporarily
Pressing `<' twice means to restrict to the current subtree or region
(if active).
-(fn &optional ARG KEYS RESTRICTION)" t nil)
+(fn &optional ARG KEYS RESTRICTION)" t)
(autoload 'org-batch-agenda "org-agenda" "\
Run an agenda command in batch mode and send the result to STDOUT.
If CMD-KEY is a string of length 1, it is used as a key in
@@ -22151,7 +22129,7 @@ agenda-day The day in the agenda where this is listed
(autoload 'org-store-agenda-views "org-agenda" "\
Store agenda views.
-(fn &rest PARAMETERS)" t nil)
+(fn &rest PARAMETERS)" t)
(autoload 'org-batch-store-agenda-views "org-agenda" "\
Run all custom agenda commands that have a file argument.
@@ -22171,7 +22149,7 @@ given in `org-agenda-start-on-weekday'.
When WITH-HOUR is non-nil, only include scheduled and deadline
items if they have an hour specification like [h]h:mm.
-(fn &optional ARG START-DAY SPAN WITH-HOUR)" t nil)
+(fn &optional ARG START-DAY SPAN WITH-HOUR)" t)
(autoload 'org-search-view "org-agenda" "\
Show all entries that contain a phrase or words or regular expressions.
@@ -22217,7 +22195,7 @@ This command searches the agenda files, and in addition the files
listed in `org-agenda-text-search-extra-files' unless a restriction lock
is active.
-(fn &optional TODO-ONLY STRING EDIT-AT)" t nil)
+(fn &optional TODO-ONLY STRING EDIT-AT)" t)
(autoload 'org-todo-list "org-agenda" "\
Show all (not done) TODO entries from all agenda files in a single list.
The prefix arg can be used to select a specific TODO keyword and limit
@@ -22225,19 +22203,19 @@ the list to these. When using `\\[universal-argument]', you will be prompted
for a keyword. A numeric prefix directly selects the Nth keyword in
`org-todo-keywords-1'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'org-tags-view "org-agenda" "\
Show all headlines for all `org-agenda-files' matching a TAGS criterion.
The prefix arg TODO-ONLY limits the search to TODO entries.
-(fn &optional TODO-ONLY MATCH)" t nil)
+(fn &optional TODO-ONLY MATCH)" t)
(autoload 'org-agenda-list-stuck-projects "org-agenda" "\
Create agenda view for projects that are stuck.
Stuck projects are project that have no next actions. For the definitions
of what a project is and how to check if it stuck, customize the variable
`org-stuck-projects'.
-(fn &rest IGNORE)" t nil)
+(fn &rest IGNORE)" t)
(autoload 'org-diary "org-agenda" "\
Return diary information from org files.
This function can be used in a \"sexp\" diary entry in the Emacs calendar.
@@ -22265,11 +22243,11 @@ The function expects the lisp variables `entry' and `date' to be provided
by the caller, because this is how the calendar works. Don't use this
function from a program - use `org-agenda-get-day-entries' instead.
-(fn &rest ARGS)" nil nil)
+(fn &rest ARGS)")
(autoload 'org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item "org-agenda" "\
Do we have a reason to ignore this TODO entry because it has a time stamp?
-(fn &optional END)" nil nil)
+(fn &optional END)")
(autoload 'org-agenda-set-restriction-lock "org-agenda" "\
Set restriction lock for agenda to current subtree or file.
When in a restricted subtree, remove it.
@@ -22279,10 +22257,10 @@ or if type is \\='(4), or if the cursor is before the first headline
in the file. Otherwise, only apply the restriction to the current
subtree.
-(fn &optional TYPE)" t nil)
+(fn &optional TYPE)" t)
(autoload 'org-calendar-goto-agenda "org-agenda" "\
Compute the Org agenda for the calendar date displayed at the cursor.
-This is a command that has to be installed in `calendar-mode-map'." t nil)
+This is a command that has to be installed in `calendar-mode-map'." t)
(autoload 'org-agenda-to-appt "org-agenda" "\
Activate appointments found in `org-agenda-files'.
@@ -22316,7 +22294,7 @@ details and examples.
If an entry has a APPT_WARNTIME property, its value will be used
to override `appt-message-warning-time'.
-(fn &optional REFRESH FILTER &rest ARGS)" t nil)
+(fn &optional REFRESH FILTER &rest ARGS)" t)
(register-definition-prefixes "org-agenda" '("org-"))
@@ -22340,7 +22318,7 @@ to override `appt-message-warning-time'.
(autoload 'org-capture-string "org-capture" "\
Capture STRING with the template selected by KEYS.
-(fn STRING &optional KEYS)" t nil)
+(fn STRING &optional KEYS)" t)
(autoload 'org-capture "org-capture" "\
Capture something.
\\<org-capture-mode-map>
@@ -22370,9 +22348,9 @@ agenda will use the date at point as the default date. Then, a
`C-1' prefix will tell the capture process to use the HH:MM time
of the day at point (if any) or the current HH:MM time.
-(fn &optional GOTO KEYS)" t nil)
+(fn &optional GOTO KEYS)" t)
(autoload 'org-capture-import-remember-templates "org-capture" "\
-Set `org-capture-templates' to be similar to `org-remember-templates'." t nil)
+Set `org-capture-templates' to be similar to `org-remember-templates'." t)
(register-definition-prefixes "org-capture" '("org-capture-"))
@@ -22394,15 +22372,15 @@ Set `org-capture-templates' to be similar to `org-remember-templates'." t nil)
;;; Generated autoloads from org/org-crypt.el
(autoload 'org-encrypt-entry "org-crypt" "\
-Encrypt the content of the current headline." t nil)
+Encrypt the content of the current headline." t)
(autoload 'org-decrypt-entry "org-crypt" "\
-Decrypt the content of the current headline." t nil)
+Decrypt the content of the current headline." t)
(autoload 'org-encrypt-entries "org-crypt" "\
-Encrypt all top-level entries in the current buffer." t nil)
+Encrypt all top-level entries in the current buffer." t)
(autoload 'org-decrypt-entries "org-crypt" "\
-Decrypt all entries in the current buffer." t nil)
+Decrypt all entries in the current buffer." t)
(autoload 'org-crypt-use-before-save-magic "org-crypt" "\
-Add a hook to automatically encrypt entries before a file is saved to disk." nil nil)
+Add a hook to automatically encrypt entries before a file is saved to disk.")
(register-definition-prefixes "org-crypt" '("org-"))
@@ -22555,10 +22533,10 @@ Add a hook to automatically encrypt entries before a file is saved to disk." nil
(autoload 'org-release "org-version" "\
The release version of Org.
-Inserted by installing Org mode or when a release is made." nil nil)
+Inserted by installing Org mode or when a release is made.")
(autoload 'org-git-version "org-version" "\
The Git version of Org mode.
-Inserted by installing Org or when a release is made." nil nil)
+Inserted by installing Org or when a release is made.")
;;; Generated autoloads from outline.el
@@ -22589,7 +22567,7 @@ beginning of the line. The longer the match, the deeper the level.
Turning on outline mode calls the value of `text-mode-hook' and then of
`outline-mode-hook', if they are non-nil.
-(fn)" t nil)
+(fn)" t)
(autoload 'outline-minor-mode "outline" "\
Toggle Outline minor mode.
@@ -22609,7 +22587,7 @@ evaluate `outline-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "outline" '("outline-"))
@@ -22670,7 +22648,7 @@ Export is done in a buffer named \"*Org KOMA-LETTER Export*\". It
will be displayed if `org-export-show-temporary-export-buffer' is
non-nil.
-(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil)
+(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t)
(autoload 'org-koma-letter-export-to-latex "ox-koma-letter" "\
Export current buffer as a KOMA Scrlttr2 letter (tex).
@@ -22702,7 +22680,7 @@ directory.
Return output file's name.
-(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil)
+(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t)
(autoload 'org-koma-letter-export-to-pdf "ox-koma-letter" "\
Export current buffer as a KOMA Scrlttr2 letter (pdf).
@@ -22731,7 +22709,7 @@ file-local settings.
Return PDF file's name.
-(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t nil)
+(fn &optional ASYNC SUBTREEP VISIBLE-ONLY BODY-ONLY EXT-PLIST)" t)
(register-definition-prefixes "ox-koma-letter" '("org-koma-letter-"))
@@ -22790,15 +22768,17 @@ call (package-activate-all) in your init-file.")
Directory containing the user's Emacs Lisp packages.
The directory name should be absolute.
Apart from this directory, Emacs also looks for system-wide
-packages in `package-directory-list'." :type 'directory :initialize #'custom-initialize-delay :risky t :version "24.1")
+packages in `package-directory-list'." :type 'directory :initialize #'custom-initialize-delay :risky t :group 'applications :version "24.1")
(custom-autoload 'package-user-dir "package" t)
(defcustom package-directory-list (let (result) (dolist (f load-path) (and (stringp f) (equal (file-name-nondirectory f) "site-lisp") (push (expand-file-name "elpa" f) result))) (nreverse result)) "\
List of additional directories containing Emacs Lisp packages.
Each directory name should be absolute.
These directories contain packages intended for system-wide; in
-contrast, `package-user-dir' contains packages for personal use." :type '(repeat directory) :initialize #'custom-initialize-delay :risky t :version "24.1")
+contrast, `package-user-dir' contains packages for personal use." :type '(repeat directory) :initialize #'custom-initialize-delay :group 'applications :risky t :version "24.1")
(custom-autoload 'package-directory-list "package" t)
+(defvar package-activated-list nil "\
+List of the names of currently activated packages.")
(defvar package--activated nil "\
Non-nil if `package-activate-all' has been run.")
(autoload 'package-initialize "package" "\
@@ -22817,14 +22797,15 @@ superfluous call to `package-initialize' from your init-file. If
you have code which must run before `package-initialize', put
that code in the early init-file.
-(fn &optional NO-ACTIVATE)" t nil)
+(fn &optional NO-ACTIVATE)" t)
(defun package-activate-all nil "\
Activate all installed packages.
The variable `package-load-list' controls which packages to load." (setq package--activated t) (let* ((elc (concat package-quickstart-file "c")) (qs (if (file-readable-p elc) elc (if (file-readable-p package-quickstart-file) package-quickstart-file)))) (if (and qs (not (bound-and-true-p package-activated-list))) (let ((load-source-file-function nil)) (unless (boundp 'package-activated-list) (setq package-activated-list nil)) (load qs nil 'nomessage)) (require 'package) (package--activate-all))))
+(autoload 'package--activate-all "package")
(autoload 'package-import-keyring "package" "\
Import keys from FILE.
-(fn &optional FILE)" t nil)
+(fn &optional FILE)" t)
(autoload 'package-refresh-contents "package" "\
Download descriptions of all configured ELPA packages.
For each archive configured in the variable `package-archives',
@@ -22833,7 +22814,7 @@ and make them available for download.
Optional argument ASYNC specifies whether to perform the
downloads in the background.
-(fn &optional ASYNC)" t nil)
+(fn &optional ASYNC)" t)
(autoload 'package-installed-p "package" "\
Return non-nil if PACKAGE, of MIN-VERSION or newer, is installed.
If PACKAGE is a symbol, it is the package name and MIN-VERSION
@@ -22841,7 +22822,7 @@ should be a version list.
If PACKAGE is a `package-desc' object, MIN-VERSION is ignored.
-(fn PACKAGE &optional MIN-VERSION)" nil nil)
+(fn PACKAGE &optional MIN-VERSION)")
(autoload 'package-install "package" "\
Install the package PKG.
PKG can be a `package-desc' or a symbol naming one of the
@@ -22858,17 +22839,17 @@ non-nil, install the package but do not add it to
If PKG is a `package-desc' and it is already installed, don't try
to install it but still mark it as selected.
-(fn PKG &optional DONT-SELECT)" t nil)
+(fn PKG &optional DONT-SELECT)" t)
(autoload 'package-update "package" "\
Update package NAME if a newer version exists.
-(fn NAME)" t nil)
+(fn NAME)" t)
(autoload 'package-update-all "package" "\
Refresh package list and upgrade all packages.
If QUERY, ask the user before updating packages. When called
interactively, QUERY is always true.
-(fn &optional QUERY)" t nil)
+(fn &optional QUERY)" t)
(autoload 'package-install-from-buffer "package" "\
Install a package from the current buffer.
The current buffer is assumed to be a single .el or .tar file or
@@ -22879,46 +22860,46 @@ Specially, if current buffer is a directory, the -pkg.el
description file is not mandatory, in which case the information
is derived from the main .el file in the directory.
-Downloads and installs required packages as needed." t nil)
+Downloads and installs required packages as needed." t)
(autoload 'package-install-file "package" "\
Install a package from FILE.
The file can either be a tar file, an Emacs Lisp file, or a
directory.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'package-install-selected-packages "package" "\
Ensure packages in `package-selected-packages' are installed.
If some packages are not installed, propose to install them.
If optional argument NOCONFIRM is non-nil, don't ask for
confirmation to install packages.
-(fn &optional NOCONFIRM)" t nil)
+(fn &optional NOCONFIRM)" t)
(autoload 'package-reinstall "package" "\
Reinstall package PKG.
PKG should be either a symbol, the package name, or a `package-desc'
object.
-(fn PKG)" t nil)
+(fn PKG)" t)
(autoload 'package-recompile "package" "\
Byte-compile package PKG again.
PKG should be either a symbol, the package name, or a `package-desc'
object.
-(fn PKG)" t nil)
+(fn PKG)" t)
(autoload 'package-recompile-all "package" "\
Byte-compile all installed packages.
This is meant to be used only in the case the byte-compiled files
-are invalid due to changed byte-code, macros or the like." t nil)
+are invalid due to changed byte-code, macros or the like." t)
(autoload 'package-autoremove "package" "\
Remove packages that are no longer needed.
Packages that are no more needed by other packages in
`package-selected-packages' and their dependencies
-will be deleted." t nil)
+will be deleted." t)
(autoload 'describe-package "package" "\
Display the full documentation of PACKAGE (a symbol).
-(fn PACKAGE)" t nil)
+(fn PACKAGE)" t)
(autoload 'list-packages "package" "\
Display a list of packages.
This first fetches the updated list of packages before
@@ -22927,7 +22908,7 @@ The list is displayed in a buffer named `*Packages*', and
includes the package's version, availability status, and a
short description.
-(fn &optional NO-FETCH)" t nil)
+(fn &optional NO-FETCH)" t)
(defalias 'package-list-packages 'list-packages)
(autoload 'package-get-version "package" "\
Return the version number of the package in which this is used.
@@ -22935,10 +22916,10 @@ Assumes it is used from an Elisp file placed inside the top-level directory
of an installed ELPA package.
The return value is a string (or nil in case we can't find it).
It works in more cases if the call is in the file which contains
-the `Version:' header." nil nil)
+the `Version:' header.")
(function-put 'package-get-version 'pure 't)
(defcustom package-quickstart-file (locate-user-emacs-file "package-quickstart.el") "\
-Location of the file used to speed up activation of packages at startup." :type 'file :initialize #'custom-initialize-delay :version "27.1")
+Location of the file used to speed up activation of packages at startup." :type 'file :group 'applications :initialize #'custom-initialize-delay :version "27.1")
(custom-autoload 'package-quickstart-file "package" t)
(register-definition-prefixes "package" '("bad-signature" "define-package" "describe-package-1" "package-"))
@@ -22958,7 +22939,7 @@ is created. The directory need not have any initial contents
(i.e., you can use this command to populate an initially empty
archive).
-(fn FILE)" t nil)
+(fn FILE)" t)
(register-definition-prefixes "package-x" '("package-"))
@@ -22981,7 +22962,7 @@ The values returned are identical to those of `decode-time', but
any unknown values other than DST are returned as nil, and an
unknown DST value is returned as -1.
-(fn STRING)" nil nil)
+(fn STRING)")
(register-definition-prefixes "parse-time" '("parse-"))
@@ -23029,7 +23010,7 @@ Variables controlling indentation/edit style:
See also the user variables `pascal-type-keywords', `pascal-start-keywords' and
`pascal-separator-keywords'.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "pascal" '("electric-pascal-" "pascal-"))
@@ -23045,7 +23026,7 @@ Whether passwords are cached at all is controlled by `password-cache'.")
(autoload 'password-in-cache-p "password-cache" "\
Check if KEY is in the cache.
-(fn KEY)" nil nil)
+(fn KEY)")
(register-definition-prefixes "password-cache" '("password-"))
@@ -23094,7 +23075,7 @@ Emacs Lisp manual for more information and examples.
(fn EXP &rest CASES)" nil t)
(function-put 'pcase 'lisp-indent-function 1)
(put 'pcase 'function-documentation '(pcase--make-docstring))
-(autoload 'pcase--make-docstring "pcase" nil nil nil)
+(autoload 'pcase--make-docstring "pcase")
(autoload 'pcase-exhaustive "pcase" "\
The exhaustive version of `pcase' (which see).
If EXP fails to match any of the patterns in CASES, an error is
@@ -23182,22 +23163,22 @@ for the result of evaluating EXP (first arg to `pcase').
;;; Generated autoloads from pcmpl-cvs.el
(autoload 'pcomplete/cvs "pcmpl-cvs" "\
-Completion rules for the `cvs' command." nil nil)
+Completion rules for the `cvs' command.")
(register-definition-prefixes "pcmpl-cvs" '("pcmpl-cvs-"))
;;; Generated autoloads from pcmpl-gnu.el
(autoload 'pcomplete/gzip "pcmpl-gnu" "\
-Completion for `gzip'." nil nil)
+Completion for `gzip'.")
(autoload 'pcomplete/bzip2 "pcmpl-gnu" "\
-Completion for `bzip2'." nil nil)
+Completion for `bzip2'.")
(autoload 'pcomplete/make "pcmpl-gnu" "\
-Completion for GNU `make'." nil nil)
+Completion for GNU `make'.")
(autoload 'pcomplete/tar "pcmpl-gnu" "\
-Completion for the GNU tar utility." nil nil)
+Completion for the GNU tar utility.")
(autoload 'pcomplete/find "pcmpl-gnu" "\
-Completion for the GNU find utility." nil nil)
+Completion for the GNU find utility.")
(defalias 'pcomplete/gdb 'pcomplete/xargs)
(register-definition-prefixes "pcmpl-gnu" '("pcmpl-gnu-" "pcomplete/find"))
@@ -23205,62 +23186,62 @@ Completion for the GNU find utility." nil nil)
;;; Generated autoloads from pcmpl-linux.el
(autoload 'pcomplete/kill "pcmpl-linux" "\
-Completion for GNU/Linux `kill', using /proc filesystem." nil nil)
+Completion for GNU/Linux `kill', using /proc filesystem.")
(autoload 'pcomplete/umount "pcmpl-linux" "\
-Completion for GNU/Linux `umount'." nil nil)
+Completion for GNU/Linux `umount'.")
(autoload 'pcomplete/mount "pcmpl-linux" "\
-Completion for GNU/Linux `mount'." nil nil)
+Completion for GNU/Linux `mount'.")
(register-definition-prefixes "pcmpl-linux" '("pcmpl-linux-" "pcomplete-pare-list"))
;;; Generated autoloads from pcmpl-rpm.el
(autoload 'pcomplete/rpm "pcmpl-rpm" "\
-Completion for the `rpm' command." nil nil)
+Completion for the `rpm' command.")
(register-definition-prefixes "pcmpl-rpm" '("pcmpl-rpm-"))
;;; Generated autoloads from pcmpl-unix.el
(autoload 'pcomplete/cd "pcmpl-unix" "\
-Completion for `cd'." nil nil)
+Completion for `cd'.")
(defalias 'pcomplete/pushd 'pcomplete/cd)
(autoload 'pcomplete/rmdir "pcmpl-unix" "\
-Completion for `rmdir'." nil nil)
+Completion for `rmdir'.")
(autoload 'pcomplete/rm "pcmpl-unix" "\
-Completion for `rm'." nil nil)
+Completion for `rm'.")
(autoload 'pcomplete/xargs "pcmpl-unix" "\
-Completion for `xargs'." nil nil)
+Completion for `xargs'.")
(defalias 'pcomplete/time 'pcomplete/xargs)
(autoload 'pcomplete/which "pcmpl-unix" "\
-Completion for `which'." nil nil)
+Completion for `which'.")
(autoload 'pcomplete/chown "pcmpl-unix" "\
-Completion for the `chown' command." nil nil)
+Completion for the `chown' command.")
(autoload 'pcomplete/chgrp "pcmpl-unix" "\
-Completion for the `chgrp' command." nil nil)
+Completion for the `chgrp' command.")
(autoload 'pcomplete/ssh "pcmpl-unix" "\
-Completion rules for the `ssh' command." nil nil)
+Completion rules for the `ssh' command.")
(defalias 'pcomplete/rsh #'pcomplete/ssh)
(autoload 'pcomplete/scp "pcmpl-unix" "\
Completion rules for the `scp' command.
-Includes files as well as host names followed by a colon." nil nil)
-(autoload 'pcomplete/telnet "pcmpl-unix" nil nil nil)
+Includes files as well as host names followed by a colon.")
+(autoload 'pcomplete/telnet "pcmpl-unix")
(register-definition-prefixes "pcmpl-unix" '("pcmpl-" "pcomplete/"))
;;; Generated autoloads from pcmpl-x.el
(autoload 'pcomplete/tlmgr "pcmpl-x" "\
-Completion for the `tlmgr' command." nil nil)
+Completion for the `tlmgr' command.")
(autoload 'pcomplete/ack "pcmpl-x" "\
Completion for the `ack' command.
Start an argument with `-' to complete short options and `--' for
-long options." nil nil)
+long options.")
(defalias 'pcomplete/ack-grep 'pcomplete/ack)
(autoload 'pcomplete/ag "pcmpl-x" "\
-Completion for the `ag' command." nil nil)
+Completion for the `ag' command.")
(autoload 'pcomplete/bcc32 "pcmpl-x" "\
-Completion function for Borland's C++ compiler." nil nil)
+Completion function for Borland's C++ compiler.")
(defalias 'pcomplete/bcc 'pcomplete/bcc32)
(register-definition-prefixes "pcmpl-x" '("pcmpl-x-"))
@@ -23272,32 +23253,32 @@ Support extensible programmable completion.
To use this function, just bind the TAB key to it, or add it to your
completion functions list (it should occur fairly early in the list).
-(fn &optional INTERACTIVELY)" t nil)
+(fn &optional INTERACTIVELY)" t)
(make-obsolete 'pcomplete '"use completion-at-point and pcomplete-completions-at-point" "27.1")
(autoload 'pcomplete-reverse "pcomplete" "\
-If cycling completion is in use, cycle backwards." t nil)
+If cycling completion is in use, cycle backwards." t)
(autoload 'pcomplete-expand-and-complete "pcomplete" "\
Expand the textual value of the current argument.
-This will modify the current buffer." t nil)
+This will modify the current buffer." t)
(autoload 'pcomplete-continue "pcomplete" "\
-Complete without reference to any cycling completions." t nil)
+Complete without reference to any cycling completions." t)
(autoload 'pcomplete-expand "pcomplete" "\
Expand the textual value of the current argument.
-This will modify the current buffer." t nil)
+This will modify the current buffer." t)
(autoload 'pcomplete-help "pcomplete" "\
-Display any help information relative to the current argument." t nil)
+Display any help information relative to the current argument." t)
(make-obsolete 'pcomplete-help '"use completion-help-at-point and pcomplete-completions-at-point" "27.1")
(autoload 'pcomplete-list "pcomplete" "\
-Show the list of possible completions for the current argument." t nil)
+Show the list of possible completions for the current argument." t)
(autoload 'pcomplete-comint-setup "pcomplete" "\
Setup a comint buffer to use pcomplete.
COMPLETEF-SYM should be the symbol where the
dynamic-complete-functions are kept. For comint mode itself,
this is `comint-dynamic-complete-functions'.
-(fn COMPLETEF-SYM)" nil nil)
+(fn COMPLETEF-SYM)")
(autoload 'pcomplete-shell-setup "pcomplete" "\
-Setup `shell-mode' to use pcomplete." nil nil)
+Setup `shell-mode' to use pcomplete.")
(register-definition-prefixes "pcomplete" '("pcomplete-"))
@@ -23315,7 +23296,7 @@ and run `cvs-mode' on it.
With a prefix argument, prompt for cvs FLAGS to use.
-(fn MODULES DIR FLAGS &optional ROOT)" t nil)
+(fn MODULES DIR FLAGS &optional ROOT)" t)
(autoload 'cvs-quickdir "pcvs" "\
Open a *cvs* buffer on DIR without running cvs.
With a prefix argument, prompt for a directory to use.
@@ -23324,7 +23305,7 @@ A prefix arg >8 (ex: \\[universal-argument] \\[universal-argument]),
Optional argument NOSHOW if non-nil means not to display the buffer.
FLAGS is ignored.
-(fn DIR &optional FLAGS NOSHOW)" t nil)
+(fn DIR &optional FLAGS NOSHOW)" t)
(autoload 'cvs-examine "pcvs" "\
Run a `cvs -n update' in the specified DIRECTORY.
That is, check what needs to be done, but don't change the disc.
@@ -23334,7 +23315,7 @@ A prefix arg >8 (ex: \\[universal-argument] \\[universal-argument]),
prevents reuse of an existing *cvs* buffer.
Optional argument NOSHOW if non-nil means not to display the buffer.
-(fn DIRECTORY FLAGS &optional NOSHOW)" t nil)
+(fn DIRECTORY FLAGS &optional NOSHOW)" t)
(autoload 'cvs-update "pcvs" "\
Run a `cvs update' in the current working DIRECTORY.
Feed the output to a *cvs* buffer and run `cvs-mode' on it.
@@ -23344,7 +23325,7 @@ A prefix arg >8 (ex: \\[universal-argument] \\[universal-argument]),
The prefix is also passed to `cvs-flags-query' to select the FLAGS
passed to cvs.
-(fn DIRECTORY FLAGS)" t nil)
+(fn DIRECTORY FLAGS)" t)
(autoload 'cvs-status "pcvs" "\
Run a `cvs status' in the current working DIRECTORY.
Feed the output to a *cvs* buffer and run `cvs-mode' on it.
@@ -23353,7 +23334,7 @@ A prefix arg >8 (ex: \\[universal-argument] \\[universal-argument]),
prevents reuse of an existing *cvs* buffer.
Optional argument NOSHOW if non-nil means not to display the buffer.
-(fn DIRECTORY FLAGS &optional NOSHOW)" t nil)
+(fn DIRECTORY FLAGS &optional NOSHOW)" t)
(defvar cvs-dired-action 'cvs-quickdir "\
The action to be performed when opening a CVS directory.
Sensible values are `cvs-examine', `cvs-status' and `cvs-quickdir'.")
@@ -23407,7 +23388,7 @@ Launch `perl-flymake-command' (which see) and pass to its
standard input the contents of the current buffer. The output of
this command is analyzed for error and warning messages.
-(fn REPORT-FN &rest ARGS)" nil nil)
+(fn REPORT-FN &rest ARGS)")
(autoload 'perl-mode "perl-mode" "\
Major mode for editing Perl code.
Expression and list commands understand all Perl brackets.
@@ -23456,8 +23437,8 @@ Various indentation styles: K&R BSD BLK GNU LW
Turning on Perl mode runs the normal hook `perl-mode-hook'.
-(fn)" t nil)
-(register-definition-prefixes "perl-mode" '("indent-perl-exp" "mark-perl-function" "perl-"))
+(fn)" t)
+(register-definition-prefixes "perl-mode" '("perl-"))
;;; Generated autoloads from pgtk-dnd.el
@@ -23536,16 +23517,11 @@ by supplying an argument.
Entry to this mode calls the value of `picture-mode-hook' if non-nil.
Note that Picture mode commands will work outside of Picture mode, but
-they are not by default assigned to keys." t nil)
+they are not by default assigned to keys." t)
(defalias 'edit-picture 'picture-mode)
(register-definition-prefixes "picture" '("picture-"))
-;;; Generated autoloads from language/pinyin.el
-
-(register-definition-prefixes "pinyin" '("pinyin-character-map"))
-
-
;;; Generated autoloads from textmodes/pixel-fill.el
(register-definition-prefixes "pixel-fill" '("pixel-fill-"))
@@ -23578,7 +23554,7 @@ evaluate `(default-value \\='pixel-scroll-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar pixel-scroll-precision-mode nil "\
Non-nil if Pixel-Scroll-Precision mode is enabled.
See the `pixel-scroll-precision-mode' command
@@ -23608,7 +23584,7 @@ evaluate `(default-value \\='pixel-scroll-precision-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "pixel-scroll" '("pixel-"))
@@ -23618,11 +23594,11 @@ it is disabled.
(autoload 'plstore-open "plstore" "\
Create a plstore instance associated with FILE.
-(fn FILE)" nil nil)
+(fn FILE)")
(autoload 'plstore-mode "plstore" "\
Major mode for editing PLSTORE files.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "plstore" '("plstore-"))
@@ -23637,7 +23613,7 @@ Major mode for editing PLSTORE files.
Return a (DECODING . ENCODING) pair, according to PO file's charset.
Called through `file-coding-system-alist', before the file is visited for real.
-(fn ARG-LIST)" nil nil)
+(fn ARG-LIST)")
(register-definition-prefixes "po" '("po-"))
@@ -23650,7 +23626,7 @@ Move left and right bats and try to bounce the ball to your opponent.
pong-mode keybindings:\\<pong-mode-map>
-\\{pong-mode-map}" t nil)
+\\{pong-mode-map}" t)
(register-definition-prefixes "pong" '("pong-"))
@@ -23660,7 +23636,7 @@ pong-mode keybindings:\\<pong-mode-map>
Transfer contents of a maildrop to the specified FILE.
Use streaming commands.
-(fn FILE)" nil nil)
+(fn FILE)")
(register-definition-prefixes "pop3" '("pop3-"))
@@ -23671,9 +23647,9 @@ Return a string containing the pretty-printed representation of OBJECT.
OBJECT can be any Lisp object. Quoting characters are used as needed
to make output that `read' can handle, whenever this is possible.
-(fn OBJECT)" nil nil)
+(fn OBJECT)")
(autoload 'pp-buffer "pp" "\
-Prettify the current buffer with printed representation of a Lisp object." t nil)
+Prettify the current buffer with printed representation of a Lisp object." t)
(autoload 'pp "pp" "\
Output the pretty-printed representation of OBJECT, any Lisp object.
Quoting characters are printed as needed to make output that `read'
@@ -23687,7 +23663,7 @@ and vectors. Bind `pp-use-max-width' to a non-nil value to do so.
Output stream is STREAM, or value of `standard-output' (which see).
-(fn OBJECT &optional STREAM)" nil nil)
+(fn OBJECT &optional STREAM)")
(autoload 'pp-display-expression "pp" "\
Prettify and display EXPRESSION in an appropriate way, depending on length.
If LISP, format with `pp-emacs-lisp-code'; use `pp' otherwise.
@@ -23695,39 +23671,38 @@ If LISP, format with `pp-emacs-lisp-code'; use `pp' otherwise.
If a temporary buffer is needed for representation, it will be named
after OUT-BUFFER-NAME.
-(fn EXPRESSION OUT-BUFFER-NAME &optional LISP)" nil nil)
+(fn EXPRESSION OUT-BUFFER-NAME &optional LISP)")
(autoload 'pp-eval-expression "pp" "\
Evaluate EXPRESSION and pretty-print its value.
Also add the value to the front of the list in the variable `values'.
-(fn EXPRESSION)" t nil)
+(fn EXPRESSION)" t)
(autoload 'pp-macroexpand-expression "pp" "\
Macroexpand EXPRESSION and pretty-print its value.
-(fn EXPRESSION)" t nil)
+(fn EXPRESSION)" t)
(autoload 'pp-eval-last-sexp "pp" "\
Run `pp-eval-expression' on sexp before point.
With ARG, pretty-print output into current buffer.
Ignores leading comment characters.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'pp-macroexpand-last-sexp "pp" "\
Run `pp-macroexpand-expression' on sexp before point.
With ARG, pretty-print output into current buffer.
Ignores leading comment characters.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'pp-emacs-lisp-code "pp" "\
Insert SEXP into the current buffer, formatted as Emacs Lisp code.
Use the `pp-max-width' variable to control the desired line length.
-(fn SEXP)" nil nil)
+(fn SEXP)")
(register-definition-prefixes "pp" '("pp-"))
;;; Generated autoloads from printing.el
-(push (purecopy '(printing 6 9 3)) package--builtin-versions)
(autoload 'pr-interface "printing" "\
Activate the printing interface buffer.
@@ -23735,7 +23710,7 @@ If BUFFER is nil, the current buffer is used for printing.
For more information, type \\[pr-interface-help].
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'pr-ps-directory-preview "printing" "\
Preview directory using ghostview.
@@ -23753,7 +23728,7 @@ file name.
See also documentation for `pr-list-directory'.
-(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
+(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t)
(autoload 'pr-ps-directory-using-ghostscript "printing" "\
Print directory using PostScript through ghostscript.
@@ -23771,7 +23746,7 @@ file name.
See also documentation for `pr-list-directory'.
-(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
+(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t)
(autoload 'pr-ps-directory-print "printing" "\
Print directory using PostScript printer.
@@ -23789,7 +23764,7 @@ file name.
See also documentation for `pr-list-directory'.
-(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
+(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t)
(autoload 'pr-ps-directory-ps-print "printing" "\
Print directory using PostScript printer or through ghostscript.
@@ -23809,7 +23784,7 @@ file name.
See also documentation for `pr-list-directory'.
-(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t nil)
+(fn N-UP DIR FILE-REGEXP &optional FILENAME)" t)
(autoload 'pr-ps-buffer-preview "printing" "\
Preview buffer using ghostview.
@@ -23822,7 +23797,7 @@ argument FILENAME is treated as follows: if it's nil, save the image in a
temporary file. If FILENAME is a string, save the PostScript image in a file
with that name. If FILENAME is t, prompts for a file name.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-buffer-using-ghostscript "printing" "\
Print buffer using PostScript through ghostscript.
@@ -23835,7 +23810,7 @@ argument FILENAME is treated as follows: if it's nil, send the image to the
printer. If FILENAME is a string, save the PostScript image in a file with
that name. If FILENAME is t, prompts for a file name.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-buffer-print "printing" "\
Print buffer using PostScript printer.
@@ -23848,7 +23823,7 @@ argument FILENAME is treated as follows: if it's nil, send the image to the
printer. If FILENAME is a string, save the PostScript image in a file with
that name. If FILENAME is t, prompts for a file name.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-buffer-ps-print "printing" "\
Print buffer using PostScript printer or through ghostscript.
@@ -23863,55 +23838,55 @@ argument FILENAME is treated as follows: if it's nil, send the image to the
printer. If FILENAME is a string, save the PostScript image in a file with
that name. If FILENAME is t, prompts for a file name.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-region-preview "printing" "\
Preview region using ghostview.
See also `pr-ps-buffer-preview'.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-region-using-ghostscript "printing" "\
Print region using PostScript through ghostscript.
See also `pr-ps-buffer-using-ghostscript'.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-region-print "printing" "\
Print region using PostScript printer.
See also `pr-ps-buffer-print'.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-region-ps-print "printing" "\
Print region using PostScript printer or through ghostscript.
See also `pr-ps-buffer-ps-print'.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-mode-preview "printing" "\
Preview major mode using ghostview.
See also `pr-ps-buffer-preview'.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-mode-using-ghostscript "printing" "\
Print major mode using PostScript through ghostscript.
See also `pr-ps-buffer-using-ghostscript'.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-mode-print "printing" "\
Print major mode using PostScript printer.
See also `pr-ps-buffer-print'.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-ps-mode-ps-print "printing" "\
Print major mode using PostScript or through ghostscript.
See also `pr-ps-buffer-ps-print'.
-(fn N-UP &optional FILENAME)" t nil)
+(fn N-UP &optional FILENAME)" t)
(autoload 'pr-printify-directory "printing" "\
Replace nonprinting characters in directory with printable representations.
The printable representations use ^ (for ASCII control characters) or hex.
@@ -23925,15 +23900,15 @@ prompts for FILE(name)-REGEXP.
See also documentation for `pr-list-directory'.
-(fn &optional DIR FILE-REGEXP)" t nil)
+(fn &optional DIR FILE-REGEXP)" t)
(autoload 'pr-printify-buffer "printing" "\
Replace nonprinting characters in buffer with printable representations.
The printable representations use ^ (for ASCII control characters) or hex.
-The characters tab, linefeed, space, return and formfeed are not affected." t nil)
+The characters tab, linefeed, space, return and formfeed are not affected." t)
(autoload 'pr-printify-region "printing" "\
Replace nonprinting characters in region with printable representations.
The printable representations use ^ (for ASCII control characters) or hex.
-The characters tab, linefeed, space, return and formfeed are not affected." t nil)
+The characters tab, linefeed, space, return and formfeed are not affected." t)
(autoload 'pr-txt-directory "printing" "\
Print directory using text printer.
@@ -23945,13 +23920,13 @@ prompts for FILE(name)-REGEXP.
See also documentation for `pr-list-directory'.
-(fn &optional DIR FILE-REGEXP)" t nil)
+(fn &optional DIR FILE-REGEXP)" t)
(autoload 'pr-txt-buffer "printing" "\
-Print buffer using text printer." t nil)
+Print buffer using text printer." t)
(autoload 'pr-txt-region "printing" "\
-Print region using text printer." t nil)
+Print region using text printer." t)
(autoload 'pr-txt-mode "printing" "\
-Print major mode using text printer." t nil)
+Print major mode using text printer." t)
(autoload 'pr-despool-preview "printing" "\
Preview spooled PostScript.
@@ -23963,7 +23938,7 @@ Noninteractively, the argument FILENAME is treated as follows: if it is nil,
save the image in a temporary file. If FILENAME is a string, save the
PostScript image in a file with that name.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'pr-despool-using-ghostscript "printing" "\
Print spooled PostScript using ghostscript.
@@ -23975,7 +23950,7 @@ Noninteractively, the argument FILENAME is treated as follows: if it is nil,
send the image to the printer. If FILENAME is a string, save the PostScript
image in a file with that name.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'pr-despool-print "printing" "\
Send the spooled PostScript to the printer.
@@ -23987,7 +23962,7 @@ Noninteractively, the argument FILENAME is treated as follows: if it is nil,
send the image to the printer. If FILENAME is a string, save the PostScript
image in a file with that name.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'pr-despool-ps-print "printing" "\
Send the spooled PostScript to the printer or use ghostscript to print it.
@@ -23999,27 +23974,27 @@ Noninteractively, the argument FILENAME is treated as follows: if it is nil,
send the image to the printer. If FILENAME is a string, save the PostScript
image in a file with that name.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'pr-ps-file-preview "printing" "\
Preview PostScript file FILENAME.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(autoload 'pr-ps-file-up-preview "printing" "\
Preview PostScript file FILENAME.
-(fn N-UP IFILENAME &optional OFILENAME)" t nil)
+(fn N-UP IFILENAME &optional OFILENAME)" t)
(autoload 'pr-ps-file-using-ghostscript "printing" "\
Print PostScript file FILENAME using ghostscript.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(autoload 'pr-ps-file-print "printing" "\
Print PostScript file FILENAME.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(autoload 'pr-ps-file-ps-print "printing" "\
Send PostScript file FILENAME to printer or use ghostscript to print it.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(autoload 'pr-ps-file-up-ps-print "printing" "\
Process a PostScript file IFILENAME and send it to printer.
@@ -24036,81 +24011,81 @@ nil, send the image to the printer. If OFILENAME is a string, save the
PostScript image in a file with that name. If OFILENAME is t, prompts for a
file name.
-(fn N-UP IFILENAME &optional OFILENAME)" t nil)
+(fn N-UP IFILENAME &optional OFILENAME)" t)
(autoload 'pr-toggle-file-duplex "printing" "\
-Toggle duplex for PostScript file." t nil)
+Toggle duplex for PostScript file." t)
(autoload 'pr-toggle-file-tumble "printing" "\
Toggle tumble for PostScript file.
If tumble is off, produces a printing suitable for binding on the left or
right.
If tumble is on, produces a printing suitable for binding at the top or
-bottom." t nil)
+bottom." t)
(autoload 'pr-toggle-file-landscape "printing" "\
-Toggle landscape for PostScript file." t nil)
+Toggle landscape for PostScript file." t)
(autoload 'pr-toggle-ghostscript "printing" "\
-Toggle printing using ghostscript." t nil)
+Toggle printing using ghostscript." t)
(autoload 'pr-toggle-faces "printing" "\
-Toggle printing with faces." t nil)
+Toggle printing with faces." t)
(autoload 'pr-toggle-spool "printing" "\
-Toggle spooling." t nil)
+Toggle spooling." t)
(autoload 'pr-toggle-duplex "printing" "\
-Toggle duplex." t nil)
+Toggle duplex." t)
(autoload 'pr-toggle-tumble "printing" "\
Toggle tumble.
If tumble is off, produces a printing suitable for binding on the left or
right.
If tumble is on, produces a printing suitable for binding at the top or
-bottom." t nil)
+bottom." t)
(autoload 'pr-toggle-landscape "printing" "\
-Toggle landscape." t nil)
+Toggle landscape." t)
(autoload 'pr-toggle-upside-down "printing" "\
-Toggle upside-down." t nil)
+Toggle upside-down." t)
(autoload 'pr-toggle-line "printing" "\
-Toggle line number." t nil)
+Toggle line number." t)
(autoload 'pr-toggle-zebra "printing" "\
-Toggle zebra stripes." t nil)
+Toggle zebra stripes." t)
(autoload 'pr-toggle-header "printing" "\
-Toggle printing header." t nil)
+Toggle printing header." t)
(autoload 'pr-toggle-header-frame "printing" "\
-Toggle printing header frame." t nil)
+Toggle printing header frame." t)
(autoload 'pr-toggle-lock "printing" "\
-Toggle menu lock." t nil)
+Toggle menu lock." t)
(autoload 'pr-toggle-region "printing" "\
-Toggle whether the region is automagically detected." t nil)
+Toggle whether the region is automagically detected." t)
(autoload 'pr-toggle-mode "printing" "\
-Toggle auto mode." t nil)
+Toggle auto mode." t)
(autoload 'pr-customize "printing" "\
Customization of the `printing' group.
-(fn &rest IGNORE)" t nil)
+(fn &rest IGNORE)" t)
(autoload 'lpr-customize "printing" "\
Customization of the `lpr' group.
-(fn &rest IGNORE)" t nil)
+(fn &rest IGNORE)" t)
(autoload 'pr-help "printing" "\
Help for the printing package.
-(fn &rest IGNORE)" t nil)
+(fn &rest IGNORE)" t)
(autoload 'pr-ps-name "printing" "\
-Interactively select a PostScript printer." t nil)
+Interactively select a PostScript printer." t)
(autoload 'pr-txt-name "printing" "\
-Interactively select a text printer." t nil)
+Interactively select a text printer." t)
(autoload 'pr-ps-utility "printing" "\
-Interactively select a PostScript utility." t nil)
+Interactively select a PostScript utility." t)
(autoload 'pr-show-ps-setup "printing" "\
Show current ps-print settings.
-(fn &rest IGNORE)" t nil)
+(fn &rest IGNORE)" t)
(autoload 'pr-show-pr-setup "printing" "\
Show current printing settings.
-(fn &rest IGNORE)" t nil)
+(fn &rest IGNORE)" t)
(autoload 'pr-show-lpr-setup "printing" "\
Show current lpr settings.
-(fn &rest IGNORE)" t nil)
+(fn &rest IGNORE)" t)
(autoload 'pr-ps-fast-fire "printing" "\
Fast fire function for PostScript printing.
@@ -24172,7 +24147,7 @@ zero and the argument SELECT is treated as follows:
Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode'
are both set to t.
-(fn N-UP &optional SELECT)" t nil)
+(fn N-UP &optional SELECT)" t)
(autoload 'pr-txt-fast-fire "printing" "\
Fast fire function for text printing.
@@ -24197,7 +24172,7 @@ Noninteractively, the argument SELECT-PRINTER is treated as follows:
Note that this command always behaves as if `pr-auto-region' and `pr-auto-mode'
are both set to t.
-(fn &optional SELECT-PRINTER)" t nil)
+(fn &optional SELECT-PRINTER)" t)
(register-definition-prefixes "printing" '("lpr-setup" "pr-"))
@@ -24218,7 +24193,7 @@ This function runs the normal hook `proced-post-display-hook'.
See `proced-mode' for a description of features available in
Proced buffers.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "proced" '("proced-"))
@@ -24234,19 +24209,19 @@ If MODE is `mem' or `cpu+mem', start profiler that samples CPU
if SIGPROF is not supported, or is unreliable, or is not sampling
at a high enough frequency.
-(fn MODE)" t nil)
+(fn MODE)" t)
(autoload 'profiler-find-profile "profiler" "\
Open profile FILENAME.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(autoload 'profiler-find-profile-other-window "profiler" "\
Open profile FILENAME.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(autoload 'profiler-find-profile-other-frame "profiler" "\
Open profile FILENAME.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(register-definition-prefixes "profiler" '("profiler-"))
@@ -24325,7 +24300,7 @@ ignored (per `project-ignores').
See the doc string of `project-find-functions' for the general form
of the project instance object.
-(fn &optional MAYBE-PROMPT DIRECTORY)" nil nil)
+(fn &optional MAYBE-PROMPT DIRECTORY)")
(defvar project-prefix-map (let ((map (make-sparse-keymap))) (define-key map "!" 'project-shell-command) (define-key map "&" 'project-async-shell-command) (define-key map "f" 'project-find-file) (define-key map "F" 'project-or-external-find-file) (define-key map "b" 'project-switch-to-buffer) (define-key map "s" 'project-shell) (define-key map "d" 'project-find-dir) (define-key map "D" 'project-dired) (define-key map "v" 'project-vc-dir) (define-key map "c" 'project-compile) (define-key map "e" 'project-eshell) (define-key map "k" 'project-kill-buffers) (define-key map "p" 'project-switch-project) (define-key map "g" 'project-find-regexp) (define-key map "G" 'project-or-external-find-regexp) (define-key map "r" 'project-query-replace-regexp) (define-key map "x" 'project-execute-extended-command) map) "\
Keymap for project commands.")
(define-key ctl-x-map "p" project-prefix-map)
@@ -24335,7 +24310,7 @@ Run project command, displaying resultant buffer in another window.
The following commands are available:
\\{project-prefix-map}
-\\{project-other-window-map}" t nil)
+\\{project-other-window-map}" t)
(define-key ctl-x-4-map "p" #'project-other-window-command)
(autoload 'project-other-frame-command "project" "\
Run project command, displaying resultant buffer in another frame.
@@ -24343,14 +24318,14 @@ Run project command, displaying resultant buffer in another frame.
The following commands are available:
\\{project-prefix-map}
-\\{project-other-frame-map}" t nil)
+\\{project-other-frame-map}" t)
(define-key ctl-x-5-map "p" #'project-other-frame-command)
(autoload 'project-other-tab-command "project" "\
Run project command, displaying resultant buffer in a new tab.
The following commands are available:
-\\{project-prefix-map}" t nil)
+\\{project-prefix-map}" t)
(when (bound-and-true-p tab-prefix-map) (define-key tab-prefix-map "p" #'project-other-tab-command))
(autoload 'project-find-regexp "project" "\
Find all matches for REGEXP in the current project's roots.
@@ -24361,13 +24336,13 @@ e.g. entering `ch' is equivalent to `*.[ch]'. As whitespace
triggers completion when entering a pattern, including it
requires quoting, e.g. `\\[quoted-insert]<space>'.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(autoload 'project-or-external-find-regexp "project" "\
Find all matches for REGEXP in the project roots or external roots.
With \\[universal-argument] prefix, you can specify the file name
pattern to search for.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(autoload 'project-find-file "project" "\
Visit a file (with completion) in the current project.
@@ -24378,7 +24353,7 @@ If INCLUDE-ALL is non-nil, or with prefix argument when called
interactively, include all files under the project root, except
for VCS directories listed in `vc-directory-exclusion-list'.
-(fn &optional INCLUDE-ALL)" t nil)
+(fn &optional INCLUDE-ALL)" t)
(autoload 'project-or-external-find-file "project" "\
Visit a file (with completion) in the current project or external roots.
@@ -24389,30 +24364,30 @@ If INCLUDE-ALL is non-nil, or with prefix argument when called
interactively, include all files under the project root, except
for VCS directories listed in `vc-directory-exclusion-list'.
-(fn &optional INCLUDE-ALL)" t nil)
+(fn &optional INCLUDE-ALL)" t)
(autoload 'project-find-dir "project" "\
-Start Dired in a directory inside the current project." t nil)
+Start Dired in a directory inside the current project." t)
(autoload 'project-dired "project" "\
-Start Dired in the current project's root." t nil)
+Start Dired in the current project's root." t)
(autoload 'project-vc-dir "project" "\
-Run VC-Dir in the current project's root." t nil)
+Run VC-Dir in the current project's root." t)
(autoload 'project-shell "project" "\
Start an inferior shell in the current project's root directory.
If a buffer already exists for running a shell in the project's root,
switch to it. Otherwise, create a new shell buffer.
With \\[universal-argument] prefix arg, create a new inferior shell buffer even
-if one already exists." t nil)
+if one already exists." t)
(autoload 'project-eshell "project" "\
Start Eshell in the current project's root directory.
If a buffer already exists for running Eshell in the project's root,
switch to it. Otherwise, create a new Eshell buffer.
With \\[universal-argument] prefix arg, create a new Eshell buffer even
-if one already exists." t nil)
+if one already exists." t)
(autoload 'project-async-shell-command "project" "\
-Run `async-shell-command' in the current project's root directory." t nil)
+Run `async-shell-command' in the current project's root directory." t)
(function-put 'project-async-shell-command 'interactive-only 'async-shell-command)
(autoload 'project-shell-command "project" "\
-Run `shell-command' in the current project's root directory." t nil)
+Run `shell-command' in the current project's root directory." t)
(function-put 'project-shell-command 'interactive-only 'shell-command)
(autoload 'project-search "project" "\
Search for REGEXP in all the files of the project.
@@ -24420,7 +24395,7 @@ Stops when a match is found.
To continue searching for the next match, use the
command \\[fileloop-continue].
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(autoload 'project-query-replace-regexp "project" "\
Query-replace REGEXP in all the files of the project.
Stops when a match is found and prompts for whether to replace it.
@@ -24431,9 +24406,9 @@ type \\[help-command] at that time.
If you exit the `query-replace', you can later continue the
`query-replace' loop using the command \\[fileloop-continue].
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'project-compile "project" "\
-Run `compile' in the project root." t nil)
+Run `compile' in the project root." t)
(function-put 'project-compile 'interactive-only 'compile)
(autoload 'project-switch-to-buffer "project" "\
Display buffer BUFFER-OR-NAME in the selected window.
@@ -24442,7 +24417,7 @@ current project. Two buffers belong to the same project if their
project instances, as reported by `project-current' in each
buffer, are identical.
-(fn BUFFER-OR-NAME)" t nil)
+(fn BUFFER-OR-NAME)" t)
(autoload 'project-display-buffer "project" "\
Display BUFFER-OR-NAME in some window, without selecting it.
When called interactively, prompts for a buffer belonging to the
@@ -24453,7 +24428,7 @@ buffer, are identical.
This function uses `display-buffer' as a subroutine, which see
for how it is determined where the buffer will be displayed.
-(fn BUFFER-OR-NAME)" t nil)
+(fn BUFFER-OR-NAME)" t)
(autoload 'project-display-buffer-other-frame "project" "\
Display BUFFER-OR-NAME preferably in another frame.
When called interactively, prompts for a buffer belonging to the
@@ -24465,7 +24440,7 @@ This function uses `display-buffer-other-frame' as a subroutine,
which see for how it is determined where the buffer will be
displayed.
-(fn BUFFER-OR-NAME)" t nil)
+(fn BUFFER-OR-NAME)" t)
(autoload 'project-kill-buffers "project" "\
Kill the buffers belonging to the current project.
Two buffers belong to the same project if their project
@@ -24478,23 +24453,23 @@ interactively.
Also see the `project-kill-buffers-display-buffer-list' variable.
-(fn &optional NO-CONFIRM)" t nil)
+(fn &optional NO-CONFIRM)" t)
(autoload 'project-remember-project "project" "\
Add project PR to the front of the project list.
Save the result in `project-list-file' if the list of projects
has changed, and NO-WRITE is nil.
-(fn PR &optional NO-WRITE)" nil nil)
+(fn PR &optional NO-WRITE)")
(autoload 'project-forget-project "project" "\
Remove directory PROJECT-ROOT from the project list.
PROJECT-ROOT is the root directory of a known project listed in
the project list.
-(fn PROJECT-ROOT)" t nil)
+(fn PROJECT-ROOT)" t)
(autoload 'project-known-project-roots "project" "\
-Return the list of root directories of all known projects." nil nil)
+Return the list of root directories of all known projects.")
(autoload 'project-execute-extended-command "project" "\
-Execute an extended command in project root." t nil)
+Execute an extended command in project root." t)
(function-put 'project-execute-extended-command 'interactive-only 'command-execute)
(autoload 'project-switch-project "project" "\
\"Switch\" to another project by running an Emacs command.
@@ -24504,7 +24479,7 @@ made from `project-switch-commands'.
When called in a program, it will use the project corresponding
to directory DIR.
-(fn DIR)" t nil)
+(fn DIR)" t)
(register-definition-prefixes "project" '("project-"))
@@ -24529,17 +24504,17 @@ To find out what version of Prolog mode you are running, enter
Commands:
\\{prolog-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'mercury-mode "prolog" "\
Major mode for editing Mercury programs.
Actually this is just customized `prolog-mode'.
-(fn)" t nil)
+(fn)" t)
(autoload 'run-prolog "prolog" "\
Run an inferior Prolog process, input and output via buffer *prolog*.
With prefix argument ARG, restart the Prolog process if running before.
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "prolog" '("mercury-mode-map" "prolog-"))
@@ -24552,11 +24527,6 @@ The default value is (\"/usr/local/share/emacs/fonts/bdf\").")
(register-definition-prefixes "ps-bdf" '("bdf-"))
-;;; Generated autoloads from ps-def.el
-
-(register-definition-prefixes "ps-def" '("ps-"))
-
-
;;; Generated autoloads from progmodes/ps-mode.el
(push (purecopy '(ps-mode 1 1 9)) package--builtin-versions)
@@ -24598,7 +24568,7 @@ point to the corresponding spot in the PostScript window, if input
to the interpreter was sent from that window.
Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when the cursor is at the number has the same effect.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "ps-mode" '("ps-"))
@@ -24609,7 +24579,6 @@ Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when the cursor is at the number
;;; Generated autoloads from ps-print.el
-(push (purecopy '(ps-print 7 3 5)) package--builtin-versions)
(defvar ps-page-dimensions-database (purecopy (list (list 'a4 (/ (* 72 21.0) 2.54) (/ (* 72 29.7) 2.54) "A4") (list 'a3 (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 2.54) "A3") (list 'letter (* 72 8.5) (* 72 11.0) "Letter") (list 'legal (* 72 8.5) (* 72 14.0) "Legal") (list 'letter-small (* 72 7.68) (* 72 10.16) "LetterSmall") (list 'tabloid (* 72 11.0) (* 72 17.0) "Tabloid") (list 'ledger (* 72 17.0) (* 72 11.0) "Ledger") (list 'statement (* 72 5.5) (* 72 8.5) "Statement") (list 'executive (* 72 7.5) (* 72 10.0) "Executive") (list 'a4small (* 72 7.47) (* 72 10.85) "A4Small") (list 'b4 (* 72 10.125) (* 72 14.33) "B4") (list 'b5 (* 72 7.16) (* 72 10.125) "B5") '(addresslarge 236.0 99.0 "AddressLarge") '(addresssmall 236.0 68.0 "AddressSmall") '(cuthanging13 90.0 222.0 "CutHanging13") '(cuthanging15 90.0 114.0 "CutHanging15") '(diskette 181.0 136.0 "Diskette") '(eurofilefolder 139.0 112.0 "EuropeanFilefolder") '(eurofoldernarrow 526.0 107.0 "EuroFolderNarrow") '(eurofolderwide 526.0 136.0 "EuroFolderWide") '(euronamebadge 189.0 108.0 "EuroNameBadge") '(euronamebadgelarge 223.0 136.0 "EuroNameBadgeLarge") '(filefolder 230.0 37.0 "FileFolder") '(jewelry 76.0 136.0 "Jewelry") '(mediabadge 180.0 136.0 "MediaBadge") '(multipurpose 126.0 68.0 "MultiPurpose") '(retaillabel 90.0 104.0 "RetailLabel") '(shipping 271.0 136.0 "Shipping") '(slide35mm 26.0 104.0 "Slide35mm") '(spine8mm 187.0 26.0 "Spine8mm") '(topcoated 425.19685 136.0 "TopCoatedPaper") '(topcoatedpaper 396.0 136.0 "TopcoatedPaper150") '(vhsface 205.0 127.0 "VHSFace") '(vhsspine 400.0 50.0 "VHSSpine") '(zipdisk 156.0 136.0 "ZipDisk"))) "\
List associating a symbolic paper type to its width, height and doc media.
See `ps-paper-type'.")
@@ -24619,7 +24588,7 @@ Specify the size of paper to format for.
Should be one of the paper types defined in `ps-page-dimensions-database', for
example `letter', `legal' or `a4'.")
(custom-autoload 'ps-paper-type "ps-print" t)
-(defvar ps-print-color-p (fboundp 'x-color-values) "\
+(defvar ps-print-color-p t "\
Specify how buffer's text color is printed.
Valid values are:
@@ -24634,7 +24603,7 @@ Valid values are:
Any other value is treated as t.")
(custom-autoload 'ps-print-color-p "ps-print" t)
(autoload 'ps-print-customize "ps-print" "\
-Customization of ps-print group." t nil)
+Customization of ps-print group." t)
(autoload 'ps-print-buffer "ps-print" "\
Generate and print a PostScript image of the buffer.
@@ -24646,46 +24615,46 @@ Noninteractively, the argument FILENAME is treated as follows: if it is nil,
send the image to the printer. If FILENAME is a string, save the PostScript
image in a file with that name.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'ps-print-buffer-with-faces "ps-print" "\
Generate and print a PostScript image of the buffer.
Like `ps-print-buffer', but includes font, color, and underline information in
the generated image. This command works only if you are using a window system,
so it has a way to determine color values.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'ps-print-region "ps-print" "\
Generate and print a PostScript image of the region.
Like `ps-print-buffer', but prints just the current region.
-(fn FROM TO &optional FILENAME)" t nil)
+(fn FROM TO &optional FILENAME)" t)
(autoload 'ps-print-region-with-faces "ps-print" "\
Generate and print a PostScript image of the region.
Like `ps-print-region', but includes font, color, and underline information in
the generated image. This command works only if you are using a window system,
so it has a way to determine color values.
-(fn FROM TO &optional FILENAME)" t nil)
+(fn FROM TO &optional FILENAME)" t)
(autoload 'ps-spool-buffer "ps-print" "\
Generate and spool a PostScript image of the buffer.
Like `ps-print-buffer' except that the PostScript image is saved in a local
buffer to be sent to the printer later.
-Use the command `ps-despool' to send the spooled images to the printer." t nil)
+Use the command `ps-despool' to send the spooled images to the printer." t)
(autoload 'ps-spool-buffer-with-faces "ps-print" "\
Generate and spool a PostScript image of the buffer.
Like the command `ps-spool-buffer', but includes font, color, and underline
information in the generated image. This command works only if you are using
a window system, so it has a way to determine color values.
-Use the command `ps-despool' to send the spooled images to the printer." t nil)
+Use the command `ps-despool' to send the spooled images to the printer." t)
(autoload 'ps-spool-region "ps-print" "\
Generate a PostScript image of the region and spool locally.
Like `ps-spool-buffer', but spools just the current region.
Use the command `ps-despool' to send the spooled images to the printer.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'ps-spool-region-with-faces "ps-print" "\
Generate a PostScript image of the region and spool locally.
Like `ps-spool-region', but includes font, color, and underline information in
@@ -24694,7 +24663,7 @@ so it has a way to determine color values.
Use the command `ps-despool' to send the spooled images to the printer.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'ps-despool "ps-print" "\
Send the spooled PostScript to the printer.
@@ -24706,24 +24675,24 @@ Noninteractively, the argument FILENAME is treated as follows: if it is nil,
send the image to the printer. If FILENAME is a string, save the PostScript
image in a file with that name.
-(fn &optional FILENAME)" t nil)
+(fn &optional FILENAME)" t)
(autoload 'ps-line-lengths "ps-print" "\
Display the correspondence between a line length and a font size.
Done using the current ps-print setup.
Try: pr -t file | awk \\='{printf \"%3d %s
-\", length($0), $0}\\=' | sort -r | head" t nil)
+\", length($0), $0}\\=' | sort -r | head" t)
(autoload 'ps-nb-pages-buffer "ps-print" "\
Display number of pages to print this buffer, for various font heights.
The table depends on the current ps-print setup.
-(fn NB-LINES)" t nil)
+(fn NB-LINES)" t)
(autoload 'ps-nb-pages-region "ps-print" "\
Display number of pages to print the region, for various font heights.
The table depends on the current ps-print setup.
-(fn NB-LINES)" t nil)
+(fn NB-LINES)" t)
(autoload 'ps-setup "ps-print" "\
-Return the current PostScript-generation setup." nil nil)
+Return the current PostScript-generation setup.")
(autoload 'ps-extend-face-list "ps-print" "\
Extend face in ALIST-SYM.
@@ -24737,7 +24706,7 @@ The elements in FACE-EXTENSION-LIST are like those for `ps-extend-face'.
See `ps-extend-face' for documentation.
-(fn FACE-EXTENSION-LIST &optional MERGE-P ALIST-SYM)" nil nil)
+(fn FACE-EXTENSION-LIST &optional MERGE-P ALIST-SYM)")
(autoload 'ps-extend-face "ps-print" "\
Extend face in ALIST-SYM.
@@ -24768,7 +24737,7 @@ EXTENSION is one of the following symbols:
If EXTENSION is any other symbol, it is ignored.
-(fn FACE-EXTENSION &optional MERGE-P ALIST-SYM)" nil nil)
+(fn FACE-EXTENSION &optional MERGE-P ALIST-SYM)")
(register-definition-prefixes "ps-print" '("ps-"))
@@ -24786,12 +24755,12 @@ If POINT is nil or missing, the current point is used instead.
Optional argument FACE specifies the face to do the highlighting.
-(fn &optional POINT FACE)" nil nil)
+(fn &optional POINT FACE)")
(autoload 'pulse-momentary-highlight-region "pulse" "\
Highlight between START and END, unhighlighting before next command.
Optional argument FACE specifies the face to do the highlighting.
-(fn START END &optional FACE)" nil nil)
+(fn START END &optional FACE)")
(register-definition-prefixes "pulse" '("pulse-"))
@@ -24823,13 +24792,13 @@ Runs the hook `inferior-python-mode-hook' after
`comint-mode-hook' is run. (Type \\[describe-mode] in the
process buffer for a list of commands.)
-(fn &optional CMD DEDICATED SHOW)" t nil)
+(fn &optional CMD DEDICATED SHOW)" t)
(autoload 'python-mode "python" "\
Major mode for editing Python files.
\\{python-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "python" '("inferior-python-mode" "python-" "run-python-internal"))
@@ -24852,14 +24821,14 @@ The CODING-SYSTEM argument is a historical hangover and is deprecated.
QP encodes raw bytes and should be decoded into raw bytes. Decoding
them into characters should be done separately.
-(fn FROM TO &optional CODING-SYSTEM)" t nil)
+(fn FROM TO &optional CODING-SYSTEM)" t)
(register-definition-prefixes "qp" '("quoted-printable-"))
;;; Generated autoloads from international/quail.el
(autoload 'quail-title "quail" "\
-Return the title of the current Quail package." nil nil)
+Return the title of the current Quail package.")
(autoload 'quail-use-package "quail" "\
Start using Quail package PACKAGE-NAME.
The remaining arguments are LIBRARIES to be loaded before using the package.
@@ -24867,7 +24836,7 @@ The remaining arguments are LIBRARIES to be loaded before using the package.
This activates input method defined by PACKAGE-NAME by running
`quail-activate', which see.
-(fn PACKAGE-NAME &rest LIBRARIES)" nil nil)
+(fn PACKAGE-NAME &rest LIBRARIES)")
(autoload 'quail-define-package "quail" "\
Define NAME as a new Quail package for input LANGUAGE.
TITLE is a string to be displayed at mode-line to indicate this package.
@@ -24948,7 +24917,7 @@ If SIMPLE is non-nil, then we do not alter the meanings of
commands such as \\[forward-char], \\[backward-char], \\[next-line], \\[previous-line] and \\[indent-for-tab-command]; they are treated as
non-Quail commands.
-(fn NAME LANGUAGE TITLE &optional GUIDANCE DOCSTRING TRANSLATION-KEYS FORGET-LAST-SELECTION DETERMINISTIC KBD-TRANSLATE SHOW-LAYOUT CREATE-DECODE-MAP MAXIMUM-SHORTEST OVERLAY-PLIST UPDATE-TRANSLATION-FUNCTION CONVERSION-KEYS SIMPLE)" nil nil)
+(fn NAME LANGUAGE TITLE &optional GUIDANCE DOCSTRING TRANSLATION-KEYS FORGET-LAST-SELECTION DETERMINISTIC KBD-TRANSLATE SHOW-LAYOUT CREATE-DECODE-MAP MAXIMUM-SHORTEST OVERLAY-PLIST UPDATE-TRANSLATION-FUNCTION CONVERSION-KEYS SIMPLE)")
(autoload 'quail-set-keyboard-layout "quail" "\
Set the current keyboard layout to the same as keyboard KBD-TYPE.
@@ -24958,14 +24927,14 @@ standard layout defined in `quail-keyboard-layout-standard'. This
function tells Quail system the layout of your keyboard so that what
you type is correctly handled.
-(fn KBD-TYPE)" t nil)
+(fn KBD-TYPE)" t)
(autoload 'quail-show-keyboard-layout "quail" "\
Show the physical layout of the keyboard type KEYBOARD-TYPE.
The variable `quail-keyboard-layout-type' holds the currently selected
keyboard type.
-(fn &optional KEYBOARD-TYPE)" t nil)
+(fn &optional KEYBOARD-TYPE)" t)
(autoload 'quail-define-rules "quail" "\
Define translation rules of the current Quail package.
Each argument is a list of KEY and TRANSLATION.
@@ -25008,7 +24977,7 @@ which to install MAP.
The installed map can be referred by the function `quail-map'.
-(fn MAP &optional NAME)" nil nil)
+(fn MAP &optional NAME)")
(autoload 'quail-install-decode-map "quail" "\
Install the Quail decode map DECODE-MAP in the current Quail package.
@@ -25017,7 +24986,7 @@ which to install MAP.
The installed decode map can be referred by the function `quail-decode-map'.
-(fn DECODE-MAP &optional NAME)" nil nil)
+(fn DECODE-MAP &optional NAME)")
(autoload 'quail-defrule "quail" "\
Add one translation rule, KEY to TRANSLATION, in the current Quail package.
KEY is a string meaning a sequence of keystrokes to be translated.
@@ -25043,7 +25012,7 @@ current Quail package.
Optional 4th argument APPEND, if non-nil, appends TRANSLATION
to the current translations for KEY instead of replacing them.
-(fn KEY TRANSLATION &optional NAME APPEND)" nil nil)
+(fn KEY TRANSLATION &optional NAME APPEND)")
(autoload 'quail-defrule-internal "quail" "\
Define KEY as TRANS in a Quail map MAP.
@@ -25055,7 +25024,7 @@ Optional 5th arg DECODE-MAP is a Quail decode map.
Optional 6th arg PROPS is a property list annotating TRANS. See the
function `quail-define-rules' for the detail.
-(fn KEY TRANS MAP &optional APPEND DECODE-MAP PROPS)" nil nil)
+(fn KEY TRANS MAP &optional APPEND DECODE-MAP PROPS)")
(autoload 'quail-update-leim-list-file "quail" "\
Update entries for Quail packages in `LEIM' list file in directory DIRNAME.
DIRNAME is a directory containing Emacs input methods;
@@ -25069,68 +25038,10 @@ When called from a program, the remaining arguments are additional
directory names to search for Quail packages under `quail' subdirectory
of each directory.
-(fn DIRNAME &rest DIRNAMES)" t nil)
+(fn DIRNAME &rest DIRNAMES)" t)
(register-definition-prefixes "quail" '("quail-"))
-;;; Generated autoloads from net/quickurl.el
-
-(defconst quickurl-reread-hook-postfix "\n;; Local Variables:\n;; eval: (progn (require 'quickurl) (add-hook 'write-file-functions (lambda () (quickurl-read) nil) nil t))\n;; End:\n" "\
-Example `quickurl-postfix' text that adds a local variable to the
-`quickurl-url-file' so that if you edit it by hand it will ensure that
-`quickurl-urls' is updated with the new URL list.
-
-To make use of this do something like:
-
- (setq quickurl-postfix quickurl-reread-hook-postfix)
-
-in your init file (after loading/requiring quickurl).")
-(autoload 'quickurl "quickurl" "\
-Insert a URL based on LOOKUP.
-
-If not supplied LOOKUP is taken to be the word at point in the current
-buffer, this default action can be modified via
-`quickurl-grab-lookup-function'.
-
-(fn &optional LOOKUP)" t nil)
-(autoload 'quickurl-ask "quickurl" "\
-Insert a URL, with `completing-read' prompt, based on LOOKUP.
-
-(fn LOOKUP)" t nil)
-(autoload 'quickurl-add-url "quickurl" "\
-Allow the user to interactively add a new URL associated with WORD.
-
-See `quickurl-grab-url' for details on how the default word/URL combination
-is decided.
-
-(fn WORD URL COMMENT)" t nil)
-(autoload 'quickurl-browse-url "quickurl" "\
-Browse the URL associated with LOOKUP.
-
-If not supplied LOOKUP is taken to be the word at point in the
-current buffer, this default action can be modified via
-`quickurl-grab-lookup-function'.
-
-(fn &optional LOOKUP)" t nil)
-(autoload 'quickurl-browse-url-ask "quickurl" "\
-Browse the URL, with `completing-read' prompt, associated with LOOKUP.
-
-(fn LOOKUP)" t nil)
-(autoload 'quickurl-edit-urls "quickurl" "\
-Pull `quickurl-url-file' into a buffer for hand editing." t nil)
-(autoload 'quickurl-list-mode "quickurl" "\
-A mode for browsing the quickurl URL list.
-
-The key bindings for `quickurl-list-mode' are:
-
-\\{quickurl-list-mode-map}
-
-(fn)" t nil)
-(autoload 'quickurl-list "quickurl" "\
-Display `quickurl-list' as a formatted list using `quickurl-list-mode'." t nil)
-(register-definition-prefixes "quickurl" '("quickurl-"))
-
-
;;; Generated autoloads from emacs-lisp/radix-tree.el
(register-definition-prefixes "radix-tree" '("radix-tree-"))
@@ -25150,7 +25061,7 @@ Do not connect to a server if it is already connected.
If ARG is non-nil, instead prompt for connection parameters.
-(fn ARG)" t nil)
+(fn ARG)" t)
(defalias 'irc 'rcirc)
(autoload 'rcirc-connect "rcirc" "\
Connect to SERVER.
@@ -25159,7 +25070,7 @@ ENCRYPTION, CERTFP, SERVER-ALIAS are interpreted as in
`rcirc-server-alist'. STARTUP-CHANNELS is a list of channels
that are joined after authentication.
-(fn SERVER &optional PORT NICK USER-NAME FULL-NAME STARTUP-CHANNELS PASSWORD ENCRYPTION CERTFP SERVER-ALIAS)" nil nil)
+(fn SERVER &optional PORT NICK USER-NAME FULL-NAME STARTUP-CHANNELS PASSWORD ENCRYPTION CERTFP SERVER-ALIAS)")
(defvar rcirc-track-minor-mode nil "\
Non-nil if Rcirc-Track minor mode is enabled.
See the `rcirc-track-minor-mode' command
@@ -25186,7 +25097,7 @@ evaluate `(default-value \\='rcirc-track-minor-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "rcirc" '("rcirc-" "with-rcirc-"))
@@ -25205,7 +25116,7 @@ matching parts of the target buffer will be highlighted.
Case-sensitivity can be toggled with \\[reb-toggle-case]. The
regexp builder supports three different forms of input which can
be set with \\[reb-change-syntax]. More options and details are
-provided in the Commentary section of this library." t nil)
+provided in the Commentary section of this library." t)
(register-definition-prefixes "re-builder" '("re-builder-unload-function" "reb-"))
@@ -25215,7 +25126,7 @@ provided in the Commentary section of this library." t nil)
Prompt for FILE in `recentf-list' and visit it.
Enable `recentf-mode' if it isn't already.
-(fn FILE)" t nil)
+(fn FILE)" t)
(defalias 'recentf 'recentf-open)
(defvar recentf-mode nil "\
Non-nil if Recentf mode is enabled.
@@ -25260,7 +25171,7 @@ evaluate `(default-value \\='recentf-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "recentf" '("recentf-"))
@@ -25276,7 +25187,7 @@ When called from a program the rectangle's corners are START and END.
With a prefix (or a FILL) argument, also fill lines where nothing has
to be deleted.
-(fn START END &optional FILL)" t nil)
+(fn START END &optional FILL)" t)
(autoload 'delete-extract-rectangle "rect" "\
Delete the contents of the rectangle with corners at START and END.
Return it as a list of strings, one for each line of the rectangle.
@@ -25285,12 +25196,12 @@ When called from a program the rectangle's corners are START and END.
With an optional FILL argument, also fill lines where nothing has to be
deleted.
-(fn START END &optional FILL)" nil nil)
+(fn START END &optional FILL)")
(autoload 'extract-rectangle "rect" "\
Return the contents of the rectangle with corners at START and END.
Return it as a list of strings, one for each line of the rectangle.
-(fn START END)" nil nil)
+(fn START END)")
(autoload 'kill-rectangle "rect" "\
Delete the region-rectangle and save it as the last killed one.
@@ -25306,13 +25217,13 @@ you can use this command to copy text from a read-only buffer.
(If the variable `kill-read-only-ok' is non-nil, then this won't
even beep.)
-(fn START END &optional FILL)" t nil)
+(fn START END &optional FILL)" t)
(autoload 'copy-rectangle-as-kill "rect" "\
Copy the region-rectangle and save it as the last killed one.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'yank-rectangle "rect" "\
-Yank the last killed rectangle with upper left corner at point." t nil)
+Yank the last killed rectangle with upper left corner at point." t)
(autoload 'insert-rectangle "rect" "\
Insert text of RECTANGLE with upper left corner at point.
RECTANGLE's first line is inserted at point, its second
@@ -25321,7 +25232,7 @@ RECTANGLE should be a list of strings.
After this command, the mark is at the upper left corner
and point is at the lower right corner.
-(fn RECTANGLE)" nil nil)
+(fn RECTANGLE)")
(autoload 'open-rectangle "rect" "\
Blank out the region-rectangle, shifting text right.
@@ -25332,8 +25243,8 @@ When called from a program the rectangle's corners are START and END.
With a prefix (or a FILL) argument, fill with blanks even if there is
no text on the right side of the rectangle.
-(fn START END &optional FILL)" t nil)
-(defalias 'close-rectangle 'delete-whitespace-rectangle)
+(fn START END &optional FILL)" t)
+(define-obsolete-function-alias 'close-rectangle #'delete-whitespace-rectangle "29.1")
(autoload 'delete-whitespace-rectangle "rect" "\
Delete all whitespace following a specified column in each line.
The left edge of the rectangle specifies the position in each line
@@ -25343,7 +25254,7 @@ rectangle, all contiguous whitespace starting at that column is deleted.
When called from a program the rectangle's corners are START and END.
With a prefix (or a FILL) argument, also fill too short lines.
-(fn START END &optional FILL)" t nil)
+(fn START END &optional FILL)" t)
(autoload 'string-rectangle "rect" "\
Replace rectangle contents with STRING on each line.
The length of STRING need not be the same as the rectangle width.
@@ -25354,8 +25265,8 @@ the minibuffer.
Called from a program, takes three args; START, END and STRING.
-(fn START END STRING)" t nil)
-(defalias 'replace-rectangle 'string-rectangle)
+(fn START END STRING)" t)
+(define-obsolete-function-alias 'replace-rectangle #'string-rectangle "29.1")
(autoload 'string-insert-rectangle "rect" "\
Insert STRING on each line of region-rectangle, shifting text right.
@@ -25363,7 +25274,7 @@ When called from a program, the rectangle's corners are START and END.
The left edge of the rectangle specifies the column for insertion.
This command does not delete or overwrite any existing text.
-(fn START END STRING)" t nil)
+(fn START END STRING)" t)
(autoload 'clear-rectangle "rect" "\
Blank out the region-rectangle.
The text previously in the region is overwritten with blanks.
@@ -25372,7 +25283,7 @@ When called from a program the rectangle's corners are START and END.
With a prefix (or a FILL) argument, also fill with blanks the parts of the
rectangle which were empty.
-(fn START END &optional FILL)" t nil)
+(fn START END &optional FILL)" t)
(autoload 'rectangle-number-lines "rect" "\
Insert numbers in front of the region-rectangle.
@@ -25381,7 +25292,7 @@ counting. FORMAT, if non-nil, should be a format string to pass
to `format' along with the line count. When called interactively
with a prefix argument, prompt for START-AT and FORMAT.
-(fn START END START-AT &optional FORMAT)" t nil)
+(fn START END START-AT &optional FORMAT)" t)
(autoload 'rectangle-mark-mode "rect" "\
Toggle the region as rectangular.
@@ -25402,9 +25313,7 @@ evaluate `rectangle-mark-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-\\{rectangle-mark-mode-map}
-
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "rect" '("apply-on-rectangle" "clear-rectangle-line" "delete-" "extract-rectangle-" "killed-rectangle" "ope" "rectangle-" "spaces-string" "string-rectangle-"))
@@ -25444,7 +25353,7 @@ evaluate `refill-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "refill" '("refill-"))
@@ -25460,7 +25369,7 @@ it is disabled.
(autoload 'reftex-isearch-minor-mode "reftex-global" nil t)
(autoload 'reftex-index-phrases-mode "reftex-index" nil t)
(autoload 'turn-on-reftex "reftex" "\
-Turn on RefTeX mode." nil nil)
+Turn on RefTeX mode.")
(autoload 'reftex-mode "reftex" "\
Minor mode with distinct support for \\label, \\ref and \\cite in LaTeX.
@@ -25506,10 +25415,10 @@ evaluate `reftex-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'reftex-reset-scanning-information "reftex" "\
Reset the symbols containing information from buffer scanning.
-This enforces rescanning the buffer on next use." nil nil)
+This enforces rescanning the buffer on next use.")
(register-definition-prefixes "reftex" '("reftex-"))
@@ -25616,13 +25525,13 @@ usually more efficient than that of a simplified version:
(mapconcat \\='regexp-quote strings \"\\\\|\")
(cdr parens))))
-(fn STRINGS &optional PAREN)" nil nil)
+(fn STRINGS &optional PAREN)")
(autoload 'regexp-opt-depth "regexp-opt" "\
Return the depth of REGEXP.
This means the number of non-shy regexp grouping constructs
(parenthesized expressions) in REGEXP.
-(fn REGEXP)" nil nil)
+(fn REGEXP)")
(register-definition-prefixes "regexp-opt" '("regexp-opt-"))
@@ -25645,16 +25554,16 @@ or nil to bring up a blank `remember-buffer'.
With a prefix or a visible region, use the region as INITIAL.
-(fn &optional INITIAL)" t nil)
+(fn &optional INITIAL)" t)
(autoload 'remember-other-frame "remember" "\
Call `remember' in another frame.
-(fn &optional INITIAL)" t nil)
+(fn &optional INITIAL)" t)
(autoload 'remember-clipboard "remember" "\
Remember the contents of the current clipboard.
-Most useful for remembering things from other applications." t nil)
+Most useful for remembering things from other applications." t)
(autoload 'remember-diary-extract-entries "remember" "\
-Extract diary entries from the region based on `remember-diary-regexp'." nil nil)
+Extract diary entries from the region based on `remember-diary-regexp'.")
(autoload 'remember-notes "remember" "\
Return the notes buffer, creating it if needed, and maybe switch to it.
This buffer is for notes that you want to preserve across Emacs sessions.
@@ -25676,7 +25585,7 @@ Set `initial-buffer-choice' to `remember-notes' to visit your notes buffer
when Emacs starts. Set `remember-notes-buffer-name' to \"*scratch*\"
to turn the *scratch* buffer into your notes buffer.
-(fn &optional SWITCH-TO)" t nil)
+(fn &optional SWITCH-TO)" t)
(register-definition-prefixes "remember" '("remember-"))
@@ -25697,7 +25606,7 @@ sequence. This behavior can be modified by the global variable
\"most recently executed command\" shall be read as \"most
recently executed command not bound to an input event\".
-(fn REPEAT-ARG)" t nil)
+(fn REPEAT-ARG)" t)
(defvar repeat-map nil "\
The value of the repeating transient map for the next command.
A command called from the map can set it again to the same map when
@@ -25731,7 +25640,7 @@ evaluate `(default-value \\='repeat-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "repeat" '("describe-repeat-maps" "repeat-"))
@@ -25761,7 +25670,7 @@ to initialize a message, which the user can then edit and finally send
(or decline to send). The variable `mail-user-agent' controls which
mail-sending package is used for editing and sending the message.
-(fn ADDRESS PKGNAME VARLIST &optional PRE-HOOKS POST-HOOKS SALUTATION)" nil nil)
+(fn ADDRESS PKGNAME VARLIST &optional PRE-HOOKS POST-HOOKS SALUTATION)")
(register-definition-prefixes "reporter" '("reporter-"))
@@ -25788,7 +25697,7 @@ first comment line visible (if point is in a comment).
If INTERACTIVE is non-nil, as it is interactively,
report errors as appropriate for this kind of usage.
-(fn &optional ARG INTERACTIVE)" t nil)
+(fn &optional ARG INTERACTIVE)" t)
(register-definition-prefixes "reposition" '("repos-count-screen-lines"))
@@ -25816,7 +25725,7 @@ evaluate `reveal-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar global-reveal-mode nil "\
Non-nil if Global Reveal mode is enabled.
See the `global-reveal-mode' command
@@ -25844,7 +25753,7 @@ evaluate `(default-value \\='global-reveal-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "reveal" '("reveal-"))
@@ -25888,11 +25797,11 @@ it is disabled.
(autoload 'ring-p "ring" "\
Return t if X is a ring; nil otherwise.
-(fn X)" nil nil)
+(fn X)")
(autoload 'make-ring "ring" "\
Make a ring that can contain SIZE elements.
-(fn SIZE)" nil nil)
+(fn SIZE)")
(register-definition-prefixes "ring" '("ring-"))
@@ -25909,7 +25818,7 @@ Its name should end with a slash." :initialize #'custom-initialize-delay :type '
Return t if the current movemail variant is any of VARIANTS.
Currently known variants are `emacs' and `mailutils'.
-(fn &rest VARIANTS)" nil nil)
+(fn &rest VARIANTS)")
(defvar rmail-user-mail-address-regexp nil "\
Regexp matching user mail addresses.
If non-nil, this variable is used to identify the correspondent
@@ -25988,7 +25897,7 @@ have a chance to specify a file name with the minibuffer.
If `rmail-display-summary' is non-nil, make a summary for this RMAIL file.
-(fn &optional FILE-NAME-ARG)" t nil)
+(fn &optional FILE-NAME-ARG)" t)
(autoload 'rmail-mode "rmail" "\
Rmail Mode is used by \\<rmail-mode-map>\\[rmail] for editing Rmail files.
All normal editing commands are turned off.
@@ -26038,15 +25947,15 @@ Instead, these commands are available:
\\[rmail-summary-by-recipients] Summarize only messages with particular recipient(s).
\\[rmail-summary-by-regexp] Summarize only messages with particular regexp(s).
\\[rmail-summary-by-topic] Summarize only messages with subject line regexp(s).
-\\[rmail-toggle-header] Toggle display of complete header." t nil)
+\\[rmail-toggle-header] Toggle display of complete header." t)
(autoload 'rmail-input "rmail" "\
Run Rmail on file FILENAME.
-(fn FILENAME)" t nil)
+(fn FILENAME)" t)
(autoload 'rmail-set-remote-password "rmail" "\
Set PASSWORD to be used for retrieving mail from a POP or IMAP server.
-(fn PASSWORD)" t nil)
+(fn PASSWORD)" t)
(register-definition-prefixes "rmail" '("mail-" "rmail-"))
@@ -26058,7 +25967,7 @@ Set PASSWORD to be used for retrieving mail from a POP or IMAP server.
;;; Generated autoloads from mail/rmailedit.el
(autoload 'rmail-edit-current-message "rmailedit" "\
-Edit the contents of this message." t nil)
+Edit the contents of this message." t)
(register-definition-prefixes "rmailedit" '("rmail-"))
@@ -26069,34 +25978,34 @@ Add LABEL to labels associated with current RMAIL message.
Completes (see `rmail-read-label') over known labels when reading.
LABEL may be a symbol or string. Only one label is allowed.
-(fn LABEL)" t nil)
+(fn LABEL)" t)
(autoload 'rmail-kill-label "rmailkwd" "\
Remove LABEL from labels associated with current RMAIL message.
Completes (see `rmail-read-label') over known labels when reading.
LABEL may be a symbol or string. Only one label is allowed.
-(fn LABEL)" t nil)
+(fn LABEL)" t)
(autoload 'rmail-read-label "rmailkwd" "\
Read a label with completion, prompting with PROMPT.
Completions are chosen from `rmail-label-obarray'. The default
is `rmail-last-label', if that is non-nil. Updates `rmail-last-label'
according to the choice made, and returns a symbol.
-(fn PROMPT)" nil nil)
+(fn PROMPT)")
(autoload 'rmail-previous-labeled-message "rmailkwd" "\
Show previous message with one of the labels LABELS.
LABELS should be a comma-separated list of label names.
If LABELS is empty, the last set of labels specified is used.
With prefix argument N moves backward N messages with these labels.
-(fn N LABELS)" t nil)
+(fn N LABELS)" t)
(autoload 'rmail-next-labeled-message "rmailkwd" "\
Show next message with one of the labels LABELS.
LABELS should be a comma-separated list of label names.
If LABELS is empty, the last set of labels specified is used.
With prefix argument N moves forward N messages with these labels.
-(fn N LABELS)" t nil)
+(fn N LABELS)" t)
(register-definition-prefixes "rmailkwd" '("rmail-"))
@@ -26121,7 +26030,7 @@ By default, this displays text and multipart messages, and offers to
download attachments as specified by `rmail-mime-attachment-dirs-alist'.
The arguments ARG and STATE have no effect in this case.
-(fn &optional ARG STATE)" t nil)
+(fn &optional ARG STATE)" t)
(register-definition-prefixes "rmailmm" '("rmail-"))
@@ -26134,7 +26043,7 @@ If FILE-NAME is empty, remove any existing inbox list.
This applies only to the current session.
-(fn FILE-NAME)" t nil)
+(fn FILE-NAME)" t)
;;; Generated autoloads from mail/rmailout.el
@@ -26175,7 +26084,7 @@ message (if writing a file directly).
Set the optional fourth argument NOT-RMAIL non-nil if you call this
from a non-Rmail buffer. In this case, COUNT is ignored.
-(fn FILE-NAME &optional COUNT NOATTRIBUTE NOT-RMAIL)" t nil)
+(fn FILE-NAME &optional COUNT NOATTRIBUTE NOT-RMAIL)" t)
(autoload 'rmail-output-as-seen "rmailout" "\
Append this message to mbox file named FILE-NAME.
The details are as for `rmail-output', except that:
@@ -26187,7 +26096,7 @@ Note that if NOT-RMAIL is non-nil, there is no difference between this
function and `rmail-output'. This argument may be removed in future,
so you should call `rmail-output' directly in that case.
-(fn FILE-NAME &optional COUNT NOATTRIBUTE NOT-RMAIL)" t nil)
+(fn FILE-NAME &optional COUNT NOATTRIBUTE NOT-RMAIL)" t)
(autoload 'rmail-output-body-to-file "rmailout" "\
Write this message body to the file FILE-NAME.
Interactively, the default file name comes from either the message
@@ -26200,7 +26109,7 @@ Note that this overwrites FILE-NAME (after confirmation), rather
than appending to it. Deletes the message after writing if
`rmail-delete-after-output' is non-nil.
-(fn FILE-NAME)" t nil)
+(fn FILE-NAME)" t)
(register-definition-prefixes "rmailout" '("rmail-"))
@@ -26210,25 +26119,25 @@ than appending to it. Deletes the message after writing if
Sort messages of current Rmail buffer by \"Date\" header.
If prefix argument REVERSE is non-nil, sorts in reverse order.
-(fn REVERSE)" t nil)
+(fn REVERSE)" t)
(autoload 'rmail-sort-by-subject "rmailsort" "\
Sort messages of current Rmail buffer by \"Subject\" header.
Ignores any \"Re: \" prefix. If prefix argument REVERSE is
non-nil, sorts in reverse order.
-(fn REVERSE)" t nil)
+(fn REVERSE)" t)
(autoload 'rmail-sort-by-author "rmailsort" "\
Sort messages of current Rmail buffer by author.
This uses either the \"From\" or \"Sender\" header, downcased.
If prefix argument REVERSE is non-nil, sorts in reverse order.
-(fn REVERSE)" t nil)
+(fn REVERSE)" t)
(autoload 'rmail-sort-by-recipient "rmailsort" "\
Sort messages of current Rmail buffer by recipient.
This uses either the \"To\" or \"Apparently-To\" header, downcased.
If prefix argument REVERSE is non-nil, sorts in reverse order.
-(fn REVERSE)" t nil)
+(fn REVERSE)" t)
(autoload 'rmail-sort-by-correspondent "rmailsort" "\
Sort messages of current Rmail buffer by other correspondent.
This uses either the \"From\", \"Sender\", \"To\", or
@@ -26236,12 +26145,12 @@ This uses either the \"From\", \"Sender\", \"To\", or
excluded by `mail-dont-reply-to-names'. If prefix argument
REVERSE is non-nil, sorts in reverse order.
-(fn REVERSE)" t nil)
+(fn REVERSE)" t)
(autoload 'rmail-sort-by-lines "rmailsort" "\
Sort messages of current Rmail buffer by the number of lines.
If prefix argument REVERSE is non-nil, sorts in reverse order.
-(fn REVERSE)" t nil)
+(fn REVERSE)" t)
(autoload 'rmail-sort-by-labels "rmailsort" "\
Sort messages of current Rmail buffer by labels.
LABELS is a comma-separated list of labels. The order of these
@@ -26250,19 +26159,19 @@ label come first, messages with the second label come second, and
so on. Messages that have none of these labels come last.
If prefix argument REVERSE is non-nil, sorts in reverse order.
-(fn REVERSE LABELS)" t nil)
+(fn REVERSE LABELS)" t)
(register-definition-prefixes "rmailsort" '("rmail-"))
;;; Generated autoloads from mail/rmailsum.el
(autoload 'rmail-summary "rmailsum" "\
-Display a summary of all messages, one line per message." t nil)
+Display a summary of all messages, one line per message." t)
(autoload 'rmail-summary-by-labels "rmailsum" "\
Display a summary of all messages with one or more LABELS.
LABELS should be a string containing the desired labels, separated by commas.
-(fn LABELS)" t nil)
+(fn LABELS)" t)
(autoload 'rmail-summary-by-recipients "rmailsum" "\
Display a summary of all messages with the given RECIPIENTS.
Normally checks the To, From and Cc fields of headers;
@@ -26270,27 +26179,27 @@ but if PRIMARY-ONLY is non-nil (prefix arg given),
only look in the To and From fields.
RECIPIENTS is a regular expression.
-(fn RECIPIENTS &optional PRIMARY-ONLY)" t nil)
+(fn RECIPIENTS &optional PRIMARY-ONLY)" t)
(autoload 'rmail-summary-by-regexp "rmailsum" "\
Display a summary of all messages according to regexp REGEXP.
If the regular expression is found in the header of the message
(including in the date and other lines, as well as the subject line),
Emacs will list the message in the summary.
-(fn REGEXP)" t nil)
+(fn REGEXP)" t)
(autoload 'rmail-summary-by-topic "rmailsum" "\
Display a summary of all messages with the given SUBJECT.
Normally checks just the Subject field of headers; but with prefix
argument WHOLE-MESSAGE is non-nil, looks in the whole message.
SUBJECT is a regular expression.
-(fn SUBJECT &optional WHOLE-MESSAGE)" t nil)
+(fn SUBJECT &optional WHOLE-MESSAGE)" t)
(autoload 'rmail-summary-by-senders "rmailsum" "\
Display a summary of all messages whose \"From\" field matches SENDERS.
SENDERS is a regular expression. The default for SENDERS matches the
sender of the current message.
-(fn SENDERS)" t nil)
+(fn SENDERS)" t)
(register-definition-prefixes "rmailsum" '("rmail-"))
@@ -26300,7 +26209,7 @@ sender of the current message.
Load a schema in RELAX NG compact syntax from FILENAME.
Return a pattern.
-(fn FILENAME)" nil nil)
+(fn FILENAME)")
(register-definition-prefixes "rng-cmpct" '("rng-"))
@@ -26329,7 +26238,7 @@ Return a pattern.
(autoload 'rng-nxml-mode-init "rng-nxml" "\
Initialize `nxml-mode' to take advantage of `rng-validate-mode'.
This is typically called from `nxml-mode-hook'.
-Validation will be enabled if `rng-nxml-auto-validate-flag' is non-nil." t nil)
+Validation will be enabled if `rng-nxml-auto-validate-flag' is non-nil." t)
(register-definition-prefixes "rng-nxml" '("rng-"))
@@ -26392,7 +26301,7 @@ evaluate `rng-validate-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "rng-valid" '("rng-"))
@@ -26417,7 +26326,7 @@ The object returned can be any convenient non-nil value, provided
that, if two strings represent the same value, the returned objects
must be equal.
-(fn NAME PARAMS)" nil nil)
+(fn NAME PARAMS)")
(register-definition-prefixes "rng-xsd" '("rng-xsd-" "xsd-duration-reference-dates"))
@@ -26442,11 +26351,11 @@ NAME is the string specifying a robin package.
INPUT is a string that specifies the input pattern.
OUTPUT is either a character or a string to be generated.
-(fn NAME INPUT OUTPUT)" nil nil)
+(fn NAME INPUT OUTPUT)")
(autoload 'robin-use-package "robin" "\
Start using robin package NAME, which is a string.
-(fn NAME)" nil nil)
+(fn NAME)")
(register-definition-prefixes "robin" '("robin-"))
@@ -26458,15 +26367,15 @@ If OBJECT is a buffer, encrypt the region between START and END.
If OBJECT is a string, encrypt it in its entirety, ignoring START
and END, and return the encrypted string.
-(fn OBJECT &optional START END)" nil nil)
+(fn OBJECT &optional START END)")
(autoload 'rot13-string "rot13" "\
Return ROT13 encryption of STRING.
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'rot13-region "rot13" "\
ROT13 encrypt the region between START and END in current buffer.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'rot13-other-window "rot13" "\
Display current buffer in ROT13 in another window.
The text itself is not modified, only the way it is displayed is affected.
@@ -26475,9 +26384,9 @@ To terminate the ROT13 display, delete that window. As long as that window
is not deleted, any buffer displayed in it will become instantly encoded
in ROT13.
-See also `toggle-rot13-mode'." t nil)
+See also `toggle-rot13-mode'." t)
(autoload 'toggle-rot13-mode "rot13" "\
-Toggle the use of ROT13 encoding for the current window." t nil)
+Toggle the use of ROT13 encoding for the current window." t)
(register-definition-prefixes "rot13" '("rot13-"))
@@ -26494,7 +26403,7 @@ highlighting.
\\{rst-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'rst-minor-mode "rst" "\
Toggle ReST minor mode.
@@ -26516,7 +26425,7 @@ evaluate `rst-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "rst" '("rst-"))
@@ -26531,7 +26440,7 @@ it is disabled.
(autoload 'ruby-mode "ruby-mode" "\
Major mode for editing Ruby code.
-(fn)" t nil)
+(fn)" t)
(add-to-list 'auto-mode-alist (cons (purecopy (concat "\\(?:\\.\\(?:" "rbw?\\|ru\\|rake\\|thor" "\\|jbuilder\\|rabl\\|gemspec\\|podspec" "\\)" "\\|/" "\\(?:Gem\\|Rake\\|Cap\\|Thor" "\\|Puppet\\|Berks\\|Brew" "\\|Vagrant\\|Guard\\|Pod\\)file" "\\)\\'")) 'ruby-mode))
(dolist (name (list "ruby" "rbx" "jruby" "ruby1.9" "ruby1.8")) (add-to-list 'interpreter-mode-alist (cons (purecopy name) 'ruby-mode)))
(register-definition-prefixes "ruby-mode" '("ruby-"))
@@ -26559,7 +26468,7 @@ evaluate `ruler-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "ruler-mode" '("ruler-"))
@@ -26574,7 +26483,7 @@ group.
For extending the `rx' notation in FORM, use `rx-define' or `rx-let-eval'.
-(fn FORM &optional NO-GROUP)" nil nil)
+(fn FORM &optional NO-GROUP)")
(autoload 'rx "rx" "\
Translate regular expressions REGEXPS in sexp form to a regexp string.
Each argument is one of the forms below; RX is a subform, and RX... stands
@@ -26759,9 +26668,13 @@ following constructs:
(backref REF) matches whatever the submatch REF matched.
REF can be a number, as usual, or a name
introduced by a previous (let REF ...)
- construct." (let* ((rx--pcase-vars nil) (regexp (rx--to-expr (rx--pcase-transform (cons 'seq regexps))))) `(and (pred stringp) ,(pcase (length rx--pcase-vars) (0 `(pred (string-match ,regexp))) (1 `(app (lambda (s) (if (string-match ,regexp s) (match-string 1 s) 0)) (and ,(car rx--pcase-vars) (pred (not numberp))))) (nvars `(app (lambda (s) (and (string-match ,regexp s) ,(rx--reduce-right (lambda (a b) `(cons ,a ,b)) (mapcar (lambda (i) `(match-string ,i s)) (number-sequence 1 nvars))))) ,(list '\` (rx--reduce-right #'cons (mapcar (lambda (name) (list '\, name)) (reverse rx--pcase-vars)))))))))))
+ construct." (rx--pcase-expand regexps)))
(define-symbol-prop 'rx--pcase-macroexpander 'edebug-form-spec 'nil)
(define-symbol-prop 'rx 'pcase-macroexpander #'rx--pcase-macroexpander)
+(autoload 'rx--pcase-expand "rx" "\
+
+
+(fn REGEXPS)")
(register-definition-prefixes "rx" '("rx-"))
@@ -26848,7 +26761,7 @@ evaluate `(default-value \\='savehist-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "savehist" '("savehist-"))
@@ -26882,7 +26795,7 @@ evaluate `(default-value \\='save-place-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'save-place-local-mode "saveplace" "\
Toggle whether to save your place in this file between sessions.
@@ -26910,8 +26823,8 @@ evaluate `save-place-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
-(register-definition-prefixes "saveplace" '("load-save-place-alist-from-file" "save-place"))
+(fn &optional ARG)" t)
+(register-definition-prefixes "saveplace" '("save-place"))
;;; Generated autoloads from cedet/semantic/sb.el
@@ -26939,7 +26852,7 @@ Delete converts tabs to spaces as it moves back.
Blank lines separate paragraphs. Semicolons start comments.
\\{scheme-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'dsssl-mode "scheme" "\
Major mode for editing DSSSL code.
Editing commands are similar to those of `lisp-mode'.
@@ -26952,7 +26865,7 @@ Entering this mode runs the hooks `scheme-mode-hook' and then
`dsssl-mode-hook' and inserts the value of `dsssl-sgml-declaration' if
that variable's value is a string.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "scheme" '("dsssl-" "scheme-"))
@@ -26974,7 +26887,7 @@ This mode is an extended emacs-lisp mode.
\\{gnus-score-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "score-mode" '("gnus-score-" "score-mode-"))
@@ -27008,7 +26921,7 @@ evaluate `(default-value \\='scroll-all-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "scroll-all" '("scroll-all-"))
@@ -27044,7 +26957,7 @@ evaluate `scroll-lock-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "scroll-lock" '("scroll-lock-"))
@@ -27119,7 +27032,7 @@ evaluate `(default-value \\='semantic-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "semantic" '("bovinate" "semantic-"))
@@ -27259,12 +27172,12 @@ variable `message-default-mail-headers' instead.")
(custom-autoload 'mail-default-headers "sendmail" t)
(autoload 'sendmail-query-once "sendmail" "\
Query for `send-mail-function' and send mail with it.
-This also saves the value of `send-mail-function' via Customize." nil nil)
+This also saves the value of `send-mail-function' via Customize.")
(define-mail-user-agent 'sendmail-user-agent #'sendmail-user-agent-compose #'mail-send-and-exit)
(autoload 'sendmail-user-agent-compose "sendmail" "\
-(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION SEND-ACTIONS RETURN-ACTION &rest IGNORED)" nil nil)
+(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION SEND-ACTIONS RETURN-ACTION &rest IGNORED)")
(autoload 'mail-mode "sendmail" "\
Major mode for editing mail to be sent.
Like Text Mode but with these additional commands:
@@ -27287,7 +27200,12 @@ Here are commands that move to a header field (and create it if there isn't):
Turning on Mail mode runs the normal hooks `text-mode-hook' and
`mail-mode-hook' (in that order).
-(fn)" t nil)
+(fn)" t)
+(autoload 'mail-send-and-exit "sendmail" "\
+Send message like `mail-send', then, if no errors, exit from mail buffer.
+Prefix arg means don't delete this window.
+
+(fn &optional ARG)" t)
(defvar mail-mailing-lists nil "\
List of mailing list addresses the user is subscribed to.
The variable is used to trigger insertion of the \"Mail-Followup-To\"
@@ -27356,15 +27274,15 @@ The seventh argument ACTIONS is a list of actions to take
when the message is sent, we apply FUNCTION to ARGS.
This is how Rmail arranges to mark messages `answered'.
-(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER ACTIONS RETURN-ACTION)" t nil)
+(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER ACTIONS RETURN-ACTION)" t)
(autoload 'mail-other-window "sendmail" "\
Like `mail' command, but display mail buffer in another window.
-(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER SENDACTIONS)" t nil)
+(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER SENDACTIONS)" t)
(autoload 'mail-other-frame "sendmail" "\
Like `mail' command, but display mail buffer in another frame.
-(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER SENDACTIONS)" t nil)
+(fn &optional NOERASE TO SUBJECT IN-REPLY-TO CC REPLYBUFFER SENDACTIONS)" t)
(register-definition-prefixes "sendmail" '("mail-" "sendmail-"))
@@ -27398,13 +27316,13 @@ To force-start a server, do \\[server-force-delete] and then
To check from a Lisp program whether a server is running, use
the `server-process' variable.
-(fn &optional LEAVE-DEAD INHIBIT-PROMPT)" t nil)
+(fn &optional LEAVE-DEAD INHIBIT-PROMPT)" t)
(autoload 'server-force-delete "server" "\
Unconditionally delete connection file for server NAME.
If server is running, it is first stopped.
NAME defaults to `server-name'. With argument, ask for NAME.
-(fn &optional NAME)" t nil)
+(fn &optional NAME)" t)
(defvar server-mode nil "\
Non-nil if Server mode is enabled.
See the `server-mode' command
@@ -27434,7 +27352,7 @@ evaluate `(default-value \\='server-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'server-save-buffers-kill-terminal "server" "\
Offer to save each buffer, then kill the current client.
With ARG non-nil, silently save all file-visiting buffers, then kill.
@@ -27442,7 +27360,7 @@ With ARG non-nil, silently save all file-visiting buffers, then kill.
If emacsclient was started with a list of filenames to edit, then
only these files will be asked to be saved.
-(fn ARG)" nil nil)
+(fn ARG)")
(autoload 'server-stop-automatically "server" "\
Automatically stop server as specified by ARG.
@@ -27464,7 +27382,7 @@ Any other value of ARG will cause this function to signal an error.
This function is meant to be called from the user init file.
-(fn ARG)" nil nil)
+(fn ARG)")
(register-definition-prefixes "server" '("server-"))
@@ -27505,7 +27423,7 @@ part):
\\{ses-mode-print-map}
These are active only in the minibuffer, when entering or editing a
formula:
-\\{ses-mode-edit-map}" t nil)
+\\{ses-mode-edit-map}" t)
(register-definition-prefixes "ses" '("ses"))
@@ -27530,7 +27448,7 @@ Do \\[describe-variable] sgml- SPC to see available variables.
Do \\[describe-key] on the following bindings to discover what they do.
\\{sgml-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'html-mode "sgml-mode" "\
Major mode based on SGML mode for editing HTML documents.
This allows inserting skeleton constructs used in hypertext documents with
@@ -27569,7 +27487,7 @@ To work around that, do:
\\{html-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "sgml-mode" '("html-" "sgml-"))
@@ -27628,7 +27546,7 @@ indicate what shell it is use `sh-alias-alist' to translate.
If your shell gives error messages with line numbers, you can use \\[executable-interpret]
with your script for an edit-interpret-debug cycle.
-(fn)" t nil)
+(fn)" t)
(defalias 'shell-script-mode 'sh-mode)
(register-definition-prefixes "sh-script" '("sh-"))
@@ -27677,7 +27595,7 @@ considered to shadow a later file XXX.el, and vice-versa.
Shadowings are located by calling the (non-interactive) companion
function, `load-path-shadows-find'.
-(fn &optional STRINGP)" t nil)
+(fn &optional STRINGP)" t)
(register-definition-prefixes "shadow" '("load-path-shadows-"))
@@ -27691,21 +27609,21 @@ defined by a name, the network address of a primary host (the one we copy
files to), and a regular expression that matches the hostnames of all the
sites in the cluster.
-(fn NAME)" t nil)
+(fn NAME)" t)
(autoload 'shadow-define-literal-group "shadowfile" "\
Declare a single file to be shared between sites.
It may have different filenames on each site. When this file is edited, the
new version will be copied to each of the other locations. Sites can be
-specific hostnames, or names of clusters (see `shadow-define-cluster')." t nil)
+specific hostnames, or names of clusters (see `shadow-define-cluster')." t)
(autoload 'shadow-define-regexp-group "shadowfile" "\
Make each of a group of files be shared between hosts.
Prompts for regular expression; files matching this are shared between a list
of sites, which are also prompted for. The filenames must be identical on all
hosts (if they aren't, use `shadow-define-literal-group' instead of this
function). Each site can be either a hostname or the name of a cluster (see
-`shadow-define-cluster')." t nil)
+`shadow-define-cluster')." t)
(autoload 'shadow-initialize "shadowfile" "\
-Set up file shadowing." t nil)
+Set up file shadowing." t)
(register-definition-prefixes "shadowfile" '("shadow"))
@@ -27728,7 +27646,7 @@ Split STRING (a shell command) into a list of strings.
General shell syntax, like single and double quoting, as well as
backslash quoting, is respected.
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'shell "shell" "\
Run an inferior shell, with I/O through BUFFER (which defaults to `*shell*').
Interactively, a prefix arg means to prompt for BUFFER.
@@ -27765,7 +27683,7 @@ Make the shell buffer the current buffer, and return it.
(Type \\[describe-mode] in the shell buffer for a list of commands.)
-(fn &optional BUFFER FILE-NAME)" t nil)
+(fn &optional BUFFER FILE-NAME)" t)
(register-definition-prefixes "shell" '("dirs" "explicit-" "shell-"))
@@ -27840,9 +27758,9 @@ Pop to a buffer with short documentation summary for functions in GROUP.
If FUNCTION is non-nil, place point on the entry for FUNCTION (if any).
If SAME-WINDOW, don't pop to a new window.
-(fn GROUP &optional FUNCTION SAME-WINDOW)" t nil)
+(fn GROUP &optional FUNCTION SAME-WINDOW)" t)
(defalias 'shortdoc #'shortdoc-display-group)
-(register-definition-prefixes "shortdoc" '("alist" "buffer" "file" "hash-table" "keymaps" "list" "number" "overlay" "process" "regexp" "sequence" "shortdoc-" "string" "text-properties" "vector"))
+(register-definition-prefixes "shortdoc" '("shortdoc-"))
;;; Generated autoloads from net/shr.el
@@ -27850,13 +27768,13 @@ If SAME-WINDOW, don't pop to a new window.
(autoload 'shr-render-region "shr" "\
Display the HTML rendering of the region between BEGIN and END.
-(fn BEGIN END &optional BUFFER)" t nil)
+(fn BEGIN END &optional BUFFER)" t)
(autoload 'shr-insert-document "shr" "\
Render the parsed document DOM into the current buffer.
DOM should be a parse tree as generated by
`libxml-parse-html-region' or similar.
-(fn DOM)" nil nil)
+(fn DOM)")
(register-definition-prefixes "shr" '("shr-"))
@@ -27870,19 +27788,19 @@ DOM should be a parse tree as generated by
(autoload 'sieve-manage "sieve" "\
-(fn SERVER &optional PORT)" t nil)
+(fn SERVER &optional PORT)" t)
(autoload 'sieve-upload "sieve" "\
-(fn &optional NAME)" t nil)
+(fn &optional NAME)" t)
(autoload 'sieve-upload-and-bury "sieve" "\
-(fn &optional NAME)" t nil)
+(fn &optional NAME)" t)
(autoload 'sieve-upload-and-kill "sieve" "\
-(fn &optional NAME)" t nil)
+(fn &optional NAME)" t)
(register-definition-prefixes "sieve" '("sieve-"))
@@ -27897,7 +27815,7 @@ DOM should be a parse tree as generated by
Major mode for editing Sieve code.
Turning on Sieve mode runs `sieve-mode-hook'.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "sieve-mode" '("sieve-"))
@@ -27946,7 +27864,7 @@ Variables controlling indentation style:
Turning on SIMULA mode calls the value of the variable simula-mode-hook
with no arguments, if that value is non-nil.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "simula" '("simula-"))
@@ -27978,7 +27896,7 @@ This command can also be an abbrev expansion (3rd and 4th columns in
Optional second argument STR may also be a string which will be the value
of `str' whereas the skeleton's interactor is then ignored.
-(fn SKELETON &optional STR ARG)" nil nil)
+(fn SKELETON &optional STR ARG)")
(autoload 'skeleton-insert "skeleton" "\
Insert the complex statement skeleton SKELETON describes very concisely.
@@ -28050,7 +27968,7 @@ available:
input initial input (string or cons with index) while reading str
v1, v2 local variables for memorizing anything you want
-(fn SKELETON &optional REGIONS STR)" nil nil)
+(fn SKELETON &optional REGIONS STR)")
(autoload 'skeleton-pair-insert-maybe "skeleton" "\
Insert the character you type ARG times.
@@ -28066,7 +27984,7 @@ the defaults are used. These are (), [], {}, <> and (grave
accent, apostrophe) for the paired ones, and the same character
twice for the others.
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "skeleton" '("skeleton-"))
@@ -28087,13 +28005,13 @@ If non-nil, PREPROC is called with no argument in a buffer that contains
a copy of a region, just before preparing it to for `diff'. It can be
used to replace chars to try and eliminate some spurious differences.
-(fn BEG1 END1 BEG2 END2 PROPS-C &optional PREPROC PROPS-R PROPS-A)" nil nil)
+(fn BEG1 END1 BEG2 END2 PROPS-C &optional PREPROC PROPS-R PROPS-A)")
(autoload 'smerge-ediff "smerge-mode" "\
Invoke ediff to resolve the conflicts.
NAME-UPPER, NAME-LOWER, and NAME-BASE, if non-nil, are used for the
buffer names.
-(fn &optional NAME-UPPER NAME-LOWER NAME-BASE)" t nil)
+(fn &optional NAME-UPPER NAME-LOWER NAME-BASE)" t)
(autoload 'smerge-mode "smerge-mode" "\
Minor mode to simplify editing output from the diff3 program.
@@ -28113,12 +28031,12 @@ evaluate `smerge-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'smerge-start-session "smerge-mode" "\
Turn on `smerge-mode' and move point to first conflict marker.
If no conflict maker is found, turn off `smerge-mode'.
-(fn &optional INTERACTIVELY)" t nil)
+(fn &optional INTERACTIVELY)" t)
(register-definition-prefixes "smerge-mode" '("smerge-"))
@@ -28133,12 +28051,12 @@ If no conflict maker is found, turn off `smerge-mode'.
Replace in the region `smiley-regexp-alist' matches with corresponding images.
A list of images is returned.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'smiley-buffer "smiley" "\
Run `smiley-region' at the BUFFER, specified in the argument or
interactively. If there's no argument, do it at the current buffer.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(register-definition-prefixes "smiley" '("gnus-smiley-file-types" "smiley-"))
@@ -28149,9 +28067,9 @@ interactively. If there's no argument, do it at the current buffer.
;;; Generated autoloads from mail/smtpmail.el
-(autoload 'smtpmail-send-it "smtpmail" nil nil nil)
+(autoload 'smtpmail-send-it "smtpmail")
(autoload 'smtpmail-send-queued-mail "smtpmail" "\
-Send mail that was queued as a result of setting `smtpmail-queue-mail'." t nil)
+Send mail that was queued as a result of setting `smtpmail-queue-mail'." t)
(register-definition-prefixes "smtpmail" '("smtpmail-"))
@@ -28171,7 +28089,7 @@ Snake mode keybindings:
\\[snake-move-left] Makes the snake move left
\\[snake-move-right] Makes the snake move right
\\[snake-move-up] Makes the snake move up
-\\[snake-move-down] Makes the snake move down" t nil)
+\\[snake-move-down] Makes the snake move down" t)
(register-definition-prefixes "snake" '("snake-"))
@@ -28185,7 +28103,7 @@ Comments start with -- and end with newline or another --.
Delete converts tabs to spaces as it moves back.
\\{snmp-mode-map}
Turning on `snmp-mode' runs the hooks in `snmp-common-mode-hook', then
-`snmp-mode-hook'." t nil)
+`snmp-mode-hook'." t)
(autoload 'snmpv2-mode "snmp-mode" "\
Major mode for editing SNMPv2 MIBs.
Expression and list commands understand all C brackets.
@@ -28194,7 +28112,7 @@ Comments start with -- and end with newline or another --.
Delete converts tabs to spaces as it moves back.
\\{snmp-mode-map}
Turning on `snmp-mode' runs the hooks in `snmp-common-mode-hook',
-then `snmpv2-mode-hook'." t nil)
+then `snmpv2-mode-hook'." t)
(register-definition-prefixes "snmp-mode" '("snmp"))
@@ -28202,9 +28120,9 @@ then `snmpv2-mode-hook'." t nil)
(push (purecopy '(so-long 1 1 2)) package--builtin-versions)
(autoload 'so-long-commentary "so-long" "\
-View the `so-long' library's documentation in `outline-mode'." t nil)
+View the `so-long' library's documentation in `outline-mode'." t)
(autoload 'so-long-customize "so-long" "\
-Open the customization group `so-long'." t nil)
+Open the customization group `so-long'." t)
(autoload 'so-long-minor-mode "so-long" "\
This is the minor mode equivalent of `so-long-mode'.
@@ -28228,7 +28146,7 @@ evaluate `so-long-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'so-long-mode "so-long" "\
This major mode is the default `so-long-action' option.
@@ -28256,7 +28174,7 @@ Use \\[so-long-commentary] for more information.
Use \\[so-long-customize] to open the customization group `so-long' to
configure the behavior.
-(fn)" t nil)
+(fn)" t)
(autoload 'so-long "so-long" "\
Invoke `so-long-action' and run `so-long-hook'.
@@ -28272,11 +28190,11 @@ With a prefix argument, select the action to use interactively.
If an action was already active in the buffer, it will be reverted before
invoking the new action.
-(fn &optional ACTION)" t nil)
+(fn &optional ACTION)" t)
(autoload 'so-long-enable "so-long" "\
Enable the `so-long' library's functionality.
-Equivalent to calling (global-so-long-mode 1)" t nil)
+Equivalent to calling (global-so-long-mode 1)" t)
(defvar global-so-long-mode nil "\
Non-nil if Global So-Long mode is enabled.
See the `global-so-long-mode' command
@@ -28317,7 +28235,7 @@ evaluate `(default-value \\='global-so-long-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "so-long" '("so-long-" "turn-o"))
@@ -28347,7 +28265,7 @@ longitude, latitude, time zone, and date, and always use standard time.
This function is suitable for execution in an init file.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "solar" '("calendar-" "diary-sunrise-sunset" "solar-"))
@@ -28421,7 +28339,7 @@ Pick your favorite shortcuts:
\\{solitaire-mode-map}
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "solitaire" '("solitaire-"))
@@ -28477,7 +28395,7 @@ the keys are numbers, with `compare-buffer-substrings' if the
keys are cons cells (the car and cdr of each cons cell are taken
as start and end positions), and with `string<' otherwise.
-(fn REVERSE NEXTRECFUN ENDRECFUN &optional STARTKEYFUN ENDKEYFUN PREDICATE)" nil nil)
+(fn REVERSE NEXTRECFUN ENDRECFUN &optional STARTKEYFUN ENDKEYFUN PREDICATE)")
(autoload 'sort-lines "sort" "\
Sort lines in region alphabetically; REVERSE non-nil means descending order.
Interactively, REVERSE is the prefix argument, and BEG and END are the region.
@@ -28486,7 +28404,7 @@ REVERSE (non-nil means reverse order), BEG and END (region to sort).
The variable `sort-fold-case' determines whether alphabetic case affects
the sort order.
-(fn REVERSE BEG END)" t nil)
+(fn REVERSE BEG END)" t)
(autoload 'sort-paragraphs "sort" "\
Sort paragraphs in region alphabetically; argument means descending order.
Called from a program, there are three arguments:
@@ -28494,7 +28412,7 @@ REVERSE (non-nil means reverse order), BEG and END (region to sort).
The variable `sort-fold-case' determines whether alphabetic case affects
the sort order.
-(fn REVERSE BEG END)" t nil)
+(fn REVERSE BEG END)" t)
(autoload 'sort-pages "sort" "\
Sort pages in region alphabetically; argument means descending order.
Called from a program, there are three arguments:
@@ -28502,7 +28420,7 @@ REVERSE (non-nil means reverse order), BEG and END (region to sort).
The variable `sort-fold-case' determines whether alphabetic case affects
the sort order.
-(fn REVERSE BEG END)" t nil)
+(fn REVERSE BEG END)" t)
(put 'sort-numeric-base 'safe-local-variable 'integerp)
(autoload 'sort-numeric-fields "sort" "\
Sort lines in region numerically by the ARGth field of each line.
@@ -28514,7 +28432,7 @@ With a negative arg, sorts by the ARGth field counted from the right.
Called from a program, there are three arguments:
FIELD, BEG and END. BEG and END specify region to sort.
-(fn FIELD BEG END)" t nil)
+(fn FIELD BEG END)" t)
(autoload 'sort-fields "sort" "\
Sort lines in region lexicographically by the ARGth field of each line.
Fields are separated by whitespace and numbered from 1 up.
@@ -28524,7 +28442,7 @@ FIELD, BEG and END. BEG and END specify region to sort.
The variable `sort-fold-case' determines whether alphabetic case affects
the sort order.
-(fn FIELD BEG END)" t nil)
+(fn FIELD BEG END)" t)
(autoload 'sort-regexp-fields "sort" "\
Sort the text in the region lexicographically.
If called interactively, prompt for two regular expressions,
@@ -28551,7 +28469,7 @@ For example: to sort lines in the region by the first word on each line
starting with the letter \"f\",
RECORD-REGEXP would be \"^.*$\" and KEY would be \"\\\\=\\<f\\\\w*\\\\>\"
-(fn REVERSE RECORD-REGEXP KEY-REGEXP BEG END)" t nil)
+(fn REVERSE RECORD-REGEXP KEY-REGEXP BEG END)" t)
(autoload 'sort-columns "sort" "\
Sort lines in region alphabetically by a certain range of columns.
For the purpose of this command, the region BEG...END includes
@@ -28567,7 +28485,7 @@ and it doesn't know how to handle that. Also, when possible,
it uses the `sort' utility program, which doesn't understand tabs.
Use \\[untabify] to convert tabs to spaces before sorting.
-(fn REVERSE &optional BEG END)" t nil)
+(fn REVERSE &optional BEG END)" t)
(autoload 'reverse-region "sort" "\
Reverse the order of lines in a region.
When called from Lisp, takes two point or marker arguments, BEG and END.
@@ -28576,7 +28494,7 @@ to be reversed is the line starting after BEG.
If END is not at the end of a line, the last line to be reversed
is the one that ends before END.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'delete-duplicate-lines "sort" "\
Delete all but one copy of any identical lines in the region.
Non-interactively, arguments BEG and END delimit the region.
@@ -28596,7 +28514,7 @@ If the argument KEEP-BLANKS is non-nil (interactively, with a
Returns the number of deleted lines. Interactively, or if INTERACTIVE
is non-nil, it also prints a message describing the number of deletions.
-(fn BEG END &optional REVERSE ADJACENT KEEP-BLANKS INTERACTIVE)" t nil)
+(fn BEG END &optional REVERSE ADJACENT KEEP-BLANKS INTERACTIVE)" t)
(register-definition-prefixes "sort" '("sort-"))
@@ -28619,8 +28537,8 @@ can call `spam-initialize' before you set spam-use-* variables on
explicitly, and matters only if you need the extra headers
installed through `spam-necessary-extra-headers'.
-(fn &rest SYMBOLS)" t nil)
-(register-definition-prefixes "spam" '(":keymap" "spam-"))
+(fn &rest SYMBOLS)" t)
+(register-definition-prefixes "spam" '("spam-"))
;;; Generated autoloads from gnus/spam-report.el
@@ -28632,27 +28550,27 @@ If FILE is given, use it instead of `spam-report-requests-file'.
If KEEP is t, leave old requests in the file. If KEEP is the
symbol `ask', query before flushing the queue file.
-(fn &optional FILE KEEP)" t nil)
+(fn &optional FILE KEEP)" t)
(autoload 'spam-report-url-ping-mm-url "spam-report" "\
Ping a host through HTTP, addressing a specific GET resource.
Use the external program specified in `mm-url-program' to connect
to server.
-(fn HOST REPORT)" nil nil)
+(fn HOST REPORT)")
(autoload 'spam-report-url-to-file "spam-report" "\
Collect spam report requests in `spam-report-requests-file'.
Customize `spam-report-url-ping-function' to use this function.
-(fn HOST REPORT)" nil nil)
+(fn HOST REPORT)")
(autoload 'spam-report-agentize "spam-report" "\
Add spam-report support to the Agent.
Spam reports will be queued with \\[spam-report-url-to-file] when
the Agent is unplugged, and will be submitted in a batch when the
-Agent is plugged." t nil)
+Agent is plugged." t)
(autoload 'spam-report-deagentize "spam-report" "\
Remove spam-report support from the Agent.
Spam reports will be queued with the method used when
-\\[spam-report-agentize] was run." t nil)
+\\[spam-report-agentize] was run." t)
(register-definition-prefixes "spam-report" '("spam-report-"))
@@ -28682,20 +28600,20 @@ supported at a time.
`speedbar-before-popup-hook' is called before popping up the speedbar frame.
`speedbar-before-delete-hook' is called before the frame is deleted.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'speedbar-get-focus "speedbar" "\
Change frame focus to or from the speedbar frame.
If the selected frame is not speedbar, then speedbar frame is
-selected. If the speedbar frame is active, then select the attached frame." t nil)
+selected. If the speedbar frame is active, then select the attached frame." t)
(register-definition-prefixes "speedbar" '("speedbar-"))
;;; Generated autoloads from play/spook.el
(autoload 'spook "spook" "\
-Add that special touch of class to your outgoing mail." t nil)
+Add that special touch of class to your outgoing mail." t)
(autoload 'snarf-spooks "spook" "\
-Return a vector containing the lines from `spook-phrases-file'." nil nil)
+Return a vector containing the lines from `spook-phrases-file'.")
(register-definition-prefixes "spook" '("spook-phrase"))
@@ -28721,7 +28639,7 @@ For example:
adds a fontification pattern to fontify identifiers ending in
`_t' as data types.
-(fn PRODUCT KEYWORDS &optional APPEND)" nil nil)
+(fn PRODUCT KEYWORDS &optional APPEND)")
(autoload 'sql-mode "sql" "\
Major mode to edit SQL.
@@ -28750,7 +28668,7 @@ must tell Emacs. Here's how to do that in your init file:
(lambda ()
(modify-syntax-entry ?\\\\ \"\\\\\" sql-mode-syntax-table)))
-(fn)" t nil)
+(fn)" t)
(autoload 'sql-connect "sql" "\
Connect to an interactive session using CONNECTION settings.
@@ -28760,7 +28678,7 @@ their settings.
The user will not be prompted for any login parameters if a value
is specified in the connection settings.
-(fn CONNECTION &optional BUF-NAME)" t nil)
+(fn CONNECTION &optional BUF-NAME)" t)
(autoload 'sql-product-interactive "sql" "\
Run PRODUCT interpreter as an inferior process.
@@ -28774,7 +28692,7 @@ the call to \\[sql-product-interactive] with
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional PRODUCT NEW-NAME)" t nil)
+(fn &optional PRODUCT NEW-NAME)" t)
(autoload 'sql-oracle "sql" "\
Run sqlplus by Oracle as an inferior process.
@@ -28804,7 +28722,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-sybase "sql" "\
Run isql by Sybase as an inferior process.
@@ -28834,7 +28752,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-informix "sql" "\
Run dbaccess by Informix as an inferior process.
@@ -28862,7 +28780,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-sqlite "sql" "\
Run sqlite as an inferior process.
@@ -28894,7 +28812,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-mysql "sql" "\
Run mysql by TcX as an inferior process.
@@ -28926,7 +28844,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-mariadb "sql" "\
Run mysql by MariaDB as an inferior process.
@@ -28958,7 +28876,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-solid "sql" "\
Run solsql by Solid as an inferior process.
@@ -28987,7 +28905,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-ingres "sql" "\
Run sql by Ingres as an inferior process.
@@ -29015,7 +28933,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-ms "sql" "\
Run osql by Microsoft as an inferior process.
@@ -29045,7 +28963,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-postgres "sql" "\
Run psql by Postgres as an inferior process.
@@ -29079,7 +28997,7 @@ Try to set `comint-output-filter-functions' like this:
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-interbase "sql" "\
Run isql by Interbase as an inferior process.
@@ -29108,7 +29026,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-db2 "sql" "\
Run db2 by IBM as an inferior process.
@@ -29141,7 +29059,7 @@ The default comes from `process-coding-system-alist' and
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-linter "sql" "\
Run inl by RELEX as an inferior process.
@@ -29171,11 +29089,11 @@ buffer.
(Type \\[describe-mode] in the SQL buffer for a list of commands.)
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload 'sql-vertica "sql" "\
Run vsql as an inferior process.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(register-definition-prefixes "sql" '("sql-"))
@@ -29189,7 +29107,7 @@ Run vsql as an inferior process.
(autoload 'sqlite-mode-open-file "sqlite-mode" "\
Browse the contents of an sqlite file.
-(fn FILE)" t nil)
+(fn FILE)" t)
(register-definition-prefixes "sqlite-mode" '("sqlite-"))
@@ -29214,7 +29132,7 @@ Browse the contents of an sqlite file.
(autoload 'srecode-template-mode "srecode/srt-mode" "\
Major-mode for writing SRecode macros.
-(fn)" t nil)
+(fn)" t)
(defalias 'srt-mode #'srecode-template-mode)
(register-definition-prefixes "srecode/srt-mode" '("semantic-" "srecode-"))
@@ -29233,7 +29151,7 @@ PROMPT will be inserted at the start of the buffer, but won't be
included in the resulting string. If PROMPT is nil, no help text
will be inserted.
-(fn PROMPT STRING SUCCESS-CALLBACK &key ABORT-CALLBACK)" nil nil)
+(fn PROMPT STRING SUCCESS-CALLBACK &key ABORT-CALLBACK)")
(autoload 'read-string-from-buffer "string-edit" "\
Switch to a new buffer to edit STRING in a recursive edit.
The user finishes editing with \\<string-edit-mode-map>\\[string-edit-done], or aborts with \\<string-edit-mode-map>\\[string-edit-abort]).
@@ -29242,7 +29160,7 @@ PROMPT will be inserted at the start of the buffer, but won't be
included in the resulting string. If nil, no prompt will be
inserted in the buffer.
-(fn PROMPT STRING)" nil nil)
+(fn PROMPT STRING)")
(register-definition-prefixes "string-edit" '("string-edit-"))
@@ -29257,7 +29175,7 @@ documentation for the `strokes-define-stroke' function.
See also `strokes-global-set-stroke-string'.
-(fn STROKE COMMAND)" t nil)
+(fn STROKE COMMAND)" t)
(autoload 'strokes-read-stroke "strokes" "\
Read a simple stroke (interactively) and return the stroke.
Optional PROMPT in minibuffer displays before and during stroke reading.
@@ -29266,7 +29184,7 @@ entered in the strokes buffer if the variable
`strokes-use-strokes-buffer' is non-nil.
Optional EVENT is acceptable as the starting event of the stroke.
-(fn &optional PROMPT EVENT)" nil nil)
+(fn &optional PROMPT EVENT)")
(autoload 'strokes-read-complex-stroke "strokes" "\
Read a complex stroke (interactively) and return the stroke.
Optional PROMPT in minibuffer displays before and during stroke reading.
@@ -29275,32 +29193,32 @@ is implemented by allowing the user to paint with button 1 or button 2 and
then complete the stroke with button 3.
Optional EVENT is acceptable as the starting event of the stroke.
-(fn &optional PROMPT EVENT)" nil nil)
+(fn &optional PROMPT EVENT)")
(autoload 'strokes-do-stroke "strokes" "\
Read a simple stroke from the user and then execute its command.
This must be bound to a mouse event.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(autoload 'strokes-do-complex-stroke "strokes" "\
Read a complex stroke from the user and then execute its command.
This must be bound to a mouse event.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(autoload 'strokes-describe-stroke "strokes" "\
Displays the command which STROKE maps to, reading STROKE interactively.
-(fn STROKE)" t nil)
+(fn STROKE)" t)
(autoload 'strokes-help "strokes" "\
-Get instruction on using the Strokes package." t nil)
+Get instruction on using the Strokes package." t)
(autoload 'strokes-load-user-strokes "strokes" "\
-Load user-defined strokes from file named by `strokes-file'." t nil)
+Load user-defined strokes from file named by `strokes-file'." t)
(autoload 'strokes-list-strokes "strokes" "\
Pop up a buffer containing an alphabetical listing of strokes in STROKES-MAP.
With CHRONOLOGICAL prefix arg (\\[universal-argument]) list strokes chronologically
by command name.
If STROKES-MAP is not given, `strokes-global-map' will be used instead.
-(fn &optional CHRONOLOGICAL STROKES-MAP)" t nil)
+(fn &optional CHRONOLOGICAL STROKES-MAP)" t)
(defvar strokes-mode nil "\
Non-nil if Strokes mode is enabled.
See the `strokes-mode' command
@@ -29339,15 +29257,15 @@ evaluate `(default-value \\='strokes-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'strokes-decode-buffer "strokes" "\
Decode stroke strings in BUFFER and display their corresponding glyphs.
Optional BUFFER defaults to the current buffer.
Optional FORCE non-nil will ignore the buffer's read-only status.
-(fn &optional BUFFER FORCE)" t nil)
+(fn &optional BUFFER FORCE)" t)
(autoload 'strokes-compose-complex-stroke "strokes" "\
-Read a complex stroke and insert its glyph into the current buffer." t nil)
+Read a complex stroke and insert its glyph into the current buffer." t)
(register-definition-prefixes "strokes" '("strokes-"))
@@ -29356,28 +29274,35 @@ Read a complex stroke and insert its glyph into the current buffer." t nil)
(autoload 'studlify-region "studly" "\
Studlify-case the region.
-(fn BEGIN END)" t nil)
+(fn BEGIN END)" t)
(autoload 'studlify-word "studly" "\
Studlify-case the current word, or COUNT words if given an argument.
-(fn COUNT)" t nil)
+(fn COUNT)" t)
(autoload 'studlify-buffer "studly" "\
-Studlify-case the current buffer." t nil)
+Studlify-case the current buffer." t)
;;; Generated autoloads from emacs-lisp/subr-x.el
(autoload 'string-truncate-left "subr-x" "\
-Truncate STRING to LENGTH, replacing initial surplus with \"...\".
-
-(fn STRING LENGTH)" nil nil)
+If STRING is longer than LENGTH, return a truncated version.
+When truncating, \"...\" is always prepended to the string, so
+the resulting string may be longer than the original if LENGTH is
+3 or smaller.
+
+(fn STRING LENGTH)")
+(defsubst string-blank-p (string) "\
+Check whether STRING is either empty or only whitespace.
+The following characters count as whitespace here: space, tab, newline and
+carriage return." (string-match-p "\\`[ \11\n\15]*\\'" string))
(autoload 'string-clean-whitespace "subr-x" "\
Clean up whitespace in STRING.
All sequences of whitespaces in STRING are collapsed into a
single space character, and leading/trailing whitespace is
removed.
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'named-let "subr-x" "\
Looping construct taken from Scheme.
Like `let', bind variables in BINDINGS and then evaluate BODY,
@@ -29390,12 +29315,12 @@ as the new values of the bound variables in the recursive invocation.
(autoload 'string-pixel-width "subr-x" "\
Return the width of STRING in pixels.
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'string-glyph-split "subr-x" "\
Split STRING into a list of strings representing separate glyphs.
This takes into account combining characters and grapheme clusters.
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'add-display-text-property "subr-x" "\
Add display property PROP with VALUE to the text from START to END.
If any text in the region has a non-nil `display' property, those
@@ -29404,12 +29329,12 @@ properties are retained.
If OBJECT is non-nil, it should be a string or a buffer. If nil,
this defaults to the current buffer.
-(fn START END PROP VALUE &optional OBJECT)" nil nil)
+(fn START END PROP VALUE &optional OBJECT)")
(autoload 'read-process-name "subr-x" "\
Query the user for a process and return the process object.
-(fn PROMPT)" nil nil)
-(register-definition-prefixes "subr-x" '("hash-table-" "internal--thread-argument" "replace-region-contents" "string-" "thread-" "with-buffer-unmodified-if-unchanged"))
+(fn PROMPT)")
+(register-definition-prefixes "subr-x" '("emacs-etc--hide-local-variables" "hash-table-" "internal--thread-argument" "replace-region-contents" "string-" "thread-" "with-buffer-unmodified-if-unchanged"))
;;; Generated autoloads from progmodes/subword.el
@@ -29450,7 +29375,7 @@ evaluate `subword-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(put 'global-subword-mode 'globalized-minor-mode t)
(defvar global-subword-mode nil "\
Non-nil if Global Subword mode is enabled.
@@ -29474,7 +29399,7 @@ Subword mode is enabled in all buffers where `(lambda nil
See `subword-mode' for more information on Subword mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'superword-mode "subword" "\
Toggle superword movement and editing (Superword mode).
@@ -29499,7 +29424,7 @@ evaluate `superword-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(put 'global-superword-mode 'globalized-minor-mode t)
(defvar global-superword-mode nil "\
Non-nil if Global Superword mode is enabled.
@@ -29523,7 +29448,7 @@ Superword mode is enabled in all buffers where `(lambda nil
See `superword-mode' for more information on Superword mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "subword" '("subword-" "superword-mode-map"))
@@ -29552,7 +29477,7 @@ original message but it does require a few things:
The region need not be active (and typically isn't when this
function is called). Also, the hook `sc-pre-hook' is run before,
-and `sc-post-hook' is run after the guts of this function." nil nil)
+and `sc-post-hook' is run after the guts of this function.")
(register-definition-prefixes "supercite" '("sc-"))
@@ -29602,7 +29527,7 @@ evaluate `(default-value \\='gpm-mouse-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "t-mouse" '("gpm-mouse-"))
@@ -29625,7 +29550,7 @@ evaluate `tab-line-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar-local tab-line-exclude nil)
(put 'global-tab-line-mode 'globalized-minor-mode t)
(defvar global-tab-line-mode nil "\
@@ -29650,7 +29575,7 @@ would do it.
See `tab-line-mode' for more information on Tab-Line mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "tab-line" '("tab-line-"))
@@ -29665,7 +29590,7 @@ Called non-interactively, the region is specified by arguments
START and END, rather than by the position of point and mark.
The variable `tab-width' controls the spacing of tab stops.
-(fn START END &optional ARG)" t nil)
+(fn START END &optional ARG)" t)
(autoload 'tabify "tabify" "\
Convert multiple spaces in region to tabs when possible.
A group of spaces is partially replaced by tabs
@@ -29677,7 +29602,7 @@ Called non-interactively, the region is specified by arguments
START and END, rather than by the position of point and mark.
The variable `tab-width' controls the spacing of tab stops.
-(fn START END &optional ARG)" t nil)
+(fn START END &optional ARG)" t)
(register-definition-prefixes "tabify" '("tabify-regexp"))
@@ -29709,7 +29634,7 @@ evaluate `table-fixed-width-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'table-insert "table" "\
Insert an editable text table.
Insert a table of specified number of COLUMNS and ROWS. Optional
@@ -29831,7 +29756,7 @@ Inside a table cell has a special keymap.
\\{table-cell-map}
-(fn COLUMNS ROWS &optional CELL-WIDTH CELL-HEIGHT)" t nil)
+(fn COLUMNS ROWS &optional CELL-WIDTH CELL-HEIGHT)" t)
(autoload 'table-insert-row "table" "\
Insert N table row(s).
When point is in a table the newly inserted row(s) are placed above
@@ -29839,7 +29764,7 @@ the current row. When point is outside of the table it must be below
the table within the table width range, then the newly created row(s)
are appended at the bottom of the table.
-(fn N)" t nil)
+(fn N)" t)
(autoload 'table-insert-column "table" "\
Insert N table column(s).
When point is in a table the newly inserted column(s) are placed left
@@ -29847,12 +29772,12 @@ of the current column. When point is outside of the table it must be
right side of the table within the table height range, then the newly
created column(s) are appended at the right of the table.
-(fn N)" t nil)
+(fn N)" t)
(autoload 'table-insert-row-column "table" "\
Insert row(s) or column(s).
See `table-insert-row' and `table-insert-column'.
-(fn ROW-COLUMN N)" t nil)
+(fn ROW-COLUMN N)" t)
(autoload 'table-recognize "table" "\
Recognize all tables within the current buffer and activate them.
Scans the entire buffer and recognizes valid table cells. If the
@@ -29860,8 +29785,8 @@ optional numeric prefix argument ARG is negative the tables in the
buffer become inactive, meaning the tables become plain text and loses
all the table specific features.
-(fn &optional ARG)" t nil)
-(autoload 'table-unrecognize "table" nil t nil)
+(fn &optional ARG)" t)
+(autoload 'table-unrecognize "table" nil t)
(autoload 'table-recognize-region "table" "\
Recognize all tables within region.
BEG and END specify the region to work on. If the optional numeric
@@ -29869,19 +29794,19 @@ prefix argument ARG is negative the tables in the region become
inactive, meaning the tables become plain text and lose all the table
specific features.
-(fn BEG END &optional ARG)" t nil)
+(fn BEG END &optional ARG)" t)
(autoload 'table-unrecognize-region "table" "\
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'table-recognize-table "table" "\
Recognize a table at point.
If the optional numeric prefix argument ARG is negative the table
becomes inactive, meaning the table becomes plain text and loses all
the table specific features.
-(fn &optional ARG)" t nil)
-(autoload 'table-unrecognize-table "table" nil t nil)
+(fn &optional ARG)" t)
+(autoload 'table-unrecognize-table "table" nil t)
(autoload 'table-recognize-cell "table" "\
Recognize a table cell that contains current point.
Probe the cell dimension and prepare the cell information. The
@@ -29890,8 +29815,8 @@ must not be specified. When the optional numeric prefix argument ARG
is negative the cell becomes inactive, meaning that the cell becomes
plain text and loses all the table specific features.
-(fn &optional FORCE NO-COPY ARG)" t nil)
-(autoload 'table-unrecognize-cell "table" nil t nil)
+(fn &optional FORCE NO-COPY ARG)" t)
+(autoload 'table-unrecognize-cell "table" nil t)
(autoload 'table-heighten-cell "table" "\
Heighten the current cell by N lines by expanding the cell vertically.
Heightening is done by adding blank lines at the bottom of the current
@@ -29900,7 +29825,7 @@ heightened in order to keep the rectangular table structure. The
optional argument NO-COPY is internal use only and must not be
specified.
-(fn N &optional NO-COPY NO-UPDATE)" t nil)
+(fn N &optional NO-COPY NO-UPDATE)" t)
(autoload 'table-shorten-cell "table" "\
Shorten the current cell by N lines by shrinking the cell vertically.
Shortening is done by removing blank lines from the bottom of the cell
@@ -29910,19 +29835,19 @@ is applicable to all the cells aligned horizontally with the current
one because they are also shortened in order to keep the rectangular
table structure.
-(fn N)" t nil)
+(fn N)" t)
(autoload 'table-widen-cell "table" "\
Widen the current cell by N columns and expand the cell horizontally.
Some other cells in the same table are widen as well to keep the
table's rectangle structure.
-(fn N &optional NO-COPY NO-UPDATE)" t nil)
+(fn N &optional NO-COPY NO-UPDATE)" t)
(autoload 'table-narrow-cell "table" "\
Narrow the current cell by N columns and shrink the cell horizontally.
Some other cells in the same table are narrowed as well to keep the
table's rectangle structure.
-(fn N)" t nil)
+(fn N)" t)
(autoload 'table-forward-cell "table" "\
Move point forward to the beginning of the next cell.
With argument ARG, do it ARG times;
@@ -29962,36 +29887,36 @@ You can actually try how it works in this buffer. Press
| |6 | | | |6 | | +--+--+--+--+ +--+--+--+--+ +--+-----+--+
+--+--+--+ +--+--+--+
-(fn &optional ARG NO-RECOGNIZE UNRECOGNIZE)" t nil)
+(fn &optional ARG NO-RECOGNIZE UNRECOGNIZE)" t)
(autoload 'table-backward-cell "table" "\
Move backward to the beginning of the previous cell.
With argument ARG, do it ARG times;
a negative argument ARG = -N means move forward N cells.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'table-span-cell "table" "\
Span current cell into adjacent cell in DIRECTION.
DIRECTION is one of symbols; right, left, above or below.
-(fn DIRECTION)" t nil)
+(fn DIRECTION)" t)
(autoload 'table-split-cell-vertically "table" "\
Split current cell vertically.
-Creates a cell above and a cell below the current point location." t nil)
+Creates a cell above and a cell below the current point location." t)
(autoload 'table-split-cell-horizontally "table" "\
Split current cell horizontally.
Creates a cell on the left and a cell on the right of the current
-point location." t nil)
+point location." t)
(autoload 'table-split-cell "table" "\
Split current cell in ORIENTATION.
ORIENTATION is a symbol either horizontally or vertically.
-(fn ORIENTATION)" t nil)
+(fn ORIENTATION)" t)
(autoload 'table-justify "table" "\
Justify contents of a cell, a row of cells or a column of cells.
WHAT is a symbol `cell', `row' or `column'. JUSTIFY is a symbol
`left', `center', `right', `top', `middle', `bottom' or `none'.
-(fn WHAT JUSTIFY)" t nil)
+(fn WHAT JUSTIFY)" t)
(autoload 'table-justify-cell "table" "\
Justify cell contents.
JUSTIFY is a symbol `left', `center' or `right' for horizontal, or `top',
@@ -29999,19 +29924,19 @@ JUSTIFY is a symbol `left', `center' or `right' for horizontal, or `top',
non-nil the justify operation is limited to the current paragraph,
otherwise the entire cell contents is justified.
-(fn JUSTIFY &optional PARAGRAPH)" t nil)
+(fn JUSTIFY &optional PARAGRAPH)" t)
(autoload 'table-justify-row "table" "\
Justify cells of a row.
JUSTIFY is a symbol `left', `center' or `right' for horizontal,
or `top', `middle', `bottom' or `none' for vertical.
-(fn JUSTIFY)" t nil)
+(fn JUSTIFY)" t)
(autoload 'table-justify-column "table" "\
Justify cells of a column.
JUSTIFY is a symbol `left', `center' or `right' for horizontal,
or `top', `middle', `bottom' or `none' for vertical.
-(fn JUSTIFY)" t nil)
+(fn JUSTIFY)" t)
(autoload 'table-query-dimension "table" "\
Return the dimension of the current cell and the current table.
The result is a list (cw ch tw th c r cells) where cw is the cell
@@ -30024,7 +29949,7 @@ the number tends to be larger than it appears for the tables with
non-uniform cell structure (heavily spanned and split). When optional
WHERE is provided the cell and table at that location is reported.
-(fn &optional WHERE)" t nil)
+(fn &optional WHERE)" t)
(autoload 'table-generate-source "table" "\
Generate source of the current table in the specified language.
LANGUAGE is a symbol that specifies the language to describe the
@@ -30052,7 +29977,7 @@ CALS (DocBook DTD):
URL `https://www.oasis-open.org/html/a502.htm'
URL `https://www.oreilly.com/catalog/docbook/chapter/book/table.html#AEN114751'
-(fn LANGUAGE &optional DEST-BUFFER CAPTION)" t nil)
+(fn LANGUAGE &optional DEST-BUFFER CAPTION)" t)
(autoload 'table-insert-sequence "table" "\
Travel cells forward while inserting a specified sequence string in each cell.
STR is the base string from which the sequence starts. When STR is an
@@ -30088,21 +30013,21 @@ Example:
(table-forward-cell 1)
(table-insert-sequence \"64\" 0 1 2 \\='left))
-(fn STR N INCREMENT INTERVAL JUSTIFY)" t nil)
+(fn STR N INCREMENT INTERVAL JUSTIFY)" t)
(autoload 'table-delete-row "table" "\
Delete N row(s) of cells.
Delete N rows of cells from current row. The current row is the row
contains the current cell where point is located. Each row must
consists from cells of same height.
-(fn N)" t nil)
+(fn N)" t)
(autoload 'table-delete-column "table" "\
Delete N column(s) of cells.
Delete N columns of cells from current column. The current column is
the column contains the current cell where point is located. Each
column must consists from cells of same width.
-(fn N)" t nil)
+(fn N)" t)
(autoload 'table-capture "table" "\
Convert plain text into a table by capturing the text in the region.
Create a table with the text in region as cell contents. BEG and END
@@ -30214,18 +30139,18 @@ By applying `table-release', which does the opposite process, the
contents become once again plain text. `table-release' works as
companion command to `table-capture' this way.
-(fn BEG END &optional COL-DELIM-REGEXP ROW-DELIM-REGEXP JUSTIFY MIN-CELL-WIDTH COLUMNS)" t nil)
+(fn BEG END &optional COL-DELIM-REGEXP ROW-DELIM-REGEXP JUSTIFY MIN-CELL-WIDTH COLUMNS)" t)
(autoload 'table-release "table" "\
Convert a table into plain text by removing the frame from a table.
Remove the frame from a table and deactivate the table. This command
converts a table into plain text without frames. It is a companion to
-`table-capture' which does the opposite process." t nil)
+`table-capture' which does the opposite process." t)
(register-definition-prefixes "table" '("*table--" "table-"))
;;; Generated autoloads from cedet/srecode/table.el
-(register-definition-prefixes "srecode/table" '("object-sort-list" "srecode-"))
+(register-definition-prefixes "srecode/table" '("srecode-"))
;;; Generated autoloads from emacs-lisp/tabulated-list.el
@@ -30258,9 +30183,9 @@ converts a table into plain text without frames. It is a companion to
(autoload 'talk-connect "talk" "\
Connect to display DISPLAY for the Emacs talk group.
-(fn DISPLAY)" t nil)
+(fn DISPLAY)" t)
(autoload 'talk "talk" "\
-Connect to the Emacs talk group from the current X display or tty frame." t nil)
+Connect to the Emacs talk group from the current X display or tty frame." t)
(register-definition-prefixes "talk" '("talk-"))
@@ -30282,7 +30207,7 @@ inside of a tar archive without extracting it and re-archiving it.
See also: variables `tar-update-datestamp' and `tar-anal-blocksize'.
\\{tar-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "tar-mode" '("tar-"))
@@ -30316,18 +30241,18 @@ Turning on Tcl mode runs `tcl-mode-hook'. Read the documentation for
`tcl-mode-hook' to see what kinds of interesting hook functions
already exist.
-(fn)" t nil)
+(fn)" t)
(autoload 'inferior-tcl "tcl" "\
Run inferior Tcl process.
Prefix arg means enter program name interactively.
See documentation for function `inferior-tcl-mode' for more information.
-(fn CMD)" t nil)
+(fn CMD)" t)
(autoload 'tcl-help-on-word "tcl" "\
Get help on Tcl command. Default is word at point.
Prefix argument means invert sense of `tcl-use-smart-word-finder'.
-(fn COMMAND &optional ARG)" t nil)
+(fn COMMAND &optional ARG)" t)
(register-definition-prefixes "tcl" '("inferior-tcl-" "run-tcl" "switch-to-tcl" "tcl-"))
@@ -30349,13 +30274,13 @@ is controlled by the contents of the global variable `telnet-host-properties',
falling back on the value of the global variable `telnet-program'.
Normally input is edited in Emacs and sent a line at a time.
-(fn HOST &optional PORT)" t nil)
+(fn HOST &optional PORT)" t)
(autoload 'rsh "telnet" "\
Open a network login connection to host named HOST (a string).
Communication with HOST is recorded in a buffer `*rsh-HOST*'.
Normally input is edited in Emacs and sent a line at a time.
-(fn HOST)" t nil)
+(fn HOST)" t)
(make-obsolete 'rsh 'nil "29.1")
(register-definition-prefixes "telnet" '("send-process-next-char" "telnet-"))
@@ -30379,7 +30304,7 @@ If there is already a running process in that buffer, it is not restarted.
Optional third arg STARTFILE is the name of a file to send the contents of to
the process. Any more args are arguments to PROGRAM.
-(fn NAME PROGRAM &optional STARTFILE &rest SWITCHES)" nil nil)
+(fn NAME PROGRAM &optional STARTFILE &rest SWITCHES)")
(autoload 'term "term" "\
Start a terminal-emulator in a new buffer.
The buffer is in Term mode; see `term-mode' for the
@@ -30387,13 +30312,13 @@ commands to use in that buffer.
\\<term-raw-map>Type \\[switch-to-buffer] to switch to another buffer.
-(fn PROGRAM)" t nil)
+(fn PROGRAM)" t)
(autoload 'ansi-term "term" "\
Start a terminal-emulator in a new buffer.
This is almost the same as `term' apart from always creating a new buffer,
and \\`C-x' being marked as a `term-escape-char'.
-(fn PROGRAM &optional NEW-BUFFER-NAME)" t nil)
+(fn PROGRAM &optional NEW-BUFFER-NAME)" t)
(autoload 'serial-term "term" "\
Start a terminal-emulator for a serial port in a new buffer.
PORT is the path or name of the serial port. For example, this
@@ -30413,7 +30338,7 @@ use in that buffer.
\\<term-raw-map>Type \\[switch-to-buffer] to switch to another buffer.
-(fn PORT SPEED &optional LINE-MODE)" t nil)
+(fn PORT SPEED &optional LINE-MODE)" t)
(register-definition-prefixes "term" '("ansi-term-color-vector" "serial-" "term-"))
@@ -30423,9 +30348,9 @@ use in that buffer.
Use Edebug to instrument for coverage all macros and functions in FILENAME.
If BYTE-COMPILE is non-nil, byte compile each function after instrumenting.
-(fn FILENAME &optional BYTE-COMPILE)" t nil)
+(fn FILENAME &optional BYTE-COMPILE)" t)
(autoload 'testcover-this-defun "testcover" "\
-Start coverage on function under point." t nil)
+Start coverage on function under point." t)
(register-definition-prefixes "testcover" '("testcover-"))
@@ -30446,7 +30371,7 @@ as to form complete rows.
\\[tetris-move-right] Move the shape one square to the right
\\[tetris-rotate-prev] Rotate the shape clockwise
\\[tetris-rotate-next] Rotate the shape anticlockwise
-\\[tetris-move-bottom] Drop the shape to the bottom of the playing area" t nil)
+\\[tetris-move-bottom] Drop the shape to the bottom of the playing area" t)
(register-definition-prefixes "tetris" '("tetris-"))
@@ -30563,7 +30488,7 @@ this file is for plain TeX, LaTeX, or SliTeX and calls `plain-tex-mode',
such as if there are no commands in the file, the value of `tex-default-mode'
says which mode to use.
-(fn)" t nil)
+(fn)" t)
(defalias 'TeX-mode #'tex-mode)
(defalias 'plain-TeX-mode #'plain-tex-mode)
(defalias 'LaTeX-mode #'latex-mode)
@@ -30608,7 +30533,7 @@ Entering Plain-tex mode runs the hook `text-mode-hook', then the hook
`tex-mode-hook', and finally the hook `plain-tex-mode-hook'. When the
special subshell is initiated, the hook `tex-shell-hook' is run.
-(fn)" t nil)
+(fn)" t)
(autoload 'latex-mode "tex-mode" "\
Major mode for editing files of input for LaTeX.
Makes $ and } display the characters they match.
@@ -30650,7 +30575,7 @@ Entering Latex mode runs the hook `text-mode-hook', then
`tex-mode-hook', and finally `latex-mode-hook'. When the special
subshell is initiated, `tex-shell-hook' is run.
-(fn)" t nil)
+(fn)" t)
(autoload 'slitex-mode "tex-mode" "\
Major mode for editing files of input for SliTeX.
Makes $ and } display the characters they match.
@@ -30693,12 +30618,12 @@ Entering SliTeX mode runs the hook `text-mode-hook', then the hook
`slitex-mode-hook'. When the special subshell is initiated, the hook
`tex-shell-hook' is run.
-(fn)" t nil)
-(autoload 'tex-start-shell "tex-mode" nil nil nil)
+(fn)" t)
+(autoload 'tex-start-shell "tex-mode")
(autoload 'doctex-mode "tex-mode" "\
Major mode to edit DocTeX files.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "tex-mode" '("doctex-font-lock-" "latex-" "plain-tex-mode-map" "tex-"))
@@ -30723,14 +30648,14 @@ Non-nil argument (prefix, if interactive) means don't make tag table
and don't split the file if large. You can use `Info-tagify' and
`Info-split' to do these manually.
-(fn &optional NOSPLIT)" t nil)
+(fn &optional NOSPLIT)" t)
(autoload 'texinfo-format-region "texinfmt" "\
Convert the current region of the Texinfo file to Info format.
This lets you see what that part of the file will look like in Info.
The command is bound to \\[texinfo-format-region]. The text that is
converted to Info is stored in a temporary buffer.
-(fn REGION-BEGINNING REGION-END)" t nil)
+(fn REGION-BEGINNING REGION-END)" t)
(autoload 'texi2info "texinfmt" "\
Convert the current buffer (written in Texinfo code) into an Info file.
The Info file output is generated in a buffer visiting the Info file
@@ -30744,7 +30669,7 @@ Texinfo source buffer is not changed.
Non-nil argument (prefix, if interactive) means don't split the file
if large. You can use `Info-split' to do this manually.
-(fn &optional NOSPLIT)" t nil)
+(fn &optional NOSPLIT)" t)
(register-definition-prefixes "texinfmt" '("batch-texinfo-format" "texinf"))
@@ -30823,7 +30748,7 @@ be the first node in the file.
Entering Texinfo mode calls the value of `text-mode-hook', and then the
value of `texinfo-mode-hook'.
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "texinfo" '("texinfo-"))
@@ -30871,7 +30796,7 @@ Available values of TYPE and corresponding OBJECTs are:
If the user option `textsec-check' is nil, these checks are
disabled, and this function always returns nil.
-(fn OBJECT TYPE)" nil nil)
+(fn OBJECT TYPE)")
(register-definition-prefixes "textsec-check" '("textsec-check"))
@@ -30887,17 +30812,17 @@ Compose Thai characters in the region.
When called from a program, expects two arguments,
positions (integers or markers) specifying the region.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'thai-compose-string "thai-util" "\
Compose Thai characters in STRING and return the resulting string.
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'thai-compose-buffer "thai-util" "\
-Compose Thai characters in the current buffer." t nil)
+Compose Thai characters in the current buffer." t)
(autoload 'thai-composition-function "thai-util" "\
-(fn GSTRING DIRECTION)" nil nil)
+(fn GSTRING DIRECTION)")
(register-definition-prefixes "thai-util" '("exit-thai-language-environment-internal" "setup-thai-language-environment-internal" "thai-"))
@@ -30915,7 +30840,7 @@ Possibilities include `symbol', `list', `sexp', `defun', `number',
`filename', `url', `email', `uuid', `word', `sentence', `whitespace',
`line', and `page'.
-(fn THING &optional N)" nil nil)
+(fn THING &optional N)")
(autoload 'bounds-of-thing-at-point "thingatpt" "\
Determine the start and end buffer locations for the THING at point.
THING should be a symbol specifying a type of syntactic entity.
@@ -30929,13 +30854,13 @@ valid THING.
Return a cons cell (START . END) giving the start and end
positions of the thing found.
-(fn THING)" nil nil)
+(fn THING)")
(autoload 'thing-at-point "thingatpt" "\
Return the THING at point.
THING should be a symbol specifying a type of syntactic entity.
Possibilities include `symbol', `list', `sexp', `defun',
`filename', `existing-filename', `url', `email', `uuid', `word',
-`sentence', `whitespace', `line', `number', and `page'.
+`sentence', `whitespace', `line', `number', `face' and `page'.
When the optional argument NO-PROPERTIES is non-nil,
strip text properties from the return value.
@@ -30943,33 +30868,33 @@ strip text properties from the return value.
See the file `thingatpt.el' for documentation on how to define
a symbol as a valid THING.
-(fn THING &optional NO-PROPERTIES)" nil nil)
+(fn THING &optional NO-PROPERTIES)")
(autoload 'bounds-of-thing-at-mouse "thingatpt" "\
Determine start and end locations for THING at mouse click given by EVENT.
Like `bounds-of-thing-at-point', but tries to use the position in EVENT
where the mouse button is clicked to find the thing nearby.
-(fn EVENT THING)" nil nil)
+(fn EVENT THING)")
(autoload 'thing-at-mouse "thingatpt" "\
Return the THING at mouse click specified by EVENT.
Like `thing-at-point', but tries to use the position in EVENT
where the mouse button is clicked to find the thing nearby.
-(fn EVENT THING &optional NO-PROPERTIES)" nil nil)
+(fn EVENT THING &optional NO-PROPERTIES)")
(autoload 'sexp-at-point "thingatpt" "\
-Return the sexp at point, or nil if none is found." nil nil)
+Return the sexp at point, or nil if none is found.")
(autoload 'symbol-at-point "thingatpt" "\
-Return the symbol at point, or nil if none is found." nil nil)
+Return the symbol at point, or nil if none is found.")
(autoload 'number-at-point "thingatpt" "\
Return the number at point, or nil if none is found.
Decimal numbers like \"14\" or \"-14.5\", as well as hex numbers
-like \"0xBEEF09\" or \"#xBEEF09\", are recognized." nil nil)
+like \"0xBEEF09\" or \"#xBEEF09\", are recognized.")
(autoload 'list-at-point "thingatpt" "\
Return the Lisp list at point, or nil if none is found.
If IGNORE-COMMENT-OR-STRING is non-nil comments and strings are
treated as white space.
-(fn &optional IGNORE-COMMENT-OR-STRING)" nil nil)
+(fn &optional IGNORE-COMMENT-OR-STRING)")
(register-definition-prefixes "thingatpt" '("beginning-of-thing" "define-thing-chars" "end-of-thing" "filename" "form-at-point" "in-string-p" "sentence-at-point" "thing-at-point-" "word-at-point"))
@@ -30980,9 +30905,9 @@ Handle thread events, propagated by `thread-signal'.
An EVENT has the format
(thread-event THREAD ERROR-SYMBOL DATA)
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(autoload 'list-threads "thread" "\
-Display a list of threads." t nil)
+Display a list of threads." t)
(put 'list-threads 'disabled "Beware: manually canceling threads can ruin your Emacs session.")
(register-definition-prefixes "thread" '("thread-list-"))
@@ -30992,20 +30917,20 @@ Display a list of threads." t nil)
(autoload 'thumbs-find-thumb "thumbs" "\
Display the thumbnail for IMG.
-(fn IMG)" t nil)
+(fn IMG)" t)
(autoload 'thumbs-show-from-dir "thumbs" "\
Make a preview buffer for all images in DIR.
Optional argument REG to select file matching a regexp,
and SAME-WINDOW to show thumbs in the same window.
-(fn DIR &optional REG SAME-WINDOW)" t nil)
+(fn DIR &optional REG SAME-WINDOW)" t)
(autoload 'thumbs-dired-show-marked "thumbs" "\
-In dired, make a thumbs buffer with marked files." t nil)
+In dired, make a thumbs buffer with marked files." t)
(autoload 'thumbs-dired-show "thumbs" "\
-In dired, make a thumbs buffer with all files in current directory." t nil)
+In dired, make a thumbs buffer with all files in current directory." t)
(defalias 'thumbs 'thumbs-show-from-dir)
(autoload 'thumbs-dired-setroot "thumbs" "\
-In dired, call the setroot program on the image at point." t nil)
+In dired, call the setroot program on the image at point." t)
(register-definition-prefixes "thumbs" '("thumbs-"))
@@ -31021,56 +30946,56 @@ In dired, call the setroot program on the image at point." t nil)
Check if char CH is Tibetan character.
Returns non-nil if CH is Tibetan. Otherwise, returns nil.
-(fn CH)" nil nil)
+(fn CH)")
(autoload 'tibetan-tibetan-to-transcription "tibet-util" "\
Transcribe Tibetan string STR and return the corresponding Roman string.
-(fn STR)" nil nil)
+(fn STR)")
(autoload 'tibetan-transcription-to-tibetan "tibet-util" "\
Convert Tibetan Roman string STR to Tibetan character string.
The returned string has no composition information.
-(fn STR)" nil nil)
+(fn STR)")
(autoload 'tibetan-compose-string "tibet-util" "\
Compose Tibetan string STR.
-(fn STR)" nil nil)
+(fn STR)")
(autoload 'tibetan-compose-region "tibet-util" "\
Compose Tibetan text the region BEG and END.
-(fn BEG END)" t nil)
+(fn BEG END)" t)
(autoload 'tibetan-decompose-region "tibet-util" "\
Decompose Tibetan text in the region FROM and TO.
This is different from `decompose-region' because precomposed
Tibetan characters are decomposed into normal Tibetan character
sequences.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'tibetan-decompose-string "tibet-util" "\
Decompose Tibetan string STR.
This is different from `decompose-string' because precomposed
Tibetan characters are decomposed into normal Tibetan character
sequences.
-(fn STR)" nil nil)
+(fn STR)")
(autoload 'tibetan-decompose-buffer "tibet-util" "\
Decomposes Tibetan characters in the buffer into their components.
-See also the documentation of the function `tibetan-decompose-region'." t nil)
+See also the documentation of the function `tibetan-decompose-region'." t)
(autoload 'tibetan-compose-buffer "tibet-util" "\
Composes Tibetan character components in the buffer.
-See also docstring of the function `tibetan-compose-region'." t nil)
+See also docstring of the function `tibetan-compose-region'." t)
(autoload 'tibetan-post-read-conversion "tibet-util" "\
-(fn LEN)" nil nil)
+(fn LEN)")
(autoload 'tibetan-pre-write-conversion "tibet-util" "\
-(fn FROM TO)" nil nil)
+(fn FROM TO)")
(autoload 'tibetan-pre-write-canonicalize-for-unicode "tibet-util" "\
-(fn FROM TO)" nil nil)
+(fn FROM TO)")
(register-definition-prefixes "tibet-util" '("tibetan-"))
@@ -31091,7 +31016,7 @@ This function performs no refilling of the changed text.
If DONT-ASK is set, or called interactively with prefix argument, user
won't be prompted for confirmation of each substitution.
-(fn BEG END &optional DONT-ASK)" t nil)
+(fn BEG END &optional DONT-ASK)" t)
(autoload 'tildify-buffer "tildify" "\
Add hard spaces in the current buffer.
See variables `tildify-pattern', `tildify-space-string', and
@@ -31101,7 +31026,7 @@ This function performs no refilling of the changed text.
If DONT-ASK is set, or called interactively with prefix argument, user
won't be prompted for confirmation of each substitution.
-(fn &optional DONT-ASK)" t nil)
+(fn &optional DONT-ASK)" t)
(autoload 'tildify-space "tildify" "\
Convert space before point into a hard space if the context is right.
@@ -31122,7 +31047,7 @@ Otherwise, if
`tildify-space-string' variable,
remove the hard space and leave only the space character.
-This function is meant to be used as a `post-self-insert-hook'." t nil)
+This function is meant to be used as a `post-self-insert-hook'." t)
(autoload 'tildify-mode "tildify" "\
Adds electric behavior to space character.
@@ -31149,7 +31074,7 @@ evaluate `tildify-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "tildify" '("tildify-"))
@@ -31164,7 +31089,7 @@ Enable display of time, load level, and mail flag in mode lines.
This display updates automatically every minute.
If `display-time-day-and-date' is non-nil, the current day and date
are displayed as well.
-This runs the normal hook `display-time-hook' after each update." t nil)
+This runs the normal hook `display-time-hook' after each update." t)
(defvar display-time-mode nil "\
Non-nil if Display-Time mode is enabled.
See the `display-time-mode' command
@@ -31196,12 +31121,12 @@ evaluate `(default-value \\='display-time-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(define-obsolete-function-alias 'display-time-world #'world-clock "28.1")
(autoload 'world-clock "time" "\
Display a world clock buffer with times in various time zones.
The variable `world-clock-list' specifies which time zones to use.
-To turn off the world time display, go to the window and type `\\[quit-window]'." t nil)
+To turn off the world time display, go to the window and type `\\[quit-window]'." t)
(autoload 'emacs-uptime "time" "\
Return a string giving the uptime of this instance of Emacs.
FORMAT is a string to format the result, using `format-seconds'.
@@ -31209,13 +31134,13 @@ For example, the Unix uptime command format is \"%D, %z%2h:%.2m\".
If the optional argument HERE is non-nil, insert string at
point.
-(fn &optional FORMAT HERE)" t nil)
+(fn &optional FORMAT HERE)" t)
(autoload 'emacs-init-time "time" "\
Return a string giving the duration of the Emacs initialization.
FORMAT is a string to format the result, using `format'. If nil,
the default format \"%f seconds\" is used.
-(fn &optional FORMAT)" t nil)
+(fn &optional FORMAT)" t)
(register-definition-prefixes "time" '("display-time-" "legacy-style-world-list" "time--display-world-list" "world-clock-" "zoneinfo-style-world-list"))
@@ -31226,49 +31151,52 @@ Parse a string DATE that represents a date-time and return a time value.
DATE should be in one of the forms recognized by `parse-time-string'.
If DATE lacks timezone information, GMT is assumed.
-(fn DATE)" nil nil)
-(defalias 'time-to-seconds 'float-time)
-(defalias 'seconds-to-time 'time-convert)
+(fn DATE)")
+(defalias 'time-to-seconds #'float-time)
+(autoload 'seconds-to-time "time-date" "\
+Convert SECONDS to a proper time, like `current-time' would.
+
+(fn SECONDS)")
(autoload 'days-to-time "time-date" "\
Convert DAYS into a time value.
-(fn DAYS)" nil nil)
+(fn DAYS)")
(autoload 'time-since "time-date" "\
Return the time elapsed since TIME.
TIME should be either a time value or a date-time string.
-(fn TIME)" nil nil)
-(define-obsolete-function-alias 'subtract-time 'time-subtract "26.1")
+(fn TIME)")
+(define-obsolete-function-alias 'subtract-time #'time-subtract "26.1")
(autoload 'date-to-day "time-date" "\
Return the absolute date of DATE, a date-time string.
The absolute date is the number of days elapsed since the imaginary
Gregorian date Sunday, December 31, 1 BC.
-(fn DATE)" nil nil)
+(fn DATE)")
(autoload 'days-between "time-date" "\
Return the number of days between DATE1 and DATE2.
DATE1 and DATE2 should be date-time strings.
-(fn DATE1 DATE2)" nil nil)
+(fn DATE1 DATE2)")
(autoload 'date-leap-year-p "time-date" "\
Return t if YEAR is a leap year.
-(fn YEAR)" nil nil)
+(fn YEAR)")
(autoload 'time-to-day-in-year "time-date" "\
Return the day number within the year corresponding to TIME.
-(fn TIME)" nil nil)
+(fn TIME)")
(autoload 'time-to-days "time-date" "\
The absolute date corresponding to TIME, a time value.
The absolute date is the number of days elapsed since the imaginary
Gregorian date Sunday, December 31, 1 BC.
-(fn TIME)" nil nil)
+(fn TIME)")
(autoload 'safe-date-to-time "time-date" "\
Parse a string DATE that represents a date-time and return a time value.
-If DATE is malformed, return a time value of zeros.
+If DATE is malformed, return a time value of zero.
-(fn DATE)" nil nil)
+(fn DATE)")
(autoload 'format-seconds "time-date" "\
Use format control STRING to format the number SECONDS.
The valid format specifiers are:
@@ -31299,11 +31227,11 @@ The \"%x\" specifier does not print anything. When it is used,
specifiers must be given in order of decreasing size. To the
right of \"%x\", trailing zero units are not output.
-(fn STRING SECONDS)" nil nil)
+(fn STRING SECONDS)")
(autoload 'seconds-to-string "time-date" "\
Convert the time interval in seconds to a short string.
-(fn DELAY)" nil nil)
+(fn DELAY)")
(register-definition-prefixes "time-date" '("date-" "decoded-time-" "encode-time-value" "seconds-to-string" "time-" "with-decoded-time-value"))
@@ -31315,7 +31243,7 @@ Convert the time interval in seconds to a short string.
Return non-nil if ZONE is of the correct type for a timezone rule.
Valid ZONE values are described in the documentation of `format-time-string'.
-(fn ZONE)" nil nil)
+(fn ZONE)")
(put 'time-stamp-line-limit 'safe-local-variable 'integerp)
(put 'time-stamp-start 'safe-local-variable 'stringp)
(put 'time-stamp-end 'safe-local-variable 'stringp)
@@ -31353,12 +31281,12 @@ If the file has no time-stamp template, this function does nothing.
You can set `time-stamp-pattern' in a file's local variables list
to customize the information in the time stamp and where it is written.
-The time stamp is updated only if `time-stamp-active' is non-nil." t nil)
+The time stamp is updated only if `time-stamp-active' is non-nil." t)
(autoload 'time-stamp-toggle-active "time-stamp" "\
Toggle `time-stamp-active', setting whether \\[time-stamp] updates a buffer.
With ARG, turn time stamping on if and only if ARG is positive.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "time-stamp" '("time-stamp-"))
@@ -31385,7 +31313,7 @@ display (non-nil means on).
If using a customized `timeclock-workday' value, this should be
set before switching this mode on.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'timeclock-in "timeclock" "\
Clock in, recording the current time moment in the timelog.
With a numeric prefix ARG, record the fact that today has only that
@@ -31400,7 +31328,7 @@ FIND-PROJECT is non-nil -- or the user calls `timeclock-in'
interactively -- call the function `timeclock-get-project-function' to
discover the name of the project.
-(fn &optional ARG PROJECT FIND-PROJECT)" t nil)
+(fn &optional ARG PROJECT FIND-PROJECT)" t)
(autoload 'timeclock-out "timeclock" "\
Clock out, recording the current time moment in the timelog.
If a prefix ARG is given, the user has completed the project that was
@@ -31411,14 +31339,14 @@ FIND-REASON is non-nil -- or the user calls `timeclock-out'
interactively -- call the function `timeclock-get-reason-function' to
discover the reason.
-(fn &optional ARG REASON FIND-REASON)" t nil)
+(fn &optional ARG REASON FIND-REASON)" t)
(autoload 'timeclock-status-string "timeclock" "\
Report the overall timeclock status at the present moment.
If SHOW-SECONDS is non-nil, display second resolution.
If TODAY-ONLY is non-nil, the display will be relative only to time
worked today, ignoring the time worked on previous days.
-(fn &optional SHOW-SECONDS TODAY-ONLY)" t nil)
+(fn &optional SHOW-SECONDS TODAY-ONLY)" t)
(autoload 'timeclock-change "timeclock" "\
Change to working on a different project.
This clocks out of the current project, then clocks in on a new one.
@@ -31426,13 +31354,13 @@ With a prefix ARG, consider the previous project as finished at the
time of changeover. PROJECT is the name of the last project you were
working on.
-(fn &optional ARG PROJECT)" t nil)
+(fn &optional ARG PROJECT)" t)
(autoload 'timeclock-query-out "timeclock" "\
Ask the user whether to clock out.
-This is a useful function for adding to `kill-emacs-query-functions'." nil nil)
+This is a useful function for adding to `kill-emacs-query-functions'.")
(autoload 'timeclock-reread-log "timeclock" "\
Re-read the timeclock, to account for external changes.
-Returns the new value of `timeclock-discrepancy'." t nil)
+Returns the new value of `timeclock-discrepancy'." t)
(autoload 'timeclock-workday-remaining-string "timeclock" "\
Return a string representing the amount of time left today.
Display second resolution if SHOW-SECONDS is non-nil. If TODAY-ONLY
@@ -31440,13 +31368,13 @@ is non-nil, the display will be relative only to time worked today.
See `timeclock-relative' for more information about the meaning of
\"relative to today\".
-(fn &optional SHOW-SECONDS TODAY-ONLY)" t nil)
+(fn &optional SHOW-SECONDS TODAY-ONLY)" t)
(autoload 'timeclock-workday-elapsed-string "timeclock" "\
Return a string representing the amount of time worked today.
Display seconds resolution if SHOW-SECONDS is non-nil. If RELATIVE is
non-nil, the amount returned will be relative to past time worked.
-(fn &optional SHOW-SECONDS)" t nil)
+(fn &optional SHOW-SECONDS)" t)
(autoload 'timeclock-when-to-leave-string "timeclock" "\
Return a string representing the end of today's workday.
This string is relative to the value of `timeclock-workday'. If
@@ -31454,7 +31382,7 @@ SHOW-SECONDS is non-nil, the value printed/returned will include
seconds. If TODAY-ONLY is non-nil, the value returned will be
relative only to the time worked today, and not to past time.
-(fn &optional SHOW-SECONDS TODAY-ONLY)" t nil)
+(fn &optional SHOW-SECONDS TODAY-ONLY)" t)
(register-definition-prefixes "timeclock" '("timeclock-"))
@@ -31463,7 +31391,7 @@ relative only to the time worked today, and not to past time.
(autoload 'list-timers "timer-list" "\
List all timers in a buffer.
-(fn &optional IGNORE-AUTO NONCONFIRM)" t nil)
+(fn &optional IGNORE-AUTO NONCONFIRM)" t)
(put 'list-timers 'disabled "Beware: manually canceling timers can ruin your Emacs session.")
(register-definition-prefixes "timer-list" '("timer-list-"))
@@ -31480,7 +31408,7 @@ Convert a TIT dictionary of FILENAME into a Quail package.
Optional argument DIRNAME if specified is the directory name under which
the generated Quail package is saved.
-(fn FILENAME &optional DIRNAME)" t nil)
+(fn FILENAME &optional DIRNAME)" t)
(autoload 'batch-titdic-convert "titdic-cnv" "\
Run `titdic-convert' on the files remaining on the command line.
Use this from the command line, with `-batch';
@@ -31489,7 +31417,7 @@ For example, invoke \"emacs -batch -f batch-titdic-convert XXX.tit\" to
generate Quail package file \"xxx.el\" from TIT dictionary file \"XXX.tit\".
To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\".
-(fn &optional FORCE)" nil nil)
+(fn &optional FORCE)")
(register-definition-prefixes "titdic-cnv" '("batch-miscdic-convert" "ctlau-" "miscdic-convert" "pinyin-convert" "py-converter" "quail-" "quick-" "tit-" "tsang-" "ziranma-converter"))
@@ -31506,14 +31434,14 @@ Note that \\[menu-bar-open] by default drops down TTY menus; if you want it
to invoke `tmm-menubar' instead, customize the variable
`tty-menu-open-use-tmm' to a non-nil value.
-(fn &optional X-POSITION)" t nil)
+(fn &optional X-POSITION)" t)
(autoload 'tmm-menubar-mouse "tmm" "\
Text-mode emulation of looking and choosing from a menubar.
This command is used when you click the mouse in the menubar
on a console which has no window system but does have a mouse.
See the documentation for `tmm-prompt'.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(autoload 'tmm-prompt "tmm" "\
Text-mode emulation of calling the bindings in keymap.
Creates a text-mode menu of possible choices. You can access the elements
@@ -31529,7 +31457,7 @@ Its value should be an event that has a binding in MENU.
NO-EXECUTE, if non-nil, means to return the command the user selects
instead of executing it.
-(fn MENU &optional IN-POPUP DEFAULT-ITEM NO-EXECUTE)" nil nil)
+(fn MENU &optional IN-POPUP DEFAULT-ITEM NO-EXECUTE)")
(register-definition-prefixes "tmm" '("tmm-"))
@@ -31572,25 +31500,25 @@ by default. The done items are hidden, but typing
items. With non-nil user option `todo-show-with-done' both todo
and done items are always shown on visiting a category.
-(fn &optional SOLICIT-FILE INTERACTIVE)" t nil)
+(fn &optional SOLICIT-FILE INTERACTIVE)" t)
(autoload 'todo-mode "todo-mode" "\
Major mode for displaying, navigating and editing todo lists.
\\{todo-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'todo-archive-mode "todo-mode" "\
Major mode for archived todo categories.
\\{todo-archive-mode-map}
-(fn)" t nil)
+(fn)" t)
(autoload 'todo-filtered-items-mode "todo-mode" "\
Mode for displaying and reprioritizing top priority Todo.
\\{todo-filtered-items-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "todo-mode" '("todo-"))
@@ -31600,7 +31528,7 @@ Mode for displaying and reprioritizing top priority Todo.
Toggle tool bar on or off, based on the status of the current frame.
See `tool-bar-mode' for more information.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'tool-bar-add-item "tool-bar" "\
Add an item to the tool bar.
ICON names the image, DEF is the key definition and KEY is a symbol
@@ -31616,7 +31544,7 @@ ICON.xbm, using `find-image'.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item'.
-(fn ICON DEF KEY &rest PROPS)" nil nil)
+(fn ICON DEF KEY &rest PROPS)")
(autoload 'tool-bar-local-item "tool-bar" "\
Add an item to the tool bar in map MAP.
ICON names the image, DEF is the key definition and KEY is a symbol
@@ -31629,7 +31557,7 @@ function will first try to use low-color/ICON.xpm if `display-color-cells'
is less or equal to 256, then ICON.xpm, then ICON.pbm, and finally
ICON.xbm, using `find-image'.
-(fn ICON DEF KEY MAP &rest PROPS)" nil nil)
+(fn ICON DEF KEY MAP &rest PROPS)")
(autoload 'tool-bar-add-item-from-menu "tool-bar" "\
Define tool bar binding for COMMAND in keymap MAP using the given ICON.
This makes a binding for COMMAND in `tool-bar-map', copying its
@@ -31643,7 +31571,7 @@ MAP must contain appropriate binding for `[menu-bar]' which holds a keymap.
Use this function only to make bindings in the global value of `tool-bar-map'.
To define items in any other map, use `tool-bar-local-item-from-menu'.
-(fn COMMAND ICON &optional MAP &rest PROPS)" nil nil)
+(fn COMMAND ICON &optional MAP &rest PROPS)")
(autoload 'tool-bar-local-item-from-menu "tool-bar" "\
Define local tool bar binding for COMMAND using the given ICON.
This makes a binding for COMMAND in IN-MAP, copying its binding from
@@ -31655,7 +31583,7 @@ properties to add to the binding.
FROM-MAP must contain appropriate binding for `[menu-bar]' which
holds a keymap.
-(fn COMMAND ICON IN-MAP &optional FROM-MAP &rest PROPS)" nil nil)
+(fn COMMAND ICON IN-MAP &optional FROM-MAP &rest PROPS)")
(register-definition-prefixes "tool-bar" '("toggle-tool-bar-mode-from-frame" "tool-bar-"))
@@ -31672,7 +31600,7 @@ PROCESS should be a subprocess capable of sending and receiving
streams of bytes. It may be a local process, or it may be connected
to a tcp server on another machine.
-(fn PROCESS)" nil nil)
+(fn PROCESS)")
(register-definition-prefixes "tq" '("tq-"))
@@ -31685,7 +31613,7 @@ Trace output will by default go to that buffer.")
Helper function to get internal values.
You can call this function to add internal values in the trace buffer.
-(fn &rest VALUES)" nil nil)
+(fn &rest VALUES)")
(autoload 'trace-function-foreground "trace" "\
Trace calls to function FUNCTION.
With a prefix argument, also prompt for the trace buffer (default
@@ -31706,13 +31634,13 @@ stuff - use `trace-function-background' instead.
To stop tracing a function, use `untrace-function' or `untrace-all'.
-(fn FUNCTION &optional BUFFER CONTEXT)" t nil)
+(fn FUNCTION &optional BUFFER CONTEXT)" t)
(autoload 'trace-function-background "trace" "\
Trace calls to function FUNCTION, quietly.
This is like `trace-function-foreground', but without popping up
the output buffer or changing the window configuration.
-(fn FUNCTION &optional BUFFER CONTEXT)" t nil)
+(fn FUNCTION &optional BUFFER CONTEXT)" t)
(defalias 'trace-function 'trace-function-foreground)
(register-definition-prefixes "trace" '("inhibit-trace" "trace-" "untrace-"))
@@ -31741,6 +31669,15 @@ Regular expression matching file names handled by Tramp autoload.
It must match the initial `tramp-syntax' settings. It should not
match file names at root of the underlying local file system,
like \"/sys\" or \"/C:\".")
+(defvar tramp-foreign-file-name-handler-alist nil "\
+Alist of elements (FUNCTION . HANDLER) for foreign methods handled specially.
+If (FUNCTION FILENAME) returns non-nil, then all I/O on that file is done by
+calling HANDLER.")
+(autoload 'tramp-file-name-handler "tramp" "\
+Invoke Tramp file name handler for OPERATION and ARGS.
+Fall back to normal file name handler if no Tramp file name handler exists.
+
+(fn OPERATION &rest ARGS)")
(defun tramp-autoload-file-name-handler (operation &rest args) "\
Load Tramp file name handler, and perform OPERATION." (tramp-unload-file-name-handlers) (when tramp-mode (let ((default-directory temporary-file-directory)) (when (bound-and-true-p tramp-archive-autoload) (load "tramp-archive" 'noerror 'nomessage)) (load "tramp" 'noerror 'nomessage))) (apply operation args))
(defun tramp-register-autoload-file-name-handlers nil "\
@@ -31770,6 +31707,7 @@ List of suffixes which indicate a compressed file.
It must be supported by libarchive(3).")
(defmacro tramp-archive-autoload-file-name-regexp nil "\
Regular expression matching archive file names." '(concat "\\`" "\\(" ".+" "\\." (regexp-opt tramp-archive-suffixes) "\\(?:" "\\." (regexp-opt tramp-archive-compression-suffixes) "\\)*" "\\)" "\\(" "/" ".*" "\\)" "\\'"))
+(autoload 'tramp-archive-file-name-handler "tramp-archive")
(defun tramp-archive-autoload-file-name-handler (operation &rest args) "\
Load Tramp archive file name handler, and perform OPERATION." (defvar tramp-archive-autoload) (let ((default-directory temporary-file-directory) (tramp-archive-autoload tramp-archive-enabled)) (apply #'tramp-autoload-file-name-handler operation args)))
(defun tramp-register-archive-file-name-handler nil "\
@@ -31781,7 +31719,7 @@ Add archive file name handler to `file-name-handler-alist'." (when (and tramp-ar
;;; Generated autoloads from net/tramp-cache.el
-(register-definition-prefixes "tramp-cache" '("tramp-"))
+(register-definition-prefixes "tramp-cache" '("tramp-" "with-tramp-"))
;;; Generated autoloads from net/tramp-cmds.el
@@ -31857,6 +31795,48 @@ Add archive file name handler to `file-name-handler-alist'." (when (and tramp-ar
;;; Generated autoloads from transient.el
+(autoload 'transient-define-prefix "transient" "\
+Define NAME as a transient prefix command.
+
+ARGLIST are the arguments that command takes.
+DOCSTRING is the documentation string and is optional.
+
+These arguments can optionally be followed by key-value pairs.
+Each key has to be a keyword symbol, either `:class' or a keyword
+argument supported by the constructor of that class. The
+`transient-prefix' class is used if the class is not specified
+explicitly.
+
+GROUPs add key bindings for infix and suffix commands and specify
+how these bindings are presented in the popup buffer. At least
+one GROUP has to be specified. See info node `(transient)Binding
+Suffix and Infix Commands'.
+
+The BODY is optional. If it is omitted, then ARGLIST is also
+ignored and the function definition becomes:
+
+ (lambda ()
+ (interactive)
+ (transient-setup \\='NAME))
+
+If BODY is specified, then it must begin with an `interactive'
+form that matches ARGLIST, and it must call `transient-setup'.
+It may however call that function only when some condition is
+satisfied; that is one of the reason why you might want to use
+an explicit BODY.
+
+All transients have a (possibly nil) value, which is exported
+when suffix commands are called, so that they can consume that
+value. For some transients it might be necessary to have a sort
+of secondary value, called a scope. Such a scope would usually
+be set in the commands `interactive' form and has to be passed
+to the setup function:
+
+ (transient-setup \\='NAME nil nil :scope SCOPE)
+
+(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... GROUP... [BODY...])" nil t)
+(function-put 'transient-define-prefix 'lisp-indent-function 'defun)
+(function-put 'transient-define-prefix 'doc-string-elt 3)
(autoload 'transient-insert-suffix "transient" "\
Insert a SUFFIX into PREFIX before LOC.
PREFIX is a prefix command, a symbol.
@@ -31865,9 +31845,11 @@ SUFFIX is a suffix command or a group specification (of
LOC is a command, a key vector, a key description (a string
as returned by `key-description'), or a coordination list
(whose last element may also be a command or key).
+Remove a conflicting binding unless optional KEEP-OTHER is
+ non-nil.
See info node `(transient)Modifying Existing Transients'.
-(fn PREFIX LOC SUFFIX)" nil nil)
+(fn PREFIX LOC SUFFIX &optional KEEP-OTHER)")
(function-put 'transient-insert-suffix 'lisp-indent-function 'defun)
(autoload 'transient-append-suffix "transient" "\
Insert a SUFFIX into PREFIX after LOC.
@@ -31877,9 +31859,11 @@ SUFFIX is a suffix command or a group specification (of
LOC is a command, a key vector, a key description (a string
as returned by `key-description'), or a coordination list
(whose last element may also be a command or key).
+Remove a conflicting binding unless optional KEEP-OTHER is
+ non-nil.
See info node `(transient)Modifying Existing Transients'.
-(fn PREFIX LOC SUFFIX)" nil nil)
+(fn PREFIX LOC SUFFIX &optional KEEP-OTHER)")
(function-put 'transient-append-suffix 'lisp-indent-function 'defun)
(autoload 'transient-replace-suffix "transient" "\
Replace the suffix at LOC in PREFIX with SUFFIX.
@@ -31891,7 +31875,7 @@ LOC is a command, a key vector, a key description (a string
(whose last element may also be a command or key).
See info node `(transient)Modifying Existing Transients'.
-(fn PREFIX LOC SUFFIX)" nil nil)
+(fn PREFIX LOC SUFFIX)")
(function-put 'transient-replace-suffix 'lisp-indent-function 'defun)
(autoload 'transient-remove-suffix "transient" "\
Remove the suffix or group at LOC in PREFIX.
@@ -31901,9 +31885,9 @@ LOC is a command, a key vector, a key description (a string
(whose last element may also be a command or key).
See info node `(transient)Modifying Existing Transients'.
-(fn PREFIX LOC)" nil nil)
+(fn PREFIX LOC)")
(function-put 'transient-remove-suffix 'lisp-indent-function 'defun)
-(register-definition-prefixes "transient" '("magit--fit-window-to-buffer" "transient-"))
+(register-definition-prefixes "transient" '("transient"))
;;; Generated autoloads from tree-widget.el
@@ -31930,7 +31914,7 @@ When the tutorial buffer is killed the content and the point
position in the buffer is saved so that the tutorial may be
resumed later.
-(fn &optional ARG DONT-ASK-FOR-REVERT)" t nil)
+(fn &optional ARG DONT-ASK-FOR-REVERT)" t)
(register-definition-prefixes "tutorial" '("get-lang-string" "lang-strings" "tutorial--"))
@@ -31939,7 +31923,7 @@ resumed later.
(autoload 'tai-viet-composition-function "tv-util" "\
-(fn FROM TO FONT-OBJECT STRING DIRECTION)" nil nil)
+(fn FROM TO FONT-OBJECT STRING DIRECTION)")
(register-definition-prefixes "tv-util" '("tai-viet-"))
@@ -31956,7 +31940,7 @@ for details.). It runs `2C-other-buffer-hook' in the new buffer.
When called again, restores the screen layout with the current buffer
first and the associated buffer to its right.
-(fn &optional BUFFER)" t nil)
+(fn &optional BUFFER)" t)
(autoload '2C-associate-buffer "two-column" "\
Associate another BUFFER with this one in two-column minor mode.
Can also be used to associate a just previously visited file, by
@@ -31964,7 +31948,7 @@ accepting the proposed default buffer.
(See \\[describe-mode] .)
-(fn BUFFER)" t nil)
+(fn BUFFER)" t)
(autoload '2C-split "two-column" "\
Split a two-column text at point, into two buffers in two-column minor mode.
Point becomes the local value of `2C-window-width'. Only lines that
@@ -31983,7 +31967,7 @@ First column's text sSs Second column's text
(See \\[describe-mode] .)
-(fn ARG)" t nil)
+(fn ARG)" t)
(register-definition-prefixes "two-column" '("2C-"))
@@ -32083,7 +32067,7 @@ evaluate `(default-value \\='type-break-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'type-break "type-break" "\
Take a typing break.
@@ -32091,11 +32075,11 @@ During the break, a demo selected from the functions listed in
`type-break-demo-functions' is run.
After the typing break is finished, the next break is scheduled
-as per the function `type-break-schedule'." t nil)
+as per the function `type-break-schedule'." t)
(autoload 'type-break-statistics "type-break" "\
Print statistics about typing breaks in a temporary buffer.
This includes the last time a typing break was taken, when the next one is
-scheduled, the keystroke thresholds and the current keystroke count, etc." t nil)
+scheduled, the keystroke thresholds and the current keystroke count, etc." t)
(autoload 'type-break-guesstimate-keystroke-threshold "type-break" "\
Guess values for the minimum/maximum keystroke threshold for typing breaks.
@@ -32118,8 +32102,8 @@ fraction of the maximum threshold to which to set the minimum threshold.
FRAC should be the inverse of the fractional value; for example, a value of
2 would mean to use one half, a value of 4 would mean to use one quarter, etc.
-(fn WPM &optional WORDLEN FRAC)" t nil)
-(register-definition-prefixes "type-break" '("timep" "type-break-"))
+(fn WPM &optional WORDLEN FRAC)" t)
+(register-definition-prefixes "type-break" '("type-break-"))
;;; Generated autoloads from international/ucs-normalize.el
@@ -32133,7 +32117,7 @@ For instance:
(string-glyph-compose \"Å\") => \"Å\"
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'string-glyph-decompose "ucs-normalize" "\
Decompose STRING according to the Unicode NFD.
This returns a new string that is the canonical decomposition of STRING,
@@ -32141,7 +32125,7 @@ a.k.a. the \"Unicode Normalization Form D\" of STRING. For instance:
(ucs-normalize-NFD-string \"Å\") => \"Å\"
-(fn STRING)" nil nil)
+(fn STRING)")
(register-definition-prefixes "ucs-normalize" '("ucs-normalize-" "utf-8-hfs"))
@@ -32153,25 +32137,25 @@ Works by overstriking underscores.
Called from program, takes two arguments START and END
which specify the range to operate on.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'ununderline-region "underline" "\
Remove all underlining (overstruck underscores) in the region.
Called from program, takes two arguments START and END
which specify the range to operate on.
-(fn START END)" t nil)
+(fn START END)" t)
;;; Generated autoloads from mail/undigest.el
(autoload 'undigestify-rmail-message "undigest" "\
Break up a digest message into its constituent messages.
-Leaves original message, deleted, before the undigestified messages." t nil)
+Leaves original message, deleted, before the undigestified messages." t)
(autoload 'unforward-rmail-message "undigest" "\
Extract a forwarded message from the containing message.
This puts the forwarded message into a separate rmail message following
the containing message. This command is only useful when messages are
-forwarded with `rmail-enable-mime-composing' set to nil." t nil)
+forwarded with `rmail-enable-mime-composing' set to nil." t)
(register-definition-prefixes "undigest" '("rmail-"))
@@ -32184,7 +32168,7 @@ With ARG, activate UCS input method if and only if ARG is positive.
While this input method is active, the variable
`input-method-function' is bound to the function `ucs-input-method'.
-(fn &optional ARG)" nil nil)
+(fn &optional ARG)")
(register-definition-prefixes "quail/uni-input" '("ucs-input-"))
@@ -32195,12 +32179,12 @@ Convert old-style Rmail Babyl files to mbox format.
Specify the input Rmail Babyl file names as command line arguments.
For each Rmail file, the corresponding output file name
is made by adding `.mail' at the end.
-For example, invoke `emacs -batch -f batch-unrmail RMAIL'." nil nil)
+For example, invoke `emacs -batch -f batch-unrmail RMAIL'.")
(autoload 'unrmail "unrmail" "\
Convert old-style Rmail Babyl file FILE to mbox format file TO-FILE.
The variable `unrmail-mbox-format' controls which mbox format to use.
-(fn FILE TO-FILE)" t nil)
+(fn FILE TO-FILE)" t)
(register-definition-prefixes "unrmail" '("unrmail-mbox-format"))
@@ -32211,7 +32195,7 @@ Return nil if evaluating FORM couldn't possibly do any harm.
Otherwise result is a reason why FORM is unsafe.
VARS is a list of symbols with local bindings like `unsafep-vars'.
-(fn FORM &optional VARS)" nil nil)
+(fn FORM &optional VARS)")
(register-definition-prefixes "unsafep" '("safe-functions" "unsafep-"))
@@ -32251,7 +32235,7 @@ the server.
If URL is a multibyte string, it will be encoded as utf-8 and
URL-encoded before it's used.
-(fn URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)" nil nil)
+(fn URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)")
(autoload 'url-retrieve-synchronously "url" "\
Retrieve URL synchronously.
Return the buffer containing the data, or nil if there are no data
@@ -32263,15 +32247,10 @@ If INHIBIT-COOKIES is non-nil, refuse to store cookies. If
TIMEOUT is passed, it should be a number that says (in seconds)
how long to wait for a response before giving up.
-(fn URL &optional SILENT INHIBIT-COOKIES TIMEOUT)" nil nil)
+(fn URL &optional SILENT INHIBIT-COOKIES TIMEOUT)")
(register-definition-prefixes "url" '("url-"))
-;;; Generated autoloads from url/url-about.el
-
-(register-definition-prefixes "url-about" '("url-"))
-
-
;;; Generated autoloads from url/url-auth.el
(autoload 'url-get-authentication "url-auth" "\
@@ -32293,7 +32272,7 @@ TYPE is the type of authentication to be returned. This is either a string
PROMPT is boolean - specifies whether to ask the user for a username/password
if one cannot be found in the cache
-(fn URL REALM TYPE PROMPT &optional ARGS)" nil nil)
+(fn URL REALM TYPE PROMPT &optional ARGS)")
(autoload 'url-register-auth-scheme "url-auth" "\
Register an HTTP authentication method.
@@ -32306,7 +32285,7 @@ RATING a rating between 1 and 10 of the strength of the authentication.
This is used when asking for the best authentication for a specific
URL. The item with the highest rating is returned.
-(fn TYPE &optional FUNCTION RATING)" nil nil)
+(fn TYPE &optional FUNCTION RATING)")
(register-definition-prefixes "url-auth" '("url-"))
@@ -32315,16 +32294,16 @@ RATING a rating between 1 and 10 of the strength of the authentication.
(autoload 'url-store-in-cache "url-cache" "\
Store buffer BUFF in the cache.
-(fn &optional BUFF)" nil nil)
+(fn &optional BUFF)")
(autoload 'url-is-cached "url-cache" "\
Return non-nil if the URL is cached.
The actual return value is the last modification time of the cache file.
-(fn URL)" nil nil)
+(fn URL)")
(autoload 'url-cache-extract "url-cache" "\
Extract FNAM from the local disk cache.
-(fn FNAM)" nil nil)
+(fn FNAM)")
(register-definition-prefixes "url-cache" '("url-"))
@@ -32333,7 +32312,7 @@ Extract FNAM from the local disk cache.
(autoload 'url-cid "url-cid" "\
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "url-cid" '("url-cid-gnus"))
@@ -32348,7 +32327,7 @@ Extract FNAM from the local disk cache.
Return WebDAV protocol version supported by URL.
Returns nil if WebDAV is not supported.
-(fn URL)" nil nil)
+(fn URL)")
(autoload 'url-dav-request "url-dav" "\
Perform WebDAV operation METHOD on URL. Return the parsed responses.
Automatically creates an XML request body if TAG is non-nil.
@@ -32365,19 +32344,14 @@ NAMESPACES is an assoc list of (NAMESPACE . EXPANSION), and these are
added to the <TAG> element. The DAV=DAV: namespace is automatically
added to this list, so most requests can just pass in nil.
-(fn URL METHOD TAG BODY &optional DEPTH HEADERS NAMESPACES)" nil nil)
+(fn URL METHOD TAG BODY &optional DEPTH HEADERS NAMESPACES)")
(autoload 'url-dav-vc-registered "url-dav" "\
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "url-dav" '("url-dav-"))
-;;; Generated autoloads from url/url-dired.el
-
-(register-definition-prefixes "url-dired" '("url-"))
-
-
;;; Generated autoloads from url/url-domsuf.el
(register-definition-prefixes "url-domsuf" '("url-domsuf-"))
@@ -32393,7 +32367,7 @@ added to this list, so most requests can just pass in nil.
(autoload 'url-file "url-file" "\
Handle file: and ftp: URLs.
-(fn URL CALLBACK CBARGS)" nil nil)
+(fn URL CALLBACK CBARGS)")
(register-definition-prefixes "url-file" '("url-"))
@@ -32412,7 +32386,7 @@ Handle file: and ftp: URLs.
(autoload 'url-gateway-nslookup-host "url-gw" "\
Attempt to resolve the given HOST using nslookup if possible.
-(fn HOST)" t nil)
+(fn HOST)" t)
(autoload 'url-open-stream "url-gw" "\
Open a stream to HOST, possibly via a gateway.
Args per `open-network-stream'.
@@ -32422,7 +32396,7 @@ Might do a non-blocking connection; use `process-status' to check.
Optional arg GATEWAY-METHOD specifies the gateway to be used,
overriding the value of `url-gateway-method'.
-(fn NAME BUFFER HOST SERVICE &optional GATEWAY-METHOD)" nil nil)
+(fn NAME BUFFER HOST SERVICE &optional GATEWAY-METHOD)")
(register-definition-prefixes "url-gw" '("url-"))
@@ -32462,13 +32436,13 @@ evaluate `(default-value \\='url-handler-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'url-file-handler "url-handlers" "\
Function called from the `file-name-handler-alist' routines.
OPERATION is what needs to be done (`file-exists-p', etc.).
ARGS are the arguments that would have been passed to OPERATION.
-(fn OPERATION &rest ARGS)" nil nil)
+(fn OPERATION &rest ARGS)")
(autoload 'url-copy-file "url-handlers" "\
Copy URL to NEWNAME. Both arguments must be strings.
Signal a `file-already-exists' error if file NEWNAME already
@@ -32476,23 +32450,23 @@ exists, unless a third argument OK-IF-ALREADY-EXISTS is supplied
and non-nil. An integer as third argument means request
confirmation if NEWNAME already exists.
-(fn URL NEWNAME &optional OK-IF-ALREADY-EXISTS &rest IGNORED)" nil nil)
+(fn URL NEWNAME &optional OK-IF-ALREADY-EXISTS &rest IGNORED)")
(autoload 'url-file-local-copy "url-handlers" "\
Copy URL into a temporary file on this machine.
Returns the name of the local copy, or nil, if FILE is directly
accessible.
-(fn URL &rest IGNORED)" nil nil)
+(fn URL &rest IGNORED)")
(autoload 'url-insert-buffer-contents "url-handlers" "\
Insert the contents of BUFFER into current buffer.
This is like `url-insert', but also decodes the current buffer as
if it had been inserted from a file named URL.
-(fn BUFFER URL &optional VISIT BEG END REPLACE)" nil nil)
+(fn BUFFER URL &optional VISIT BEG END REPLACE)")
(autoload 'url-insert-file-contents "url-handlers" "\
-(fn URL &optional VISIT BEG END REPLACE)" nil nil)
+(fn URL &optional VISIT BEG END REPLACE)")
(register-definition-prefixes "url-handlers" '("url-"))
@@ -32522,7 +32496,7 @@ if it had been inserted from a file named URL.
(autoload 'url-irc "url-irc" "\
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "url-irc" '("url-irc-"))
@@ -32534,7 +32508,7 @@ The return value is a buffer displaying the search results in HTML.
URL can be a URL string, or a URL record of the type returned by
`url-generic-parse-url'.
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "url-ldap" '("url-ldap-"))
@@ -32543,11 +32517,11 @@ URL can be a URL string, or a URL record of the type returned by
(autoload 'url-mail "url-mailto" "\
-(fn &rest ARGS)" t nil)
+(fn &rest ARGS)" t)
(autoload 'url-mailto "url-mailto" "\
Handle the mailto: URL syntax.
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "url-mailto" '("url-mail-goto-field"))
@@ -32561,22 +32535,22 @@ Handle the mailto: URL syntax.
(autoload 'url-man "url-misc" "\
Fetch a Unix manual page URL.
-(fn URL)" nil nil)
+(fn URL)")
(autoload 'url-info "url-misc" "\
Fetch a GNU Info URL.
-(fn URL)" nil nil)
+(fn URL)")
(autoload 'url-generic-emulator-loader "url-misc" "\
-(fn URL)" nil nil)
+(fn URL)")
(defalias 'url-rlogin 'url-generic-emulator-loader)
(defalias 'url-telnet 'url-generic-emulator-loader)
(defalias 'url-tn3270 'url-generic-emulator-loader)
(autoload 'url-data "url-misc" "\
Fetch a data URL (RFC 2397).
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "url-misc" '("url-do-terminal-emulator"))
@@ -32585,11 +32559,11 @@ Fetch a data URL (RFC 2397).
(autoload 'url-news "url-news" "\
-(fn URL)" nil nil)
+(fn URL)")
(autoload 'url-snews "url-news" "\
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "url-news" '("url-news-"))
@@ -32603,7 +32577,7 @@ Fetch a data URL (RFC 2397).
(autoload 'url-recreate-url "url-parse" "\
Recreate a URL string from the parsed URLOBJ.
-(fn URLOBJ)" nil nil)
+(fn URLOBJ)")
(autoload 'url-generic-parse-url "url-parse" "\
Return an URL-struct of the parts of URL.
The CL-style struct contains the following fields:
@@ -32643,14 +32617,14 @@ parses to
ATTRIBUTES = nil
FULLNESS = t
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "url-parse" '("url-"))
;;; Generated autoloads from url/url-privacy.el
(autoload 'url-setup-privacy-info "url-privacy" "\
-Setup variables that expose info about you and your system." t nil)
+Setup variables that expose info about you and your system." t)
(register-definition-prefixes "url-privacy" '("url-device-type"))
@@ -32668,7 +32642,7 @@ but with limits on the degree of parallelism. The variable
`url-queue-parallel-processes' sets the number of concurrent processes.
The variable `url-queue-timeout' sets a timeout.
-(fn URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)" nil nil)
+(fn URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)")
(register-definition-prefixes "url-queue" '("url-queue"))
@@ -32683,7 +32657,7 @@ Function called from the `file-name-handler-alist' routines.
OPERATION is what needs to be done. ARGS are the arguments that
would have been passed to OPERATION.
-(fn OPERATION &rest ARGS)" nil nil)
+(fn OPERATION &rest ARGS)")
(register-definition-prefixes "url-tramp" '("url-tramp-convert-"))
@@ -32700,11 +32674,11 @@ If a list, it is a list of the types of messages to be logged.")
(autoload 'url-debug "url-util" "\
-(fn TAG &rest ARGS)" nil nil)
+(fn TAG &rest ARGS)")
(autoload 'url-parse-args "url-util" "\
-(fn STR &optional NODOWNCASE)" nil nil)
+(fn STR &optional NODOWNCASE)")
(autoload 'url-insert-entities-in-string "url-util" "\
Convert HTML markup-start characters to entity references in STRING.
Also replaces the \" character, so that the result may be safely used as
@@ -32715,50 +32689,49 @@ conversion. Replaces these characters as follows:
> ==> &gt;
\" ==> &quot;
-(fn STRING)" nil nil)
+(fn STRING)")
(autoload 'url-normalize-url "url-util" "\
Return a \"normalized\" version of URL.
Strips out default port numbers, etc.
-(fn URL)" nil nil)
+(fn URL)")
(autoload 'url-lazy-message "url-util" "\
Just like `message', but is a no-op if called more than once a second.
Will not do anything if `url-show-status' is nil.
-(fn &rest ARGS)" nil nil)
+(fn &rest ARGS)")
(autoload 'url-get-normalized-date "url-util" "\
Return a date string that most HTTP servers can understand.
-(fn &optional SPECIFIED-TIME)" nil nil)
-(autoload 'url-eat-trailing-space "url-util" "\
-Remove spaces/tabs at the end of a string.
-
-(fn X)" nil nil)
-(autoload 'url-strip-leading-spaces "url-util" "\
-Remove spaces at the front of a string.
+(fn &optional SPECIFIED-TIME)")
+(define-obsolete-function-alias 'url-eat-trailing-space #'string-trim-right "29.1")
+(define-obsolete-function-alias 'url-strip-leading-spaces #'string-trim-left "29.1")
+(autoload 'url-display-message "url-util" "\
+Like `message', but do nothing if `url-show-status' is nil.
-(fn X)" nil nil)
+(fn FMT &rest ARGS)")
(autoload 'url-display-percentage "url-util" "\
-(fn FMT PERC &rest ARGS)" nil nil)
+(fn FMT PERC &rest ARGS)")
+(make-obsolete 'url-display-percentage 'url-display-message "29.1")
(autoload 'url-percentage "url-util" "\
-(fn X Y)" nil nil)
+(fn X Y)")
(defalias 'url-basepath 'url-file-directory)
(autoload 'url-file-directory "url-util" "\
Return the directory part of FILE, for a URL.
-(fn FILE)" nil nil)
+(fn FILE)")
(autoload 'url-file-nondirectory "url-util" "\
Return the nondirectory part of FILE, for a URL.
-(fn FILE)" nil nil)
+(fn FILE)")
(autoload 'url-parse-query-string "url-util" "\
-(fn QUERY &optional DOWNCASE ALLOW-NEWLINES)" nil nil)
+(fn QUERY &optional DOWNCASE ALLOW-NEWLINES)")
(autoload 'url-build-query-string "url-util" "\
Build a query-string.
@@ -32781,7 +32754,7 @@ When SEMICOLONS is given, the separator will be \";\".
When KEEP-EMPTY is given, empty values will show as \"key=\"
instead of just \"key\" as in the example above.
-(fn QUERY &optional SEMICOLONS KEEP-EMPTY)" nil nil)
+(fn QUERY &optional SEMICOLONS KEEP-EMPTY)")
(autoload 'url-unhex-string "url-util" "\
Decode %XX sequences in a percent-encoded URL.
If optional second argument ALLOW-NEWLINES is non-nil, then allow the
@@ -32791,7 +32764,7 @@ forbidden in URL encoding.
The resulting string in general requires decoding using an
appropriate coding-system; see `decode-coding-string'.
-(fn STR &optional ALLOW-NEWLINES)" nil nil)
+(fn STR &optional ALLOW-NEWLINES)")
(autoload 'url-hexify-string "url-util" "\
URI-encode STRING and return the result.
If STRING is multibyte, it is first converted to a utf-8 byte
@@ -32805,7 +32778,7 @@ allowed characters. Otherwise, ALLOWED-CHARS should be either a
list of allowed chars, or a vector whose Nth element is non-nil
if character N is allowed.
-(fn STRING &optional ALLOWED-CHARS)" nil nil)
+(fn STRING &optional ALLOWED-CHARS)")
(autoload 'url-encode-url "url-util" "\
Return a properly URI-encoded version of URL.
This function also performs URI normalization, e.g. converting
@@ -32813,18 +32786,18 @@ the scheme to lowercase if it is uppercase. Apart from
normalization, if URL is already URI-encoded, this function
should return it unchanged.
-(fn URL)" nil nil)
+(fn URL)")
(autoload 'url-file-extension "url-util" "\
Return the filename extension of FNAME.
If optional argument X is t, then return the basename
of the file with the extension stripped off.
-(fn FNAME &optional X)" nil nil)
+(fn FNAME &optional X)")
(autoload 'url-truncate-url-for-viewing "url-util" "\
Return a shortened version of URL that is WIDTH characters wide or less.
WIDTH defaults to the current frame width.
-(fn URL &optional WIDTH)" nil nil)
+(fn URL &optional WIDTH)")
(autoload 'url-view-url "url-util" "\
View the current document's URL.
Optional argument NO-SHOW means just return the URL, don't show it in
@@ -32832,7 +32805,7 @@ the minibuffer.
This uses `url-current-object', set locally to the buffer.
-(fn &optional NO-SHOW)" t nil)
+(fn &optional NO-SHOW)" t)
(autoload 'url-domain "url-util" "\
Return the domain of the host of the URL.
Return nil if this can't be determined.
@@ -32840,7 +32813,7 @@ Return nil if this can't be determined.
For instance, this function will return \"fsf.co.uk\" if the host in URL
is \"www.fsf.co.uk\".
-(fn URL)" nil nil)
+(fn URL)")
(register-definition-prefixes "url-util" '("url-"))
@@ -32862,11 +32835,11 @@ This function has a choice of three things to do:
You can redefine this function to choose among those three alternatives
in any way you like.
-(fn FILE OPPONENT)" nil nil)
+(fn FILE OPPONENT)")
(autoload 'userlock--ask-user-about-supersession-threat "userlock" "\
-(fn FILENAME)" nil nil)
+(fn FILENAME)")
(autoload 'ask-user-about-supersession-threat "userlock" "\
Ask a user who is about to modify an obsolete buffer what to do.
This function has two choices: it can return, in which case the modification
@@ -32876,11 +32849,11 @@ in which case the proposed buffer modification will not be made.
You can rewrite this to use any criterion you like to choose which one to do.
The buffer in question is current when this function is called.
-(fn FILENAME)" nil nil)
+(fn FILENAME)")
(autoload 'userlock--handle-unlock-error "userlock" "\
Report an ERROR that occurred while unlocking a file.
-(fn ERROR)" nil nil)
+(fn ERROR)")
(register-definition-prefixes "userlock" '("ask-user-about-" "file-" "userlock--check-content-unchanged"))
@@ -32889,19 +32862,19 @@ Report an ERROR that occurred while unlocking a file.
(autoload 'utf-7-post-read-conversion "utf-7" "\
-(fn LEN)" nil nil)
+(fn LEN)")
(autoload 'utf-7-imap-post-read-conversion "utf-7" "\
-(fn LEN)" nil nil)
+(fn LEN)")
(autoload 'utf-7-pre-write-conversion "utf-7" "\
-(fn FROM TO)" nil nil)
+(fn FROM TO)")
(autoload 'utf-7-imap-pre-write-conversion "utf-7" "\
-(fn FROM TO)" nil nil)
+(fn FROM TO)")
(register-definition-prefixes "utf-7" '("utf-7-"))
@@ -32910,7 +32883,7 @@ Report an ERROR that occurred while unlocking a file.
(autoload 'utf7-encode "utf7" "\
Encode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil.
-(fn STRING &optional FOR-IMAP)" nil nil)
+(fn STRING &optional FOR-IMAP)")
(register-definition-prefixes "utf7" '("utf7-"))
@@ -32936,17 +32909,17 @@ Uudecode region between START and END using external program.
If FILE-NAME is non-nil, save the result to FILE-NAME. The program
used is specified by `uudecode-decoder-program'.
-(fn START END &optional FILE-NAME)" t nil)
+(fn START END &optional FILE-NAME)" t)
(autoload 'uudecode-decode-region-internal "uudecode" "\
Uudecode region between START and END without using an external program.
If FILE-NAME is non-nil, save the result to FILE-NAME.
-(fn START END &optional FILE-NAME)" t nil)
+(fn START END &optional FILE-NAME)" t)
(autoload 'uudecode-decode-region "uudecode" "\
Uudecode region between START and END.
If FILE-NAME is non-nil, save the result to FILE-NAME.
-(fn START END &optional FILE-NAME)" nil nil)
+(fn START END &optional FILE-NAME)")
(register-definition-prefixes "uudecode" '("uudecode-"))
@@ -32979,7 +32952,7 @@ be reported.
If NO-ERROR is nil, signal an error that no VC backend is
responsible for the given file.
-(fn FILE &optional NO-ERROR)" nil nil)
+(fn FILE &optional NO-ERROR)")
(autoload 'vc-next-action "vc" "\
Do the next logical version control operation on the current fileset.
This requires that all files in the current VC fileset be in the
@@ -33007,7 +32980,7 @@ When using this command to register a new file (or files), it
will automatically deduce which VC repository to register it
with, using the most specific one.
-(fn VERBOSE)" t nil)
+(fn VERBOSE)" t)
(autoload 'vc-register "vc" "\
Register into a version control system.
If VC-FILESET is given, register the files in that fileset.
@@ -33021,7 +32994,7 @@ directory are already registered under that backend) will be used to
register the file. If no backend declares itself responsible, the
first backend that could register the file is used.
-(fn &optional VC-FILESET COMMENT)" t nil)
+(fn &optional VC-FILESET COMMENT)" t)
(autoload 'vc-ignore "vc" "\
Ignore FILE under the VCS of DIRECTORY.
@@ -33036,7 +33009,7 @@ When called interactively, prompt for a FILE to ignore, unless a
prefix argument is given, in which case prompt for a file FILE to
remove from the list of ignored files.
-(fn FILE &optional DIRECTORY REMOVE)" t nil)
+(fn FILE &optional DIRECTORY REMOVE)" t)
(autoload 'vc-version-diff "vc" "\
Report diffs between revisions REV1 and REV2 in the repository history.
This compares two revisions of the current fileset.
@@ -33045,11 +33018,11 @@ of the last commit.
If REV2 is nil, it defaults to the work tree, i.e. the current
state of each file in the fileset.
-(fn FILES REV1 REV2)" t nil)
+(fn FILES REV1 REV2)" t)
(autoload 'vc-root-version-diff "vc" "\
Report diffs between REV1 and REV2 revisions of the whole tree.
-(fn FILES REV1 REV2)" t nil)
+(fn FILES REV1 REV2)" t)
(autoload 'vc-diff "vc" "\
Display diffs between file revisions.
Normally this compares the currently selected fileset with their
@@ -33059,12 +33032,12 @@ designators specifying which revisions to compare.
The optional argument NOT-URGENT non-nil means it is ok to say no to
saving the buffer.
-(fn &optional HISTORIC NOT-URGENT)" t nil)
+(fn &optional HISTORIC NOT-URGENT)" t)
(autoload 'vc-diff-mergebase "vc" "\
Report diffs between the merge base of REV1 and REV2 revisions.
The merge base is a common ancestor between REV1 and REV2 revisions.
-(fn FILES REV1 REV2)" t nil)
+(fn FILES REV1 REV2)" t)
(autoload 'vc-version-ediff "vc" "\
Show differences between REV1 and REV2 of FILES using ediff.
This compares two revisions of the files in FILES. Currently,
@@ -33075,7 +33048,7 @@ of the last commit.
If REV2 is nil, it defaults to the work tree, i.e. the current
state of each file in FILES.
-(fn FILES REV1 REV2)" t nil)
+(fn FILES REV1 REV2)" t)
(autoload 'vc-ediff "vc" "\
Display diffs between file revisions using ediff.
Normally this compares the currently selected fileset with their
@@ -33085,7 +33058,7 @@ designators specifying which revisions to compare.
The optional argument NOT-URGENT non-nil means it is ok to say no to
saving the buffer.
-(fn HISTORIC &optional NOT-URGENT)" t nil)
+(fn HISTORIC &optional NOT-URGENT)" t)
(autoload 'vc-root-diff "vc" "\
Display diffs between VC-controlled whole tree revisions.
Normally, this compares the tree corresponding to the current
@@ -33096,20 +33069,20 @@ designators specifying which revisions to compare.
The optional argument NOT-URGENT non-nil means it is ok to say no to
saving the buffer.
-(fn HISTORIC &optional NOT-URGENT)" t nil)
+(fn HISTORIC &optional NOT-URGENT)" t)
(autoload 'vc-root-dir "vc" "\
Return the root directory for the current VC tree.
-Return nil if the root directory cannot be identified." nil nil)
+Return nil if the root directory cannot be identified.")
(autoload 'vc-revision-other-window "vc" "\
Visit revision REV of the current file in another window.
If the current file is named `F', the revision is named `F.~REV~'.
If `F.~REV~' already exists, use it instead of checking it out again.
-(fn REV)" t nil)
+(fn REV)" t)
(autoload 'vc-insert-headers "vc" "\
Insert headers into a file for use with a version control system.
Headers desired are inserted at point, and are pulled from
-the variable `vc-BACKEND-header'." t nil)
+the variable `vc-BACKEND-header'." t)
(autoload 'vc-merge "vc" "\
Perform a version control merge operation.
You must be visiting a version controlled file, or in a `vc-dir' buffer.
@@ -33122,14 +33095,14 @@ between two revisions into the current fileset. This asks for
two revisions to merge from in the minibuffer. If the first
revision is a branch number, then merge all changes from that
branch. If the first revision is empty, merge the most recent
-changes from the current branch." t nil)
+changes from the current branch." t)
(autoload 'vc-message-unresolved-conflicts "vc" "\
Display a message indicating unresolved conflicts in FILENAME.
-(fn FILENAME)" nil nil)
+(fn FILENAME)")
(defalias 'vc-resolve-conflicts 'smerge-ediff)
(autoload 'vc-find-conflicted-file "vc" "\
-Visit the next conflicted file in the current project." t nil)
+Visit the next conflicted file in the current project." t)
(autoload 'vc-create-tag "vc" "\
Descending recursively from DIR, make a tag called NAME.
For each registered file, the working revision becomes part of
@@ -33137,7 +33110,7 @@ the named configuration. If the prefix argument BRANCHP is
given, the tag is made as a new branch and the files are
checked out in that new branch.
-(fn DIR NAME BRANCHP)" t nil)
+(fn DIR NAME BRANCHP)" t)
(autoload 'vc-retrieve-tag "vc" "\
For each file in or below DIR, retrieve their tagged version NAME.
NAME can name a branch, in which case this command will switch to the
@@ -33150,7 +33123,7 @@ locked files at or below DIR (but if NAME is empty, locked files are
allowed and simply skipped).
This function runs the hook `vc-retrieve-tag-hook' when finished.
-(fn DIR NAME)" t nil)
+(fn DIR NAME)" t)
(autoload 'vc-print-log "vc" "\
List the change log of the current fileset in a window.
If WORKING-REVISION is non-nil, leave point at that revision.
@@ -33160,7 +33133,7 @@ number of revisions to show; the default is `vc-log-show-limit'.
When called interactively with a prefix argument, prompt for
WORKING-REVISION and LIMIT.
-(fn &optional WORKING-REVISION LIMIT)" t nil)
+(fn &optional WORKING-REVISION LIMIT)" t)
(autoload 'vc-print-root-log "vc" "\
List the revision history for the current VC controlled tree in a window.
If LIMIT is non-nil, it should be a number specifying the maximum
@@ -33171,21 +33144,21 @@ A special case is when the prefix argument is 1: in this case
the command asks for the ID of a revision, and shows that revision
with its diffs (if the underlying VCS supports that).
-(fn &optional LIMIT REVISION)" t nil)
+(fn &optional LIMIT REVISION)" t)
(autoload 'vc-print-branch-log "vc" "\
Show the change log for BRANCH root in a window.
-(fn BRANCH)" t nil)
+(fn BRANCH)" t)
(autoload 'vc-log-incoming "vc" "\
Show log of changes that will be received with pull from REMOTE-LOCATION.
When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
-(fn &optional REMOTE-LOCATION)" t nil)
+(fn &optional REMOTE-LOCATION)" t)
(autoload 'vc-log-outgoing "vc" "\
Show log of changes that will be sent with a push operation to REMOTE-LOCATION.
When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
-(fn &optional REMOTE-LOCATION)" t nil)
+(fn &optional REMOTE-LOCATION)" t)
(autoload 'vc-log-search "vc" "\
Search the log of changes for PATTERN.
@@ -33197,23 +33170,23 @@ Display all entries that match log messages in long format.
With a prefix argument, ask for a command to run that will output
log entries.
-(fn PATTERN)" t nil)
+(fn PATTERN)" t)
(autoload 'vc-log-mergebase "vc" "\
Show a log of changes between the merge base of REV1 and REV2 revisions.
The merge base is a common ancestor between REV1 and REV2 revisions.
-(fn FILES REV1 REV2)" t nil)
+(fn FILES REV1 REV2)" t)
(autoload 'vc-region-history "vc" "\
Show the history of the region between FROM and TO.
If called interactively, show the history between point and
mark.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'vc-revert "vc" "\
Revert working copies of the selected fileset to their repository contents.
This asks for confirmation if the buffer contents are not identical
-to the working revision (except for keyword expansion)." t nil)
+to the working revision (except for keyword expansion)." t)
(autoload 'vc-pull "vc" "\
Update the current fileset or branch.
You must be visiting a version controlled file, or in a `vc-dir' buffer.
@@ -33228,7 +33201,7 @@ file, this simply replaces the work file with the latest revision
on its branch. If the file contains changes, any changes in the
tip revision are merged into the working file.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defalias 'vc-update 'vc-pull)
(autoload 'vc-push "vc" "\
Push the current branch.
@@ -33241,7 +33214,7 @@ VCS command to run.
On a non-distributed version control system, this signals an error.
It also signals an error in a Bazaar bound branch.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'vc-switch-backend "vc" "\
Make BACKEND the current version control system for FILE.
FILE must already be registered in BACKEND. The change is not
@@ -33250,7 +33223,7 @@ VC's perspective on FILE, it does not register or unregister it.
By default, this command cycles through the registered backends.
To get a prompt, use a prefix argument.
-(fn FILE BACKEND)" t nil)
+(fn FILE BACKEND)" t)
(make-obsolete 'vc-switch-backend 'nil "28.1")
(autoload 'vc-transfer-file "vc" "\
Transfer FILE to another version control system NEW-BACKEND.
@@ -33262,19 +33235,19 @@ backend, then commit all changes that were made under the current
backend to NEW-BACKEND, and unregister FILE from the current backend.
(If FILE is not yet registered under NEW-BACKEND, register it.)
-(fn FILE NEW-BACKEND)" nil nil)
+(fn FILE NEW-BACKEND)")
(autoload 'vc-delete-file "vc" "\
Delete file and mark it as such in the version control system.
If called interactively, read FILE, defaulting to the current
buffer's file name if it's under version control.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'vc-rename-file "vc" "\
Rename file OLD to NEW in both work area and repository.
If called interactively, read OLD and NEW, defaulting OLD to the
current buffer's file name if it's under version control.
-(fn OLD NEW)" t nil)
+(fn OLD NEW)" t)
(autoload 'vc-update-change-log "vc" "\
Find change log file and add entries from recent version control logs.
Normally, find log entries for all registered files in the default
@@ -33289,7 +33262,7 @@ log for the default directory, which may not be appropriate.
From a program, any ARGS are assumed to be filenames for which
log entries should be gathered.
-(fn &rest ARGS)" t nil)
+(fn &rest ARGS)" t)
(register-definition-prefixes "vc" '("vc-" "with-vc-properties"))
@@ -33327,7 +33300,7 @@ mode-specific menu. `vc-annotate-color-map' and
`vc-annotate-background-mode' specifies whether the color map
should be applied to the background or to the foreground.
-(fn FILE REV &optional DISPLAY-MODE BUF MOVE-POINT-TO VC-BK)" t nil)
+(fn FILE REV &optional DISPLAY-MODE BUF MOVE-POINT-TO VC-BK)" t)
(register-definition-prefixes "vc-annotate" '("vc-"))
@@ -33366,7 +33339,7 @@ Name of the format file in a .bzr directory.")
(autoload 'vc-dir-root "vc-dir" "\
Run `vc-dir' in the repository root directory without prompt.
If the default directory of the current buffer is
-not under version control, prompt for a directory." t nil)
+not under version control, prompt for a directory." t)
(autoload 'vc-dir "vc-dir" "\
Show the VC status for \"interesting\" files in and below DIR.
This allows you to mark files and perform VC operations on them.
@@ -33384,13 +33357,13 @@ These are the commands available for use in the file status buffer:
\\{vc-dir-mode-map}
-(fn DIR &optional BACKEND)" t nil)
+(fn DIR &optional BACKEND)" t)
(autoload 'vc-dir-bookmark-jump "vc-dir" "\
Provide the `bookmark-jump' behavior for a `vc-dir' buffer.
This implements the `handler' function interface for the record
type returned by `vc-dir-bookmark-make-record'.
-(fn BMK)" nil nil)
+(fn BMK)")
(register-definition-prefixes "vc-dir" '("vc-"))
@@ -33412,7 +33385,7 @@ that is inserted into the command line before the filename.
Return the return value of the slave command in the synchronous
case, and the process object in the asynchronous case.
-(fn BUFFER OKSTATUS COMMAND FILE-OR-LIST &rest FLAGS)" nil nil)
+(fn BUFFER OKSTATUS COMMAND FILE-OR-LIST &rest FLAGS)")
(register-definition-prefixes "vc-dispatcher" '("vc-"))
@@ -33548,7 +33521,7 @@ Key bindings:
\\{vera-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "vera-mode" '("vera-"))
@@ -33690,7 +33663,7 @@ Key bindings specific to `verilog-mode-map' are:
\\{verilog-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "verilog-mode" '("electric-verilog-" "verilog-" "vl-"))
@@ -34243,7 +34216,7 @@ Key bindings:
\\{vhdl-mode-map}
-(fn)" t nil)
+(fn)" t)
(register-definition-prefixes "vhdl-mode" '("vhdl-"))
@@ -34252,31 +34225,31 @@ Key bindings:
(autoload 'viet-encode-viscii-char "viet-util" "\
Return VISCII character code of CHAR if appropriate.
-(fn CHAR)" nil nil)
+(fn CHAR)")
(autoload 'viet-decode-viqr-region "viet-util" "\
Convert `VIQR' mnemonics of the current region to Vietnamese characters.
When called from a program, expects two arguments,
positions (integers or markers) specifying the stretch of the region.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'viet-decode-viqr-buffer "viet-util" "\
-Convert `VIQR' mnemonics of the current buffer to Vietnamese characters." t nil)
+Convert `VIQR' mnemonics of the current buffer to Vietnamese characters." t)
(autoload 'viet-encode-viqr-region "viet-util" "\
Convert Vietnamese characters of the current region to `VIQR' mnemonics.
When called from a program, expects two arguments,
positions (integers or markers) specifying the stretch of the region.
-(fn FROM TO)" t nil)
+(fn FROM TO)" t)
(autoload 'viet-encode-viqr-buffer "viet-util" "\
-Convert Vietnamese characters of the current buffer to `VIQR' mnemonics." t nil)
+Convert Vietnamese characters of the current buffer to `VIQR' mnemonics." t)
(autoload 'viqr-post-read-conversion "viet-util" "\
-(fn LEN)" nil nil)
+(fn LEN)")
(autoload 'viqr-pre-write-conversion "viet-util" "\
-(fn FROM TO)" nil nil)
+(fn FROM TO)")
(register-definition-prefixes "viet-util" '("viet-viqr-alist" "viqr-regexp"))
@@ -34293,7 +34266,7 @@ functions that enable or disable view mode.")
(autoload 'kill-buffer-if-not-modified "view" "\
Like `kill-buffer', but does nothing if buffer BUF is modified.
-(fn BUF)" nil nil)
+(fn BUF)")
(autoload 'view-file "view" "\
View FILE in View mode, returning to previous buffer when done.
Emacs commands editing the buffer contents are not available; instead, a
@@ -34304,7 +34277,7 @@ For a list of all View commands, type H or h while viewing.
This command runs the normal hook `view-mode-hook'.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'view-file-other-window "view" "\
View FILE in View mode in another window.
When done, return that window to its previous buffer, and kill the
@@ -34318,7 +34291,7 @@ For a list of all View commands, type H or h while viewing.
This command runs the normal hook `view-mode-hook'.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'view-file-other-frame "view" "\
View FILE in View mode in another frame.
When done, kill the buffer visiting FILE if unmodified and if it wasn't
@@ -34333,7 +34306,7 @@ For a list of all View commands, type H or h while viewing.
This command runs the normal hook `view-mode-hook'.
-(fn FILE)" t nil)
+(fn FILE)" t)
(autoload 'view-buffer "view" "\
View BUFFER in View mode, returning to previous buffer when done.
Emacs commands editing the buffer contents are not available; instead, a
@@ -34357,7 +34330,7 @@ This function does not enable View mode if the buffer's major mode
has a `special' mode-class, because such modes usually have their
own View-like bindings.
-(fn BUFFER &optional EXIT-ACTION)" t nil)
+(fn BUFFER &optional EXIT-ACTION)" t)
(autoload 'view-buffer-other-window "view" "\
View BUFFER in View mode in another window.
Emacs commands editing the buffer contents are not available;
@@ -34378,7 +34351,7 @@ This function does not enable View mode if the buffer's major mode
has a `special' mode-class, because such modes usually have their
own View-like bindings.
-(fn BUFFER &optional NOT-RETURN EXIT-ACTION)" t nil)
+(fn BUFFER &optional NOT-RETURN EXIT-ACTION)" t)
(autoload 'view-buffer-other-frame "view" "\
View BUFFER in View mode in another frame.
Emacs commands editing the buffer contents are not available;
@@ -34399,7 +34372,7 @@ This function does not enable View mode if the buffer's major mode
has a `special' mode-class, because such modes usually have their
own View-like bindings.
-(fn BUFFER &optional NOT-RETURN EXIT-ACTION)" t nil)
+(fn BUFFER &optional NOT-RETURN EXIT-ACTION)" t)
(autoload 'view-mode "view" "\
Toggle View mode, a minor mode for viewing text but not editing it.
@@ -34494,7 +34467,7 @@ evaluate `view-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'view-mode-enter "view" "\
Enter View mode and set up exit from view mode depending on optional arguments.
Optional argument QUIT-RESTORE if non-nil must specify a valid
@@ -34510,21 +34483,21 @@ For a list of all View commands, type H or h while viewing.
This function runs the normal hook `view-mode-hook'.
-(fn &optional QUIT-RESTORE EXIT-ACTION)" nil nil)
+(fn &optional QUIT-RESTORE EXIT-ACTION)")
(autoload 'View-exit-and-edit "view" "\
-Exit View mode and make the current buffer editable." t nil)
+Exit View mode and make the current buffer editable." t)
(register-definition-prefixes "view" '("View-" "view-"))
;;; Generated autoloads from emulation/viper.el
-(push (purecopy '(viper 3 14 1)) package--builtin-versions)
+(push (purecopy '(viper 3 14 2)) package--builtin-versions)
(autoload 'toggle-viper-mode "viper" "\
Toggle Viper on/off.
-If Viper is enabled, turn it off. Otherwise, turn it on." t nil)
+If Viper is enabled, turn it off. Otherwise, turn it on." t)
(autoload 'viper-mode "viper" "\
-Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Top'." t nil)
-(register-definition-prefixes "viper" '("set-viper-state-in-major-mode" "this-major-mode-requires-vi-state" "viper-"))
+Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Top'." t)
+(register-definition-prefixes "viper" '("viper-"))
;;; Generated autoloads from emulation/viper-cmd.el
@@ -34544,7 +34517,7 @@ Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Top'." t nil)
;;; Generated autoloads from emulation/viper-keym.el
-(register-definition-prefixes "viper-keym" '("ex-read-filename-map" "viper-"))
+(register-definition-prefixes "viper-keym" '("viper-"))
;;; Generated autoloads from emulation/viper-macs.el
@@ -34639,7 +34612,7 @@ disable automatic display of the warning or disable the warning
entirely by setting `warning-suppress-types' or
`warning-suppress-log-types' on their behalf.
-(fn TYPE MESSAGE &optional LEVEL BUFFER-NAME)" nil nil)
+(fn TYPE MESSAGE &optional LEVEL BUFFER-NAME)")
(autoload 'lwarn "warnings" "\
Display a warning message made from (format-message MESSAGE ARGS...).
\\<special-mode-map>
@@ -34660,15 +34633,15 @@ LEVEL should be either :debug, :warning, :error, or :emergency
:warning -- suspicious data or circumstances.
:debug -- info for debugging only.
-(fn TYPE LEVEL MESSAGE &rest ARGS)" nil nil)
+(fn TYPE LEVEL MESSAGE &rest ARGS)")
(autoload 'warn "warnings" "\
Display a warning message made from (format-message MESSAGE ARGS...).
Aside from generating the message with `format-message',
this is equivalent to `display-warning', using
`emacs' as the type and `:warning' as the level.
-(fn MESSAGE &rest ARGS)" nil nil)
-(register-definition-prefixes "warnings" '("warning-"))
+(fn MESSAGE &rest ARGS)")
+(register-definition-prefixes "warnings" '("warning"))
;;; Generated autoloads from wdired.el
@@ -34681,7 +34654,7 @@ buffer, the target of the links, and the permission bits of the
files. After typing \\[wdired-finish-edit], Emacs modifies the files and
directories to reflect your edits.
-See `wdired-mode'." t nil)
+See `wdired-mode'." t)
(register-definition-prefixes "wdired" '("wdired-"))
@@ -34694,7 +34667,7 @@ See the documentation for the `webjump-sites' variable for how to customize the
hotlist.
Please submit bug reports and other feedback to the author, Neil W. Van Dyke
-<nwv@acm.org>." t nil)
+<nwv@acm.org>." t)
(register-definition-prefixes "webjump" '("webjump-"))
@@ -34731,7 +34704,7 @@ evaluate `(default-value \\='which-function-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "which-func" '("which-func"))
@@ -34761,7 +34734,7 @@ evaluate `whitespace-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'whitespace-newline-mode "whitespace" "\
Toggle newline visualization (Whitespace Newline mode).
@@ -34787,7 +34760,7 @@ evaluate `whitespace-newline-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar global-whitespace-mode nil "\
Non-nil if Global Whitespace mode is enabled.
See the `global-whitespace-mode' command
@@ -34817,7 +34790,7 @@ evaluate `(default-value \\='global-whitespace-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar global-whitespace-newline-mode nil "\
Non-nil if Global Whitespace-Newline mode is enabled.
See the `global-whitespace-newline-mode' command
@@ -34851,7 +34824,7 @@ evaluate `(default-value \\='global-whitespace-newline-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'whitespace-toggle-options "whitespace" "\
Toggle local `whitespace-mode' options.
@@ -34922,7 +34895,7 @@ The valid symbols are:
See `whitespace-style' and `indent-tabs-mode' for documentation.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'global-whitespace-toggle-options "whitespace" "\
Toggle global `whitespace-mode' options.
@@ -34995,7 +34968,7 @@ The valid symbols are:
See `whitespace-style' and `indent-tabs-mode' for documentation.
-(fn ARG)" t nil)
+(fn ARG)" t)
(autoload 'whitespace-cleanup "whitespace" "\
Cleanup some blank problems in all buffer or at region.
@@ -35047,7 +35020,7 @@ The problems cleaned up are:
`space-after-tab::space', replace TABs by SPACEs.
See `whitespace-style', `indent-tabs-mode' and `tab-width' for
-documentation." t nil)
+documentation." t)
(autoload 'whitespace-cleanup-region "whitespace" "\
Cleanup some blank problems at region.
@@ -35088,13 +35061,13 @@ The problems cleaned up are:
See `whitespace-style', `indent-tabs-mode' and `tab-width' for
documentation.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'whitespace-report "whitespace" "\
Report some whitespace problems in buffer.
Perform `whitespace-report-region' on the current buffer.
-(fn &optional FORCE REPORT-IF-BOGUS)" t nil)
+(fn &optional FORCE REPORT-IF-BOGUS)" t)
(autoload 'whitespace-report-region "whitespace" "\
Report some whitespace problems in a region.
@@ -35132,7 +35105,7 @@ See `whitespace-style' for documentation.
See also `whitespace-cleanup' and `whitespace-cleanup-region' for
cleaning up these problems.
-(fn START END &optional FORCE REPORT-IF-BOGUS)" t nil)
+(fn START END &optional FORCE REPORT-IF-BOGUS)" t)
(register-definition-prefixes "whitespace" '("whitespace-"))
@@ -35141,15 +35114,15 @@ cleaning up these problems.
(autoload 'widget-browse-at "wid-browse" "\
Browse the widget under point.
-(fn POS)" t nil)
+(fn POS)" t)
(autoload 'widget-browse "wid-browse" "\
Create a widget browser for WIDGET.
-(fn WIDGET)" t nil)
+(fn WIDGET)" t)
(autoload 'widget-browse-other-window "wid-browse" "\
Show widget browser for WIDGET in other window.
-(fn &optional WIDGET)" t nil)
+(fn &optional WIDGET)" t)
(autoload 'widget-minor-mode "wid-browse" "\
Minor mode for traversing widgets.
@@ -35167,7 +35140,7 @@ evaluate `widget-minor-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "wid-browse" '("widget-"))
@@ -35176,36 +35149,36 @@ it is disabled.
(autoload 'widgetp "wid-edit" "\
Return non-nil if WIDGET is a widget.
-(fn WIDGET)" nil nil)
+(fn WIDGET)")
(autoload 'widget-prompt-value "wid-edit" "\
Prompt for a value matching WIDGET, using PROMPT.
The current value is assumed to be VALUE, unless UNBOUND is non-nil.
-(fn WIDGET PROMPT &optional VALUE UNBOUND)" nil nil)
+(fn WIDGET PROMPT &optional VALUE UNBOUND)")
(autoload 'widget-create "wid-edit" "\
Create widget of TYPE.
The optional ARGS are additional keyword arguments.
-(fn TYPE &rest ARGS)" nil nil)
+(fn TYPE &rest ARGS)")
(autoload 'widget-delete "wid-edit" "\
Delete WIDGET.
-(fn WIDGET)" nil nil)
+(fn WIDGET)")
(autoload 'widget-convert "wid-edit" "\
Convert TYPE to a widget without inserting it in the buffer.
The optional ARGS are additional keyword arguments.
-(fn TYPE &rest ARGS)" nil nil)
+(fn TYPE &rest ARGS)")
(autoload 'widget-insert "wid-edit" "\
Call `insert' with ARGS even if surrounding text is read only.
-(fn &rest ARGS)" nil nil)
+(fn &rest ARGS)")
(defvar widget-keymap (let ((map (make-sparse-keymap))) (define-key map "\11" 'widget-forward) (define-key map "\33\11" 'widget-backward) (define-key map [(shift tab)] 'widget-backward) (put 'widget-backward :advertised-binding [(shift tab)]) (define-key map [backtab] 'widget-backward) (define-key map [down-mouse-2] 'widget-button-click) (define-key map [down-mouse-1] 'widget-button-click) (define-key map [(control 109)] 'widget-button-press) map) "\
Keymap containing useful binding for buffers containing widgets.
Recommended as a parent keymap for modes using widgets.
Note that such modes will need to require wid-edit.")
(autoload 'widget-setup "wid-edit" "\
-Setup current buffer so editing string widgets works." nil nil)
+Setup current buffer so editing string widgets works.")
(register-definition-prefixes "wid-edit" '("widget-"))
@@ -35220,7 +35193,7 @@ it is relative to the top edge (for positive ARG) or the bottom edge
If no window is at the desired location, an error is signaled
unless `windmove-create-window' is non-nil and a new window is created.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-up "windmove" "\
Select the window above the current one.
With no prefix argument, or with prefix argument equal to zero, \"up\"
@@ -35230,7 +35203,7 @@ negative ARG) of the current window.
If no window is at the desired location, an error is signaled
unless `windmove-create-window' is non-nil and a new window is created.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-right "windmove" "\
Select the window to the right of the current one.
With no prefix argument, or with prefix argument equal to zero,
@@ -35240,7 +35213,7 @@ bottom edge (for negative ARG) of the current window.
If no window is at the desired location, an error is signaled
unless `windmove-create-window' is non-nil and a new window is created.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-down "windmove" "\
Select the window below the current one.
With no prefix argument, or with prefix argument equal to zero,
@@ -35250,7 +35223,7 @@ it is relative to the left edge (for positive ARG) or the right edge
If no window is at the desired location, an error is signaled
unless `windmove-create-window' is non-nil and a new window is created.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(defvar windmove-mode t "\
Non-nil if Windmove mode is enabled.
See the `windmove-mode' command
@@ -35273,7 +35246,7 @@ evaluate `(default-value \\='windmove-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-default-keybindings "windmove" "\
Set up keybindings for `windmove'.
Keybindings are of the form MODIFIERS-{left,right,up,down},
@@ -35282,43 +35255,43 @@ If MODIFIERS is `none', the keybindings will be directly bound to
the arrow keys.
Default value of MODIFIERS is `shift'.
-(fn &optional MODIFIERS)" t nil)
+(fn &optional MODIFIERS)" t)
(autoload 'windmove-display-left "windmove" "\
Display the next buffer in window to the left of the current one.
See the logic of the prefix ARG and `windmove-display-no-select'
in `windmove-display-in-direction'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-display-up "windmove" "\
Display the next buffer in window above the current one.
See the logic of the prefix ARG and `windmove-display-no-select'
in `windmove-display-in-direction'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-display-right "windmove" "\
Display the next buffer in window to the right of the current one.
See the logic of the prefix ARG and `windmove-display-no-select'
in `windmove-display-in-direction'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-display-down "windmove" "\
Display the next buffer in window below the current one.
See the logic of the prefix ARG and `windmove-display-no-select'
in `windmove-display-in-direction'.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-display-same-window "windmove" "\
Display the next buffer in the same window.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-display-new-frame "windmove" "\
Display the next buffer in a new frame.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-display-new-tab "windmove" "\
Display the next buffer in a new tab.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-display-default-keybindings "windmove" "\
Set up keybindings for directional buffer display.
Keys are bound to commands that display the next buffer in the specified
@@ -35328,31 +35301,31 @@ If MODIFIERS is `none', the keybindings will be directly bound to
the arrow keys.
Default value of MODIFIERS is `shift-meta'.
-(fn &optional MODIFIERS)" t nil)
+(fn &optional MODIFIERS)" t)
(autoload 'windmove-delete-left "windmove" "\
Delete the window to the left of the current one.
If prefix ARG is \\[universal-argument], delete the selected window and
select the window that was to the left of the current one.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-delete-up "windmove" "\
Delete the window above the current one.
If prefix ARG is \\[universal-argument], delete the selected window and
select the window that was above the current one.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-delete-right "windmove" "\
Delete the window to the right of the current one.
If prefix ARG is \\[universal-argument], delete the selected window and
select the window that was to the right of the current one.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-delete-down "windmove" "\
Delete the window below the current one.
If prefix ARG is \\[universal-argument], delete the selected window and
select the window that was below the current one.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(autoload 'windmove-delete-default-keybindings "windmove" "\
Set up keybindings for directional window deletion.
Keys are bound to commands that delete windows in the specified
@@ -35363,15 +35336,15 @@ If PREFIX is `none', no prefix is used. If MODIFIERS is `none',
the keybindings are directly bound to the arrow keys.
Default value of PREFIX is \\`C-x' and MODIFIERS is `shift'.
-(fn &optional PREFIX MODIFIERS)" t nil)
+(fn &optional PREFIX MODIFIERS)" t)
(autoload 'windmove-swap-states-left "windmove" "\
-Swap the states with the window on the left from the current one." t nil)
+Swap the states with the window on the left from the current one." t)
(autoload 'windmove-swap-states-up "windmove" "\
-Swap the states with the window above from the current one." t nil)
+Swap the states with the window above from the current one." t)
(autoload 'windmove-swap-states-down "windmove" "\
-Swap the states with the window below from the current one." t nil)
+Swap the states with the window below from the current one." t)
(autoload 'windmove-swap-states-right "windmove" "\
-Swap the states with the window on the right from the current one." t nil)
+Swap the states with the window on the right from the current one." t)
(autoload 'windmove-swap-states-default-keybindings "windmove" "\
Set up keybindings for directional window swap states.
Keys are bound to commands that swap the states of the selected window
@@ -35382,7 +35355,7 @@ If MODIFIERS is `none', the keybindings will be directly bound to the
arrow keys.
Default value of MODIFIERS is `shift-super'.
-(fn &optional MODIFIERS)" t nil)
+(fn &optional MODIFIERS)" t)
(register-definition-prefixes "windmove" '("windmove-"))
@@ -35420,7 +35393,7 @@ evaluate `(default-value \\='winner-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "winner" '("winner-"))
@@ -35454,9 +35427,9 @@ updated (e.g. to re-interpret the current directory).
Used non-interactively, arguments are optional: if given then TOPIC
should be a topic string and non-nil RE-CACHE forces re-caching.
-(fn &optional TOPIC RE-CACHE)" t nil)
+(fn &optional TOPIC RE-CACHE)" t)
(autoload 'woman-dired-find-file "woman" "\
-In dired, run the WoMan man-page browser on this file." t nil)
+In dired, run the WoMan man-page browser on this file." t)
(autoload 'woman-find-file "woman" "\
Find, decode and browse a specific UN*X man-page source file FILE-NAME.
Use existing buffer if possible; reformat only if prefix arg given.
@@ -35466,12 +35439,12 @@ No external programs are used, except that `gunzip' will be used to
decompress the file if appropriate. See the documentation for the
`woman' command for further details.
-(fn FILE-NAME &optional REFORMAT)" t nil)
+(fn FILE-NAME &optional REFORMAT)" t)
(autoload 'woman-bookmark-jump "woman" "\
Default bookmark handler for Woman buffers.
-(fn BOOKMARK)" nil nil)
-(register-definition-prefixes "woman" '("WoMan-" "menu-bar-manuals-menu" "set-woman-file-regexp" "woman"))
+(fn BOOKMARK)")
+(register-definition-prefixes "woman" '("WoMan-" "woman"))
;;; Generated autoloads from textmodes/word-wrap-mode.el
@@ -35496,7 +35469,7 @@ evaluate `word-wrap-whitespace-mode'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(put 'global-word-wrap-whitespace-mode 'globalized-minor-mode t)
(defvar global-word-wrap-whitespace-mode nil "\
Non-nil if Global Word-Wrap-Whitespace mode is enabled.
@@ -35521,7 +35494,7 @@ Word-Wrap-Whitespace mode is enabled in all buffers where
See `word-wrap-whitespace-mode' for more information on
Word-Wrap-Whitespace mode.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "word-wrap-mode" '("word-wrap-whitespace-characters"))
@@ -35558,7 +35531,7 @@ Both features can be combined by providing a cons cell
(symbol-qnames . ALIST).
-(fn FILE &optional PARSE-DTD PARSE-NS)" nil nil)
+(fn FILE &optional PARSE-DTD PARSE-NS)")
(autoload 'xml-parse-region "xml" "\
Parse the region from BEG to END in BUFFER.
Return the XML parse tree, or raise an error if the region does
@@ -35585,12 +35558,12 @@ Both features can be combined by providing a cons cell
(symbol-qnames . ALIST).
-(fn &optional BEG END BUFFER PARSE-DTD PARSE-NS)" nil nil)
+(fn &optional BEG END BUFFER PARSE-DTD PARSE-NS)")
(autoload 'xml-remove-comments "xml" "\
Remove XML/HTML comments in the region between BEG and END.
All text between the <!-- ... --> markers will be removed.
-(fn BEG END)" nil nil)
+(fn BEG END)")
(register-definition-prefixes "xml" '("xml-"))
@@ -35607,30 +35580,30 @@ If there is XML that is not well-formed that looks like an XML
declaration, return nil. Otherwise, return t.
If LIMIT is non-nil, then do not consider characters beyond LIMIT.
-(fn &optional LIMIT)" nil nil)
+(fn &optional LIMIT)")
(register-definition-prefixes "xmltok" '("xmltok-"))
;;; Generated autoloads from progmodes/xref.el
-(push (purecopy '(xref 1 4 1)) package--builtin-versions)
-(autoload 'xref-find-backend "xref" nil nil nil)
+(push (purecopy '(xref 1 5 0)) package--builtin-versions)
+(autoload 'xref-find-backend "xref")
(define-obsolete-function-alias 'xref-pop-marker-stack #'xref-go-back "29.1")
(autoload 'xref-go-back "xref" "\
Go back to the previous position in xref history.
-To undo, use \\[xref-go-forward]." t nil)
+To undo, use \\[xref-go-forward]." t)
(autoload 'xref-go-forward "xref" "\
-Got to the point where a previous \\[xref-go-back] was invoked." t nil)
+Got to the point where a previous \\[xref-go-back] was invoked." t)
(autoload 'xref-marker-stack-empty-p "xref" "\
-Whether the xref back-history is empty." nil nil)
+Whether the xref back-history is empty.")
(autoload 'xref-forward-history-empty-p "xref" "\
-Whether the xref forward-history is empty." nil nil)
+Whether the xref forward-history is empty.")
(autoload 'xref-show-xrefs "xref" "\
Display some Xref values produced by FETCHER using DISPLAY-ACTION.
The meanings of both arguments are the same as documented in
`xref-show-xrefs-function'.
-(fn FETCHER DISPLAY-ACTION)" nil nil)
+(fn FETCHER DISPLAY-ACTION)")
(autoload 'xref-find-definitions "xref" "\
Find the definition of the identifier at point.
With prefix argument or when there's no identifier at point,
@@ -35643,15 +35616,15 @@ buffer where the user can select from the list.
Use \\[xref-go-back] to return back to where you invoked this command.
-(fn IDENTIFIER)" t nil)
+(fn IDENTIFIER)" t)
(autoload 'xref-find-definitions-other-window "xref" "\
Like `xref-find-definitions' but switch to the other window.
-(fn IDENTIFIER)" t nil)
+(fn IDENTIFIER)" t)
(autoload 'xref-find-definitions-other-frame "xref" "\
Like `xref-find-definitions' but switch to the other frame.
-(fn IDENTIFIER)" t nil)
+(fn IDENTIFIER)" t)
(autoload 'xref-find-references "xref" "\
Find references to the identifier at point.
This command might prompt for the identifier as needed, perhaps
@@ -35660,24 +35633,24 @@ With prefix argument, or if `xref-prompt-for-identifier' is t,
always prompt for the identifier. If `xref-prompt-for-identifier'
is nil, prompt only if there's no usable symbol at point.
-(fn IDENTIFIER)" t nil)
+(fn IDENTIFIER)" t)
(autoload 'xref-find-definitions-at-mouse "xref" "\
Find the definition of identifier at or around mouse click.
This command is intended to be bound to a mouse event.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(autoload 'xref-find-references-at-mouse "xref" "\
Find references to the identifier at or around mouse click.
This command is intended to be bound to a mouse event.
-(fn EVENT)" t nil)
+(fn EVENT)" t)
(autoload 'xref-find-apropos "xref" "\
Find all meaningful symbols that match PATTERN.
The argument has the same meaning as in `apropos'.
See `tags-apropos-additional-actions' for how to augment the
output of this command when the backend is etags.
-(fn PATTERN)" t nil)
+(fn PATTERN)" t)
(define-key esc-map "." #'xref-find-definitions)
(define-key esc-map "," #'xref-go-back)
(define-key esc-map [?\C-,] #'xref-go-forward)
@@ -35693,7 +35666,7 @@ This function uses the Semantic Symbol Reference API, see
`semantic-symref-tool-alist' for details on which tools are used,
and when.
-(fn SYMBOL DIR)" nil nil)
+(fn SYMBOL DIR)")
(autoload 'xref-matches-in-directory "xref" "\
Find all matches for REGEXP in directory DIR.
Return a list of xref values.
@@ -35701,7 +35674,7 @@ Only files matching some of FILES and none of IGNORES are searched.
FILES is a string with glob patterns separated by spaces.
IGNORES is a list of glob patterns for files to ignore.
-(fn REGEXP FILES DIR IGNORES)" nil nil)
+(fn REGEXP FILES DIR IGNORES)")
(autoload 'xref-matches-in-files "xref" "\
Find all matches for REGEXP in FILES.
Return a list of xref values.
@@ -35710,13 +35683,13 @@ FILES must be a list of absolute file names.
See `xref-search-program' and `xref-search-program-alist' for how
to control which program to use when looking for matches.
-(fn REGEXP FILES)" nil nil)
+(fn REGEXP FILES)")
(register-definition-prefixes "xref" '("xref-"))
;;; Generated autoloads from progmodes/xscheme.el
-(register-definition-prefixes "xscheme" '("default-xscheme-runlight" "exit-scheme-interaction-mode" "global-set-scheme-interaction-buffer" "local-" "reset-scheme" "run-scheme" "scheme-" "start-scheme" "verify-xscheme-buffer" "xscheme-"))
+(register-definition-prefixes "xscheme" '("exit-scheme-interaction-mode" "global-set-scheme-interaction-buffer" "local-" "reset-scheme" "run-scheme" "scheme-" "start-scheme" "xscheme-"))
;;; Generated autoloads from nxml/xsd-regexp.el
@@ -35758,7 +35731,7 @@ evaluate `(default-value \\='xterm-mouse-mode)'.
The mode's hook is called both when the mode is enabled and when
it is disabled.
-(fn &optional ARG)" t nil)
+(fn &optional ARG)" t)
(register-definition-prefixes "xt-mouse" '("turn-o" "xt-mouse-epoch" "xterm-mouse-"))
@@ -35769,13 +35742,13 @@ Ask xwidget-webkit to browse URL.
NEW-SESSION specifies whether to create a new xwidget-webkit session.
Interactively, URL defaults to the string looking like a url around point.
-(fn URL &optional NEW-SESSION)" t nil)
+(fn URL &optional NEW-SESSION)" t)
(autoload 'xwidget-webkit-bookmark-jump-handler "xwidget" "\
Jump to the web page bookmarked by the bookmark record BOOKMARK.
If `xwidget-webkit-bookmark-jump-new-session' is non-nil, create
a new xwidget-webkit session, otherwise use an existing session.
-(fn BOOKMARK)" nil nil)
+(fn BOOKMARK)")
(register-definition-prefixes "xwidget" '("xwidget-"))
@@ -35788,7 +35761,7 @@ accepting the media type. The mode has to register itself using
the `yank-media-handler' mechanism.
Also see `yank-media-types' for a command that lets you explore
-all the different selection types." t nil)
+all the different selection types." t)
(autoload 'yank-media-handler "yank-media" "\
Register HANDLER for dealing with `yank-media' actions for TYPES.
TYPES should be a MIME media type symbol, a regexp, or a list
@@ -35798,7 +35771,7 @@ HANDLER is a function that will be called with two arguments: The
MIME type (a symbol on the form `image/png') and the selection
data (a string).
-(fn TYPES HANDLER)" nil nil)
+(fn TYPES HANDLER)")
(register-definition-prefixes "yank-media" '("yank-media-"))
@@ -35807,9 +35780,9 @@ data (a string).
(autoload 'yenc-decode-region "yenc" "\
Yenc decode region between START and END using an internal decoder.
-(fn START END)" t nil)
+(fn START END)" t)
(autoload 'yenc-extract-filename "yenc" "\
-Extract file name from an yenc header." nil nil)
+Extract file name from an yenc header.")
(register-definition-prefixes "yenc" '("yenc-"))
@@ -35821,7 +35794,7 @@ Extract file name from an yenc header." nil nil)
;;; Generated autoloads from play/zone.el
(autoload 'zone "zone" "\
-Zone out, completely." t nil)
+Zone out, completely." t)
(register-definition-prefixes "zone" '("zone-"))
;;; End of scraped data
@@ -35829,8 +35802,8 @@ Zone out, completely." t nil)
(provide 'loaddefs)
;; Local Variables:
-;; version-control: never
;; no-byte-compile: t
+;; version-control: never
;; no-update-autoloads: t
;; coding: utf-8-emacs-unix
;; End:
diff --git a/lisp/leim/quail/hangul.el b/lisp/leim/quail/hangul.el
index 0ef5b2d5c72..83fee1e04c3 100644
--- a/lisp/leim/quail/hangul.el
+++ b/lisp/leim/quail/hangul.el
@@ -103,9 +103,10 @@
(make-vector 6 0))
(defsubst notzerop (number)
+ (declare (obsolete "use `(not (zerop ...))'." "29.1"))
(not (zerop number)))
-(defsubst alphabetp (char)
+(defsubst hangul-alphabetp (char)
(or (and (>= char ?A) (<= char ?Z))
(and (>= char ?a) (<= char ?z))))
@@ -191,10 +192,10 @@ and insert CHAR to new `hangul-queue'."
(aset hangul-queue 0 char))
((and (zerop (aref hangul-queue 1))
(zerop (aref hangul-queue 2))
- (notzerop (hangul-djamo 'cho (aref hangul-queue 0) char)))
+ (not (zerop (hangul-djamo 'cho (aref hangul-queue 0) char))))
(aset hangul-queue 1 char))
((and (zerop (aref hangul-queue 4))
- (notzerop (aref hangul-queue 2))
+ (not (zerop (aref hangul-queue 2)))
(/= char 8)
(/= char 19)
(/= char 25)
@@ -213,7 +214,7 @@ and insert CHAR to new `hangul-queue'."
char)))
(aset hangul-queue 4 char))
((and (zerop (aref hangul-queue 5))
- (notzerop (hangul-djamo 'jong (aref hangul-queue 4) char))
+ (not (zerop (hangul-djamo 'jong (aref hangul-queue 4) char)))
(numberp
(hangul-character
(+ (aref hangul-queue 0)
@@ -246,14 +247,14 @@ Other parts are the same as a `hangul2-input-method-jaum'."
(aset hangul-queue 2 char))
((and (zerop (aref hangul-queue 3))
(zerop (aref hangul-queue 4))
- (notzerop (hangul-djamo 'jung (aref hangul-queue 2) char)))
+ (not (zerop (hangul-djamo 'jung (aref hangul-queue 2) char))))
(aset hangul-queue 3 char)))
(hangul-insert-character hangul-queue)
(let ((next-char (vector 0 0 char 0 0 0)))
- (cond ((notzerop (aref hangul-queue 5))
+ (cond ((not (zerop (aref hangul-queue 5)))
(aset next-char 0 (aref hangul-queue 5))
(aset hangul-queue 5 0))
- ((notzerop (aref hangul-queue 4))
+ ((not (zerop (aref hangul-queue 4)))
(aset next-char 0 (aref hangul-queue 4))
(aset hangul-queue 4 0)))
(hangul-insert-character hangul-queue
@@ -271,7 +272,7 @@ Other parts are the same as a `hangul2-input-method-jaum'."
(aset hangul-queue 0 char))
((and (zerop (aref hangul-queue 1))
(zerop (aref hangul-queue 2))
- (notzerop (hangul-djamo 'cho (aref hangul-queue 0) char)))
+ (not (zerop (hangul-djamo 'cho (aref hangul-queue 0) char))))
(aset hangul-queue 1 char)))
(hangul-insert-character hangul-queue)
(hangul-insert-character hangul-queue
@@ -287,7 +288,7 @@ Other parts are the same as a `hangul3-input-method-cho'."
(zerop (aref hangul-queue 4)))
(aset hangul-queue 2 char))
((and (zerop (aref hangul-queue 3))
- (notzerop (hangul-djamo 'jung (aref hangul-queue 2) char)))
+ (not (zerop (hangul-djamo 'jung (aref hangul-queue 2) char))))
(aset hangul-queue 3 char)))
(hangul-insert-character hangul-queue)
(hangul-insert-character hangul-queue
@@ -300,8 +301,8 @@ This function processes a Hangul 3-Bulsik Jongseong.
The Jongseong can be located in a Jongseong position.
Other parts are the same as a `hangul3-input-method-cho'."
(if (cond ((and (zerop (aref hangul-queue 4))
- (notzerop (aref hangul-queue 0))
- (notzerop (aref hangul-queue 2))
+ (not (zerop (aref hangul-queue 0)))
+ (not (zerop (aref hangul-queue 2)))
(numberp
(hangul-character
(+ (aref hangul-queue 0)
@@ -317,7 +318,7 @@ Other parts are the same as a `hangul3-input-method-cho'."
char)))
(aset hangul-queue 4 char))
((and (zerop (aref hangul-queue 5))
- (notzerop (hangul-djamo 'jong (aref hangul-queue 4) char))
+ (not (zerop (hangul-djamo 'jong (aref hangul-queue 4) char)))
(numberp
(hangul-character
(+ (aref hangul-queue 0)
@@ -349,7 +350,7 @@ Other parts are the same as a `hangul3-input-method-cho'."
(while (and (> i 0) (zerop (aref hangul-queue i)))
(setq i (1- i)))
(aset hangul-queue i 0))
- (if (notzerop (apply #'+ (append hangul-queue nil)))
+ (if (not (zerop (apply #'+ (append hangul-queue nil))))
(hangul-insert-character hangul-queue)
(delete-char -1)))
@@ -388,7 +389,7 @@ When a Korean input method is off, convert the following hangul character."
(defun hangul2-input-method (key)
"2-Bulsik input method."
- (if (or buffer-read-only (not (alphabetp key)))
+ (if (or buffer-read-only (not (hangul-alphabetp key)))
(list key)
(quail-setup-overlays nil)
(let ((input-method-function nil)
@@ -405,7 +406,7 @@ When a Korean input method is off, convert the following hangul character."
(cond ((and (stringp seq)
(= 1 (length seq))
(setq key (aref seq 0))
- (alphabetp key))
+ (hangul-alphabetp key))
(hangul2-input-method-internal key))
((commandp cmd)
(call-interactively cmd))
@@ -546,6 +547,8 @@ HELP-TEXT is a text set in `hangul-input-method-help-text'."
(with-output-to-temp-buffer "*Help*"
(princ hangul-input-method-help-text)))
+(define-obsolete-function-alias 'alphabetp 'hangul-alphabetp "29.1")
+
(provide 'hangul)
;; Local Variables:
diff --git a/lisp/leim/quail/indian.el b/lisp/leim/quail/indian.el
index e652f108dde..431d8369c1e 100644
--- a/lisp/leim/quail/indian.el
+++ b/lisp/leim/quail/indian.el
@@ -702,7 +702,7 @@ is."
;; Probhat Input Method
(quail-define-package
"bengali-probhat" "Bengali" "BngPB" t
- "Probhat keyboard for Bengali/Bangla" nil t nil nil nil nil nil nil nil nil t)
+ "Probhat keyboard for Bengali/Bangla" nil t nil t t nil nil nil nil nil t)
(quail-define-rules
("!" ?!)
diff --git a/lisp/loadhist.el b/lisp/loadhist.el
index 39481ab0684..b4ed0432465 100644
--- a/lisp/loadhist.el
+++ b/lisp/loadhist.el
@@ -128,7 +128,7 @@ from a file."
font-lock-unfontify-region-function
kill-buffer-query-functions kill-emacs-query-functions
lisp-indent-function mouse-position-function
- redisplay-end-trigger-functions suspend-tty-functions
+ suspend-tty-functions
temp-buffer-show-function window-scroll-functions
window-size-change-functions write-contents-functions
write-file-functions write-region-annotate-functions)
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 21a87dbd77b..17e82cc0c49 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -32,9 +32,6 @@
;; If you add a file to be loaded here, keep the following points in mind:
;; i) If the file is no-byte-compile, explicitly load the .el version.
-;; Such files should (where possible) obey the doc-string conventions
-;; expected by make-docfile. They should also be added to the
-;; uncompiled[] list in make-docfile.c.
;; ii) If the file is dumped with Emacs (on any platform), put the
;; load statement at the start of a line (leading whitespace is ok).
@@ -42,11 +39,9 @@
;; iii) If the file is _not_ dumped with Emacs, make sure the load
;; statement is _not_ at the start of a line. See pcase for an example.
-;; These rules are so that src/Makefile can construct lisp.mk automatically.
-;; This ensures both that the Lisp files are compiled (if necessary)
-;; before the emacs executable is dumped, and that they are passed to
-;; make-docfile. (Any that are not processed for DOC will not have
-;; doc strings in the dumped Emacs.)
+;; These rules are so that src/Makefile can construct lisp.mk
+;; automatically. This ensures that the Lisp files are compiled (if
+;; necessary) before the emacs executable is dumped.
;;; Code:
@@ -159,8 +154,7 @@
;; Load-time macro-expansion can only take effect after setting
;; load-source-file-function because of where it is called in lread.c.
(load "emacs-lisp/macroexp")
-(if (or (byte-code-function-p (symbol-function 'macroexpand-all))
- (subr-native-elisp-p (symbol-function 'macroexpand-all)))
+(if (compiled-function-p (symbol-function 'macroexpand-all))
nil
;; Since loaddefs is not yet loaded, macroexp's uses of pcase will simply
;; fail until pcase is explicitly loaded. This also means that we have to
@@ -185,9 +179,10 @@
;; should be updated by overwriting it with an up-to-date copy of
;; loaddefs.el that is not corrupted by local changes.
;; admin/update_autogen can be used to update ldefs-boot.el periodically.
-(condition-case nil (load "loaddefs.el")
- ;; In case loaddefs hasn't been generated yet.
- (file-error (load "ldefs-boot.el")))
+(condition-case nil
+ (load "loaddefs")
+ (file-error
+ (load "ldefs-boot.el")))
(let ((new (make-hash-table :test #'equal)))
;; Now that loaddefs has populated definition-prefixes, purify its contents.
diff --git a/lisp/ls-lisp.el b/lisp/ls-lisp.el
index 6d1f449568a..3e50b0dcc87 100644
--- a/lisp/ls-lisp.el
+++ b/lisp/ls-lisp.el
@@ -100,14 +100,6 @@ update the dependent variables."
(ls-lisp-set-options)))
:group 'ls-lisp)
-;; Only made an obsolete alias in 23.3. Before that, the initial
-;; value was set according to:
-;; (or (memq ls-lisp-emulation '(MS-Windows MacOS))
-;; (and (boundp 'ls-lisp-dired-ignore-case) ls-lisp-dired-ignore-case))
-;; Which isn't the right thing to do.
-(define-obsolete-variable-alias 'ls-lisp-dired-ignore-case
- 'ls-lisp-ignore-case "21.1")
-
(defcustom ls-lisp-ignore-case
(memq ls-lisp-emulation '(MS-Windows MacOS))
"Non-nil causes ls-lisp alphabetic sorting to ignore case."
diff --git a/lisp/mail/binhex.el b/lisp/mail/binhex.el
index ad6ce19a958..93dd8697bd7 100644
--- a/lisp/mail/binhex.el
+++ b/lisp/mail/binhex.el
@@ -23,9 +23,13 @@
;;; Commentary:
;; BinHex is a binary-to-text encoding scheme similar to uuencode.
+;; It was used on the classic Mac OS, last released in 2001.
+;;
;; The command `binhex-decode-region' decodes BinHex-encoded text, via
;; the external program "hexbin" if that is available, or an Emacs
;; Lisp implementation if not.
+;;
+;; See also: https://en.wikipedia.org/wiki/BinHex
;;; Code:
diff --git a/lisp/mail/feedmail.el b/lisp/mail/feedmail.el
index af12417f706..989a8b3cd67 100644
--- a/lisp/mail/feedmail.el
+++ b/lisp/mail/feedmail.el
@@ -211,14 +211,6 @@
;;
;;;;;;;;
;;
-;; I think the LCD is no longer being updated, but if it were, this
-;; would be a proper LCD record. There is an old version of
-;; feedmail.el in the LCD archive. It works but is missing a lot of
-;; features.
-;;
-;; LCD record:
-;; feedmail|WJCarpenter|bill-feedmail@carpenter.ORG|Outbound mail queue handling|01-??-??|11-beta-??|feedmail.el
-;;
;; Change log:
;; original, 31 March 1991
;; patchlevel 1, 5 April 1991
diff --git a/lisp/mail/footnote.el b/lisp/mail/footnote.el
index 29e16c419be..a594fa3ccb4 100644
--- a/lisp/mail/footnote.el
+++ b/lisp/mail/footnote.el
@@ -93,6 +93,7 @@ displaying footnotes."
(defcustom footnote-use-message-mode t ; Nowhere used.
"If non-nil, assume Footnoting will be done in `message-mode'."
:type 'boolean)
+(make-obsolete-variable 'footnote-use-message-mode "it does nothing." "29.1")
(defcustom footnote-body-tag-spacing 2
"Number of spaces separating a footnote body tag and its text.
@@ -839,22 +840,18 @@ being set it is automatically widened."
(when (looking-at (footnote--current-regexp))
(goto-char (match-end 0))))))
-(defvar footnote-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "a" #'footnote-add-footnote)
- (define-key map "b" #'footnote-back-to-message)
- (define-key map "c" #'footnote-cycle-style)
- (define-key map "d" #'footnote-delete-footnote)
- (define-key map "g" #'footnote-goto-footnote)
- (define-key map "r" #'footnote-renumber-footnotes)
- (define-key map "s" #'footnote-set-style)
- map))
-
-(defvar footnote-minor-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map footnote-prefix footnote-mode-map)
- map)
- "Keymap used for binding footnote minor mode.")
+(defvar-keymap footnote-mode-map
+ "a" #'footnote-add-footnote
+ "b" #'footnote-back-to-message
+ "c" #'footnote-cycle-style
+ "d" #'footnote-delete-footnote
+ "g" #'footnote-goto-footnote
+ "r" #'footnote-renumber-footnotes
+ "s" #'footnote-set-style)
+
+(defvar-keymap footnote-minor-mode-map
+ :doc "Keymap used for binding footnote minor mode."
+ (key-description footnote-prefix) footnote-mode-map)
(defmacro footnote--local-advice (mode variable function)
"Add advice to a variable holding buffer-local functions.
@@ -888,7 +885,6 @@ play around with the following keys:
(footnote--local-advice footnote-mode fill-paragraph-function
footnote--fill-paragraph)
(when footnote-mode
- ;; (footnote-setup-keybindings)
(make-local-variable 'footnote-style)
(make-local-variable 'footnote-body-tag-spacing)
(make-local-variable 'footnote-spaced-footnotes)
diff --git a/lisp/mail/ietf-drums.el b/lisp/mail/ietf-drums.el
index d1ad671b160..b7d96a1053d 100644
--- a/lisp/mail/ietf-drums.el
+++ b/lisp/mail/ietf-drums.el
@@ -189,6 +189,19 @@ the Content-Transfer-Encoding header of a mail."
(defun ietf-drums-parse-address (string &optional decode)
"Parse STRING and return a MAILBOX / DISPLAY-NAME pair.
+STRING here is supposed to be an RFC822(bis) mail address, and
+will commonly look like, for instance:
+
+ \"=?utf-8?Q?Andr=C3=A9?= <andre@example.com>\"
+
+If you have an already-decoded address, like
+
+ \"André <andre@example.com>\"
+
+this function can't be used to parse that. Instead, use
+`mail-header-parse-address-lax' to make a guess at what's the
+name and what's the address.
+
If DECODE, the DISPLAY-NAME will have RFC2047 decoding performed
(that's the \"=?utf...q...=?\") stuff."
(when decode
diff --git a/lisp/mail/mail-parse.el b/lisp/mail/mail-parse.el
index ec719850e2e..d28b8b58438 100644
--- a/lisp/mail/mail-parse.el
+++ b/lisp/mail/mail-parse.el
@@ -85,10 +85,10 @@ The return value is a list with mail/name pairs."
"Parse STRING as a mail address.
Returns a mail/name pair.
-This function will first try to parse STRING as a
-standards-compliant address string, and if that fails, try to use
-heuristics to determine the email address and the name in the
-string."
+This function uses heuristics to determine the email address and
+the name in the string. If you have an RFC822(bis)
+standards-compliant STRING, use `mail-header-parse-address'
+instead."
(with-temp-buffer
(insert (string-clean-whitespace string))
;; Find the bit with the @ and guess that that's the mail.
diff --git a/lisp/mail/mailabbrev.el b/lisp/mail/mailabbrev.el
index e4061bd2f14..86711a4543f 100644
--- a/lisp/mail/mailabbrev.el
+++ b/lisp/mail/mailabbrev.el
@@ -163,7 +163,7 @@ no aliases, which is represented by this being a table with no entries.)")
(if (file-exists-p mail-personal-alias-file)
(let ((modtime (file-attribute-modification-time
(file-attributes mail-personal-alias-file))))
- (if (not (equal mail-abbrev-modtime modtime))
+ (if (not (time-equal-p mail-abbrev-modtime modtime))
(progn
(setq mail-abbrev-modtime modtime)
(build-mail-abbrevs)))))))
diff --git a/lisp/mail/mspools.el b/lisp/mail/mspools.el
index 2c3851f835d..2ab4fa411a6 100644
--- a/lisp/mail/mspools.el
+++ b/lisp/mail/mspools.el
@@ -55,7 +55,6 @@
;; `mspools-using-vm' for details.
;;; Basic installation.
-;; (autoload 'mspools-show "mspools" "Show outstanding mail spools." t)
;; (setq mspools-folder-directory "~/MAIL/")
;;
;; If you use VM, mspools-folder-directory will default to vm-folder-directory
@@ -165,17 +164,13 @@ your primary spool is. If this fails, set it to something like
(defvar mspools-buffer "*spools*"
"Name of buffer for displaying spool info.")
-(defvar mspools-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "\C-c\C-c" #'mspools-visit-spool)
- (define-key map "\C-m" #'mspools-visit-spool)
- (define-key map " " #'mspools-visit-spool)
- (define-key map "n" #'next-line)
- (define-key map "p" #'previous-line)
- map)
- "Keymap for the *spools* buffer.")
-
-;;; Code
+(defvar-keymap mspools-mode-map
+ :doc "Keymap for the *spools* buffer."
+ "C-c C-c" #'mspools-visit-spool
+ "RET" #'mspools-visit-spool
+ "SPC" #'mspools-visit-spool
+ "n" #'next-line
+ "p" #'previous-line)
;;; VM Specific code
(if mspools-using-vm
diff --git a/lisp/mail/rfc2047.el b/lisp/mail/rfc2047.el
index bb0d646346c..67874d508b1 100644
--- a/lisp/mail/rfc2047.el
+++ b/lisp/mail/rfc2047.el
@@ -45,6 +45,9 @@
'(("Newsgroups" . nil)
("Followup-To" . nil)
("Message-ID" . nil)
+ ;; This header must be pre-encoded by the MTA, so avoid
+ ;; double-encoding it.
+ ("Content-Disposition" . default)
("\\(Resent-\\)?\\(From\\|Cc\\|To\\|Bcc\\|\\(In-\\)?Reply-To\\|Sender\
\\|Mail-Followup-To\\|Mail-Copies-To\\|Approved\\|Disposition-Notification-To\\)" . address-mime)
(t . mime))
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 71eda7cd2b0..4bfec22b3a9 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -1451,8 +1451,7 @@ If so restore the actual mbox message collection."
(setq-local font-lock-defaults
'(rmail-font-lock-keywords
t t nil nil
- (font-lock-dont-widen . t)
- (font-lock-inhibit-thing-lock . (lazy-lock-mode fast-lock-mode))))
+ (font-lock-dont-widen . t)))
(setq-local require-final-newline nil)
(setq-local version-control 'never)
(add-hook 'kill-buffer-hook #'rmail-mode-kill-summary nil t)
diff --git a/lisp/mail/rmailedit.el b/lisp/mail/rmailedit.el
index 79bd02fd67e..553fac26f9e 100644
--- a/lisp/mail/rmailedit.el
+++ b/lisp/mail/rmailedit.el
@@ -34,13 +34,10 @@
:group 'rmail-edit)
-(defvar rmail-edit-map
- (let ((map (make-sparse-keymap)))
- ;; Make a keymap that inherits text-mode-map.
- (set-keymap-parent map text-mode-map)
- (define-key map "\C-c\C-c" #'rmail-cease-edit)
- (define-key map "\C-c\C-]" #'rmail-abort-edit)
- map))
+(defvar-keymap rmail-edit-map
+ :parent text-mode-map
+ "C-c C-c" #'rmail-cease-edit
+ "C-c C-]" #'rmail-abort-edit)
(declare-function rmail-summary-disable "rmailsum" ())
diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el
index b23fbc3f600..b959f45250e 100644
--- a/lisp/mail/rmailsum.el
+++ b/lisp/mail/rmailsum.el
@@ -1480,11 +1480,10 @@ argument says to read a file name and use that file as the inbox."
(declare-function rmail-output-read-file-name "rmailout" ())
(declare-function mail-send-and-exit "sendmail" (&optional arg))
-(defvar rmail-summary-edit-map
- (let ((map (nconc (make-sparse-keymap) text-mode-map)))
- (define-key map "\C-c\C-c" #'rmail-cease-edit)
- (define-key map "\C-c\C-]" #'rmail-abort-edit)
- map))
+(defvar-keymap rmail-summary-edit-map
+ :parent text-mode-map
+ "C-c C-c" #'rmail-cease-edit
+ "C-c C-]" #'rmail-abort-edit)
(defun rmail-summary-edit-current-message ()
"Edit the contents of this message."
@@ -1728,8 +1727,6 @@ even if the header display is currently pruned."
(if (< i n)
(rmail-summary-next-msg 1))))))
-(defalias 'rmail-summary-output-to-rmail-file 'rmail-summary-output)
-
(declare-function rmail-output-as-seen "rmailout"
(file-name &optional count noattribute from-gnus))
@@ -1875,6 +1872,9 @@ the summary is only showing a subset of messages."
(funcall sortfun reverse))
(select-window selwin))))
+(define-obsolete-function-alias 'rmail-summary-output-to-rmail-file
+ #'rmail-summary-output "29.1")
+
(provide 'rmailsum)
;;; rmailsum.el ends here
diff --git a/lisp/mail/sendmail.el b/lisp/mail/sendmail.el
index 8cb079f7fbe..189ad075c47 100644
--- a/lisp/mail/sendmail.el
+++ b/lisp/mail/sendmail.el
@@ -49,7 +49,9 @@
((file-exists-p "/usr/lib/sendmail") "/usr/lib/sendmail")
((file-exists-p "/usr/ucblib/sendmail") "/usr/ucblib/sendmail")
(t "sendmail")))
- "Program used to send messages."
+ "Program used to send messages.
+If the program returns a non-zero error code, or outputs any
+text, sending is considered \"failed\" by Emacs."
:version "24.1" ; add executable-find, remove fakemail
:type 'file)
@@ -537,7 +539,7 @@ This also saves the value of `send-mail-function' via Customize."
(when mail-personal-alias-file
(let ((modtime (file-attribute-modification-time
(file-attributes mail-personal-alias-file))))
- (or (equal mail-alias-modtime modtime)
+ (or (time-equal-p mail-alias-modtime modtime)
(setq mail-alias-modtime modtime
mail-aliases t)))))
@@ -820,6 +822,7 @@ If within the headers, this makes the new lines into continuation lines."
;; User-level commands for sending.
+;;;###autoload
(defun mail-send-and-exit (&optional arg)
"Send message like `mail-send', then, if no errors, exit from mail buffer.
Prefix arg means don't delete this window."
diff --git a/lisp/mail/smtpmail.el b/lisp/mail/smtpmail.el
index fcb072d5d09..45b25b55301 100644
--- a/lisp/mail/smtpmail.el
+++ b/lisp/mail/smtpmail.el
@@ -806,7 +806,11 @@ Returns an error if the server cannot be contacted."
(plist-get (cdr result) :capabilities)
"\r\n")))
(let ((name
- (with-case-table ascii-case-table ;FIXME: Why?
+ ;; Use ASCII case-table to prevent I
+ ;; downcasing to a dotless i under some
+ ;; language environments. See
+ ;; https://lists.gnu.org/archive/html/emacs-devel/2007-03/msg01760.html.
+ (with-case-table ascii-case-table
(mapcar (lambda (s) (intern (downcase s)))
(split-string (substring line 4) "[ ]")))))
(when (= (length name) 1)
diff --git a/lisp/mail/supercite.el b/lisp/mail/supercite.el
index f320246f2de..98f46a3af55 100644
--- a/lisp/mail/supercite.el
+++ b/lisp/mail/supercite.el
@@ -1,6 +1,6 @@
;;; supercite.el --- minor mode for citing mail and news replies -*- lexical-binding: t; -*-
-;; Copyright (C) 1993, 1997, 2001-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1993-2022 Free Software Foundation, Inc.
;; Author: 1993 Barry A. Warsaw <bwarsaw@python.org>
;; Maintainer: emacs-devel@gnu.org
@@ -22,11 +22,6 @@
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-;; LCD Archive Entry
-;; supercite|Barry A. Warsaw|supercite-help@python.org
-;; |Mail and news reply citation package
-;; |1993/09/22 18:58:46|3.1|
-
;;; Commentary:
;;; Code:
@@ -525,75 +520,67 @@ string."
;; ======================================================================
;; supercite keymaps
-(defvar sc-T-keymap
- (let ((map (make-sparse-keymap)))
- (define-key map "a" #'sc-S-preferred-attribution-list)
- (define-key map "b" #'sc-T-mail-nuke-blank-lines)
- (define-key map "c" #'sc-T-confirm-always)
- (define-key map "d" #'sc-T-downcase)
- (define-key map "e" #'sc-T-electric-references)
- (define-key map "f" #'sc-T-auto-fill-region)
- (define-key map "h" #'sc-T-describe)
- (define-key map "l" #'sc-S-cite-region-limit)
- (define-key map "n" #'sc-S-mail-nuke-mail-headers)
- (define-key map "N" #'sc-S-mail-header-nuke-list)
- (define-key map "o" #'sc-T-electric-circular)
- (define-key map "p" #'sc-S-preferred-header-style)
- (define-key map "s" #'sc-T-nested-citation)
- (define-key map "u" #'sc-T-use-only-preferences)
- (define-key map "w" #'sc-T-fixup-whitespace)
- (define-key map "?" #'sc-T-describe)
- map)
- "Keymap for sub-keymap of setting and toggling functions.")
-
-(defvar sc-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "c" #'sc-cite-region)
- (define-key map "f" #'sc-mail-field-query)
- (define-key map "g" #'sc-mail-process-headers)
- (define-key map "h" #'sc-describe)
- (define-key map "i" #'sc-insert-citation)
- (define-key map "o" #'sc-open-line)
- (define-key map "r" #'sc-recite-region)
- (define-key map "\C-p" #'sc-raw-mode-toggle)
- (define-key map "u" #'sc-uncite-region)
- (define-key map "w" #'sc-insert-reference)
- (define-key map "\C-t" sc-T-keymap)
- (define-key map "?" #'sc-describe)
- map)
- "Keymap for Supercite quasi-mode.")
-
-(defvar sc-electric-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "p" #'sc-eref-prev)
- (define-key map "n" #'sc-eref-next)
- (define-key map "s" #'sc-eref-setn)
- (define-key map "j" #'sc-eref-jump)
- (define-key map "x" #'sc-eref-abort)
- (define-key map "q" #'sc-eref-abort)
- (define-key map "\r" #'sc-eref-exit)
- (define-key map "\n" #'sc-eref-exit)
- (define-key map "g" #'sc-eref-goto)
- (define-key map "?" #'describe-mode)
- (define-key map "\C-h" #'describe-mode)
- (define-key map [f1] #'describe-mode)
- (define-key map [help] #'describe-mode)
- map)
- "Keymap for `sc-electric-mode' electric references mode.")
-
-
-(defvar sc-minibuffer-local-completion-map
- (let ((map (copy-keymap minibuffer-local-completion-map)))
- (define-key map "\C-t" #'sc-toggle-fn)
- (define-key map " " #'self-insert-command)
- map)
- "Keymap for minibuffer confirmation of attribution strings.")
-
-(defvar sc-minibuffer-local-map
- (let ((map (copy-keymap minibuffer-local-map)))
- (define-key map "\C-t" #'sc-toggle-fn)
- map)
- "Keymap for minibuffer confirmation of attribution strings.")
+(defvar-keymap sc-T-keymap
+ :doc "Keymap for sub-keymap of setting and toggling functions."
+ "a" #'sc-S-preferred-attribution-list
+ "b" #'sc-T-mail-nuke-blank-lines
+ "c" #'sc-T-confirm-always
+ "d" #'sc-T-downcase
+ "e" #'sc-T-electric-references
+ "f" #'sc-T-auto-fill-region
+ "h" #'sc-T-describe
+ "l" #'sc-S-cite-region-limit
+ "n" #'sc-S-mail-nuke-mail-headers
+ "N" #'sc-S-mail-header-nuke-list
+ "o" #'sc-T-electric-circular
+ "p" #'sc-S-preferred-header-style
+ "s" #'sc-T-nested-citation
+ "u" #'sc-T-use-only-preferences
+ "w" #'sc-T-fixup-whitespace
+ "?" #'sc-T-describe)
+
+(defvar-keymap sc-mode-map
+ :doc "Keymap for Supercite quasi-mode."
+ "c" #'sc-cite-region
+ "f" #'sc-mail-field-query
+ "g" #'sc-mail-process-headers
+ "h" #'sc-describe
+ "i" #'sc-insert-citation
+ "o" #'sc-open-line
+ "r" #'sc-recite-region
+ "C-p" #'sc-raw-mode-toggle
+ "u" #'sc-uncite-region
+ "w" #'sc-insert-reference
+ "C-t" sc-T-keymap
+ "?" #'sc-describe)
+
+(defvar-keymap sc-electric-mode-map
+ :doc "Keymap for `sc-electric-mode' electric references mode."
+ "p" #'sc-eref-prev
+ "n" #'sc-eref-next
+ "s" #'sc-eref-setn
+ "j" #'sc-eref-jump
+ "x" #'sc-eref-abort
+ "q" #'sc-eref-abort
+ "RET" #'sc-eref-exit
+ "C-j" #'sc-eref-exit
+ "g" #'sc-eref-goto
+ "?" #'describe-mode
+ "C-h" #'describe-mode
+ "<f1>" #'describe-mode
+ "<help>" #'describe-mode)
+
+
+(defvar-keymap sc-minibuffer-local-completion-map
+ :doc "Keymap for minibuffer confirmation of attribution strings."
+ :parent minibuffer-local-completion-map
+ "C-t" #'sc-toggle-fn
+ "SPC" #'self-insert-command)
+
+(defvar-keymap sc-minibuffer-local-map
+ :doc "Keymap for minibuffer confirmation of attribution strings."
+ :parent minibuffer-local-map
+ "C-t" #'sc-toggle-fn)
;; ======================================================================
diff --git a/lisp/man.el b/lisp/man.el
index 951e0ef9add..d66f63972ae 100644
--- a/lisp/man.el
+++ b/lisp/man.el
@@ -1241,8 +1241,7 @@ See the variable `Man-notify-method' for the different notification behaviors."
(defun Man-softhyphen-to-minus ()
;; \255 is SOFT HYPHEN in Latin-N. Versions of Debian man, at
;; least, emit it even when not in a Latin-N locale.
- (unless (eq t (compare-strings "latin-" 0 nil
- current-language-environment 0 6 t))
+ (unless (string-prefix-p "latin-" current-language-environment t)
(goto-char (point-min))
(while (search-forward "­" nil t) (replace-match "-"))))
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index 12a0b4d328f..c2c18320b15 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -47,7 +47,7 @@
;; This definition is just to show what this looks like.
;; It gets modified in place when menu-bar-update-buffers is called.
-(defvar global-buffers-menu-map (make-sparse-keymap "Buffers"))
+(defvar-keymap global-buffers-menu-map :name "Buffers")
(defvar menu-bar-print-menu
(let ((menu (make-sparse-keymap "Print")))
@@ -680,7 +680,7 @@ Do the same for the keys of the same name."
'(menu-item "Custom Themes" customize-themes
:help "Choose a pre-defined customization theme"))
menu))
-;(defvar menu-bar-preferences-menu (make-sparse-keymap "Preferences"))
+;(defvar-keymap menu-bar-preferences-menu :name "Preferences")
(defmacro menu-bar-make-mm-toggle (fname doc help &optional props)
"Make a menu-item for a global minor mode toggle.
diff --git a/lisp/mh-e/mh-acros.el b/lisp/mh-e/mh-acros.el
index 805b0820b03..2b4807ab696 100644
--- a/lisp/mh-e/mh-acros.el
+++ b/lisp/mh-e/mh-acros.el
@@ -269,11 +269,25 @@ MH-E functions."
binders)
(let* ,binders ,@body))))
+;; Emacs 24 made flet obsolete and suggested either cl-flet or
+;; cl-letf. This macro is based upon gmm-flet from Gnus.
+(defmacro mh-flet (bindings &rest body)
+ "Make temporary overriding function definitions.
+That is, temporarily rebind the functions listed in BINDINGS and then
+execute BODY. BINDINGS is a list containing one or more lists of the
+form (FUNCNAME ARGLIST BODY...), similar to defun."
+ (declare (indent 1) (debug ((&rest (sexp sexp &rest form)) &rest form)))
+ (if (fboundp 'cl-letf)
+ `(cl-letf ,(mapcar (lambda (binding)
+ `((symbol-function ',(car binding))
+ (lambda ,@(cdr binding))))
+ bindings)
+ ,@body)
+ `(flet ,bindings ,@body)))
+
(provide 'mh-acros)
;; Local Variables:
-;; no-byte-compile: t
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-alias.el b/lisp/mh-e/mh-alias.el
index f39caac893d..3ceb419023e 100644
--- a/lisp/mh-e/mh-alias.el
+++ b/lisp/mh-e/mh-alias.el
@@ -245,10 +245,6 @@ Blind aliases or users from /etc/passwd are not expanded."
(t
(mh-alias-ali alias))))
-(eval-and-compile
- (require 'crm nil t) ; completing-read-multiple
- (require 'multi-prompt nil t))
-
;;;###mh-autoload
(defun mh-read-address (prompt)
"Read an address from the minibuffer with PROMPT."
@@ -662,7 +658,6 @@ show buffer, the message in the show buffer doesn't match."
(provide 'mh-alias)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-buffers.el b/lisp/mh-e/mh-buffers.el
index f21b57663b2..4b15b774132 100644
--- a/lisp/mh-e/mh-buffers.el
+++ b/lisp/mh-e/mh-buffers.el
@@ -75,7 +75,6 @@ The function returns the size of the final size of the log buffer."
(provide 'mh-buffers)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-comp.el b/lisp/mh-e/mh-comp.el
index a9f6274e9d4..678bffd1687 100644
--- a/lisp/mh-e/mh-comp.el
+++ b/lisp/mh-e/mh-comp.el
@@ -1272,7 +1272,6 @@ discarded."
(provide 'mh-comp)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-e.el b/lisp/mh-e/mh-e.el
index 872f0d79d29..f6031df9c24 100644
--- a/lisp/mh-e/mh-e.el
+++ b/lisp/mh-e/mh-e.el
@@ -86,7 +86,6 @@
(require 'cl-lib)
(require 'mh-buffers)
-(require 'mh-compat)
@@ -163,8 +162,9 @@ User's mail folder directory.")
;; Maps declared here so that they can be used in docstrings.
-(defvar mh-folder-mode-map (make-keymap)
- "Keymap for MH-Folder mode.")
+(defvar-keymap mh-folder-mode-map
+ :doc "Keymap for MH-Folder mode."
+ :full t)
(defvar mh-folder-seq-tool-bar-map nil
"Keymap for MH-Folder tool bar.")
@@ -172,8 +172,8 @@ User's mail folder directory.")
(defvar mh-folder-tool-bar-map nil
"Keymap for MH-Folder tool bar.")
-(defvar mh-inc-spool-map (make-sparse-keymap)
- "Keymap for MH-E's mh-inc-spool commands.")
+(defvar-keymap mh-inc-spool-map
+ :doc "Keymap for MH-E's mh-inc-spool commands.")
(defvar mh-letter-mode-map (copy-keymap text-mode-map)
"Keymap for MH-Letter mode.")
@@ -181,11 +181,11 @@ User's mail folder directory.")
(defvar mh-letter-tool-bar-map nil
"Keymap for MH-Letter tool bar.")
-(defvar mh-search-mode-map (make-sparse-keymap)
- "Keymap for MH-Search mode.")
+(defvar-keymap mh-search-mode-map
+ :doc "Keymap for MH-Search mode.")
-(defvar mh-show-mode-map (make-sparse-keymap)
- "Keymap MH-Show mode.")
+(defvar-keymap mh-show-mode-map
+ :doc "Keymap for MH-Show mode.")
(defvar mh-show-seq-tool-bar-map nil
"Keymap for MH-Show tool bar.")
@@ -388,11 +388,11 @@ gnus-version)
(insert "MH-E " mh-version "\n\n")
;; MH-E compilation details.
(insert "MH-E compilation details:\n")
- (let* ((compiled-mhe (byte-code-function-p (symbol-function 'mh-version)))
+ (let* ((compiled-mhe (compiled-function-p (symbol-function 'mh-version)))
(gnus-compiled-version (if compiled-mhe
(mh-macro-expansion-time-gnus-version)
"N/A")))
- (insert " Byte compiled:\t\t" (if compiled-mhe "yes" "no") "\n"
+ (insert " Compiled:\t\t" (if compiled-mhe "yes" "no") "\n"
" Gnus (compile-time):\t" gnus-compiled-version "\n"
" Gnus (run-time):\t" (mh-run-time-gnus-version) "\n\n"))
;; Emacs version.
@@ -1790,16 +1790,7 @@ message without line wrapping."
This option is used to select between a variety of mail security
mechanisms. The default is \"PGP (MIME)\" if it is supported;
otherwise, the default is \"None\". Other mechanisms include
-vanilla \"PGP\" and \"S/MIME\".
-
-The `pgg' customization group may have some settings which may
-interest you (see Info node `(pgg)').
-
-In particular, I turn on the option `pgg-encrypt-for-me' so that
-all messages I encrypt are encrypted with my public key as well.
-If you keep a copy of all of your outgoing mail with a \"Fcc:\"
-header field, this setting is vital so that you can read the mail
-you write!"
+vanilla \"PGP\" and \"S/MIME\"."
:type '(choice (const :tag "PGP (MIME)" "pgpmime")
(const :tag "PGP" "pgp")
(const :tag "S/MIME" "smime")
@@ -3715,7 +3706,6 @@ The background and foreground are used in the image."
(provide 'mh-e)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-folder.el b/lisp/mh-e/mh-folder.el
index 09df0465eda..5b902902378 100644
--- a/lisp/mh-e/mh-folder.el
+++ b/lisp/mh-e/mh-folder.el
@@ -510,7 +510,7 @@ font-lock is done highlighting.")
nil)
;; Register mh-folder-mode as supporting which-function-mode...
-(eval-and-compile (require 'which-func nil t))
+(require 'which-func)
(when (and (boundp 'which-func-modes) (listp which-func-modes))
(add-to-list 'which-func-modes 'mh-folder-mode))
@@ -2012,7 +2012,6 @@ If MSG is nil then act on the message at point"
(provide 'mh-folder)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-funcs.el b/lisp/mh-e/mh-funcs.el
index f011ea47f80..ab89ef2a3d1 100644
--- a/lisp/mh-e/mh-funcs.el
+++ b/lisp/mh-e/mh-funcs.el
@@ -366,7 +366,6 @@ Arguments are IGNORED (for `revert-buffer')."
(provide 'mh-funcs)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-gnus.el b/lisp/mh-e/mh-gnus.el
index c341b096834..b797000566e 100644
--- a/lisp/mh-e/mh-gnus.el
+++ b/lisp/mh-e/mh-gnus.el
@@ -28,12 +28,11 @@
(require 'mh-e)
-(eval-and-compile
- (require 'gnus-util nil t)
- (require 'mm-bodies nil t)
- (require 'mm-decode nil t)
- (require 'mm-view nil t)
- (require 'mml nil t))
+(require 'gnus-util)
+(require 'mm-bodies)
+(require 'mm-decode)
+(require 'mm-view)
+(require 'mml)
(defun mh-gnus-local-map-property (map)
"Return a list suitable for a text property list specifying keymap MAP."
@@ -109,7 +108,6 @@ PROMPT overrides the default one used to ask user for a file name."
;; Local Variables:
;; no-update-autoloads: t
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-identity.el b/lisp/mh-e/mh-identity.el
index 43eaeb7aa0f..bcdf91299be 100644
--- a/lisp/mh-e/mh-identity.el
+++ b/lisp/mh-e/mh-identity.el
@@ -39,8 +39,10 @@
(autoload 'mml-insert-tag "mml")
-(defvar-local mh-identity-pgg-default-user-id nil
- "Holds the GPG key ID to be used by pgg.el.
+(define-obsolete-variable-alias 'mh-identity-pgg-default-user-id
+ 'mh-identity-gpg-default-user-id "29.1")
+(defvar-local mh-identity-gpg-default-user-id nil
+ "Holds the GPG key ID.
This is normally set as part of an Identity in
`mh-identity-list'.")
@@ -202,15 +204,15 @@ See `mh-identity-list'."
(defun mh-identity-handler-gpg-identity (_field action &optional value)
"Process header FIELD \":pgg-default-user-id\".
The ACTION is one of `remove' or `add'. If `add', the VALUE is added.
-The buffer-local variable `mh-identity-pgg-default-user-id' is set to
+The buffer-local variable `mh-identity-gpg-default-user-id' is set to
VALUE when action `add' is selected."
(cond
((or (equal action 'remove)
(not value)
(string= value ""))
- (setq mh-identity-pgg-default-user-id nil))
+ (setq mh-identity-gpg-default-user-id nil))
((equal action 'add)
- (setq mh-identity-pgg-default-user-id value))))
+ (setq mh-identity-gpg-default-user-id value))))
;;;###mh-autoload
(defun mh-identity-handler-signature (_field action &optional value)
@@ -316,7 +318,6 @@ the header."
(provide 'mh-identity)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-inc.el b/lisp/mh-e/mh-inc.el
index 2c29ec32234..cc6ebfef426 100644
--- a/lisp/mh-e/mh-inc.el
+++ b/lisp/mh-e/mh-inc.el
@@ -78,7 +78,6 @@
(provide 'mh-inc)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-junk.el b/lisp/mh-e/mh-junk.el
index 1f773b878a8..be1b7642eb3 100644
--- a/lisp/mh-e/mh-junk.el
+++ b/lisp/mh-e/mh-junk.el
@@ -540,7 +540,6 @@ See `mh-spamprobe-blocklist' for more information."
(provide 'mh-junk)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-letter.el b/lisp/mh-e/mh-letter.el
index 4e3e1012315..723e5bb36c0 100644
--- a/lisp/mh-e/mh-letter.el
+++ b/lisp/mh-e/mh-letter.el
@@ -864,16 +864,17 @@ Any match found replaces the text from BEGIN to END."
((stringp completion)
(if (equal word completion)
(with-output-to-temp-buffer completions-buffer
- (mh-display-completion-list
- (all-completions word choices)
- ;; The `common-substring' arg only works if it's a prefix.
- (unless (and (functionp choices)
- (let ((bounds
- (funcall choices
- word nil '(boundaries . ""))))
- (and (eq 'boundaries (car-safe bounds))
- (< 0 (cadr bounds)))))
- word)))
+ (display-completion-list
+ (completion-hilit-commonality
+ (all-completions word choices)
+ ;; The `common-substring' arg only works if it's a prefix.
+ (unless (and (functionp choices)
+ (let ((bounds
+ (funcall choices
+ word nil '(boundaries . ""))))
+ (and (eq 'boundaries (car-safe bounds))
+ (< 0 (cadr bounds)))))
+ word))))
(ignore-errors
(kill-buffer completions-buffer))
(delete-region begin end)
@@ -935,7 +936,6 @@ Otherwise, simply insert MH-INS-STRING before each line."
(provide 'mh-letter)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-limit.el b/lisp/mh-e/mh-limit.el
index 3e731e22a1f..da3e5b4f35c 100644
--- a/lisp/mh-e/mh-limit.el
+++ b/lisp/mh-e/mh-limit.el
@@ -325,7 +325,6 @@ The MH command pick is used to do the match."
(provide 'mh-limit)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-mime.el b/lisp/mh-e/mh-mime.el
index b93f7d8c412..316463b9897 100644
--- a/lisp/mh-e/mh-mime.el
+++ b/lisp/mh-e/mh-mime.el
@@ -379,10 +379,8 @@ do the work."
((and (or prompt
(equal t mh-mime-save-parts-default-directory))
mh-mime-save-parts-directory)
- (read-directory-name (format-prompt
- "Store in directory"
- mh-mime-save-parts-directory)
- "" mh-mime-save-parts-directory t ""))
+ (read-directory-name "Store in directory: "
+ mh-mime-save-parts-directory nil t))
((stringp mh-mime-save-parts-default-directory)
mh-mime-save-parts-default-directory)
(t
@@ -394,18 +392,19 @@ do the work."
(if (equal nil mh-mime-save-parts-default-directory)
(setq mh-mime-save-parts-directory directory))
(with-current-buffer (get-buffer-create mh-log-buffer)
- (cd directory)
- (setq mh-mime-save-parts-directory directory)
- (let ((initial-size (mh-truncate-log-buffer)))
- (apply #'call-process
- (expand-file-name command mh-progs) nil t nil
- (mh-list-to-string (list folder msg "-auto"
- (if (not (mh-variant-p 'nmh))
- "-store"))))
- (if (> (buffer-size) initial-size)
- (save-window-excursion
- (switch-to-buffer-other-window mh-log-buffer)
- (sit-for 3))))))))
+ (let (default-directory)
+ (cd directory)
+ (setq mh-mime-save-parts-directory directory)
+ (let ((initial-size (mh-truncate-log-buffer)))
+ (apply #'call-process
+ (expand-file-name command mh-progs) nil t nil
+ (mh-list-to-string (list folder msg "-auto"
+ (if (not (mh-variant-p 'nmh))
+ "-store"))))
+ (if (> (buffer-size) initial-size)
+ (save-window-excursion
+ (switch-to-buffer-other-window mh-log-buffer)
+ (sit-for 3)))))))))
;;;###mh-autoload
(defun mh-toggle-mh-decode-mime-flag ()
@@ -1503,7 +1502,7 @@ a prefix argument NOCONFIRM."
(after-find-file nil nil nil nil t)))
;; Shush compiler.
-(defvar mh-identity-pgg-default-user-id)
+(defvar mh-identity-gpg-default-user-id)
;;;###mh-autoload
(defun mh-mml-secure-message-encrypt (method)
@@ -1514,7 +1513,7 @@ message. Use the command \\[mh-mml-unsecure-message] to remove
this tag. Use a prefix argument METHOD to be prompted for one of
the possible security methods (see `mh-mml-method-default')."
(interactive (list (mh-mml-query-cryptographic-method)))
- (mh-secure-message method "encrypt" mh-identity-pgg-default-user-id))
+ (mh-secure-message method "encrypt" mh-identity-gpg-default-user-id))
;;;###mh-autoload
(defun mh-mml-secure-message-sign (method)
@@ -1525,7 +1524,7 @@ message. Use the command \\[mh-mml-unsecure-message] to remove
this tag. Use a prefix argument METHOD to be prompted for one of
the possible security methods (see `mh-mml-method-default')."
(interactive (list (mh-mml-query-cryptographic-method)))
- (mh-secure-message method "sign" mh-identity-pgg-default-user-id))
+ (mh-secure-message method "sign" mh-identity-gpg-default-user-id))
;;;###mh-autoload
(defun mh-mml-secure-message-signencrypt (method)
@@ -1536,7 +1535,7 @@ message. Use the command \\[mh-mml-unsecure-message] to remove
this tag. Use a prefix argument METHOD to be prompted for one of
the possible security methods (see `mh-mml-method-default')."
(interactive (list (mh-mml-query-cryptographic-method)))
- (mh-secure-message method "signencrypt" mh-identity-pgg-default-user-id))
+ (mh-secure-message method "signencrypt" mh-identity-gpg-default-user-id))
(defvar mh-mml-cryptographic-method-history ())
@@ -1570,9 +1569,9 @@ IDENTITY is optionally the default-user-id to use."
(save-excursion
(goto-char (point-min))
(mh-goto-header-end 1)
- (if mh-identity-pgg-default-user-id
+ (if mh-identity-gpg-default-user-id
(mml-insert-tag 'secure 'method method 'mode mode
- 'sender mh-identity-pgg-default-user-id)
+ 'sender mh-identity-gpg-default-user-id)
(mml-insert-tag 'secure 'method method 'mode mode)))))))
;;;###mh-autoload
@@ -1789,7 +1788,6 @@ initialized. Always use the command `mh-have-file-command'.")
(provide 'mh-mime)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-print.el b/lisp/mh-e/mh-print.el
index 2eec8d91600..78906b68ad3 100644
--- a/lisp/mh-e/mh-print.el
+++ b/lisp/mh-e/mh-print.el
@@ -242,7 +242,6 @@ Consider using \\[mh-ps-print-msg] instead."
(provide 'mh-print)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-scan.el b/lisp/mh-e/mh-scan.el
index 06381a2e0ed..4b4c5942863 100644
--- a/lisp/mh-e/mh-scan.el
+++ b/lisp/mh-e/mh-scan.el
@@ -526,7 +526,6 @@ comes after that."
(provide 'mh-scan)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-search.el b/lisp/mh-e/mh-search.el
index c5519eba0ac..058ea4499fd 100644
--- a/lisp/mh-e/mh-search.el
+++ b/lisp/mh-e/mh-search.el
@@ -1411,7 +1411,7 @@ being the list of messages originally from that folder."
(when cur-msg (mh-goto-msg cur-msg t t))
(set-buffer-modified-p old-buffer-modified-flag)))
-(eval-and-compile (require 'which-func nil t))
+(require 'which-func)
;;;###mh-autoload
(defun mh-index-create-imenu-index ()
@@ -1932,7 +1932,6 @@ folder buffer."
(provide 'mh-search)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-seq.el b/lisp/mh-e/mh-seq.el
index a95c7c03d17..8339273fc9b 100644
--- a/lisp/mh-e/mh-seq.el
+++ b/lisp/mh-e/mh-seq.el
@@ -996,7 +996,6 @@ removed."
(provide 'mh-seq)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-show.el b/lisp/mh-e/mh-show.el
index cc76b8d7e61..1731d75738b 100644
--- a/lisp/mh-e/mh-show.el
+++ b/lisp/mh-e/mh-show.el
@@ -894,7 +894,6 @@ See also `mh-folder-mode'.
(provide 'mh-show)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-speed.el b/lisp/mh-e/mh-speed.el
index a7e9c9bd678..3babea76121 100644
--- a/lisp/mh-e/mh-speed.el
+++ b/lisp/mh-e/mh-speed.el
@@ -568,7 +568,6 @@ The function invalidates the latest ancestor that is present."
(provide 'mh-speed)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-thread.el b/lisp/mh-e/mh-thread.el
index 139e9b74cbb..2358ba4bc61 100644
--- a/lisp/mh-e/mh-thread.el
+++ b/lisp/mh-e/mh-thread.el
@@ -865,7 +865,6 @@ This function can only be used the folder is threaded."
(provide 'mh-thread)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-tool-bar.el b/lisp/mh-e/mh-tool-bar.el
index 17df075cfac..933b3b633af 100644
--- a/lisp/mh-e/mh-tool-bar.el
+++ b/lisp/mh-e/mh-tool-bar.el
@@ -376,7 +376,6 @@ This button runs `mh-widen'"))
(provide 'mh-tool-bar)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-utils.el b/lisp/mh-e/mh-utils.el
index d7a92be5b5f..dd662f35522 100644
--- a/lisp/mh-e/mh-utils.el
+++ b/lisp/mh-e/mh-utils.el
@@ -29,6 +29,7 @@
(require 'mh-e)
(require 'font-lock)
+(require 'mailabbrev)
;;; CL Replacements
@@ -444,10 +445,8 @@ no effect."
(setq folder (format "%s/%s/" mh-current-folder-name
(substring folder 1))))
;; XXX: Purge empty strings from the list that split-string
- ;; returns. In XEmacs, (split-string "+foo/" "/") returns
- ;; ("+foo" "") while in GNU Emacs it returns ("+foo"). In the
- ;; code it is assumed that the components list has no empty
- ;; strings.
+ ;; returns. In the code it is assumed that the components list
+ ;; has no empty strings.
(let ((components (delete "" (split-string folder "/")))
(result ()))
;; Remove .. and . from the pathname.
@@ -1009,7 +1008,6 @@ If the current line is too long truncate a part of it as well."
(provide 'mh-utils)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/mh-e/mh-xface.el b/lisp/mh-e/mh-xface.el
index b144c58d696..d6ecd836556 100644
--- a/lisp/mh-e/mh-xface.el
+++ b/lisp/mh-e/mh-xface.el
@@ -414,7 +414,6 @@ The argument CHANGE is ignored."
(provide 'mh-xface)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 9d2abbd1180..3daab8a1e8d 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -634,9 +634,6 @@ for use at QPOS."
(let ((qstr (funcall qfun completion)))
(cons qstr (length qstr))))))
-(defun completion--string-equal-p (s1 s2)
- (eq t (compare-strings s1 nil nil s2 nil nil 'ignore-case)))
-
(defun completion--twq-all (string ustring completions boundary
_unquote requote)
(when completions
@@ -650,7 +647,7 @@ for use at QPOS."
(qfullprefix (substring string 0 qfullpos))
;; FIXME: This assertion can be wrong, e.g. in Cygwin, where
;; (unquote "c:\bin") => "/usr/bin" but (unquote "c:\") => "/".
- ;;(cl-assert (completion--string-equal-p
+ ;;(cl-assert (string-equal-ignore-case
;; (funcall unquote qfullprefix)
;; (concat (substring ustring 0 boundary) prefix))
;; t))
@@ -688,7 +685,7 @@ for use at QPOS."
(let* ((rest (substring completion
0 (length prefix)))
(qrest (funcall qfun rest)))
- (if (completion--string-equal-p qprefix qrest)
+ (if (string-equal-ignore-case qprefix qrest)
(propertize qrest 'face
'completions-common-part)
qprefix))))
@@ -696,7 +693,7 @@ for use at QPOS."
;; FIXME: Similarly here, Cygwin's mapping trips this
;; assertion.
;;(cl-assert
- ;; (completion--string-equal-p
+ ;; (string-equal-ignore-case
;; (funcall unquote
;; (concat (substring string 0 qboundary)
;; qcompletion))
@@ -1309,10 +1306,8 @@ when the buffer's text is already an exact match."
;; for appearance, the string is rewritten if the case changes.
(let* ((comp-pos (cdr comp))
(completion (car comp))
- (completed (not (eq t (compare-strings completion nil nil
- string nil nil t))))
- (unchanged (eq t (compare-strings completion nil nil
- string nil nil nil))))
+ (completed (not (string-equal-ignore-case completion string)))
+ (unchanged (string-equal completion string)))
(if unchanged
(goto-char end)
;; Insert in minibuffer the chars we got.
@@ -2760,7 +2755,6 @@ The completion method is determined by `completion-at-point-functions'."
(defvar-keymap minibuffer-local-must-match-map
:doc "Local keymap for minibuffer input with completion, for exact match."
:parent minibuffer-local-completion-map
- "M-X" #'execute-extended-command-cycle
"RET" #'minibuffer-complete-and-exit
"C-j" #'minibuffer-complete-and-exit)
@@ -4408,27 +4402,41 @@ minibuffer, but don't quit the completions window."
Like `minibuffer-complete' but completes on the history items
instead of the default completion table."
(interactive)
- (let ((completions-sort nil)
- (history (mapcar (lambda (h)
- ;; Support e.g. `C-x ESC ESC TAB' as
- ;; a replacement of `list-command-history'
- (if (consp h) (format "%S" h) h))
- (symbol-value minibuffer-history-variable))))
- (completion-in-region (minibuffer--completion-prompt-end) (point-max)
- history nil)))
+ (let* ((history (symbol-value minibuffer-history-variable))
+ (completions
+ (if (listp history)
+ ;; Support e.g. `C-x ESC ESC TAB' as
+ ;; a replacement of `list-command-history'
+ (mapcar (lambda (h)
+ (if (stringp h) h (format "%S" h)))
+ history)
+ (user-error "No history available"))))
+ ;; FIXME: Can we make it work for CRM?
+ (completion-in-region
+ (minibuffer--completion-prompt-end) (point-max)
+ (lambda (string pred action)
+ (if (eq action 'metadata)
+ '(metadata (display-sort-function . identity)
+ (cycle-sort-function . identity))
+ (complete-with-action action completions string pred))))))
(defun minibuffer-complete-defaults ()
"Complete minibuffer defaults as far as possible.
Like `minibuffer-complete' but completes on the default items
instead of the completion table."
(interactive)
- (let ((completions-sort nil))
- (when (and (not minibuffer-default-add-done)
- (functionp minibuffer-default-add-function))
- (setq minibuffer-default-add-done t
- minibuffer-default (funcall minibuffer-default-add-function)))
- (completion-in-region (minibuffer--completion-prompt-end) (point-max)
- (ensure-list minibuffer-default) nil)))
+ (when (and (not minibuffer-default-add-done)
+ (functionp minibuffer-default-add-function))
+ (setq minibuffer-default-add-done t
+ minibuffer-default (funcall minibuffer-default-add-function)))
+ (let ((completions (ensure-list minibuffer-default)))
+ (completion-in-region
+ (minibuffer--completion-prompt-end) (point-max)
+ (lambda (string pred action)
+ (if (eq action 'metadata)
+ '(metadata (display-sort-function . identity)
+ (cycle-sort-function . identity))
+ (complete-with-action action completions string pred))))))
(define-key minibuffer-local-map [?\C-x up] 'minibuffer-complete-history)
(define-key minibuffer-local-map [?\C-x down] 'minibuffer-complete-defaults)
diff --git a/lisp/misc.el b/lisp/misc.el
index 28c5d6e07f5..a53571f4639 100644
--- a/lisp/misc.el
+++ b/lisp/misc.el
@@ -79,6 +79,43 @@ Also see the `copy-from-above-command' command."
(dotimes (_ n)
(insert line "\n")))))
+(declare-function rectangle--duplicate-right "rect" (n))
+
+;; `duplicate-dwim' preserves an active region and changes the buffer
+;; outside of it: disregard the region when immediately undoing the
+;; actions of this command.
+(put 'duplicate-dwim 'undo-inhibit-region t)
+
+;;;###autoload
+(defun duplicate-dwim (&optional n)
+ "Duplicate the current line or region N times.
+If the region is inactive, duplicate the current line (like `duplicate-line').
+Otherwise, duplicate the region, which remains active afterwards.
+If the region is rectangular, duplicate on its right-hand side.
+Interactively, N is the prefix numeric argument, and defaults to 1."
+ (interactive "p")
+ (unless n
+ (setq n 1))
+ (cond
+ ;; Duplicate rectangle.
+ ((bound-and-true-p rectangle-mark-mode)
+ (rectangle--duplicate-right n)
+ (setq deactivate-mark nil))
+
+ ;; Duplicate (contiguous) region.
+ ((use-region-p)
+ (let* ((beg (region-beginning))
+ (end (region-end))
+ (text (buffer-substring beg end)))
+ (save-excursion
+ (goto-char end)
+ (dotimes (_ n)
+ (insert text))))
+ (setq deactivate-mark nil))
+
+ ;; Duplicate line.
+ (t (duplicate-line n))))
+
;; Variation of `zap-to-char'.
;;;###autoload
diff --git a/lisp/mouse.el b/lisp/mouse.el
index ddcb51aecf2..bee664dc568 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -1,6 +1,6 @@
;;; mouse.el --- window system-independent mouse support -*- lexical-binding: t -*-
-;; Copyright (C) 1993-1995, 1999-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1993-2022 Free Software Foundation, Inc.
;; Maintainer: emacs-devel@gnu.org
;; Keywords: hardware, mouse
@@ -31,8 +31,6 @@
(eval-when-compile (require 'rect))
-;;; Utility functions.
-
;; Indent track-mouse like progn.
(put 'track-mouse 'lisp-indent-function 0)
diff --git a/lisp/mpc.el b/lisp/mpc.el
index dc61ce78bda..ba95308bf67 100644
--- a/lisp/mpc.el
+++ b/lisp/mpc.el
@@ -1126,32 +1126,30 @@ If PLAYLIST is t or nil or missing, use the main playlist."
;;; The actual UI code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar mpc-mode-map
- (let ((map (make-sparse-keymap)))
- ;; (define-key map "\e" #'mpc-stop)
- (define-key map "q" #'mpc-quit)
- (define-key map "\r" #'mpc-select)
- (define-key map [(shift return)] #'mpc-select-toggle)
- (define-key map [mouse-2] #'mpc-select)
- (define-key map [S-mouse-2] #'mpc-select-extend)
- (define-key map [C-mouse-2] #'mpc-select-toggle)
- (define-key map [drag-mouse-2] #'mpc-drag-n-drop)
- ;; We use `always' because a binding to t is like a binding to nil.
- (define-key map [follow-link] :always)
- ;; But follow-link doesn't apply blindly to header-line and
- ;; mode-line clicks.
- (define-key map [header-line follow-link] #'ignore)
- (define-key map [mode-line follow-link] #'ignore)
- ;; Doesn't work because the first click changes the buffer, so the second
- ;; is applied elsewhere :-(
- ;; (define-key map [(double mouse-2)] #'mpc-play-at-point)
- (define-key map "p" #'mpc-pause)
- (define-key map "s" #'mpc-toggle-play)
- (define-key map ">" #'mpc-next)
- (define-key map "<" #'mpc-prev)
- (define-key map "g" #'mpc-seek-current)
- (define-key map "o" #'mpc-goto-playing-song)
- map))
+(defvar-keymap mpc-mode-map
+ ;; "ESC" #'mpc-stop
+ "q" #'mpc-quit
+ "RET" #'mpc-select
+ "S-<return>" #'mpc-select-toggle
+ "<mouse-2>" #'mpc-select
+ "S-<mouse-2>" #'mpc-select-extend
+ "C-<mouse-2>" #'mpc-select-toggle
+ "<drag-mouse-2>" #'mpc-drag-n-drop
+ ;; We use `always' because a binding to t is like a binding to nil.
+ "<follow-link>" :always
+ ;; But follow-link doesn't apply blindly to header-line and
+ ;; mode-line clicks.
+ "<header-line> <follow-link>" #'ignore
+ "<mode-line> <follow-link>" #'ignore
+ ;; Doesn't work because the first click changes the buffer, so the second
+ ;; is applied elsewhere :-(
+ ;; "<double-mouse-2>" #'mpc-play-at-point
+ "p" #'mpc-pause
+ "s" #'mpc-toggle-play
+ ">" #'mpc-next
+ "<" #'mpc-prev
+ "g" #'mpc-seek-current
+ "o" #'mpc-goto-playing-song)
(easy-menu-define mpc-mode-menu mpc-mode-map
"Menu for MPC mode."
@@ -1571,8 +1569,9 @@ when constructing the set of constraints."
(mpc-tagbrowser-refresh)
buf))))
-(defvar tag-browser-tagtypes
- (lazy-completion-table tag-browser-tagtypes
+(define-obsolete-variable-alias 'tag-browser-tagtypes 'mpc-tag-browser-tagtypes "29.1")
+(defvar mpc-tag-browser-tagtypes
+ (lazy-completion-table mpc-tag-browser-tagtypes
(lambda ()
(append '("Playlist" "Directory")
(mpc-cmd-tagtypes)))))
@@ -1583,7 +1582,7 @@ when constructing the set of constraints."
(list
(let ((completion-ignore-case t))
(intern
- (completing-read "Tag: " tag-browser-tagtypes nil 'require-match)))))
+ (completing-read "Tag: " mpc-tag-browser-tagtypes nil 'require-match)))))
(let* ((newbuf (mpc-tagbrowser-buf tag))
(win (get-buffer-window newbuf 0)))
(if win (select-window win)
@@ -1748,11 +1747,9 @@ Return non-nil if a selection was deactivated."
;; present (because we're in the non-selected part and the parent is
;; in the selected part).
-(defvar mpc-tagbrowser-dir-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map mpc-tagbrowser-mode-map)
- (define-key map [?\M-\C-m] #'mpc-tagbrowser-dir-toggle)
- map))
+(defvar-keymap mpc-tagbrowser-dir-mode-map
+ :parent mpc-tagbrowser-mode-map
+ "M-RET" #'mpc-tagbrowser-dir-toggle)
;; (defvar mpc-tagbrowser-dir-keywords
;; '(mpc-tagbrowser-dir-hide-prefix))
@@ -1859,17 +1856,15 @@ A value of t means the main playlist.")
;;; Volume management ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar mpc-volume-map
- (let ((map (make-sparse-keymap)))
- ;; Bind the up-events rather than the down-event, so the
- ;; `message' isn't canceled by the subsequent up-event binding.
- (define-key map [down-mouse-1] #'ignore)
- (define-key map [mouse-1] #'mpc-volume-mouse-set)
- (define-key map [header-line mouse-1] #'mpc-volume-mouse-set)
- (define-key map [header-line down-mouse-1] #'ignore)
- (define-key map [mode-line mouse-1] #'mpc-volume-mouse-set)
- (define-key map [mode-line down-mouse-1] #'ignore)
- map))
+(defvar-keymap mpc-volume-map
+ ;; Bind the up-events rather than the down-event, so the
+ ;; `message' isn't canceled by the subsequent up-event binding.
+ "<down-mouse-1>" #'ignore
+ "<mouse-1>" #'mpc-volume-mouse-set
+ "<header-line> <mouse-1>" #'mpc-volume-mouse-set
+ "<header-line> <down-mouse-1>" #'ignore
+ "<mode-line> <mouse-1>" #'mpc-volume-mouse-set
+ "<mode-line> <down-mouse-1>" #'ignore)
(defvar mpc-volume nil) (put 'mpc-volume 'risky-local-variable t)
@@ -1937,10 +1932,8 @@ A value of t means the main playlist.")
(defvar mpc-previous-window-config nil)
-(defvar mpc-songs-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [remap mpc-select] #'mpc-songs-jump-to)
- map))
+(defvar-keymap mpc-songs-mode-map
+ "<remap> <mpc-select>" #'mpc-songs-jump-to)
(defvar mpc-songpointer-set-visible nil)
diff --git a/lisp/net/ange-ftp.el b/lisp/net/ange-ftp.el
index 8355ca4838e..6ffa65a2dde 100644
--- a/lisp/net/ange-ftp.el
+++ b/lisp/net/ange-ftp.el
@@ -2,7 +2,7 @@
;; Copyright (C) 1989-2022 Free Software Foundation, Inc.
-;; Author: Andy Norman (ange@hplb.hpl.hp.com)
+;; Author: Andy Norman <ange@hplb.hpl.hp.com>
;; Maintainer: emacs-devel@gnu.org
;; Keywords: comm
@@ -4099,11 +4099,11 @@ E.g.,
;; Put these lines uncommented in your .emacs if you want C-r to refresh
;; ange-ftp's cache whilst doing filename completion.
;;
-;;(define-key minibuffer-local-completion-map "\C-r" 'ange-ftp-re-read-dir)
-;;(define-key minibuffer-local-must-match-map "\C-r" 'ange-ftp-re-read-dir)
+;;(define-key minibuffer-local-completion-map "\C-r" 'ange-ftp-reread-dir)
+;;(define-key minibuffer-local-must-match-map "\C-r" 'ange-ftp-reread-dir)
;;;###autoload
-(defalias 'ange-ftp-re-read-dir 'ange-ftp-reread-dir)
+(define-obsolete-function-alias 'ange-ftp-re-read-dir #'ange-ftp-reread-dir "29.1")
;;;###autoload
(defun ange-ftp-reread-dir (&optional dir)
diff --git a/lisp/net/browse-url.el b/lisp/net/browse-url.el
index a55aec76bfc..2d528c4862c 100644
--- a/lisp/net/browse-url.el
+++ b/lisp/net/browse-url.el
@@ -403,7 +403,7 @@ commands reverses the effect of this variable."
Any substring of a filename matching one of the REGEXPs is replaced by
the corresponding STRING using `replace-match', not treating STRING
literally. All pairs are applied in the order given. The default
-value converts ange-ftp/EFS-style file names into ftp URLs and prepends
+value converts ange-ftp-style file names into ftp URLs and prepends
`file:' to any file name beginning with `/'.
For example, adding to the default a specific translation of an ange-ftp
@@ -981,8 +981,7 @@ The optional NEW-WINDOW argument is not used."
;; quotes in the MAILTO URLs, so we prefer
;; to leave the URL with its embedded %nn
;; encoding intact.
- (if (eq t (compare-strings url nil 7
- "file://" nil nil))
+ (if (string-prefix-p "file://" url)
(url-unhex-string url)
url)))))
diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el
index d4d4ed54e90..6c978c5a5fe 100644
--- a/lisp/net/dbus.el
+++ b/lisp/net/dbus.el
@@ -941,9 +941,7 @@ association to the service from D-Bus."
;; Loop over the registered functions.
(dolist (elt entry)
- (when (equal
- value
- (butlast (cdr elt) (- (length (cdr elt)) (length value))))
+ (when (equal value (take (length value) (cdr elt)))
(setq ret t)
;; Compute new hash value. If it is empty, remove it from the
;; hash table.
diff --git a/lisp/net/dictionary.el b/lisp/net/dictionary.el
index 31cc5035a3e..43dd28ff6dc 100644
--- a/lisp/net/dictionary.el
+++ b/lisp/net/dictionary.el
@@ -119,7 +119,7 @@ one dictionary yields matches."
"exact"
"The default strategy for listing matching words within a popup window.
-The following algorithm (defined by the dictd server) are supported
+The following algorithms (defined by the dictd server) are supported
by the choice value:
- Exact match
@@ -130,7 +130,7 @@ by the choice value:
The found word sounds similar to the searched word. For this match type
the soundex algorithm defined by Donald E. Knuth is used. It will only
- works with english words and the algorithm is not very reliable (i.e.,
+ work with English words and the algorithm is not very reliable (i.e.,
the soundex algorithm is quite simple).
- Levenshtein distance one
@@ -330,7 +330,7 @@ is utf-8"
:doc "Keymap for the dictionary mode."
:suppress t :parent button-buffer-map
"q" #'dictionary-close
- "h" #'dictionary-help
+ "h" #'describe-mode
"s" #'dictionary-search
"d" #'dictionary-lookup-definition
"D" #'dictionary-select-dictionary
@@ -357,7 +357,7 @@ is utf-8"
(defvar dictionary-color-support
(condition-case nil
- (x-display-color-p)
+ (display-color-p)
(error nil))
"Determines if the Emacs has support to display color.")
@@ -379,7 +379,7 @@ protocol defined in RFC 2229.
This is a quick reference to this mode describing the default key bindings:
\\<dictionary-mode-map>
* \\[dictionary-close] close the dictionary buffer
-* \\[dictionary-help] display this help information
+* \\[describe-mode] display this help information
* \\[dictionary-search] ask for a new word to search
* \\[dictionary-lookup-definition] search the word at point
* \\[forward-button] or TAB place point to the next link
@@ -389,7 +389,7 @@ This is a quick reference to this mode describing the default key bindings:
* \\[dictionary-select-dictionary] select the default dictionary
* \\[dictionary-select-strategy] select the default search strategy
-* RET or <mouse-2> visit that link"
+* \\`RET' or \\`<mouse-2>' visit that link"
(unless (eq major-mode 'dictionary-mode)
(cl-incf dictionary-instances))
@@ -1184,7 +1184,8 @@ allows editing it."
(defun dictionary-help ()
"Display a little help."
- (interactive)
+ (declare (obsolete describe-mode "29.1"))
+ (interactive nil dictionary-mode)
(describe-function 'dictionary-mode))
;;;###autoload
diff --git a/lisp/net/dig.el b/lisp/net/dig.el
index d4fad0c61fd..d6436c579b3 100644
--- a/lisp/net/dig.el
+++ b/lisp/net/dig.el
@@ -22,18 +22,14 @@
;;; Commentary:
-;; This provide an interface for "dig".
+;; This provides an interface for "dig".
;;
-;; For interactive use, try M-x dig and type a hostname. Use `q' to quit
-;; dig buffer.
+;; For interactive use, try `M-x dig' and type a hostname. Use `q' to
+;; quit dig buffer.
;;
-;; For use in elisp programs, call `dig-invoke' and use
+;; For use in Emacs Lisp programs, call `dig-invoke' and use
;; `dig-extract-rr' to extract resource records.
-;;; Release history:
-
-;; 2000-10-28 posted on gnu.emacs.sources
-
;;; Code:
(defgroup dig nil
@@ -168,20 +164,21 @@ prefix, also prompt for the SERVER parameter."
(forward-line))
(dig-mode))
-;; named for consistency with query-dns in dns.el
-(defun query-dig (domain &optional
- query-type query-class query-option dig-option server)
+(defun dig-query (domain &optional
+ query-type query-class query-option dig-option server)
"Query addresses of a DOMAIN using dig.
It works by calling `dig-invoke' and `dig-extract-rr'.
Optional arguments are passed to `dig-invoke' and `dig-extract-rr'.
Returns nil for domain/class/type queries that result in no data."
-(let ((buffer (dig-invoke domain query-type query-class
- query-option dig-option server)))
- (when buffer
- (pop-to-buffer-same-window buffer)
- (let ((digger (dig-extract-rr domain query-type query-class)))
- (kill-buffer buffer)
- digger))))
+ (let ((buffer (dig-invoke domain query-type query-class
+ query-option dig-option server)))
+ (when buffer
+ (pop-to-buffer-same-window buffer)
+ (let ((digger (dig-extract-rr domain query-type query-class)))
+ (kill-buffer buffer)
+ digger))))
+
+(define-obsolete-function-alias 'query-dig #'dig-query "29.1")
(provide 'dig)
diff --git a/lisp/net/eudc-hotlist.el b/lisp/net/eudc-hotlist.el
index d70e0cf4f63..458d13fb24d 100644
--- a/lisp/net/eudc-hotlist.el
+++ b/lisp/net/eudc-hotlist.el
@@ -32,7 +32,6 @@
(require 'eudc)
-(defvar eudc-hotlist-menu nil)
(defvar eudc-hotlist-list-beginning nil)
(defvar-keymap eudc-hotlist-mode-map
@@ -46,13 +45,13 @@
(define-derived-mode eudc-hotlist-mode fundamental-mode "EUDC-Servers"
"Major mode used to edit the hotlist of servers.
-These are the special commands of this mode:
- a -- Add a new server to the list.
- d -- Delete the server at point from the list.
- s -- Select the server at point.
- t -- Transpose the server at point and the previous one
- q -- Commit the changes and quit.
- x -- Quit without committing the changes."
+These are the special commands of this mode:\\<eudc-hotlist-mode-map>
+ \\[eudc-hotlist-add-server] -- Add a new server to the list.
+ \\[eudc-hotlist-delete-server] -- Delete the server at point from the list.
+ \\[eudc-hotlist-select-server] -- Select the server at point.
+ \\[eudc-hotlist-transpose-servers] -- Transpose the server at point and the previous one
+ \\[eudc-hotlist-quit-edit] -- Commit the changes and quit.
+ \\[kill-current-buffer] -- Quit without committing the changes."
(setq buffer-read-only t))
;;;###autoload
diff --git a/lisp/net/eudc-vars.el b/lisp/net/eudc-vars.el
index 59347ccc89a..dea17f34247 100644
--- a/lisp/net/eudc-vars.el
+++ b/lisp/net/eudc-vars.el
@@ -194,7 +194,7 @@ must be set in a protocol/server-local fashion, see `eudc-server-set' and
(defcustom eudc-inline-expansion-format nil
"Specify the format of the expansion of inline queries.
This variable controls what `eudc-expand-inline' actually inserts
-in the buffer. It is either a list, or a function.
+in the buffer. It is either a list, or a function.
When set to a list, the expansion result will be formatted
according to the first element of the list, a string, which is
@@ -214,13 +214,14 @@ used to format the PHRASE, and COMMENT parts, respectively. It
receives a single argument, which is an alist of
protocol-specific attributes describing the recipient. To access
the alist elements using generic EUDC attribute names, such as
-for example name, or email, use `eudc-translate-attribute-list'.
-The function should return a list, which should contain two
-elements. If the first element is a string, it will be used as
-the PHRASE part, quoting it if necessary. If the second element
-is a string, it will be used as the COMMENT part, unless it
-contains characters not allowed in the COMMENT part by RFC 5322,
-in which case the COMMENT part will be omitted."
+for example name, or email, use `eudc-translate-query' with
+REVERSE set to t to transform the received attribute alist. The
+function should return a list, which should contain two elements.
+If the first element is a string, it will be used as the PHRASE
+part, quoting it if necessary. If the second element is a string,
+it will be used as the COMMENT part, unless it contains
+characters not allowed in the COMMENT part by RFC 5322, in which
+case the COMMENT part will be omitted."
:type '(choice (const :tag "RFC 5322 formatted \"first last <address>\"" nil)
(function :tag "RFC 5322 phrase/comment formatting function")
(list :tag "Format string (deprecated)"
diff --git a/lisp/net/eudc.el b/lisp/net/eudc.el
index 5cfd4e25ec0..eb440ba6144 100644
--- a/lisp/net/eudc.el
+++ b/lisp/net/eudc.el
@@ -48,7 +48,6 @@
(require 'wid-edit)
(require 'cl-lib)
(require 'eudc-vars)
-(eval-when-compile (require 'subr-x))
;;{{{ Internal cooking
diff --git a/lisp/net/eudcb-macos-contacts.el b/lisp/net/eudcb-macos-contacts.el
index c02b5689e79..7495dcbc9cc 100644
--- a/lisp/net/eudcb-macos-contacts.el
+++ b/lisp/net/eudcb-macos-contacts.el
@@ -25,8 +25,17 @@
;; Contacts app on localhost, so no 3rd party tools are needed.
;;; Usage:
-;; (require 'eudcb-macos-contacts)
-;; (eudc-macos-contacts-set-server "localhost")
+;; To load the library, first `require' it:
+;;
+;; (require 'eudcb-macos-contacts)
+;;
+;; In the simplest case then just use:
+;;
+;; (eudc-macos-contacts-set-server "localhost")
+;;
+;; When using `eudc-server-hotlist', instead use:
+;;
+;; (add-to-list 'eudc-server-hotlist '("localhost" . macos-contacts))
;;; Code:
@@ -35,44 +44,139 @@
;;{{{ Internal cooking
-(defvar eudc-macos-contacts-conversion-alist nil)
+(defvar eudc-macos-contacts-attributes-translation-alist
+ '((name . last_name)
+ (firstname . first_name)
+ (email . email)
+ (phone . phone)
+ (title . job_title)
+ (o . organization)
+ (ou . department))
+ "See `eudc-protocol-attributes-translation-alist'.")
+
+(defconst eudc-macos-contacts--unsearchable-attributes
+ '(email phone)
+ "See `eudc-macos-contacts-search-helper'.")
;; hook ourselves into the EUDC framework
(eudc-protocol-set 'eudc-query-function
- 'eudc-macos-contacts-query-internal
- 'macos-contacts)
+ 'eudc-macos-contacts-query-internal
+ 'macos-contacts)
(eudc-protocol-set 'eudc-list-attributes-function
- nil
- 'macos-contacts)
-(eudc-protocol-set 'eudc-macos-contacts-conversion-alist
- nil
- 'macos-contacts)
+ nil
+ 'macos-contacts)
+(eudc-protocol-set 'eudc-protocol-attributes-translation-alist
+ 'eudc-macos-contacts-attributes-translation-alist
+ 'macos-contacts)
(eudc-protocol-set 'eudc-protocol-has-default-query-attributes
- nil
- 'macos-contacts)
+ nil
+ 'macos-contacts)
-(defun eudc-macos-contacts-search-helper (str)
+(defun eudc-macos-contacts-search-helper (query)
"Helper function to query the Contacts app via AppleScript.
-Searches for all persons with a case-insensitive substring match
-of STR in any of their name fields (first, middle, or last)."
- (if (executable-find "osascript")
- (call-process "osascript" nil t nil
- "-e"
- (format "
-set results to {}
-tell application \"Address Book\"
- set pList to every person whose (name contains \"%s\")
- repeat with pers in pList
- repeat with emailAddr in emails of pers
- set results to results & {name of pers & \":\" & value ¬
- of emailAddr & \"\n\"}
- end repeat
- end repeat
- get results as text
-end tell" str))
- (message (concat "[eudc] Error in macOS Contacts backend: "
- "`osascript' executable not found. "
- "Is this is a macOS 10.0 or later system?"))))
+Searches for all persons matching QUERY. QUERY is a list of cons
+cells (ATTR . VALUE) where ATTRs should be valid macOS Contacts
+attribute names with space characters replaced by `_' characters.
+Thus, to for instance search for the \"first name\" attribute in
+the Contacts app, the corresponding ATTR would be the symbol
+`first_name'.
+
+Note that due to the way the Contacts app exposes its data via
+AppleScript, the attributes listed in
+`eudc-macos-contacts--unsearchable-attributes' can not be searched
+efficiently. If and when one of these attributes appears in
+QUERY, it is thus skipped, and the query is composed from the
+other attributes in the QUERY."
+ (let ((crit-idx 0)
+ (query-str (string)))
+ ;; assemble a query string for use in an AppleScript "whose"
+ ;; filter clause; generally, this has the form
+ ;; (ATTR1 contains "VALUE1") and (ATTR2 contains "VALUE2") and ...
+ (dolist (criterion query)
+ (let ((attr (string-replace "_" " " (symbol-name (car criterion))))
+ (term (cdr criterion)))
+ ;; defend against unusable attribute names as they cause
+ ;; AppleScript to emit an error message, which in turn will
+ ;; cause elisp errors during results parsing in
+ ;; `eudc-macos-contacts-query-internal'
+ (if (or (not (rassq (car criterion)
+ eudc-macos-contacts-attributes-translation-alist))
+ (memq (car criterion)
+ eudc-macos-contacts--unsearchable-attributes))
+ (message (concat "[eudc] Warning in macOS Contacts backend: "
+ "can not search in attribute "
+ (format "\"%s\"; skipping it." attr)))
+ (progn
+ (when (> crit-idx 0)
+ (setq query-str (concat query-str " and ")))
+ (setq query-str (concat query-str
+ (format "(%s contains \"%s\")" attr term)))
+ (setq crit-idx (1+ crit-idx))))))
+ ;; if a useful query string could be assembled, insert it into the
+ ;; AppleScript template, and run the resulting script; results are
+ ;; captured in the current buffer
+ (if (not (string= query-str ""))
+ (if (executable-find "osascript")
+ (call-process "osascript" nil t nil
+ "-e"
+ (format "
+on joinLines(theText)
+ if (theText is missing value) or (theText is \"\") then
+ return \"\"
+ else
+ set thePars to paragraphs of theText
+ set result to {}
+ repeat with para in thePars
+ set result to result & {para & space}
+ end repeat
+ return text 1 thru -2 of (result as text)
+ end if
+end joinLines
+
+on run
+ set results to {}
+ tell application \"Address Book\"
+ set pList to every person whose %s
+ repeat with pers in pList
+ set pText to ¬
+ first name of pers & \":\" & ¬
+ last name of pers & \":\"
+ if (job title of pers is not missing value) then ¬
+ set pText to pText ¬
+ & my joinLines(job title of pers)
+ set pText to pText & \":\"
+ if (department of pers is not missing value) then ¬
+ set pText to pText ¬
+ & my joinLines(department of pers)
+ set pText to pText & \":\"
+ if (organization of pers is not missing value) then ¬
+ set pText to pText ¬
+ & my joinLines(organization of pers)
+ set pText to pText & \":\"
+ if (count emails of pers) > 0 then
+ repeat with emailAddr in emails of pers
+ set pText to pText & value ¬
+ of emailAddr & \",\"
+ end repeat
+ set pText to text 1 thru -2 of pText
+ end if
+ set pText to pText & \":\"
+ if (count phones of pers) > 0 then
+ repeat with phoneNmbr in phones of pers
+ set pText to pText & value ¬
+ of phoneNmbr & \",\"
+ end repeat
+ set pText to text 1 thru -2 of pText
+ end if
+ set results to results & {pText & \"\n\"}
+ end repeat
+ get results as text
+ end tell
+end run
+" query-str))
+ (message (concat "[eudc] Error in macOS Contacts backend: "
+ "`osascript' executable not found. "
+ "Is this is a macOS 10.0 or later system?"))))))
(defun eudc-macos-contacts-query-internal (query &optional _return-attrs)
"Query macOS Contacts with QUERY.
@@ -81,24 +185,29 @@ macOS Contacts attribute names.
RETURN-ATTRS is a list of attributes to return, defaulting to
`eudc-default-return-attributes'."
(let ((macos-contacts-buffer (get-buffer-create " *macOS Contacts*"))
- result)
+ result)
(with-current-buffer macos-contacts-buffer
(erase-buffer)
- (dolist (term query)
- (eudc-macos-contacts-search-helper (cdr term)))
+ (eudc-macos-contacts-search-helper query)
(delete-duplicate-lines (point-min) (point-max))
(goto-char (point-min))
(while (not (eobp))
- (if (not (equal (line-beginning-position) (line-end-position)))
- (let* ((args (split-string (buffer-substring
- (point) (line-end-position))
- ":"))
- (name (nth 0 args))
- (email (nth 1 args)))
- (setq result (cons `((name . ,name)
- (email . ,email))
- result))))
- (forward-line))
+ (if (not (equal (line-beginning-position) (line-end-position)))
+ (let ((keys '(first_name last_name job_title department
+ organization email phone))
+ record)
+ (dolist (field (split-string (buffer-substring
+ (point) (line-end-position))
+ ":"))
+ (let ((key (pop keys)))
+ (unless (string= "" field)
+ (pcase key
+ ((or 'email 'phone) (dolist (x (split-string field ","))
+ (push (cons key x) record)))
+ (_ (push (cons key field) record))))))
+ (unless (length= record 0)
+ (push (nreverse record) result))))
+ (forward-line))
result)))
;;}}}
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index 4dbd5de2ef7..6ed0719eca6 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -64,7 +64,7 @@ The action to be taken can be further customized via
:version "28.1"
:type 'regexp)
-(defun erc--download-directory ()
+(defun eww--download-directory ()
"Return the name of the download directory.
If ~/Downloads/ exists, that will be used, and if not, the
DOWNLOAD XDG user directory will be returned. If that's
@@ -75,7 +75,7 @@ undefined, ~/Downloads/ is returned anyway."
(file-name-as-directory dir))
"~/Downloads/"))
-(defcustom eww-download-directory 'erc--download-directory
+(defcustom eww-download-directory 'eww--download-directory
"Directory where files will downloaded.
This should either be a directory name or a function (called with
no parameters) that returns a directory name."
@@ -349,6 +349,8 @@ This can also be used on the command line directly:
will start Emacs and browse the GNU web site."
(interactive)
+ (unless command-line-args-left
+ (user-error "No URL given"))
(eww (pop command-line-args-left)))
diff --git a/lisp/net/mailcap.el b/lisp/net/mailcap.el
index ee72eba35db..469643dbca4 100644
--- a/lisp/net/mailcap.el
+++ b/lisp/net/mailcap.el
@@ -87,11 +87,9 @@ you have an entry for \"image/*\" in your ~/.mailcap file."
(defcustom mailcap-user-mime-data nil
"A list of viewers preferred for different MIME types.
-The elements of the list are alists of the following structure
+The elements of the list are lists of the following structure
- ((viewer . VIEWER)
- (type . MIME-TYPE)
- (test . TEST))
+ (VIEWER MIME-TYPE TEST)
where VIEWER is either a Lisp command, e.g., a major mode, or a
string containing a shell command for viewing files of the
diff --git a/lisp/net/net-utils.el b/lisp/net/net-utils.el
index c7ff175e08e..192c8446eb1 100644
--- a/lisp/net/net-utils.el
+++ b/lisp/net/net-utils.el
@@ -442,15 +442,6 @@ If your system's ping continues until interrupted, you can try setting
ping-program
options)))
-;; FIXME -- Needs to be a process filter
-;; (defun netstat-with-filter (filter)
-;; "Run netstat program."
-;; (interactive "sFilter: ")
-;; (netstat)
-;; (set-buffer (get-buffer "*Netstat*"))
-;; (goto-char (point-min))
-;; (delete-matching-lines filter))
-
;;;###autoload
(defun nslookup-host (host &optional name-server)
"Look up the DNS information for HOST (name or IP address).
diff --git a/lisp/net/newst-backend.el b/lisp/net/newst-backend.el
index 5ae2df769a2..f65ef522f23 100644
--- a/lisp/net/newst-backend.el
+++ b/lisp/net/newst-backend.el
@@ -1552,12 +1552,8 @@ argument, which is one of the items in ITEMLIST."
(defun newsticker--remove-whitespace (string)
"Remove leading and trailing whitespace from STRING."
- ;; we must have ...+ but not ...* in the regexps otherwise xemacs loops
- ;; endlessly...
- (when (and string (stringp string))
- (replace-regexp-in-string
- "[ \t\r\n]+$" ""
- (replace-regexp-in-string "^[ \t\r\n]+" "" string))))
+ (when (stringp string)
+ (string-trim string)))
(defun newsticker--do-forget-preformatted (item)
"Forget pre-formatted data for ITEM.
diff --git a/lisp/net/newst-treeview.el b/lisp/net/newst-treeview.el
index 637f53e6550..e98767ae7c7 100644
--- a/lisp/net/newst-treeview.el
+++ b/lisp/net/newst-treeview.el
@@ -361,7 +361,8 @@ AGES is the list of ages that are to be shown."
(mapc (lambda (feed)
(let ((feed-name-symbol (intern (car feed))))
(mapc (lambda (item)
- (when (memq (newsticker--age item) ages)
+ (when (or (memq 'all ages)
+ (memq (newsticker--age item) ages))
(newsticker--treeview-list-add-item
item feed-name-symbol t)))
(newsticker--treeview-list-sort-items
@@ -1218,11 +1219,11 @@ Note: does not update the layout."
(newsticker--treeview-list-update t)
(newsticker--treeview-item-update)
(newsticker--treeview-tree-update-tags)
- (cond (newsticker--treeview-current-feed
- (newsticker--treeview-list-items newsticker--treeview-current-feed))
- (newsticker--treeview-current-vfeed
+ (cond (newsticker--treeview-current-vfeed
(newsticker--treeview-list-items-with-age
- (intern newsticker--treeview-current-vfeed))))
+ (intern newsticker--treeview-current-vfeed)))
+ (newsticker--treeview-current-feed
+ (newsticker--treeview-list-items newsticker--treeview-current-feed)))
(newsticker--treeview-tree-update-highlight)
(newsticker--treeview-list-update-highlight)
(let ((cur-feed (or newsticker--treeview-current-feed
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index 54d7861f445..065398b64af 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -1388,6 +1388,21 @@ Each element looks like (FILENAME . TEXT).")
"The current number of responses printed in this channel.
This number is independent of the number of lines in the buffer.")
+(defun rcirc--electric-pair-inhibit (char)
+ "Check whether CHAR should be paired by `electric-pair-mode'.
+This uses the default value inhibition predicate (as set by
+`electric-pair-inhibit-predicate'), but ignores all text prior to
+the prompt so that mismatches parentheses by some other message
+does not confuse the pairing."
+ (let ((fallback (default-value 'electric-pair-inhibit-predicate)))
+ ;; The assumption is that this function is only bound by
+ ;; `rcirc-mode', and should never be the global default.
+ (cl-assert (not (eq fallback #'rcirc--electric-pair-inhibit)))
+ (save-restriction
+ (widen)
+ (narrow-to-region rcirc-prompt-start-marker (point-max))
+ (funcall fallback char))))
+
(defun rcirc-mode (process target)
"Initialize an IRC buffer for writing with TARGET.
PROCESS is the process object used for communication.
@@ -1459,6 +1474,9 @@ PROCESS is the process object used for communication.
(when rcirc-cycle-completion-flag
(setq-local completion-cycle-threshold t))
+ (setq-local electric-pair-inhibit-predicate
+ #'rcirc--electric-pair-inhibit)
+
(run-mode-hooks 'rcirc-mode-hook))
(defun rcirc-update-prompt (&optional all)
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index 476c7017e6c..248faeb223c 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -1740,35 +1740,14 @@ BASE is the URL of the HTML being rendered."
shr-cookie-policy)))
(defun shr--preferred-image (dom)
- (let ((srcset (dom-attr dom 'srcset))
- (frame-width (frame-pixel-width))
- (width (string-to-number (or (dom-attr dom 'width) "100")))
- candidate)
- (when (> (length srcset) 0)
- ;; srcset consist of a series of URL/size specifications
- ;; separated by the ", " string.
- (setq srcset
- (sort (mapcar
- (lambda (elem)
- (let ((spec (split-string elem "[\t\n\r ]+")))
- (cond
- ((= (length spec) 1)
- ;; Make sure it's well formed.
- (list (car spec) 0))
- ((string-match "\\([0-9]+\\)x\\'" (cadr spec))
- ;; If we have an "x" form, then use the width
- ;; spec to compute the real width.
- (list (car spec)
- (* width (string-to-number
- (match-string 1 (cadr spec))))))
- (t
- (list (car spec)
- (string-to-number (cadr spec)))))))
- (split-string (replace-regexp-in-string
- "\\`[\t\n\r ]+\\|[\t\n\r ]+\\'" "" srcset)
- "[\t\n\r ]*,[\t\n\r ]*"))
- (lambda (e1 e2)
- (> (cadr e1) (cadr e2)))))
+ (let* ((srcset (and (dom-attr dom 'srcset)
+ (shr--parse-srcset (dom-attr dom 'srcset)
+ (and (dom-attr dom 'width)
+ (string-to-number
+ (dom-attr dom 'width))))))
+ (frame-width (frame-pixel-width))
+ candidate)
+ (when srcset
;; Choose the smallest picture that's bigger than the current
;; frame.
(setq candidate (caar srcset))
@@ -1778,6 +1757,42 @@ BASE is the URL of the HTML being rendered."
(pop srcset)))
(or candidate (dom-attr dom 'src))))
+(defun shr--parse-srcset (srcset &optional width)
+ (setq srcset (string-trim srcset)
+ width (or width 100))
+ (when (> (length srcset) 0)
+ ;; srcset consists of a series of URL/size specifications separated
+ ;; by the " ," string.
+ (sort (mapcar
+ (lambda (elem)
+ (let ((spec (split-string elem "[\t\n\r ]+")))
+ (cond
+ ((= (length spec) 1)
+ ;; Make sure it's well formed.
+ (list (car spec) 0))
+ ((string-match "\\([0-9]+\\)x\\'" (cadr spec))
+ ;; If we have an "x" form, then use the width
+ ;; spec to compute the real width.
+ (list (car spec)
+ (* width (string-to-number
+ (match-string 1 (cadr spec))))))
+ (t
+ (list (car spec)
+ (string-to-number (cadr spec)))))))
+ (with-temp-buffer
+ (insert srcset)
+ (goto-char (point-min))
+ (let ((bits nil))
+ (while (re-search-forward "[^\t\n\r ]+[\t\n\r ]+[^\t\n\r ,]+"
+ nil t)
+ (push (match-string 0) bits)
+ (if (looking-at "[\t\n\r ]*,[\t\n\r ]*")
+ (goto-char (match-end 0))
+ (goto-char (point-max))))
+ bits)))
+ (lambda (e1 e2)
+ (> (cadr e1) (cadr e2))))))
+
(defun shr-string-number (string)
(if (null string)
nil
diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
index b504ce600d1..170583f608c 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -95,7 +95,7 @@ It is used for TCP/IP devices."
(add-to-list 'tramp-methods
`(,tramp-adb-method
(tramp-login-program ,tramp-adb-program)
- (tramp-login-args (("shell")))
+ (tramp-login-args (("-s" "%d") ("shell")))
(tramp-direct-async t)
(tramp-tmpdir "/data/local/tmp")
(tramp-default-port 5555)))
@@ -182,8 +182,8 @@ It is used for TCP/IP devices."
(substitute-in-file-name . tramp-handle-substitute-in-file-name)
(temporary-file-directory . tramp-handle-temporary-file-directory)
(tramp-get-home-directory . ignore)
- (tramp-get-remote-gid . ignore)
- (tramp-get-remote-uid . ignore)
+ (tramp-get-remote-gid . tramp-adb-handle-get-remote-gid)
+ (tramp-get-remote-uid . tramp-adb-handle-get-remote-uid)
(tramp-set-file-uid-gid . ignore)
(unhandled-file-name-directory . ignore)
(unlock-file . tramp-handle-unlock-file)
@@ -252,21 +252,19 @@ arguments to pass to the OPERATION."
(defun tramp-adb-handle-file-attributes (filename &optional id-format)
"Like `file-attributes' for Tramp files."
- (unless id-format (setq id-format 'integer))
- (ignore-errors
- (with-parsed-tramp-file-name filename nil
- (with-tramp-file-property
- v localname (format "file-attributes-%s" id-format)
- (and
- (tramp-adb-send-command-and-check
- v (format "%s -d -l %s"
- (tramp-adb-get-ls-command v)
- (tramp-shell-quote-argument localname)))
- (with-current-buffer (tramp-get-buffer v)
- (tramp-adb-sh-fix-ls-output)
- (cdar (tramp-do-parse-file-attributes-with-ls v id-format))))))))
-
-(defun tramp-do-parse-file-attributes-with-ls (vec &optional id-format)
+ ;; The result is cached in `tramp-convert-file-attributes'.
+ (with-parsed-tramp-file-name filename nil
+ (tramp-convert-file-attributes v localname id-format
+ (and
+ (tramp-adb-send-command-and-check
+ v (format "%s -d -l %s | cat"
+ (tramp-adb-get-ls-command v)
+ (tramp-shell-quote-argument localname)))
+ (with-current-buffer (tramp-get-buffer v)
+ (tramp-adb-sh-fix-ls-output)
+ (cdar (tramp-do-parse-file-attributes-with-ls v)))))))
+
+(defun tramp-do-parse-file-attributes-with-ls (vec)
"Parse `file-attributes' for Tramp files using the ls(1) command."
(with-current-buffer (tramp-get-buffer vec)
(goto-char (point-min))
@@ -290,8 +288,8 @@ arguments to pass to the OPERATION."
(or is-dir symlink-target)
1 ;link-count
;; no way to handle numeric ids in Androids ash
- (if (eq id-format 'integer) 0 uid)
- (if (eq id-format 'integer) 0 gid)
+ (cons uid tramp-unknown-id-integer)
+ (cons gid tramp-unknown-id-integer)
tramp-time-dont-know ; atime
;; `date-to-time' checks `iso8601-parse', which might fail.
(let (signal-hook-function)
@@ -308,54 +306,32 @@ arguments to pass to the OPERATION."
(defun tramp-adb-handle-directory-files-and-attributes
(directory &optional full match nosort id-format count)
"Like `directory-files-and-attributes' for Tramp files."
- (unless (file-exists-p directory)
- (tramp-error (tramp-dissect-file-name directory) 'file-missing directory))
- (when (file-directory-p directory)
- (with-parsed-tramp-file-name (expand-file-name directory) nil
- (copy-tree
- (with-tramp-file-property
- v localname (format "directory-files-and-attributes-%s-%s-%s-%s-%s"
- full match id-format nosort count)
- (with-current-buffer (tramp-get-buffer v)
- (when (tramp-adb-send-command-and-check
- v (format "%s -a -l %s"
- (tramp-adb-get-ls-command v)
- (tramp-shell-quote-argument localname)))
- ;; We insert also filename/. and filename/.., because "ls" doesn't.
- ;; Looks like it does include them in toybox, since Android 6.
- (unless (re-search-backward "\\.$" nil t)
- (narrow-to-region (point-max) (point-max))
- (tramp-adb-send-command
- v (format "%s -d -a -l %s %s"
- (tramp-adb-get-ls-command v)
- (tramp-shell-quote-argument
- (tramp-compat-file-name-concat localname "."))
- (tramp-shell-quote-argument
- (tramp-compat-file-name-concat localname ".."))))
- (widen)))
- (tramp-adb-sh-fix-ls-output)
- (let ((result (tramp-do-parse-file-attributes-with-ls
- v (or id-format 'integer))))
- (when full
- (setq result
- (mapcar
- (lambda (x)
- (cons (expand-file-name (car x) directory) (cdr x)))
- result)))
- (unless nosort
- (setq result
- (sort result (lambda (x y) (string< (car x) (car y))))))
-
- (setq result (delq nil
- (mapcar
- (lambda (x) (if (or (not match)
- (string-match-p
- match (car x)))
- x))
- result)))
- (when (and (natnump count) (> count 0))
- (setq result (nbutlast result (- (length result) count))))
- result)))))))
+ (tramp-skeleton-directory-files-and-attributes
+ directory full match nosort id-format count
+ (with-current-buffer (tramp-get-buffer v)
+ (when (tramp-adb-send-command-and-check
+ v (format "%s -a -l %s | cat"
+ (tramp-adb-get-ls-command v)
+ (tramp-shell-quote-argument localname)))
+ ;; We insert also filename/. and filename/.., because "ls"
+ ;; doesn't on some file systems, like "sdcard".
+ (unless (re-search-backward "\\.$" nil t)
+ (narrow-to-region (point-max) (point-max))
+ (tramp-adb-send-command
+ v (format "%s -d -a -l %s %s | cat"
+ (tramp-adb-get-ls-command v)
+ (tramp-shell-quote-argument
+ (tramp-compat-file-name-concat localname "."))
+ (tramp-shell-quote-argument
+ (tramp-compat-file-name-concat localname ".."))))
+ (tramp-compat-replace-regexp-in-region
+ (regexp-quote
+ (tramp-compat-file-name-unquote
+ (file-name-as-directory localname)))
+ "" (point-min))
+ (widen)))
+ (tramp-adb-sh-fix-ls-output)
+ (tramp-do-parse-file-attributes-with-ls v))))
(defun tramp-adb-get-ls-command (vec)
"Determine `ls' command and its arguments."
@@ -479,7 +455,7 @@ Emacs dired can't find files."
(with-parsed-tramp-file-name (expand-file-name directory) nil
(with-tramp-file-property v localname "file-name-all-completions"
(tramp-adb-send-command
- v (format "%s -a %s"
+ v (format "%s -a %s | cat"
(tramp-adb-get-ls-command v)
(tramp-shell-quote-argument localname)))
(mapcar
@@ -490,9 +466,8 @@ Emacs dired can't find files."
(with-current-buffer (tramp-get-buffer v)
(delete-dups
(append
- ;; In older Android versions, "." and ".." are not
- ;; included. In newer versions (toybox, since Android 6)
- ;; they are. We fix this by `delete-dups'.
+ ;; On some file systems like "sdcard", "." and ".." are
+ ;; not included. We fix this by `delete-dups'.
'("." "..")
(delq
nil
@@ -502,22 +477,18 @@ Emacs dired can't find files."
(defun tramp-adb-handle-file-local-copy (filename)
"Like `file-local-copy' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (unless (file-exists-p (file-truename filename))
- (tramp-error v 'file-missing filename))
- (let ((tmpfile (tramp-compat-make-temp-file filename)))
- (with-tramp-progress-reporter
- v 3 (format "Fetching %s to tmp file %s" filename tmpfile)
- ;; "adb pull ..." does not always return an error code.
- (unless
- (and (tramp-adb-execute-adb-command
- v "pull" (tramp-compat-file-name-unquote localname) tmpfile)
- (file-exists-p tmpfile))
- (ignore-errors (delete-file tmpfile))
- (tramp-error
- v 'file-error "Cannot make local copy of file `%s'" filename))
- (set-file-modes tmpfile (logior (or (file-modes filename) 0) #o0400)))
- tmpfile)))
+ (tramp-skeleton-file-local-copy filename
+ (with-tramp-progress-reporter
+ v 3 (format "Fetching %s to tmp file %s" filename tmpfile)
+ ;; "adb pull ..." does not always return an error code.
+ (unless
+ (and (tramp-adb-execute-adb-command
+ v "pull" (tramp-compat-file-name-unquote localname) tmpfile)
+ (file-exists-p tmpfile))
+ (ignore-errors (delete-file tmpfile))
+ (tramp-error
+ v 'file-error "Cannot make local copy of file `%s'" filename))
+ (set-file-modes tmpfile (logior (or (file-modes filename) 0) #o0400)))))
(defun tramp-adb-handle-file-executable-p (filename)
"Like `file-executable-p' for Tramp files."
@@ -549,34 +520,39 @@ Emacs dired can't find files."
(start end filename &optional append visit lockname mustbenew)
"Like `write-region' for Tramp files."
(tramp-skeleton-write-region start end filename append visit lockname mustbenew
- (let ((tmpfile (tramp-compat-make-temp-file filename)))
- (when (and append (file-exists-p filename))
- (copy-file filename tmpfile 'ok)
- (set-file-modes tmpfile (logior (or (file-modes tmpfile) 0) #o0600)))
- (let (create-lockfiles)
- (write-region start end tmpfile append 'no-message))
- (with-tramp-progress-reporter
- v 3 (format-message
- "Moving tmp file `%s' to `%s'" tmpfile filename)
- (unwind-protect
- (unless (tramp-adb-execute-adb-command
- v "push" tmpfile (tramp-compat-file-name-unquote localname))
- (tramp-error v 'file-error "Cannot write: `%s'" filename))
- (delete-file tmpfile))))))
+ ;; If `start' is the empty string, it is likely that a temporary
+ ;; file is created. Do it directly.
+ (if (and (stringp start) (string-empty-p start))
+ (tramp-adb-send-command-and-check
+ v (format "echo -n \"\" >%s" (tramp-shell-quote-argument localname)))
+
+ (let ((tmpfile (tramp-compat-make-temp-file filename)))
+ (when (and append (file-exists-p filename))
+ (copy-file filename tmpfile 'ok)
+ (set-file-modes tmpfile (logior (or (file-modes tmpfile) 0) #o0600)))
+ (let (create-lockfiles)
+ (write-region start end tmpfile append 'no-message))
+ (with-tramp-progress-reporter
+ v 3 (format-message
+ "Moving tmp file `%s' to `%s'" tmpfile filename)
+ (unwind-protect
+ (unless (tramp-adb-execute-adb-command
+ v "push" tmpfile
+ (tramp-compat-file-name-unquote localname))
+ (tramp-error v 'file-error "Cannot write: `%s'" filename))
+ (delete-file tmpfile)))))))
(defun tramp-adb-handle-set-file-modes (filename mode &optional flag)
"Like `set-file-modes' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- ;; ADB shell does not support "chmod -h".
- (unless (and (eq flag 'nofollow) (file-symlink-p filename))
- (tramp-flush-file-properties v localname)
+ ;; ADB shell does not support "chmod -h".
+ (unless (and (eq flag 'nofollow) (file-symlink-p filename))
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(tramp-adb-send-command-and-check
v (format "chmod %o %s" mode (tramp-shell-quote-argument localname))))))
(defun tramp-adb-handle-set-file-times (filename &optional time flag)
"Like `set-file-times' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(let ((time (if (or (null time)
(tramp-compat-time-equal-p time tramp-time-doesnt-exist)
(tramp-compat-time-equal-p time tramp-time-dont-know))
@@ -617,62 +593,61 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
;; let-bind `jka-compr-inhibit' to t.
(jka-compr-inhibit t))
(with-parsed-tramp-file-name (if t1 filename newname) nil
- (unless (file-exists-p filename)
- (tramp-error v 'file-missing filename))
- (when (and (not ok-if-already-exists) (file-exists-p newname))
- (tramp-error v 'file-already-exists newname))
- (when (and (file-directory-p newname)
- (not (directory-name-p newname)))
- (tramp-error v 'file-error "File is a directory %s" newname))
-
- (with-tramp-progress-reporter
- v 0 (format "Copying %s to %s" filename newname)
- (if (and t1 t2 (tramp-equal-remote filename newname))
- (let ((l1 (tramp-file-local-name filename))
- (l2 (tramp-file-local-name newname)))
- ;; We must also flush the cache of the directory,
- ;; because `file-attributes' reads the values from
- ;; there.
- (tramp-flush-file-properties v l2)
- ;; Short track.
- (tramp-adb-barf-unless-okay
- v (format
- "cp -f %s %s"
- (tramp-shell-quote-argument l1)
- (tramp-shell-quote-argument l2))
- "Error copying %s to %s" filename newname))
-
- (if-let ((tmpfile (file-local-copy filename)))
- ;; Remote filename.
- (condition-case err
- (rename-file tmpfile newname ok-if-already-exists)
- ((error quit)
- (delete-file tmpfile)
- (signal (car err) (cdr err))))
-
- ;; Remote newname.
- (when (and (file-directory-p newname)
- (directory-name-p newname))
- (setq newname
- (expand-file-name
- (file-name-nondirectory filename) newname)))
-
- (with-parsed-tramp-file-name newname nil
- (when (and (not ok-if-already-exists)
- (file-exists-p newname))
- (tramp-error v 'file-already-exists newname))
-
- ;; We must also flush the cache of the directory,
- ;; because `file-attributes' reads the values from
- ;; there.
- (tramp-flush-file-properties v localname)
- (unless (tramp-adb-execute-adb-command
- v "push"
- (tramp-compat-file-name-unquote filename)
- (tramp-compat-file-name-unquote localname))
- (tramp-error
- v 'file-error
- "Cannot copy `%s' `%s'" filename newname))))))))
+ (tramp-barf-if-file-missing v filename
+ (when (and (not ok-if-already-exists) (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+ (when (and (file-directory-p newname)
+ (not (directory-name-p newname)))
+ (tramp-error v 'file-error "File is a directory %s" newname))
+
+ (with-tramp-progress-reporter
+ v 0 (format "Copying %s to %s" filename newname)
+ (if (and t1 t2 (tramp-equal-remote filename newname))
+ (let ((l1 (tramp-file-local-name filename))
+ (l2 (tramp-file-local-name newname)))
+ ;; We must also flush the cache of the directory,
+ ;; because `file-attributes' reads the values from
+ ;; there.
+ (tramp-flush-file-properties v l2)
+ ;; Short track.
+ (tramp-adb-barf-unless-okay
+ v (format
+ "cp -f %s %s"
+ (tramp-shell-quote-argument l1)
+ (tramp-shell-quote-argument l2))
+ "Error copying %s to %s" filename newname))
+
+ (if-let ((tmpfile (file-local-copy filename)))
+ ;; Remote filename.
+ (condition-case err
+ (rename-file tmpfile newname ok-if-already-exists)
+ ((error quit)
+ (delete-file tmpfile)
+ (signal (car err) (cdr err))))
+
+ ;; Remote newname.
+ (when (and (file-directory-p newname)
+ (directory-name-p newname))
+ (setq newname
+ (expand-file-name
+ (file-name-nondirectory filename) newname)))
+
+ (with-parsed-tramp-file-name newname nil
+ (when (and (not ok-if-already-exists)
+ (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+
+ ;; We must also flush the cache of the directory,
+ ;; because `file-attributes' reads the values from
+ ;; there.
+ (tramp-flush-file-properties v localname)
+ (unless (tramp-adb-execute-adb-command
+ v "push"
+ (tramp-compat-file-name-unquote filename)
+ (tramp-compat-file-name-unquote localname))
+ (tramp-error
+ v 'file-error
+ "Cannot copy `%s' `%s'" filename newname)))))))))
;; KEEP-DATE handling.
(when keep-date
@@ -698,37 +673,38 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
;; let-bind `jka-compr-inhibit' to t.
(jka-compr-inhibit t))
(with-parsed-tramp-file-name (if t1 filename newname) nil
- (unless (file-exists-p filename)
- (tramp-error v 'file-missing filename))
- (when (and (not ok-if-already-exists) (file-exists-p newname))
- (tramp-error v 'file-already-exists newname))
- (when (and (file-directory-p newname)
- (not (directory-name-p newname)))
- (tramp-error v 'file-error "File is a directory %s" newname))
-
- (with-tramp-progress-reporter
- v 0 (format "Renaming %s to %s" filename newname)
- (if (and t1 t2
- (tramp-equal-remote filename newname)
- (not (file-directory-p filename)))
- (let ((l1 (tramp-file-local-name filename))
- (l2 (tramp-file-local-name newname)))
- ;; We must also flush the cache of the directory, because
- ;; `file-attributes' reads the values from there.
- (tramp-flush-file-properties v l1)
- (tramp-flush-file-properties v l2)
- ;; Short track.
- (tramp-adb-barf-unless-okay
- v (format
- "mv -f %s %s"
- (tramp-shell-quote-argument l1)
- (tramp-shell-quote-argument l2))
- "Error renaming %s to %s" filename newname))
-
- ;; Rename by copy.
- (copy-file
- filename newname ok-if-already-exists 'keep-time 'preserve-uid-gid)
- (delete-file filename)))))))
+ (tramp-barf-if-file-missing v filename
+ (when (and (not ok-if-already-exists) (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+ (when (and (file-directory-p newname)
+ (not (directory-name-p newname)))
+ (tramp-error v 'file-error "File is a directory %s" newname))
+
+ (with-tramp-progress-reporter
+ v 0 (format "Renaming %s to %s" filename newname)
+ (if (and t1 t2
+ (tramp-equal-remote filename newname)
+ (not (file-directory-p filename)))
+ (let ((l1 (tramp-file-local-name filename))
+ (l2 (tramp-file-local-name newname)))
+ ;; We must also flush the cache of the directory,
+ ;; because `file-attributes' reads the values from
+ ;; there.
+ (tramp-flush-file-properties v l1)
+ (tramp-flush-file-properties v l2)
+ ;; Short track.
+ (tramp-adb-barf-unless-okay
+ v (format
+ "mv -f %s %s"
+ (tramp-shell-quote-argument l1)
+ (tramp-shell-quote-argument l2))
+ "Error renaming %s to %s" filename newname))
+
+ ;; Rename by copy.
+ (copy-file
+ filename newname ok-if-already-exists
+ 'keep-time 'preserve-uid-gid)
+ (delete-file filename))))))))
(defun tramp-adb-get-signal-strings (vec)
"Strings to return by `process-file' in case of signals."
@@ -859,7 +835,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
;; because the remote process could have changed them.
(when tmpinput (delete-file tmpinput))
(when process-file-side-effects
- (tramp-flush-directory-properties v ""))
+ (tramp-flush-directory-properties v "/"))
;; Return exit status.
(if (equal ret -1)
@@ -904,7 +880,10 @@ implementation will be used."
(signal 'wrong-type-argument (list #'symbolp coding)))
(when (eq connection-type t)
(setq connection-type 'pty))
- (unless (memq connection-type '(nil pipe pty))
+ (unless (or (and (consp connection-type)
+ (memq (car connection-type) '(nil pipe pty))
+ (memq (cdr connection-type) '(nil pipe pty)))
+ (memq connection-type '(nil pipe pty)))
(signal 'wrong-type-argument (list #'symbolp connection-type)))
(unless (or (null filter) (eq filter t) (functionp filter))
(signal 'wrong-type-argument (list #'functionp filter)))
@@ -955,102 +934,99 @@ implementation will be used."
name1 (format "%s<%d>" name i)))
(setq name name1)
- (with-tramp-saved-connection-property v "process-name"
- (with-tramp-saved-connection-property v "process-buffer"
- ;; Set the new process properties.
- (tramp-set-connection-property v "process-name" name)
- (tramp-set-connection-property v "process-buffer" buffer)
- (with-current-buffer (tramp-get-connection-buffer v)
- (unwind-protect
- ;; We catch this event. Otherwise,
- ;; `make-process' could be called on the local
- ;; host.
- (save-excursion
- (save-restriction
- ;; Activate narrowing in order to save
- ;; BUFFER contents. Clear also the
- ;; modification time; otherwise we might be
- ;; interrupted by `verify-visited-file-modtime'.
- (let ((buffer-undo-list t)
- (inhibit-read-only t)
- (coding-system-for-write
- (if (symbolp coding) coding (car coding)))
- (coding-system-for-read
- (if (symbolp coding) coding (cdr coding))))
- (clear-visited-file-modtime)
- (narrow-to-region (point-max) (point-max))
- ;; We call `tramp-adb-maybe-open-connection',
- ;; in order to cleanup the prompt afterwards.
- (tramp-adb-maybe-open-connection v)
- (delete-region (point-min) (point-max))
- ;; Send the command.
- (setq p (tramp-get-connection-process v))
- (tramp-adb-send-command v command nil t) ; nooutput
- ;; Set sentinel and filter.
- (when sentinel
- (set-process-sentinel p sentinel))
- (when filter
- (set-process-filter p filter))
- (process-put p 'remote-command orig-command)
- (tramp-set-connection-property
- p "remote-command" orig-command)
- ;; Set query flag and process marker for
- ;; this process. We ignore errors,
- ;; because the process could have finished
- ;; already.
- (ignore-errors
- (set-process-query-on-exit-flag p (null noquery))
- (set-marker (process-mark p) (point))
- ;; We must flush them here already;
- ;; otherwise `rename-file', `delete-file' or
- ;; `insert-file-contents' will fail.
- (tramp-flush-connection-property v "process-name")
- (tramp-flush-connection-property
- v "process-buffer")
- ;; Copy tmpstderr file.
- (when (and (stringp stderr)
- (not (tramp-tramp-file-p stderr)))
- (add-function
- :after (process-sentinel p)
- (lambda (_proc _msg)
- (rename-file remote-tmpstderr stderr))))
- ;; Read initial output. Remove the
- ;; first line, which is the command
- ;; echo.
- (unless (eq filter t)
- (while
- (progn
- (goto-char (point-min))
- (not (re-search-forward "[\n]" nil t)))
- (tramp-accept-process-output p 0))
- (delete-region (point-min) (point)))
- ;; Provide error buffer. This shows
- ;; only initial error messages; messages
- ;; arriving later on will be inserted
- ;; when the process is deleted. The
- ;; temporary file will exist until the
- ;; process is deleted.
- (when (bufferp stderr)
- (with-current-buffer stderr
- (insert-file-contents-literally
- remote-tmpstderr 'visit))
- ;; Delete tmpstderr file.
- (add-function
- :after (process-sentinel p)
- (lambda (_proc _msg)
- (with-current-buffer stderr
- (insert-file-contents-literally
- remote-tmpstderr 'visit nil nil 'replace))
- (delete-file remote-tmpstderr))))
- ;; Return process.
- p))))
-
- ;; Save exit.
- (if (string-prefix-p tramp-temp-buffer-name (buffer-name))
- (ignore-errors
- (set-process-buffer p nil)
- (kill-buffer (current-buffer)))
- (set-buffer-modified-p bmp))))))))))))
+ (with-tramp-saved-connection-properties
+ v '("process-name" "process-buffer")
+ ;; Set the new process properties.
+ (tramp-set-connection-property v "process-name" name)
+ (tramp-set-connection-property v "process-buffer" buffer)
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (unwind-protect
+ ;; We catch this event. Otherwise, `make-process'
+ ;; could be called on the local host.
+ (save-excursion
+ (save-restriction
+ ;; Activate narrowing in order to save BUFFER
+ ;; contents. Clear also the modification
+ ;; time; otherwise we might be interrupted by
+ ;; `verify-visited-file-modtime'.
+ (let ((buffer-undo-list t)
+ (inhibit-read-only t)
+ (coding-system-for-write
+ (if (symbolp coding) coding (car coding)))
+ (coding-system-for-read
+ (if (symbolp coding) coding (cdr coding))))
+ (clear-visited-file-modtime)
+ (narrow-to-region (point-max) (point-max))
+ ;; We call `tramp-adb-maybe-open-connection',
+ ;; in order to cleanup the prompt afterwards.
+ (tramp-adb-maybe-open-connection v)
+ (delete-region (point-min) (point-max))
+ ;; Send the command.
+ (setq p (tramp-get-connection-process v))
+ (tramp-adb-send-command v command nil t) ; nooutput
+ ;; Set sentinel and filter.
+ (when sentinel
+ (set-process-sentinel p sentinel))
+ (when filter
+ (set-process-filter p filter))
+ (process-put p 'remote-command orig-command)
+ (tramp-set-connection-property
+ p "remote-command" orig-command)
+ ;; Set query flag and process marker for
+ ;; this process. We ignore errors, because
+ ;; the process could have finished already.
+ (ignore-errors
+ (set-process-query-on-exit-flag p (null noquery))
+ (set-marker (process-mark p) (point))
+ ;; We must flush them here already;
+ ;; otherwise `rename-file', `delete-file'
+ ;; or `insert-file-contents' will fail.
+ (tramp-flush-connection-property v "process-name")
+ (tramp-flush-connection-property
+ v "process-buffer")
+ ;; Copy tmpstderr file.
+ (when (and (stringp stderr)
+ (not (tramp-tramp-file-p stderr)))
+ (add-function
+ :after (process-sentinel p)
+ (lambda (_proc _msg)
+ (rename-file remote-tmpstderr stderr))))
+ ;; Read initial output. Remove the first
+ ;; line, which is the command echo.
+ (unless (eq filter t)
+ (while
+ (progn
+ (goto-char (point-min))
+ (not (re-search-forward "[\n]" nil t)))
+ (tramp-accept-process-output p 0))
+ (delete-region (point-min) (point)))
+ ;; Provide error buffer. This shows only
+ ;; initial error messages; messages
+ ;; arriving later on will be inserted when
+ ;; the process is deleted. The temporary
+ ;; file will exist until the process is
+ ;; deleted.
+ (when (bufferp stderr)
+ (with-current-buffer stderr
+ (insert-file-contents-literally
+ remote-tmpstderr 'visit))
+ ;; Delete tmpstderr file.
+ (add-function
+ :after (process-sentinel p)
+ (lambda (_proc _msg)
+ (with-current-buffer stderr
+ (insert-file-contents-literally
+ remote-tmpstderr 'visit nil nil 'replace))
+ (delete-file remote-tmpstderr))))
+ ;; Return process.
+ p))))
+
+ ;; Save exit.
+ (if (string-prefix-p tramp-temp-buffer-name (buffer-name))
+ (ignore-errors
+ (set-process-buffer p nil)
+ (kill-buffer (current-buffer)))
+ (set-buffer-modified-p bmp)))))))))))
(defun tramp-adb-handle-exec-path ()
"Like `exec-path' for Tramp files."
@@ -1067,6 +1043,36 @@ implementation will be used."
;; The equivalent to `exec-directory'.
`(,(tramp-file-local-name (expand-file-name default-directory)))))
+(defun tramp-adb-handle-get-remote-uid (vec id-format)
+ "Like `tramp-get-remote-uid' for Tramp files.
+ ID-FORMAT valid values are `string' and `integer'."
+ ;; The result is cached in `tramp-get-remote-uid'.
+ (tramp-adb-send-command
+ vec
+ (format "id -u%s %s"
+ (if (equal id-format 'integer) "" "n")
+ (if (equal id-format 'integer)
+ "" "| sed -e s/^/\\\"/ -e s/\\$/\\\"/")))
+ (with-current-buffer (tramp-get-connection-buffer vec)
+ ;; Read the expression.
+ (goto-char (point-min))
+ (read (current-buffer))))
+
+(defun tramp-adb-handle-get-remote-gid (vec id-format)
+ "Like `tramp-get-remote-gid' for Tramp files.
+ID-FORMAT valid values are `string' and `integer'."
+ ;; The result is cached in `tramp-get-remote-gid'.
+ (tramp-adb-send-command
+ vec
+ (format "id -g%s %s"
+ (if (equal id-format 'integer) "" "n")
+ (if (equal id-format 'integer)
+ "" "| sed -e s/^/\\\"/ -e s/\\$/\\\"/")))
+ (with-current-buffer (tramp-get-connection-buffer vec)
+ ;; Read the expression.
+ (goto-char (point-min))
+ (read (current-buffer))))
+
(defun tramp-adb-get-device (vec)
"Return full host name from VEC to be used in shell execution.
E.g. a host name \"192.168.1.1#5555\" returns \"192.168.1.1:5555\"
@@ -1237,9 +1243,8 @@ connection if a previous connection has died for some reason."
(with-tramp-progress-reporter vec 3 "Opening adb shell connection"
(let* ((coding-system-for-read 'utf-8-dos) ; Is this correct?
(process-connection-type tramp-process-connection-type)
- (args (if (> (length host) 0)
- (list "-s" device "shell")
- (list "shell")))
+ (args (tramp-expand-args
+ vec 'tramp-login-args ?d (or device "")))
(p (let ((default-directory
tramp-compat-temporary-file-directory))
(apply #'start-process (tramp-get-connection-name vec) buf
diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el
index 119ac54dd29..548999ca1d2 100644
--- a/lisp/net/tramp-archive.el
+++ b/lisp/net/tramp-archive.el
@@ -227,7 +227,7 @@ It must be supported by libarchive(3).")
(delete-file . tramp-archive-handle-not-implemented)
;; `diff-latest-backup-file' performed by default handler.
(directory-file-name . tramp-archive-handle-directory-file-name)
- (directory-files . tramp-handle-directory-files)
+ (directory-files . tramp-archive-handle-directory-files)
(directory-files-and-attributes
. tramp-handle-directory-files-and-attributes)
(dired-compress-file . tramp-archive-handle-not-implemented)
@@ -240,7 +240,7 @@ It must be supported by libarchive(3).")
(file-directory-p . tramp-handle-file-directory-p)
(file-equal-p . tramp-handle-file-equal-p)
(file-executable-p . tramp-archive-handle-file-executable-p)
- (file-exists-p . tramp-handle-file-exists-p)
+ (file-exists-p . tramp-archive-handle-file-exists-p)
(file-in-directory-p . tramp-handle-file-in-directory-p)
(file-local-copy . tramp-archive-handle-file-local-copy)
(file-locked-p . ignore)
@@ -322,6 +322,10 @@ arguments to pass to the OPERATION."
(inhibit-file-name-operation operation))
(apply operation args))))
+;; Starting with Emacs 29, `tramp-archive-file-name-handler' is
+;; autoloaded. But it must still be in tramp-loaddefs.el for older
+;; Emacsen.
+;;;###autoload(autoload 'tramp-archive-file-name-handler "tramp-archive")
;;;###tramp-autoload
(defun tramp-archive-file-name-handler (operation &rest args)
"Invoke the file archive related OPERATION.
@@ -348,6 +352,13 @@ arguments to pass to the OPERATION."
(tramp-archive-run-real-handler
#'file-directory-p (list archive)))
(tramp-archive-run-real-handler operation args)
+ ;; The default directory of the Tramp connection buffer
+ ;; cannot be accessed. (Bug#56628)
+ ;; FIXME: It is superfluous to set it every single loop.
+ ;; But there is no place to set it when creating the buffer.
+ (with-current-buffer
+ (tramp-get-buffer (tramp-archive-dissect-file-name filename))
+ (setq default-directory (file-name-as-directory archive)))
;; Now run the handler.
(let ((tramp-methods (cons `(,tramp-archive-method) tramp-methods))
(tramp-gvfs-methods tramp-archive-all-gvfs-methods)
@@ -605,6 +616,27 @@ offered."
;; example. So we return `directory'.
directory)))
+(defun tramp-archive-handle-directory-files
+ (directory &optional full match nosort count)
+ "Like `directory-files' for Tramp files."
+ (unless (file-exists-p directory)
+ (tramp-error (tramp-dissect-file-name directory) 'file-missing directory))
+ (when (file-directory-p directory)
+ (setq directory (file-name-as-directory (expand-file-name directory)))
+ (let ((temp (nreverse (file-name-all-completions "" directory)))
+ result item)
+
+ (while temp
+ (setq item (directory-file-name (pop temp)))
+ (when (or (null match) (string-match-p match item))
+ (push (if full (concat directory item) item)
+ result)))
+ (unless nosort
+ (setq result (sort result #'string<)))
+ (when (and (natnump count) (> count 0))
+ (setq result (tramp-compat-ntake count result)))
+ result)))
+
(defun tramp-archive-handle-dired-uncache (dir)
"Like `dired-uncache' for file archives."
(dired-uncache (tramp-archive-gvfs-file-name dir)))
@@ -617,6 +649,10 @@ offered."
"Like `file-executable-p' for file archives."
(file-executable-p (tramp-archive-gvfs-file-name filename)))
+(defun tramp-archive-handle-file-exists-p (filename)
+ "Like `file-exists-p' for file archives."
+ (file-exists-p (tramp-archive-gvfs-file-name filename)))
+
(defun tramp-archive-handle-file-local-copy (filename)
"Like `file-local-copy' for file archives."
(file-local-copy (tramp-archive-gvfs-file-name filename)))
diff --git a/lisp/net/tramp-cache.el b/lisp/net/tramp-cache.el
index dbebcad1a84..289df2f9aad 100644
--- a/lisp/net/tramp-cache.el
+++ b/lisp/net/tramp-cache.el
@@ -48,7 +48,7 @@
;; - The key is a process. These are temporary properties related to
;; an open connection. Examples: "scripts" keeps shell script
;; definitions already sent to the remote shell, "last-cmd-time" is
-;; the time stamp a command has been sent to the remote process.
+;; the timestamp a command has been sent to the remote process.
;;
;; - The key is nil. These are temporary properties related to the
;; local machine. Examples: "parse-passwd" and "parse-group" keep
@@ -75,8 +75,9 @@
;;; Code:
-(require 'tramp)
-(autoload 'time-stamp-string "time-stamp")
+(require 'tramp-compat)
+(require 'tramp-loaddefs)
+(require 'time-stamp)
;;; -- Cache --
@@ -133,11 +134,7 @@ If KEY is `tramp-cache-undefined', don't create anything, and return nil."
"Get the PROPERTY of FILE from the cache context of KEY.
Return DEFAULT if not set."
;; Unify localname. Remove hop from `tramp-file-name' structure.
- (setq file (tramp-compat-file-name-unquote file)
- key (copy-tramp-file-name key))
- (setf (tramp-file-name-localname key)
- (tramp-run-real-handler #'directory-file-name (list file))
- (tramp-file-name-hop key) nil)
+ (setq key (tramp-file-name-unify key file))
(let* ((hash (tramp-get-hash-table key))
(cached (and (hash-table-p hash) (gethash property hash)))
(cached-at (and (consp cached) (format-time-string "%T" (car cached))))
@@ -161,7 +158,8 @@ Return DEFAULT if not set."
(tramp-message
key 8 "%s %s %s; inhibit: %s; cache used: %s; cached at: %s"
- file property value remote-file-name-inhibit-cache cache-used cached-at)
+ (tramp-file-name-localname key)
+ property value remote-file-name-inhibit-cache cache-used cached-at)
;; For analysis purposes, count the number of getting this file attribute.
(when (>= tramp-verbose 10)
(let* ((var (intern (concat "tramp-cache-get-count-" property)))
@@ -181,15 +179,12 @@ Return DEFAULT if not set."
"Set the PROPERTY of FILE to VALUE, in the cache context of KEY.
Return VALUE."
;; Unify localname. Remove hop from `tramp-file-name' structure.
- (setq file (tramp-compat-file-name-unquote file)
- key (copy-tramp-file-name key))
- (setf (tramp-file-name-localname key)
- (tramp-run-real-handler #'directory-file-name (list file))
- (tramp-file-name-hop key) nil)
+ (setq key (tramp-file-name-unify key file))
(let ((hash (tramp-get-hash-table key)))
;; We put the timestamp there.
(puthash property (cons (current-time) value) hash)
- (tramp-message key 8 "%s %s %s" file property value)
+ (tramp-message
+ key 8 "%s %s %s" (tramp-file-name-localname key) property value)
;; For analysis purposes, count the number of setting this file attribute.
(when (>= tramp-verbose 10)
(let* ((var (intern (concat "tramp-cache-set-count-" property)))
@@ -205,16 +200,18 @@ Return VALUE."
(unintern var obarray))))
;;;###tramp-autoload
+(defun tramp-file-property-p (key file property)
+ "Check whether PROPERTY of FILE is defined in the cache context of KEY."
+ (not (eq (tramp-get-file-property key file property tramp-cache-undefined)
+ tramp-cache-undefined)))
+
+;;;###tramp-autoload
(defun tramp-flush-file-property (key file property)
"Remove PROPERTY of FILE in the cache context of KEY."
;; Unify localname. Remove hop from `tramp-file-name' structure.
- (setq file (tramp-compat-file-name-unquote file)
- key (copy-tramp-file-name key))
- (setf (tramp-file-name-localname key)
- (tramp-run-real-handler #'directory-file-name (list file))
- (tramp-file-name-hop key) nil)
+ (setq key (tramp-file-name-unify key file))
(remhash property (tramp-get-hash-table key))
- (tramp-message key 8 "%s %s" file property)
+ (tramp-message key 8 "%s %s" (tramp-file-name-localname key) property)
(when (>= tramp-verbose 10)
(let ((var (intern (concat "tramp-cache-set-count-" property))))
(makunbound var))))
@@ -226,10 +223,7 @@ Return VALUE."
(when-let ((file (file-name-directory file))
(file (directory-file-name file)))
;; Unify localname. Remove hop from `tramp-file-name' structure.
- (setq file (tramp-compat-file-name-unquote file)
- key (copy-tramp-file-name key))
- (setf (tramp-file-name-localname key) file
- (tramp-file-name-hop key) nil)
+ (setq key (tramp-file-name-unify key file))
(dolist (property (hash-table-keys (tramp-get-hash-table key)))
(when (string-match-p
"^\\(directory-\\|file-name-all-completions\\|file-entries\\)"
@@ -239,14 +233,10 @@ Return VALUE."
;;;###tramp-autoload
(defun tramp-flush-file-properties (key file)
"Remove all properties of FILE in the cache context of KEY."
- (let* ((file (tramp-run-real-handler #'directory-file-name (list file)))
- (truename (tramp-get-file-property key file "file-truename")))
+ (let ((truename (tramp-get-file-property key file "file-truename")))
;; Unify localname. Remove hop from `tramp-file-name' structure.
- (setq file (tramp-compat-file-name-unquote file)
- key (copy-tramp-file-name key))
- (setf (tramp-file-name-localname key) file
- (tramp-file-name-hop key) nil)
- (tramp-message key 8 "%s" file)
+ (setq key (tramp-file-name-unify key file))
+ (tramp-message key 8 "%s" (tramp-file-name-localname key))
(remhash key tramp-cache-data)
;; Remove file properties of symlinks.
(when (and (stringp truename)
@@ -259,9 +249,8 @@ Return VALUE."
(defun tramp-flush-directory-properties (key directory)
"Remove all properties of DIRECTORY in the cache context of KEY.
Remove also properties of all files in subdirectories."
- (setq directory (tramp-compat-file-name-unquote directory))
- (let* ((directory (tramp-run-real-handler
- #'directory-file-name (list directory)))
+ (let* ((directory
+ (directory-file-name (tramp-compat-file-name-unquote directory)))
(truename (tramp-get-file-property key directory "file-truename")))
(tramp-message key 8 "%s" directory)
(dolist (key (hash-table-keys tramp-cache-data))
@@ -282,6 +271,7 @@ Remove also properties of all files in subdirectories."
;; not show proper directory contents when a file has been copied or
;; deleted before. We must apply `save-match-data', because it would
;; corrupt other packages otherwise (reported from org).
+;;;###tramp-autoload
(defun tramp-flush-file-function ()
"Flush all Tramp cache properties from `buffer-file-name'.
This is suppressed for temporary buffers."
@@ -293,8 +283,8 @@ This is suppressed for temporary buffers."
default-directory))
(tramp-verbose 0))
(when (tramp-tramp-file-p bfn)
- (with-parsed-tramp-file-name bfn nil
- (tramp-flush-file-properties v localname)))))))
+ (tramp-flush-file-properties
+ (tramp-dissect-file-name bfn) (tramp-file-local-name bfn)))))))
(add-hook 'before-revert-hook #'tramp-flush-file-function)
(add-hook 'eshell-pre-command-hook #'tramp-flush-file-function)
@@ -308,6 +298,61 @@ This is suppressed for temporary buffers."
(remove-hook 'kill-buffer-hook
#'tramp-flush-file-function)))
+;;;###tramp-autoload
+(defmacro with-tramp-file-property (key file property &rest body)
+ "Check in Tramp cache for PROPERTY, otherwise execute BODY and set cache.
+FILE must be a local file name on a connection identified via KEY."
+ (declare (indent 3) (debug t))
+ `(let ((value (tramp-get-file-property
+ ,key ,file ,property tramp-cache-undefined)))
+ (when (eq value tramp-cache-undefined)
+ ;; We cannot pass @body as parameter to
+ ;; `tramp-set-file-property' because it mangles our debug
+ ;; messages.
+ (setq value (progn ,@body))
+ (tramp-set-file-property ,key ,file ,property value))
+ value))
+
+;;;###tramp-autoload
+(defmacro with-tramp-saved-file-property (key file property &rest body)
+ "Save PROPERTY, run BODY, reset PROPERTY.
+Preserve timestamps."
+ (declare (indent 3) (debug t))
+ `(progn
+ ;; Unify localname. Remove hop from `tramp-file-name' structure.
+ (setq ,key (tramp-file-name-unify ,key ,file))
+ (let* ((hash (tramp-get-hash-table ,key))
+ (cached (and (hash-table-p hash) (gethash ,property hash))))
+ (unwind-protect (progn ,@body)
+ ;; Reset PROPERTY. Recompute hash, it could have been flushed.
+ (setq hash (tramp-get-hash-table ,key))
+ (if (consp cached)
+ (puthash ,property cached hash)
+ (remhash ,property hash))))))
+
+;;;###tramp-autoload
+(defmacro with-tramp-saved-file-properties (key file properties &rest body)
+ "Save PROPERTIES, run BODY, reset PROPERTIES.
+PROPERTIES is a list of file properties (strings).
+Preserve timestamps."
+ (declare (indent 3) (debug t))
+ `(progn
+ ;; Unify localname. Remove hop from `tramp-file-name' structure.
+ (setq ,key (tramp-file-name-unify ,key ,file))
+ (let* ((hash (tramp-get-hash-table ,key))
+ (values
+ (and (hash-table-p hash)
+ (mapcar
+ (lambda (property) (cons property (gethash property hash)))
+ ,properties))))
+ (unwind-protect (progn ,@body)
+ ;; Reset PROPERTIES. Recompute hash, it could have been flushed.
+ (setq hash (tramp-get-hash-table ,key))
+ (dolist (value values)
+ (if (consp (cdr value))
+ (puthash (car value) (cdr value) hash)
+ (remhash (car value) hash)))))))
+
;;; -- Properties --
;;;###tramp-autoload
@@ -391,6 +436,57 @@ used to cache connection properties of the local machine."
(remhash key tramp-cache-data))
;;;###tramp-autoload
+(defmacro with-tramp-connection-property (key property &rest body)
+ "Check in Tramp for property PROPERTY, otherwise execute BODY and set."
+ (declare (indent 2) (debug t))
+ `(let ((value (tramp-get-connection-property
+ ,key ,property tramp-cache-undefined)))
+ (when (eq value tramp-cache-undefined)
+ ;; We cannot pass ,@body as parameter to
+ ;; `tramp-set-connection-property' because it mangles our debug
+ ;; messages.
+ (setq value (progn ,@body))
+ (tramp-set-connection-property ,key ,property value))
+ value))
+
+;;;###tramp-autoload
+(defmacro with-tramp-saved-connection-property (key property &rest body)
+ "Save PROPERTY, run BODY, reset PROPERTY."
+ (declare (indent 2) (debug t))
+ `(progn
+ (setq ,key (tramp-file-name-unify ,key))
+ (let* ((hash (tramp-get-hash-table ,key))
+ (cached (and (hash-table-p hash)
+ (gethash ,property hash tramp-cache-undefined))))
+ (unwind-protect (progn ,@body)
+ ;; Reset PROPERTY. Recompute hash, it could have been flushed.
+ (setq hash (tramp-get-hash-table ,key))
+ (if (not (eq cached tramp-cache-undefined))
+ (puthash ,property cached hash)
+ (remhash ,property hash))))))
+
+;;;###tramp-autoload
+(defmacro with-tramp-saved-connection-properties (key properties &rest body)
+ "Save PROPERTIES, run BODY, reset PROPERTIES.
+PROPERTIES is a list of file properties (strings)."
+ (declare (indent 2) (debug t))
+ `(progn
+ (setq ,key (tramp-file-name-unify ,key))
+ (let* ((hash (tramp-get-hash-table ,key))
+ (values
+ (mapcar
+ (lambda (property)
+ (cons property (gethash property hash tramp-cache-undefined)))
+ ,properties)))
+ (unwind-protect (progn ,@body)
+ ;; Reset PROPERTIES. Recompute hash, it could have been flushed.
+ (setq hash (tramp-get-hash-table ,key))
+ (dolist (value values)
+ (if (not (eq (cdr value) tramp-cache-undefined))
+ (puthash (car value) (cdr value) hash)
+ (remhash (car value) hash)))))))
+
+;;;###tramp-autoload
(defun tramp-cache-print (table)
"Print hash table TABLE."
(when (hash-table-p table)
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
index bd2dbf4a1e0..f7704864ec6 100644
--- a/lisp/net/tramp-cmds.el
+++ b/lisp/net/tramp-cmds.el
@@ -46,7 +46,7 @@ SYNTAX can be one of the symbols `default' (default),
(let ((input (completing-read
"Enter Tramp syntax: " (tramp-syntax-values) nil t
(symbol-name tramp-syntax))))
- (unless (string-equal input "")
+ (unless (string-empty-p input)
(list (intern input)))))
(when syntax
(customize-set-variable 'tramp-syntax syntax)))
@@ -139,7 +139,7 @@ When called interactively, a Tramp connection has to be selected."
(when (bufferp buf) (kill-buffer buf)))
;; Flush file cache.
- (tramp-flush-directory-properties vec "")
+ (tramp-flush-directory-properties vec "/")
;; Flush connection cache.
(tramp-flush-connection-properties vec)
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index a12e4859ac4..203d3ede98f 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -79,6 +79,7 @@ Add the extension of F, if existing."
;; `file-name-quoted-p', `file-name-quote' and `file-name-unquote' got
;; a second argument in Emacs 27.1.
+;;;###tramp-autoload
(defalias 'tramp-compat-file-name-quoted-p
(if (equal (func-arity #'file-name-quoted-p) '(1 . 2))
#'file-name-quoted-p
@@ -294,6 +295,64 @@ CONDITION can also be a list of error conditions."
(setq secret (funcall secret)))
secret))))
+;; Function `take' is new in Emacs 29.1.
+(defalias 'tramp-compat-take
+ (if (fboundp 'take)
+ #'take
+ (lambda (n list)
+ (when (and (natnump n) (> n 0))
+ (if (>= n (length list))
+ list (butlast list (- (length list) n)))))))
+
+;; Function `ntake' is new in Emacs 29.1.
+(defalias 'tramp-compat-ntake
+ (if (fboundp 'ntake)
+ #'ntake
+ (lambda (n list)
+ (when (and (natnump n) (> n 0))
+ (if (>= n (length list))
+ list (nbutlast list (- (length list) n)))))))
+
+;; Function `string-equal-ignore-case' is new in Emacs 29.1.
+(defalias 'tramp-compat-string-equal-ignore-case
+ (if (fboundp 'string-equal-ignore-case)
+ #'string-equal-ignore-case
+ (lambda (string1 string2)
+ (eq t (compare-strings string1 nil nil string2 nil nil t)))))
+
+;; Function `auth-source-netrc-parse-all' is new in Emacs 29.1.
+;; `netrc-parse' has been obsoleted in parallel.
+(defalias 'tramp-compat-auth-source-netrc-parse-all
+ (if (fboundp 'auth-source-netrc-parse-all)
+ #'auth-source-netrc-parse-all
+ (lambda (&optional file)
+ (declare-function netrc-parse "netrc")
+ (autoload 'netrc-parse "netrc")
+ (netrc-parse file))))
+
+;; Function `replace-regexp-in-region' is new in Emacs 28.1.
+(defalias 'tramp-compat-replace-regexp-in-region
+ (if (fboundp 'replace-regexp-in-region)
+ #'replace-regexp-in-region
+ (lambda (regexp replacement &optional start end)
+ (if start
+ (when (< start (point-min))
+ (error "Start before start of buffer"))
+ (setq start (point)))
+ (if end
+ (when (> end (point-max))
+ (error "End after end of buffer"))
+ (setq end (point-max)))
+ (save-excursion
+ (let ((matches 0)
+ (case-fold-search nil))
+ (goto-char start)
+ (while (re-search-forward regexp end t)
+ (replace-match replacement t)
+ (setq matches (1+ matches)))
+ (and (not (zerop matches))
+ matches))))))
+
(dolist (elt (all-completions "tramp-compat-" obarray 'functionp))
(put (intern elt) 'tramp-suppress-trace t))
@@ -310,6 +369,6 @@ CONDITION can also be a list of error conditions."
;; parentheses with a backslash in docstrings anymore.
;;
;; * Starting with Emacs 27.1, there's `make-empty-file'. Could be
-;; used instead of `write-region'.
+;; used instead of `(write-region "" ...)'.
;;; tramp-compat.el ends here
diff --git a/lisp/net/tramp-crypt.el b/lisp/net/tramp-crypt.el
index 6cb1237a0f4..27b359d439b 100644
--- a/lisp/net/tramp-crypt.el
+++ b/lisp/net/tramp-crypt.el
@@ -23,50 +23,50 @@
;;; Commentary:
-;; Access functions for crypted remote files. It uses encfs to
+;; Access functions for encrypted remote files. It uses encfs to
;; encrypt / decrypt the files on a remote directory. A remote
-;; directory, which shall include crypted files, must be declared in
+;; directory where you wish files to be encrypted must be declared in
;; `tramp-crypt-directories' via command `tramp-crypt-add-directory'.
;; All files in that directory, including all subdirectories, are
-;; stored there encrypted. This includes file names and directory
+;; stored encrypted. This includes file names and directory
;; names.
;; This package is just responsible for the encryption part. Copying
-;; of the crypted files is still the responsibility of the remote file
-;; name handlers.
+;; of the encrypted files is still the responsibility of the remote
+;; file name handlers.
;; A password protected encfs configuration file is created the very
-;; first time you access a crypted remote directory. It is kept in
-;; your user directory "~/.emacs.d/" with the url-encoded directory
-;; name as part of the basename, and ".encfs6.xml" as suffix. Do not
-;; lose this file and the corresponding password; otherwise there is
-;; no way to decrypt your crypted files.
+;; first time you access an encrypted remote directory. It is kept in
+;; your user directory (usually "~/.emacs.d/") with the url-encoded
+;; directory name as part of the basename, and ".encfs6.xml" as
+;; suffix. Do not lose this file and the corresponding password;
+;; otherwise there is no way to decrypt your encrypted files.
;; If the user option `tramp-crypt-save-encfs-config-remote' is
;; non-nil (the default), the encfs configuration file ".encfs6.xml"
-;; is also kept in the crypted remote directory. It depends on you,
+;; is also kept in the encrypted remote directory. It depends on you,
;; whether you regard the password protection of this file as
-;; sufficient.
+;; sufficient security.
;; If you use a remote file name with a quoted localname part, this
;; localname and the corresponding file will not be encrypted/
-;; decrypted. For example, if you have a crypted remote directory
-;; "/nextcloud:user@host:/crypted_dir", the command
+;; decrypted. For example, if you have an encrypted remote directory
+;; "/nextcloud:user@host:/encrypted_dir", the command
;;
-;; C-x d /nextcloud:user@host:/crypted_dir
+;; C-x d /nextcloud:user@host:/encrypted_dir
;;
;; will show the directory listing with the plain file names, and the
;; command
;;
-;; C-x d /nextcloud:user@host:/:/crypted_dir
+;; C-x d /nextcloud:user@host:/:/encrypted_dir
;;
;; will show the directory with the encrypted file names, and visiting
-;; a file will show its crypted contents. However, it is highly
-;; discouraged to mix crypted and not crypted files in the same
+;; a file will show its encrypted contents. However, it is highly
+;; discouraged to mix encrypted and non-encrypted files in the same
;; directory.
-;; If a remote directory shall not include crypted files anymore, it
-;; must be indicated by the command `tramp-crypt-remove-directory'.
+;; To disable encryption for a particular remote directory, use the
+;; command `tramp-crypt-remove-directory'.
;;; Code:
@@ -78,7 +78,7 @@
(autoload 'text-property-search-forward "text-property-search")
(defconst tramp-crypt-method "crypt"
- "Method name for crypted remote directories.")
+ "Method name for encrypted remote directories.")
(defcustom tramp-crypt-encfs-program "encfs"
"Name of the encfs program."
@@ -96,7 +96,7 @@
"Configuration option for encfs.
This could be either \"--standard\" or \"--paranoia\". The file
name IV chaining mode mode will always be disabled when
-initializing a new crypted remote directory."
+initializing a new encrypted remote directory."
:group 'tramp
:version "28.1"
:type '(choice (const "--standard")
@@ -120,7 +120,7 @@ initializing a new crypted remote directory."
They are completed by \"M-x TAB\" only when encryption support is enabled."
(and tramp-crypt-enabled
;; `tramp-crypt-remove-directory' needs to be completed only in
- ;; case we have already crypted directories.
+ ;; case we have already encrypted directories.
(or (not (eq symbol #'tramp-crypt-remove-directory))
tramp-crypt-directories)))
@@ -129,21 +129,21 @@ They are completed by \"M-x TAB\" only when encryption support is enabled."
"Encfs configuration file name.")
(defcustom tramp-crypt-save-encfs-config-remote t
- "Whether to keep the encfs configuration file in the crypted remote directory."
+ "Whether to keep the encfs configuration file in the encrypted remote directory."
:group 'tramp
:version "28.1"
:type 'boolean)
;;;###tramp-autoload
(defvar tramp-crypt-directories nil
- "List of crypted remote directories.")
+ "List of encrypted remote directories.")
;; It must be a `defsubst' in order to push the whole code into
;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
;;;###tramp-autoload
(defsubst tramp-crypt-file-name-p (name)
- "Return the crypted remote directory NAME belongs to.
-If NAME doesn't belong to a crypted remote directory, retun nil."
+ "Return the encrypted remote directory NAME belongs to.
+If NAME doesn't belong to an encrypted remote directory, return nil."
(catch 'crypt-file-name-p
(and tramp-crypt-enabled (stringp name)
(not (tramp-compat-file-name-quoted-p name))
@@ -244,7 +244,7 @@ If NAME doesn't belong to a crypted remote directory, retun nil."
Operations not mentioned here will be handled by the default Emacs primitives.")
(defsubst tramp-crypt-file-name-for-operation (operation &rest args)
- "Like `tramp-file-name-for-operation', but for crypted remote files."
+ "Like `tramp-file-name-for-operation', but for encrypted remote files."
(let ((tfnfo (apply #'tramp-file-name-for-operation operation args)))
;; `tramp-file-name-for-operation' returns already the first argument
;; if it is remote. So we check a possible second argument.
@@ -268,7 +268,7 @@ arguments to pass to the OPERATION."
;;;###tramp-autoload
(defun tramp-crypt-file-name-handler (operation &rest args)
- "Invoke the crypted remote file related OPERATION.
+ "Invoke the encrypted remote file related OPERATION.
First arg specifies the OPERATION, second arg is a list of
arguments to pass to the OPERATION."
(if-let ((filename
@@ -413,7 +413,7 @@ ARGS are the arguments. It returns t if ran successful, and nil otherwise."
t))))
(defun tramp-crypt-do-encrypt-or-decrypt-file-name (op name)
- "Return encrypted / decrypted NAME if NAME belongs to a crypted directory.
+ "Return encrypted / decrypted NAME if NAME belongs to an encrypted directory.
OP must be `encrypt' or `decrypt'. Raise an error if this fails.
Otherwise, return NAME."
(if-let ((tramp-crypt-enabled t)
@@ -426,7 +426,7 @@ Otherwise, return NAME."
(if (directory-name-p name) #'file-name-as-directory #'identity)
(concat
dir
- (unless (string-equal localname "/")
+ (unless (string-match-p (rx (seq bos (opt "/") eos)) localname)
(with-tramp-file-property
crypt-vec localname (concat (symbol-name op) "-file-name")
(unless (tramp-crypt-send-command
@@ -442,17 +442,17 @@ Otherwise, return NAME."
name))
(defsubst tramp-crypt-encrypt-file-name (name)
- "Return encrypted NAME if NAME belongs to a crypted directory.
+ "Return encrypted NAME if NAME belongs to an encrypted directory.
Otherwise, return NAME."
(tramp-crypt-do-encrypt-or-decrypt-file-name 'encrypt name))
(defsubst tramp-crypt-decrypt-file-name (name)
- "Return decrypted NAME if NAME belongs to a crypted directory.
+ "Return decrypted NAME if NAME belongs to an encrypted directory.
Otherwise, return NAME."
(tramp-crypt-do-encrypt-or-decrypt-file-name 'decrypt name))
(defun tramp-crypt-do-encrypt-or-decrypt-file (op root infile outfile)
- "Encrypt / decrypt file INFILE to OUTFILE according to crypted directory ROOT.
+ "Encrypt / decrypt file INFILE to OUTFILE according to encrypted directory ROOT.
Both files must be local files. OP must be `encrypt' or `decrypt'.
If OP ist `decrypt', the basename of INFILE must be an encrypted file name.
Raise an error if this fails."
@@ -474,12 +474,12 @@ Raise an error if this fails."
(write-region nil nil outfile)))))
(defsubst tramp-crypt-encrypt-file (root infile outfile)
- "Encrypt file INFILE to OUTFILE according to crypted directory ROOT.
+ "Encrypt file INFILE to OUTFILE according to encrypted directory ROOT.
See `tramp-crypt-do-encrypt-or-decrypt-file'."
(tramp-crypt-do-encrypt-or-decrypt-file 'encrypt root infile outfile))
(defsubst tramp-crypt-decrypt-file (root infile outfile)
- "Decrypt file INFILE to OUTFILE according to crypted directory ROOT.
+ "Decrypt file INFILE to OUTFILE according to encrypted directory ROOT.
See `tramp-crypt-do-encrypt-or-decrypt-file'."
(tramp-crypt-do-encrypt-or-decrypt-file 'decrypt root infile outfile))
@@ -542,10 +542,10 @@ localname."
(make-tramp-file-name
:method tramp-crypt-method :user (user-login-name)
:host (url-hexify-string dir))
- (tramp-user-error nil "Not a crypted remote directory: \"%s\"" name))))
+ (tramp-user-error nil "Not an encrypted remote directory: \"%s\"" name))))
(defun tramp-crypt-get-remote-dir (vec)
- "Return the name of the crypted remote directory to be used for encfs."
+ "Return the name of the encrypted remote directory to be used for encfs."
(url-unhex-string (tramp-file-name-host vec)))
@@ -600,62 +600,61 @@ absolute file names."
(delete-directory filename 'recursive)))
(with-parsed-tramp-file-name (if t1 filename newname) nil
- (unless (file-exists-p filename)
- (tramp-error v 'file-missing filename))
- (when (and (not ok-if-already-exists) (file-exists-p newname))
- (tramp-error v 'file-already-exists newname))
- (when (and (file-directory-p newname)
- (not (directory-name-p newname)))
- (tramp-error v 'file-error "File is a directory %s" newname))
-
- (with-tramp-progress-reporter
- v 0 (format "%s %s to %s" msg-operation filename newname)
- (if (and t1 t2 (string-equal t1 t2))
- ;; Both files are on the same crypted remote directory.
- (let (tramp-crypt-enabled)
- (if (eq op 'copy)
- (copy-file
- encrypt-filename encrypt-newname ok-if-already-exists
- keep-date preserve-uid-gid preserve-extended-attributes)
- (rename-file
- encrypt-filename encrypt-newname ok-if-already-exists)))
-
- (let* ((tmpdir (tramp-compat-make-temp-file filename 'dir))
- (tmpfile1
- (expand-file-name
- (file-name-nondirectory encrypt-filename) tmpdir))
- (tmpfile2
- (expand-file-name
- (file-name-nondirectory encrypt-newname) tmpdir))
- tramp-crypt-enabled)
- (cond
- ;; Source and target file are on a crypted remote directory.
- ((and t1 t2)
- (if (eq op 'copy)
- (copy-file
- encrypt-filename encrypt-newname ok-if-already-exists
- keep-date preserve-uid-gid preserve-extended-attributes)
- (rename-file
- encrypt-filename encrypt-newname ok-if-already-exists)))
- ;; Source file is on a crypted remote directory.
- (t1
- (if (eq op 'copy)
- (copy-file
- encrypt-filename tmpfile1 t keep-date preserve-uid-gid
- preserve-extended-attributes)
- (rename-file encrypt-filename tmpfile1 t))
- (tramp-crypt-decrypt-file t1 tmpfile1 tmpfile2)
- (rename-file tmpfile2 newname ok-if-already-exists))
- ;; Target file is on a crypted remote directory.
- (t2
- (if (eq op 'copy)
- (copy-file
- filename tmpfile1 t keep-date preserve-uid-gid
- preserve-extended-attributes)
- (rename-file filename tmpfile1 t))
- (tramp-crypt-encrypt-file t2 tmpfile1 tmpfile2)
- (rename-file tmpfile2 encrypt-newname ok-if-already-exists)))
- (delete-directory tmpdir 'recursive))))))
+ (tramp-barf-if-file-missing v filename
+ (when (and (not ok-if-already-exists) (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+ (when (and (file-directory-p newname)
+ (not (directory-name-p newname)))
+ (tramp-error v 'file-error "File is a directory %s" newname))
+
+ (with-tramp-progress-reporter
+ v 0 (format "%s %s to %s" msg-operation filename newname)
+ (if (and t1 t2 (string-equal t1 t2))
+ ;; Both files are on the same encrypted remote directory.
+ (let (tramp-crypt-enabled)
+ (if (eq op 'copy)
+ (copy-file
+ encrypt-filename encrypt-newname ok-if-already-exists
+ keep-date preserve-uid-gid preserve-extended-attributes)
+ (rename-file
+ encrypt-filename encrypt-newname ok-if-already-exists)))
+
+ (let* ((tmpdir (tramp-compat-make-temp-file filename 'dir))
+ (tmpfile1
+ (expand-file-name
+ (file-name-nondirectory encrypt-filename) tmpdir))
+ (tmpfile2
+ (expand-file-name
+ (file-name-nondirectory encrypt-newname) tmpdir))
+ tramp-crypt-enabled)
+ (cond
+ ;; Source and target file are on an encrypted remote directory.
+ ((and t1 t2)
+ (if (eq op 'copy)
+ (copy-file
+ encrypt-filename encrypt-newname ok-if-already-exists
+ keep-date preserve-uid-gid preserve-extended-attributes)
+ (rename-file
+ encrypt-filename encrypt-newname ok-if-already-exists)))
+ ;; Source file is on an encrypted remote directory.
+ (t1
+ (if (eq op 'copy)
+ (copy-file
+ encrypt-filename tmpfile1 t keep-date preserve-uid-gid
+ preserve-extended-attributes)
+ (rename-file encrypt-filename tmpfile1 t))
+ (tramp-crypt-decrypt-file t1 tmpfile1 tmpfile2)
+ (rename-file tmpfile2 newname ok-if-already-exists))
+ ;; Target file is on an encrypted remote directory.
+ (t2
+ (if (eq op 'copy)
+ (copy-file
+ filename tmpfile1 t keep-date preserve-uid-gid
+ preserve-extended-attributes)
+ (rename-file filename tmpfile1 t))
+ (tramp-crypt-encrypt-file t2 tmpfile1 tmpfile2)
+ (rename-file tmpfile2 encrypt-newname ok-if-already-exists)))
+ (delete-directory tmpdir 'recursive)))))))
(when (and t1 (eq op 'rename))
(with-parsed-tramp-file-name filename v1
@@ -682,7 +681,7 @@ absolute file names."
(list filename newname ok-if-already-exists keep-date
preserve-uid-gid preserve-extended-attributes))))
-;; Crypted files won't be trashed.
+;; Encrypted files won't be trashed.
(defun tramp-crypt-handle-delete-directory
(directory &optional recursive _trash)
"Like `delete-directory' for Tramp files."
@@ -691,7 +690,7 @@ absolute file names."
(let (tramp-crypt-enabled)
(delete-directory (tramp-crypt-encrypt-file-name directory) recursive))))
-;; Crypted files won't be trashed.
+;; Encrypted files won't be trashed.
(defun tramp-crypt-handle-delete-file (filename &optional _trash)
"Like `delete-file' for Tramp files."
(with-parsed-tramp-file-name (expand-file-name filename) nil
@@ -702,36 +701,14 @@ absolute file names."
(defun tramp-crypt-handle-directory-files
(directory &optional full match nosort count)
"Like `directory-files' for Tramp files."
- (unless (file-exists-p directory)
- (tramp-error (tramp-dissect-file-name directory) 'file-missing directory))
- (when (file-directory-p directory)
- (setq directory (file-name-as-directory (expand-file-name directory)))
- (let* (tramp-crypt-enabled
- (result
- (directory-files (tramp-crypt-encrypt-file-name directory) 'full)))
- (setq result
- (mapcar (lambda (x) (tramp-crypt-decrypt-file-name x)) result))
- (when match
- (setq result
- (delq
- nil
- (mapcar
- (lambda (x)
- (when (string-match-p match (substring x (length directory)))
- x))
- result))))
- (unless full
- (setq result
- (mapcar
- (lambda (x)
- (replace-regexp-in-string
- (concat "^" (regexp-quote directory)) "" x))
- result)))
- (unless nosort
- (setq result (sort result #'string<)))
- (when (and (natnump count) (> count 0))
- (setq result (nbutlast result (- (length result) count))))
- result)))
+ (tramp-skeleton-directory-files directory full match nosort count
+ (let (tramp-crypt-enabled)
+ (mapcar
+ (lambda (x)
+ (replace-regexp-in-string
+ (concat "^" (regexp-quote directory)) ""
+ (tramp-crypt-decrypt-file-name x)))
+ (directory-files (tramp-crypt-encrypt-file-name directory) 'full)))))
(defun tramp-crypt-handle-file-attributes (filename &optional id-format)
"Like `file-attributes' for Tramp files."
@@ -847,24 +824,21 @@ WILDCARD is not supported."
(defun tramp-crypt-handle-set-file-modes (filename mode &optional flag)
"Like `set-file-modes' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(let (tramp-crypt-enabled)
(tramp-compat-set-file-modes
(tramp-crypt-encrypt-file-name filename) mode flag))))
(defun tramp-crypt-handle-set-file-times (filename &optional time flag)
"Like `set-file-times' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(let (tramp-crypt-enabled)
(tramp-compat-set-file-times
(tramp-crypt-encrypt-file-name filename) time flag))))
(defun tramp-crypt-handle-set-file-uid-gid (filename &optional uid gid)
"Like `tramp-set-file-uid-gid' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(let (tramp-crypt-enabled)
(tramp-set-file-uid-gid
(tramp-crypt-encrypt-file-name filename) uid gid))))
diff --git a/lisp/net/tramp-fuse.el b/lisp/net/tramp-fuse.el
index 2ff106d6023..486a3cc57b7 100644
--- a/lisp/net/tramp-fuse.el
+++ b/lisp/net/tramp-fuse.el
@@ -58,36 +58,30 @@
(defun tramp-fuse-handle-directory-files
(directory &optional full match nosort count)
"Like `directory-files' for Tramp files."
- (unless (file-exists-p directory)
- (tramp-error (tramp-dissect-file-name directory) 'file-missing directory))
- (when (file-directory-p directory)
- (setq directory (file-name-as-directory (expand-file-name directory)))
- (with-parsed-tramp-file-name directory nil
- (let ((result
- (tramp-compat-directory-files
- (tramp-fuse-local-file-name directory) full match nosort count)))
+ (let ((result
+ (tramp-skeleton-directory-files directory full match nosort count
+ ;; Some storage systems do not return "." and "..".
+ (delete-dups
+ (append
+ '("." "..")
+ (tramp-fuse-remove-hidden-files
+ (tramp-compat-directory-files
+ (tramp-fuse-local-file-name directory))))))))
+ (if full
;; Massage the result.
- (when full
- (let ((local (concat "^" (regexp-quote (tramp-fuse-mount-point v))))
- (remote (directory-file-name
- (funcall
- (if (tramp-compat-file-name-quoted-p directory)
- #'tramp-compat-file-name-quote #'identity)
- (file-remote-p directory)))))
- (setq result
- (mapcar
- (lambda (x) (replace-regexp-in-string local remote x))
- result))))
- ;; Some storage systems do not return "." and "..".
- (dolist (item '(".." "."))
- (when (and (string-match-p (or match (regexp-quote item)) item)
- (not
- (member (if full (setq item (concat directory item)) item)
- result)))
- (setq result (cons item result))))
- ;; Return result.
- (tramp-fuse-remove-hidden-files
- (if nosort result (sort result #'string<)))))))
+ (let ((local (concat
+ "^" (regexp-quote
+ (tramp-fuse-mount-point
+ (tramp-dissect-file-name directory)))))
+ (remote (directory-file-name
+ (funcall
+ (if (tramp-compat-file-name-quoted-p directory)
+ #'tramp-compat-file-name-quote #'identity)
+ (file-remote-p directory)))))
+ (mapcar
+ (lambda (x) (replace-regexp-in-string local remote x))
+ result))
+ result)))
(defun tramp-fuse-handle-file-attributes (filename &optional id-format)
"Like `file-attributes' for Tramp files."
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index 056237fd55c..ca5e959bea5 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -87,7 +87,7 @@
;; For hostname completion, information is retrieved from the zeroconf
;; daemon (for the "afp", "dav", "davs", and "sftp" methods). The
;; zeroconf daemon is pre-configured to discover services in the
-;; "local" domain. If another domain shall be used for discovering
+;; "local" domain. If another domain should be used for discovering
;; services, the user option `tramp-gvfs-zeroconf-domain' can be set
;; accordingly.
@@ -943,7 +943,7 @@ The call will be traced by Tramp with trace level 6."
"Current Tramp file name to be used, as vector.
It is needed when D-Bus signals or errors arrive, because there
is no information where to trace the message.
-Globally, the value shall always be nil; it is bound where needed.")
+The global value will always be nil; it is bound where needed.")
(defun tramp-gvfs-dbus-event-error (event err)
"Called when a D-Bus error message arrives, see `dbus-event-error-functions'."
@@ -960,6 +960,15 @@ Globally, the value shall always be nil; it is bound where needed.")
;; File name primitives.
+(defun tramp-gvfs-info (filename &optional arg)
+ "Check FILENAME via `gvfs-info'.
+Set file property \"file-exists-p\" with the result."
+ (with-parsed-tramp-file-name filename nil
+ (tramp-set-file-property
+ v localname "file-exists-p"
+ (tramp-gvfs-send-command
+ v "gvfs-info" arg (tramp-gvfs-url-file-name filename)))))
+
(defun tramp-gvfs-do-copy-or-rename-file
(op filename newname &optional ok-if-already-exists keep-date
preserve-uid-gid preserve-extended-attributes)
@@ -1002,84 +1011,81 @@ file names."
(msg-operation (if (eq op 'copy) "Copying" "Renaming")))
(with-parsed-tramp-file-name (if t1 filename newname) nil
- (unless (file-exists-p filename)
- (tramp-error v 'file-missing filename))
- (when (and (not ok-if-already-exists) (file-exists-p newname))
- (tramp-error v 'file-already-exists newname))
- (when (and (file-directory-p newname)
- (not (directory-name-p newname)))
- (tramp-error v 'file-error "File is a directory %s" newname))
-
- (cond
- ;; We cannot rename volatile files, as used by Google-drive.
- ((and (not equal-remote) volatile)
- (prog1 (copy-file
- filename newname ok-if-already-exists keep-date
- preserve-uid-gid preserve-extended-attributes)
- (delete-file filename)))
-
- ;; We cannot copy or rename directly.
- ((or (and equal-remote
- (tramp-get-connection-property v "direct-copy-failed"))
- (and t1 (not (tramp-gvfs-file-name-p filename)))
- (and t2 (not (tramp-gvfs-file-name-p newname))))
- (let ((tmpfile (tramp-compat-make-temp-file filename)))
- (if (eq op 'copy)
- (copy-file
- filename tmpfile t keep-date preserve-uid-gid
- preserve-extended-attributes)
- (rename-file filename tmpfile t))
- (rename-file tmpfile newname ok-if-already-exists)))
-
- ;; Direct action.
- (t (with-tramp-progress-reporter
- v 0 (format "%s %s to %s" msg-operation filename newname)
- (unless
- (and (apply
- #'tramp-gvfs-send-command v gvfs-operation
- (append
- (and (eq op 'copy) (or keep-date preserve-uid-gid)
- '("--preserve"))
- (list
- (tramp-gvfs-url-file-name filename)
- (tramp-gvfs-url-file-name newname))))
- ;; Some backends do not return a proper error
- ;; code in case of direct copy/move. Apply
- ;; sanity checks.
- (or (not equal-remote)
- (tramp-gvfs-send-command
- v "gvfs-info" (tramp-gvfs-url-file-name newname))
- (eq op 'copy)
- (not (tramp-gvfs-send-command
- v "gvfs-info"
- (tramp-gvfs-url-file-name filename)))))
-
- (if (or (not equal-remote)
- (and equal-remote
- (tramp-get-connection-property
- v "direct-copy-failed")))
- ;; Propagate the error.
- (with-current-buffer (tramp-get-connection-buffer v)
- (goto-char (point-min))
- (tramp-error-with-buffer
- nil v 'file-error
- "%s failed, see buffer `%s' for details."
- msg-operation (buffer-name)))
-
- ;; Some WebDAV server, like the one from QNAP, do
- ;; not support direct copy/move. Try a fallback.
- (tramp-set-connection-property v "direct-copy-failed" t)
- (tramp-gvfs-do-copy-or-rename-file
- op filename newname ok-if-already-exists keep-date
- preserve-uid-gid preserve-extended-attributes))))
-
- (when (and t1 (eq op 'rename))
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)))
-
- (when t2
- (with-parsed-tramp-file-name newname nil
- (tramp-flush-file-properties v localname)))))))))
+ (tramp-barf-if-file-missing v filename
+ (when (and (not ok-if-already-exists) (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+ (when (and (file-directory-p newname)
+ (not (directory-name-p newname)))
+ (tramp-error v 'file-error "File is a directory %s" newname))
+
+ (cond
+ ;; We cannot rename volatile files, as used by Google-drive.
+ ((and (not equal-remote) volatile)
+ (prog1 (copy-file
+ filename newname ok-if-already-exists keep-date
+ preserve-uid-gid preserve-extended-attributes)
+ (delete-file filename)))
+
+ ;; We cannot copy or rename directly.
+ ((or (and equal-remote
+ (tramp-get-connection-property v "direct-copy-failed"))
+ (and t1 (not (tramp-gvfs-file-name-p filename)))
+ (and t2 (not (tramp-gvfs-file-name-p newname))))
+ (let ((tmpfile (tramp-compat-make-temp-file filename)))
+ (if (eq op 'copy)
+ (copy-file
+ filename tmpfile t keep-date preserve-uid-gid
+ preserve-extended-attributes)
+ (rename-file filename tmpfile t))
+ (rename-file tmpfile newname ok-if-already-exists)))
+
+ ;; Direct action.
+ (t (with-tramp-progress-reporter
+ v 0 (format "%s %s to %s" msg-operation filename newname)
+ (unless
+ (and (apply
+ #'tramp-gvfs-send-command v gvfs-operation
+ (append
+ (and (eq op 'copy) (or keep-date preserve-uid-gid)
+ '("--preserve"))
+ (list
+ (tramp-gvfs-url-file-name filename)
+ (tramp-gvfs-url-file-name newname))))
+ ;; Some backends do not return a proper error
+ ;; code in case of direct copy/move. Apply
+ ;; sanity checks.
+ (or (not equal-remote)
+ (and
+ (tramp-gvfs-info newname)
+ (or (eq op 'copy)
+ (not (tramp-gvfs-info filename))))))
+
+ (if (or (not equal-remote)
+ (and equal-remote
+ (tramp-get-connection-property
+ v "direct-copy-failed")))
+ ;; Propagate the error.
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (goto-char (point-min))
+ (tramp-error-with-buffer
+ nil v 'file-error
+ "%s failed, see buffer `%s' for details."
+ msg-operation (buffer-name)))
+
+ ;; Some WebDAV server, like the one from QNAP, do
+ ;; not support direct copy/move. Try a fallback.
+ (tramp-set-connection-property v "direct-copy-failed" t)
+ (tramp-gvfs-do-copy-or-rename-file
+ op filename newname ok-if-already-exists keep-date
+ preserve-uid-gid preserve-extended-attributes))))
+
+ (when (and t1 (eq op 'rename))
+ (with-parsed-tramp-file-name filename nil
+ (tramp-flush-file-properties v localname)))
+
+ (when t2
+ (with-parsed-tramp-file-name newname nil
+ (tramp-flush-file-properties v localname))))))))))
(defun tramp-gvfs-handle-copy-file
(filename newname &optional ok-if-already-exists keep-date
@@ -1112,8 +1118,9 @@ file names."
(tramp-error
v 'file-error "Couldn't delete non-empty %s" directory)))
- (unless (tramp-gvfs-send-command
- v "gvfs-rm" (tramp-gvfs-url-file-name directory))
+ (unless (and (tramp-gvfs-send-command
+ v "gvfs-rm" (tramp-gvfs-url-file-name directory))
+ (not (tramp-gvfs-info directory)))
;; Propagate the error.
(with-current-buffer (tramp-get-connection-buffer v)
(goto-char (point-min))
@@ -1126,8 +1133,9 @@ file names."
(tramp-flush-file-properties v localname)
(if (and delete-by-moving-to-trash trash)
(move-file-to-trash filename)
- (unless (tramp-gvfs-send-command
- v "gvfs-rm" (tramp-gvfs-url-file-name filename))
+ (unless (and (tramp-gvfs-send-command
+ v "gvfs-rm" (tramp-gvfs-url-file-name filename))
+ (not (tramp-gvfs-info filename)))
;; Propagate the error.
(with-current-buffer (tramp-get-connection-buffer v)
(goto-char (point-min))
@@ -1240,10 +1248,8 @@ If FILE-SYSTEM is non-nil, return file system attributes."
(if file-system " system" "") localname)
;; Send command.
(if file-system
- (tramp-gvfs-send-command
- v "gvfs-info" "--filesystem" (tramp-gvfs-url-file-name filename))
- (tramp-gvfs-send-command
- v "gvfs-info" (tramp-gvfs-url-file-name filename)))
+ (tramp-gvfs-info filename "--filesystem")
+ (tramp-gvfs-info filename))
;; Parse output.
(with-current-buffer (tramp-get-connection-buffer v)
(goto-char (point-min))
@@ -1548,8 +1554,10 @@ If FILE-SYSTEM is non-nil, return file system attributes."
(make-directory ldir parents))
;; Just do it.
(or (when-let ((mkdir-succeeded
- (tramp-gvfs-send-command
- v "gvfs-mkdir" (tramp-gvfs-url-file-name dir))))
+ (and
+ (tramp-gvfs-send-command
+ v "gvfs-mkdir" (tramp-gvfs-url-file-name dir))
+ (tramp-gvfs-info dir))))
(set-file-modes dir (default-file-modes))
mkdir-succeeded)
(and parents (file-directory-p dir))
@@ -1583,16 +1591,14 @@ If FILE-SYSTEM is non-nil, return file system attributes."
(defun tramp-gvfs-handle-set-file-modes (filename mode &optional flag)
"Like `set-file-modes' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(tramp-gvfs-set-attribute
v (if (eq flag 'nofollow) "-nt" "-t") "uint32"
(tramp-gvfs-url-file-name filename) "unix::mode" (number-to-string mode))))
(defun tramp-gvfs-handle-set-file-times (filename &optional time flag)
"Like `set-file-times' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(tramp-gvfs-set-attribute
v (if (eq flag 'nofollow) "-nt" "-t") "uint64"
(tramp-gvfs-url-file-name filename) "time::modified"
@@ -1626,6 +1632,7 @@ VEC or USER, or if there is no home directory, return nil."
(defun tramp-gvfs-handle-get-remote-uid (vec id-format)
"The uid of the remote connection VEC, in ID-FORMAT.
ID-FORMAT valid values are `string' and `integer'."
+ ;; The result is cached in `tramp-get-remote-uid'.
(if (equal id-format 'string)
(tramp-file-name-user vec)
(when-let ((localname
@@ -1636,6 +1643,7 @@ ID-FORMAT valid values are `string' and `integer'."
(defun tramp-gvfs-handle-get-remote-gid (vec id-format)
"The gid of the remote connection VEC, in ID-FORMAT.
ID-FORMAT valid values are `string' and `integer'."
+ ;; The result is cached in `tramp-get-remote-gid'.
(when-let ((localname
(tramp-get-connection-property (tramp-get-process vec) "share")))
(file-attribute-group-id
@@ -1643,8 +1651,7 @@ ID-FORMAT valid values are `string' and `integer'."
(defun tramp-gvfs-handle-set-file-uid-gid (filename &optional uid gid)
"Like `tramp-set-file-uid-gid' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(when (natnump uid)
(tramp-gvfs-set-attribute
v "-t" "uint32"
@@ -1795,7 +1802,8 @@ a downcased host name only."
(progn
(message "%s" message)
0)
- (with-tramp-connection-property (tramp-get-process v) message
+ (with-tramp-connection-property
+ (tramp-get-process v) message
;; In theory, there can be several choices.
;; Until now, there is only the question
;; whether to accept an unknown host
@@ -1887,7 +1895,7 @@ Their full names are \"org.gtk.vfs.MountTracker.mounted\" and
v 6 "%s %s"
signal-name (tramp-gvfs-stringify-dbus-message mount-info))
(tramp-flush-file-property v "/" "list-mounts")
- (if (string-equal (downcase signal-name) "unmounted")
+ (if (tramp-compat-string-equal-ignore-case signal-name "unmounted")
(tramp-flush-file-properties v "/")
;; Set mountpoint and location.
(tramp-set-file-property v "/" "fuse-mountpoint" fuse-mountpoint)
diff --git a/lisp/net/tramp-rclone.el b/lisp/net/tramp-rclone.el
index bbc76851318..5bee5641bb1 100644
--- a/lisp/net/tramp-rclone.el
+++ b/lisp/net/tramp-rclone.el
@@ -225,46 +225,45 @@ file names."
(msg-operation (if (eq op 'copy) "Copying" "Renaming")))
(with-parsed-tramp-file-name (if t1 filename newname) nil
- (unless (file-exists-p filename)
- (tramp-error v 'file-missing filename))
- (when (and (not ok-if-already-exists) (file-exists-p newname))
- (tramp-error v 'file-already-exists newname))
- (when (and (file-directory-p newname)
- (not (directory-name-p newname)))
- (tramp-error v 'file-error "File is a directory %s" newname))
-
- (if (or (and t1 (not (tramp-rclone-file-name-p filename)))
- (and t2 (not (tramp-rclone-file-name-p newname))))
-
- ;; We cannot copy or rename directly.
- (let ((tmpfile (tramp-compat-make-temp-file filename)))
- (if (eq op 'copy)
- (copy-file
- filename tmpfile t keep-date preserve-uid-gid
- preserve-extended-attributes)
- (rename-file filename tmpfile t))
- (rename-file tmpfile newname ok-if-already-exists))
-
- ;; Direct action.
- (with-tramp-progress-reporter
- v 0 (format "%s %s to %s" msg-operation filename newname)
- (unless (zerop
- (tramp-rclone-send-command
- v rclone-operation
- (tramp-rclone-remote-file-name filename)
- (tramp-rclone-remote-file-name newname)))
- (tramp-error
- v 'file-error
- "Error %s `%s' `%s'" msg-operation filename newname)))
-
- (when (and t1 (eq op 'rename))
- (while (file-exists-p filename)
- (with-parsed-tramp-file-name filename v1
- (tramp-flush-file-properties v1 v1-localname))))
-
- (when t2
- (with-parsed-tramp-file-name newname v2
- (tramp-flush-file-properties v2 v2-localname))))))))
+ (tramp-barf-if-file-missing v filename
+ (when (and (not ok-if-already-exists) (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+ (when (and (file-directory-p newname)
+ (not (directory-name-p newname)))
+ (tramp-error v 'file-error "File is a directory %s" newname))
+
+ (if (or (and t1 (not (tramp-rclone-file-name-p filename)))
+ (and t2 (not (tramp-rclone-file-name-p newname))))
+
+ ;; We cannot copy or rename directly.
+ (let ((tmpfile (tramp-compat-make-temp-file filename)))
+ (if (eq op 'copy)
+ (copy-file
+ filename tmpfile t keep-date preserve-uid-gid
+ preserve-extended-attributes)
+ (rename-file filename tmpfile t))
+ (rename-file tmpfile newname ok-if-already-exists))
+
+ ;; Direct action.
+ (with-tramp-progress-reporter
+ v 0 (format "%s %s to %s" msg-operation filename newname)
+ (unless (zerop
+ (tramp-rclone-send-command
+ v rclone-operation
+ (tramp-rclone-remote-file-name filename)
+ (tramp-rclone-remote-file-name newname)))
+ (tramp-error
+ v 'file-error
+ "Error %s `%s' `%s'" msg-operation filename newname)))
+
+ (when (and t1 (eq op 'rename))
+ (while (file-exists-p filename)
+ (with-parsed-tramp-file-name filename v1
+ (tramp-flush-file-properties v1 v1-localname))))
+
+ (when t2
+ (with-parsed-tramp-file-name newname v2
+ (tramp-flush-file-properties v2 v2-localname)))))))))
(defun tramp-rclone-handle-copy-file
(filename newname &optional ok-if-already-exists keep-date
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index 174fde720e4..4a9cf2e6997 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -410,11 +410,12 @@ The string is used in `tramp-methods'.")
(tramp-copy-keep-date t)))
(add-to-list 'tramp-default-method-alist
- `(,tramp-local-host-regexp "\\`root\\'" "su"))
+ `(,tramp-local-host-regexp
+ ,(format "\\`%s\\'" tramp-root-id-string) "su"))
(add-to-list 'tramp-default-user-alist
`(,(concat "\\`" (regexp-opt '("su" "sudo" "doas" "ksu")) "\\'")
- nil "root"))
+ nil ,tramp-root-id-string))
;; Do not add "ssh" based methods, otherwise ~/.ssh/config would be ignored.
;; Do not add "plink" based methods, they ask interactively for the user.
(add-to-list 'tramp-default-user-alist
@@ -666,14 +667,14 @@ else
{
$type = \"nil\"
};
-$uid = ($ARGV[1] eq \"integer\") ? $stat[4] : \"\\\"\" . getpwuid($stat[4]) . \"\\\"\";
-$gid = ($ARGV[1] eq \"integer\") ? $stat[5] : \"\\\"\" . getgrgid($stat[5]) . \"\\\"\";
printf(
- \"(%%s %%u %%s %%s (%%u %%u) (%%u %%u) (%%u %%u) %%u %%u t %%u -1)\\n\",
+ \"(%%s %%u (%%s . %%u) (%%s . %%u) (%%u %%u) (%%u %%u) (%%u %%u) %%u %%u t %%u -1)\\n\",
$type,
$stat[3],
- $uid,
- $gid,
+ \"\\\"\" . getpwuid($stat[4]) . \"\\\"\",
+ $stat[4],
+ \"\\\"\" . getgrgid($stat[5]) . \"\\\"\",
+ $stat[5],
$stat[8] >> 16 & 0xffff,
$stat[8] & 0xffff,
$stat[9] >> 16 & 0xffff,
@@ -683,12 +684,29 @@ printf(
$stat[7],
$stat[2],
$stat[1]
-);' \"$1\" \"$2\" %n"
+);' \"$1\" %n"
"Perl script to produce output suitable for use with `file-attributes'
on the remote file system.
Format specifiers are replaced by `tramp-expand-script', percent
characters need to be doubled.")
+(defconst tramp-stat-file-attributes
+ (format
+ (concat
+ "(%%s -c"
+ " '((%s%%%%N%s) %%%%h (%s%%%%U%s . %%%%u) (%s%%%%G%s . %%%%g)"
+ " %%%%X %%%%Y %%%%Z %%%%s %s%%%%A%s t %%%%i -1)' \"$1\" %%n || echo nil) |"
+ " sed -e 's/\"/\\\\\"/g' -e 's/%s/\"/g'")
+ tramp-stat-marker tramp-stat-marker ; %%N
+ tramp-stat-marker tramp-stat-marker ; %%U
+ tramp-stat-marker tramp-stat-marker ; %%G
+ tramp-stat-marker tramp-stat-marker ; %%A
+ tramp-stat-quoted-marker)
+ "Shell function to produce output suitable for use with `file-attributes'
+on the remote file system.
+Format specifiers are replaced by `tramp-expand-script', percent
+characters need to be doubled.")
+
(defconst tramp-perl-directory-files-and-attributes
"%p -e '
chdir($ARGV[0]) or printf(\"\\\"Cannot change to $ARGV[0]: $''!''\\\"\\n\"), exit();
@@ -715,16 +733,16 @@ for($i = 0; $i < $n; $i++)
{
$type = \"nil\"
};
- $uid = ($ARGV[1] eq \"integer\") ? $stat[4] : \"\\\"\" . getpwuid($stat[4]) . \"\\\"\";
- $gid = ($ARGV[1] eq \"integer\") ? $stat[5] : \"\\\"\" . getgrgid($stat[5]) . \"\\\"\";
$filename =~ s/\"/\\\\\"/g;
printf(
- \"(\\\"%%s\\\" %%s %%u %%s %%s (%%u %%u) (%%u %%u) (%%u %%u) %%u %%u t %%u -1)\\n\",
+ \"(\\\"%%s\\\" %%s %%u (%%s . %%u) (%%s . %%u) (%%u %%u) (%%u %%u) (%%u %%u) %%u %%u t %%u -1)\\n\",
$filename,
$type,
$stat[3],
- $uid,
- $gid,
+ \"\\\"\" . getpwuid($stat[4]) . \"\\\"\",
+ $stat[4],
+ \"\\\"\" . getgrgid($stat[5]) . \"\\\"\",
+ $stat[5],
$stat[8] >> 16 & 0xffff,
$stat[8] & 0xffff,
$stat[9] >> 16 & 0xffff,
@@ -735,12 +753,38 @@ for($i = 0; $i < $n; $i++)
$stat[2],
$stat[1]);
}
-printf(\")\\n\");' \"$1\" \"$2\" %n"
+printf(\")\\n\");' \"$1\" %n"
"Perl script implementing `directory-files-and-attributes' as Lisp `read'able
output.
Format specifiers are replaced by `tramp-expand-script', percent
characters need to be doubled.")
+(defconst tramp-stat-directory-files-and-attributes
+ (format
+ (concat
+ ;; We must care about file names with spaces, or starting with
+ ;; "-"; this would confuse xargs. "ls -aQ" might be a solution,
+ ;; but it does not work on all remote systems. Therefore, we use
+ ;; \000 as file separator. `tramp-sh--quoting-style-options' do
+ ;; not work for file names with spaces piped to "xargs".
+ ;; Apostrophes in the stat output are masked as
+ ;; `tramp-stat-marker', in order to make a proper shell escape of
+ ;; them in file names.
+ "cd \"$1\" && echo \"(\"; (%%l -a | tr '\\n\\r' '\\000\\000' |"
+ " xargs -0 %%s -c"
+ " '(%s%%%%n%s (%s%%%%N%s) %%%%h (%s%%%%U%s . %%%%u) (%s%%%%G%s . %%%%g) %%%%X %%%%Y %%%%Z %%%%s %s%%%%A%s t %%%%i -1)'"
+ " -- %%n | sed -e 's/\"/\\\\\"/g' -e 's/%s/\"/g'); echo \")\"")
+ tramp-stat-marker tramp-stat-marker ; %n
+ tramp-stat-marker tramp-stat-marker ; %N
+ tramp-stat-marker tramp-stat-marker ; %U
+ tramp-stat-marker tramp-stat-marker ; %G
+ tramp-stat-marker tramp-stat-marker ; %A
+ tramp-stat-quoted-marker)
+ "Shell function implementing `directory-files-and-attributes' as Lisp
+`read'able output.
+Format specifiers are replaced by `tramp-expand-script', percent
+characters need to be doubled.")
+
;; These two use base64 encoding.
(defconst tramp-perl-encode-with-module
"%p -MMIME::Base64 -0777 -ne 'print encode_base64($_)' %n"
@@ -1068,7 +1112,10 @@ component is used as the target of the symlink."
(let ((non-essential t))
(when (and (tramp-tramp-file-p target)
(tramp-file-name-equal-p v (tramp-dissect-file-name target)))
- (setq target (tramp-file-local-name (expand-file-name target)))))
+ (setq target (tramp-file-local-name (expand-file-name target))))
+ ;; There could be a cyclic link.
+ (tramp-flush-file-properties
+ v (expand-file-name target (tramp-file-local-name default-directory))))
;; If TARGET is still remote, quote it.
(if (tramp-tramp-file-p target)
@@ -1130,36 +1177,32 @@ component is used as the target of the symlink."
(tramp-make-tramp-file-name
v
(with-tramp-file-property v localname "file-truename"
- (let (result) ; result steps in reverse order
- (tramp-message v 4 "Finding true name for `%s'" filename)
- (cond
- ;; Use GNU readlink --canonicalize-missing where available.
- ((tramp-get-remote-readlink v)
- (tramp-send-command-and-check
- v
- (format "%s --canonicalize-missing %s"
- (tramp-get-remote-readlink v)
- (tramp-shell-quote-argument localname)))
- (with-current-buffer (tramp-get-connection-buffer v)
- (goto-char (point-min))
- (setq result (buffer-substring (point-min) (point-at-eol)))))
-
- ;; Use Perl implementation.
- ((and (tramp-get-remote-perl v)
- (tramp-get-connection-property v "perl-file-spec")
- (tramp-get-connection-property v "perl-cwd-realpath"))
- (tramp-maybe-send-script
- v tramp-perl-file-truename "tramp_perl_file_truename")
- (setq result
- (tramp-send-command-and-read
- v
- (format "tramp_perl_file_truename %s"
- (tramp-shell-quote-argument localname)))))
-
- ;; Do it yourself.
- (t (setq
- result
- (tramp-file-local-name (tramp-handle-file-truename filename)))))
+ (tramp-message v 4 "Finding true name for `%s'" filename)
+ (let ((result
+ (cond
+ ;; Use GNU readlink --canonicalize-missing where available.
+ ((tramp-get-remote-readlink v)
+ (tramp-send-command-and-check
+ v (format "%s --canonicalize-missing %s"
+ (tramp-get-remote-readlink v)
+ (tramp-shell-quote-argument localname)))
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (goto-char (point-min))
+ (buffer-substring (point-min) (point-at-eol))))
+
+ ;; Use Perl implementation.
+ ((and (tramp-get-remote-perl v)
+ (tramp-get-connection-property v "perl-file-spec")
+ (tramp-get-connection-property v "perl-cwd-realpath"))
+ (tramp-maybe-send-script
+ v tramp-perl-file-truename "tramp_perl_file_truename")
+ (tramp-send-command-and-read
+ v (format "tramp_perl_file_truename %s"
+ (tramp-shell-quote-argument localname))))
+
+ ;; Do it yourself.
+ (t (tramp-file-local-name
+ (tramp-handle-file-truename filename))))))
;; Detect cycle.
(when (and (file-symlink-p filename)
@@ -1184,37 +1227,28 @@ component is used as the target of the symlink."
(when (tramp-connectable-p filename)
(with-parsed-tramp-file-name filename nil
(with-tramp-file-property v localname "file-exists-p"
- (or (not (null (tramp-get-file-property
- v localname "file-attributes-integer")))
- (not (null (tramp-get-file-property
- v localname "file-attributes-string")))
- (tramp-send-command-and-check
- v
- (format
- "%s %s"
- (tramp-get-file-exists-command v)
- (tramp-shell-quote-argument localname))))))))
+ (if (tramp-file-property-p v localname "file-attributes")
+ (not (null (tramp-get-file-property v localname "file-attributes")))
+ (tramp-send-command-and-check
+ v
+ (format
+ "%s %s"
+ (tramp-get-file-exists-command v)
+ (tramp-shell-quote-argument localname))))))))
(defun tramp-sh-handle-file-attributes (filename &optional id-format)
"Like `file-attributes' for Tramp files."
- (unless id-format (setq id-format 'integer))
- (ignore-errors
- ;; Don't modify `last-coding-system-used' by accident.
- (let ((last-coding-system-used last-coding-system-used))
- (with-parsed-tramp-file-name (expand-file-name filename) nil
- (with-tramp-file-property
- v localname (format "file-attributes-%s" id-format)
- (tramp-convert-file-attributes
- v
- (or
- (cond
- ((tramp-get-remote-stat v)
- (tramp-do-file-attributes-with-stat v localname id-format))
- ((tramp-get-remote-perl v)
- (tramp-do-file-attributes-with-perl v localname id-format))
- (t nil))
- ;; The scripts could fail, for example with huge file size.
- (tramp-do-file-attributes-with-ls v localname id-format))))))))
+ ;; The result is cached in `tramp-convert-file-attributes'.
+ ;; Don't modify `last-coding-system-used' by accident.
+ (let ((last-coding-system-used last-coding-system-used))
+ (with-parsed-tramp-file-name (expand-file-name filename) nil
+ (tramp-convert-file-attributes v localname id-format
+ (cond
+ ((tramp-get-remote-stat v)
+ (tramp-do-file-attributes-with-stat v localname))
+ ((tramp-get-remote-perl v)
+ (tramp-do-file-attributes-with-perl v localname))
+ (t (tramp-do-file-attributes-with-ls v localname)))))))
(defconst tramp-sunos-unames (regexp-opt '("SunOS 5.10" "SunOS 5.11"))
"Regexp to determine remote SunOS.")
@@ -1230,29 +1264,40 @@ component is used as the target of the symlink."
(tramp-get-ls-command-with vec "-w"))
""))
-(defun tramp-do-file-attributes-with-ls (vec localname &optional id-format)
+(defun tramp-do-file-attributes-with-ls (vec localname)
"Implement `file-attributes' for Tramp files using the ls(1) command."
(let (symlinkp dirp
res-inode res-filemodes res-numlinks
- res-uid res-gid res-size res-symlink-target)
+ res-uid-string res-gid-string res-uid-integer res-gid-integer
+ res-size res-symlink-target)
(tramp-message vec 5 "file attributes with ls: %s" localname)
;; We cannot send all three commands combined, it could exceed
;; NAME_MAX or PATH_MAX. Happened on macOS, for example.
- (when (or (tramp-send-command-and-check
- vec
- (format "%s %s"
- (tramp-get-file-exists-command vec)
- (tramp-shell-quote-argument localname)))
- (tramp-send-command-and-check
- vec
- (format "%s -h %s"
- (tramp-get-test-command vec)
- (tramp-shell-quote-argument localname))))
+ (when (tramp-send-command-and-check
+ vec
+ (format "cd %s && (%s %s || %s -h %s)"
+ (tramp-shell-quote-argument
+ (tramp-run-real-handler
+ #'file-name-directory (list localname)))
+ (tramp-get-file-exists-command vec)
+ (if (string-empty-p (file-name-nondirectory localname))
+ "."
+ (tramp-shell-quote-argument
+ (file-name-nondirectory localname)))
+ (tramp-get-test-command vec)
+ (if (string-empty-p (file-name-nondirectory localname))
+ "."
+ (tramp-shell-quote-argument
+ (file-name-nondirectory localname)))))
(tramp-send-command
vec
- (format "%s %s %s %s"
+ (format "%s -ild %s %s; %s -lnd %s %s"
+ (tramp-get-ls-command vec)
+ ;; On systems which have no quoting style, file names
+ ;; with special characters could fail.
+ (tramp-sh--quoting-style-options vec)
+ (tramp-shell-quote-argument localname)
(tramp-get-ls-command vec)
- (if (eq id-format 'integer) "-ildn" "-ild")
;; On systems which have no quoting style, file names
;; with special characters could fail.
(tramp-sh--quoting-style-options vec)
@@ -1268,17 +1313,16 @@ component is used as the target of the symlink."
;; ... number links
(setq res-numlinks (read (current-buffer)))
;; ... uid and gid
- (setq res-uid (read (current-buffer)))
- (setq res-gid (read (current-buffer)))
- (if (eq id-format 'integer)
- (progn
- (unless (numberp res-uid)
- (setq res-uid tramp-unknown-id-integer))
- (unless (numberp res-gid)
- (setq res-gid tramp-unknown-id-integer)))
- (progn
- (unless (stringp res-uid) (setq res-uid (symbol-name res-uid)))
- (unless (stringp res-gid) (setq res-gid (symbol-name res-gid)))))
+ (setq res-uid-string (read (current-buffer)))
+ (setq res-gid-string (read (current-buffer)))
+ (when (natnump res-uid-string)
+ (setq res-uid-string (number-to-string res-uid-string)))
+ (unless (stringp res-uid-string)
+ (setq res-uid-string (symbol-name res-uid-string)))
+ (when (natnump res-gid-string)
+ (setq res-gid-string (number-to-string res-gid-string)))
+ (unless (stringp res-gid-string)
+ (setq res-gid-string (symbol-name res-gid-string)))
;; ... size
(setq res-size (read (current-buffer)))
;; From the file modes, figure out other stuff.
@@ -1291,7 +1335,20 @@ component is used as the target of the symlink."
(if (looking-at-p "\"")
(read (current-buffer))
(buffer-substring (point) (point-at-eol)))))
- ;; Return data gathered.
+ (forward-line)
+ ;; ... file mode flags
+ (read (current-buffer))
+ ;; ... number links
+ (read (current-buffer))
+ ;; ... uid and gid
+ (setq res-uid-integer (read (current-buffer)))
+ (setq res-gid-integer (read (current-buffer)))
+ (unless (numberp res-uid-integer)
+ (setq res-uid-integer tramp-unknown-id-integer))
+ (unless (numberp res-gid-integer)
+ (setq res-gid-integer tramp-unknown-id-integer))
+
+ ;; Return data gathered.
(list
;; 0. t for directory, string (name linked to) for symbolic
;; link, or nil.
@@ -1299,9 +1356,9 @@ component is used as the target of the symlink."
;; 1. Number of links to file.
res-numlinks
;; 2. File uid.
- res-uid
+ (cons res-uid-string res-uid-integer)
;; 3. File gid.
- res-gid
+ (cons res-gid-string res-gid-integer)
;; 4. Last access time.
;; 5. Last modification time.
;; 6. Last status change time.
@@ -1318,42 +1375,23 @@ component is used as the target of the symlink."
;; 11. Device number. Will be replaced by a virtual device number.
-1))))))
-(defun tramp-do-file-attributes-with-perl
- (vec localname &optional id-format)
+(defun tramp-do-file-attributes-with-perl (vec localname)
"Implement `file-attributes' for Tramp files using a Perl script."
(tramp-message vec 5 "file attributes with perl: %s" localname)
(tramp-maybe-send-script
vec tramp-perl-file-attributes "tramp_perl_file_attributes")
(tramp-send-command-and-read
- vec
- (format "tramp_perl_file_attributes %s %s"
- (tramp-shell-quote-argument localname) id-format)))
+ vec (format "tramp_perl_file_attributes %s"
+ (tramp-shell-quote-argument localname))))
-(defun tramp-do-file-attributes-with-stat
- (vec localname &optional id-format)
+(defun tramp-do-file-attributes-with-stat (vec localname)
"Implement `file-attributes' for Tramp files using stat(1) command."
(tramp-message vec 5 "file attributes with stat: %s" localname)
+ (tramp-maybe-send-script
+ vec tramp-stat-file-attributes "tramp_stat_file_attributes")
(tramp-send-command-and-read
- vec
- (format
- (concat
- ;; Apostrophes in the stat output are masked as
- ;; `tramp-stat-marker', in order to make a proper shell escape of
- ;; them in file names.
- "(%s -c '((%s%%N%s) %%h %s %s %%X %%Y %%Z %%s %s%%A%s t %%i -1)' %s |"
- " sed -e 's/\"/\\\\\"/g' -e 's/%s/\"/g')")
- (tramp-get-remote-stat vec)
- tramp-stat-marker tramp-stat-marker
- (if (eq id-format 'integer)
- "%u"
- (eval-when-compile (concat tramp-stat-marker "%U" tramp-stat-marker)))
- (if (eq id-format 'integer)
- "%g"
- (eval-when-compile (concat tramp-stat-marker "%G" tramp-stat-marker)))
- tramp-stat-marker tramp-stat-marker
- (tramp-shell-quote-argument localname)
- tramp-stat-quoted-marker)
- 'noerror))
+ vec (format "tramp_stat_file_attributes %s"
+ (tramp-shell-quote-argument localname))))
(defun tramp-sh-handle-set-visited-file-modtime (&optional time-list)
"Like `set-visited-file-modtime' for Tramp files."
@@ -1433,12 +1471,11 @@ of."
(defun tramp-sh-handle-set-file-modes (filename mode &optional flag)
"Like `set-file-modes' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- ;; We need "chmod -h" when the flag is set.
- (when (or (not (eq flag 'nofollow))
- (not (file-symlink-p filename))
- (tramp-get-remote-chmod-h v))
- (tramp-flush-file-properties v localname)
+ ;; We need "chmod -h" when the flag is set.
+ (when (or (not (eq flag 'nofollow))
+ (not (file-symlink-p filename))
+ (tramp-get-remote-chmod-h (tramp-dissect-file-name filename)))
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
;; FIXME: extract the proper text from chmod's stderr.
(tramp-barf-unless-okay
v
@@ -1450,9 +1487,8 @@ of."
(defun tramp-sh-handle-set-file-times (filename &optional time flag)
"Like `set-file-times' for Tramp files."
- (with-parsed-tramp-file-name filename nil
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(when (tramp-get-remote-touch v)
- (tramp-flush-file-properties v localname)
(let ((time
(if (or (null time)
(tramp-compat-time-equal-p time tramp-time-doesnt-exist)
@@ -1486,6 +1522,7 @@ VEC or USER, or if there is no home directory, return nil."
(defun tramp-sh-handle-get-remote-uid (vec id-format)
"The uid of the remote connection VEC, in ID-FORMAT.
ID-FORMAT valid values are `string' and `integer'."
+ ;; The result is cached in `tramp-get-remote-uid'.
(ignore-errors
(cond
((tramp-get-remote-id vec) (tramp-get-remote-uid-with-id vec id-format))
@@ -1496,6 +1533,7 @@ ID-FORMAT valid values are `string' and `integer'."
(defun tramp-sh-handle-get-remote-gid (vec id-format)
"The gid of the remote connection VEC, in ID-FORMAT.
ID-FORMAT valid values are `string' and `integer'."
+ ;; The result is cached in `tramp-get-remote-gid'.
(ignore-errors
(cond
((tramp-get-remote-id vec) (tramp-get-remote-gid-with-id vec id-format))
@@ -1509,9 +1547,9 @@ ID-FORMAT valid values are `string' and `integer'."
;; another implementation, see `dired-do-chown'. OTOH, it is mostly
;; working with su(do)? when it is needed, so it shall succeed in
;; the majority of cases.
- ;; Don't modify `last-coding-system-used' by accident.
- (let ((last-coding-system-used last-coding-system-used))
- (with-parsed-tramp-file-name filename nil
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
+ ;; Don't modify `last-coding-system-used' by accident.
+ (let ((last-coding-system-used last-coding-system-used))
(if (and (zerop (user-uid)) (tramp-local-host-p v))
;; If we are root on the local host, we can do it directly.
(tramp-set-file-uid-gid localname uid gid)
@@ -1620,16 +1658,18 @@ ID-FORMAT valid values are `string' and `integer'."
(with-tramp-file-property v localname "file-executable-p"
;; Examine `file-attributes' cache to see if request can be
;; satisfied without remote operation.
- (or (tramp-check-cached-permissions v ?x)
- (tramp-check-cached-permissions v ?s)
- (tramp-run-test "-x" filename)))))
+ (if (tramp-file-property-p v localname "file-attributes")
+ (or (tramp-check-cached-permissions v ?x)
+ (tramp-check-cached-permissions v ?s))
+ (tramp-run-test "-x" filename)))))
(defun tramp-sh-handle-file-readable-p (filename)
"Like `file-readable-p' for Tramp files."
(with-parsed-tramp-file-name filename nil
(with-tramp-file-property v localname "file-readable-p"
- (or (tramp-handle-file-readable-p filename)
- (tramp-run-test "-r" filename)))))
+ (if (tramp-file-property-p v localname "file-attributes")
+ (tramp-handle-file-readable-p filename)
+ (tramp-run-test "-r" filename)))))
;; Functions implemented using the basic functions above.
@@ -1642,19 +1682,28 @@ ID-FORMAT valid values are `string' and `integer'."
;; be expected that this is always a directory.
(or (zerop (length localname))
(with-tramp-file-property v localname "file-directory-p"
- (tramp-run-test "-d" filename)))))
+ (if-let
+ ((truename (tramp-get-file-property v localname "file-truename"))
+ (attr-p (tramp-file-property-p
+ v (tramp-file-local-name truename) "file-attributes")))
+ (eq (file-attribute-type
+ (tramp-get-file-property
+ v (tramp-file-local-name truename) "file-attributes"))
+ t)
+ (tramp-run-test "-d" filename))))))
(defun tramp-sh-handle-file-writable-p (filename)
"Like `file-writable-p' for Tramp files."
(with-parsed-tramp-file-name filename nil
(with-tramp-file-property v localname "file-writable-p"
(if (file-exists-p filename)
- ;; Examine `file-attributes' cache to see if request can be
- ;; satisfied without remote operation.
- (or (tramp-check-cached-permissions v ?w)
- (tramp-run-test "-w" filename))
+ (if (tramp-file-property-p v localname "file-attributes")
+ ;; Examine `file-attributes' cache to see if request can
+ ;; be satisfied without remote operation.
+ (tramp-check-cached-permissions v ?w)
+ (tramp-run-test "-w" filename))
;; If file doesn't exist, check if directory is writable.
- (and (tramp-run-test "-d" (file-name-directory filename))
+ (and (file-exists-p (file-name-directory filename))
(tramp-run-test "-w" (file-name-directory filename)))))))
(defun tramp-sh-handle-file-ownership-preserved-p (filename &optional group)
@@ -1683,51 +1732,18 @@ ID-FORMAT valid values are `string' and `integer'."
(defun tramp-sh-handle-directory-files-and-attributes
(directory &optional full match nosort id-format count)
"Like `directory-files-and-attributes' for Tramp files."
- (unless id-format (setq id-format 'integer))
- (unless (file-exists-p directory)
- (tramp-error (tramp-dissect-file-name directory) 'file-missing directory))
- (when (file-directory-p directory)
- (setq directory (expand-file-name directory))
- (let* ((temp
- (copy-tree
- (with-parsed-tramp-file-name directory nil
- (with-tramp-file-property
- v localname
- (format "directory-files-and-attributes-%s" id-format)
- (mapcar
- (lambda (x)
- (cons (car x) (tramp-convert-file-attributes v (cdr x))))
- (cond
- ((tramp-get-remote-stat v)
- (tramp-do-directory-files-and-attributes-with-stat
- v localname id-format))
- ((tramp-get-remote-perl v)
- (tramp-do-directory-files-and-attributes-with-perl
- v localname id-format))
- (t nil)))))))
- result item)
-
- (while temp
- (setq item (pop temp))
- (when (or (null match) (string-match-p match (car item)))
- (when full
- (setcar item (expand-file-name (car item) directory)))
- (push item result)))
-
- (unless nosort
- (setq result (sort result (lambda (x y) (string< (car x) (car y))))))
-
- (when (and (natnump count) (> count 0))
- (setq result (nbutlast result (- (length result) count))))
-
- (or result
- ;; The scripts could fail, for example with huge file size.
- (tramp-handle-directory-files-and-attributes
- directory full match nosort id-format count)))))
+ (tramp-skeleton-directory-files-and-attributes
+ directory full match nosort id-format count
+ (cond
+ ((tramp-get-remote-stat v)
+ (tramp-do-directory-files-and-attributes-with-stat
+ v localname))
+ ((tramp-get-remote-perl v)
+ (tramp-do-directory-files-and-attributes-with-perl
+ v localname)))))
;; FIXME: Fix function to work with count parameter.
-(defun tramp-do-directory-files-and-attributes-with-perl
- (vec localname &optional id-format)
+(defun tramp-do-directory-files-and-attributes-with-perl (vec localname)
"Implement `directory-files-and-attributes' for Tramp files using a Perl script."
(tramp-message vec 5 "directory-files-and-attributes with perl: %s" localname)
(tramp-maybe-send-script
@@ -1735,59 +1751,31 @@ ID-FORMAT valid values are `string' and `integer'."
"tramp_perl_directory_files_and_attributes")
(let ((object
(tramp-send-command-and-read
- vec
- (format "tramp_perl_directory_files_and_attributes %s %s"
- (tramp-shell-quote-argument localname) id-format))))
+ vec (format "tramp_perl_directory_files_and_attributes %s"
+ (tramp-shell-quote-argument localname)))))
(when (stringp object) (tramp-error vec 'file-error object))
object))
;; FIXME: Fix function to work with count parameter.
-(defun tramp-do-directory-files-and-attributes-with-stat
- (vec localname &optional id-format)
+(defun tramp-do-directory-files-and-attributes-with-stat (vec localname)
"Implement `directory-files-and-attributes' for Tramp files with stat(1) command."
(tramp-message vec 5 "directory-files-and-attributes with stat: %s" localname)
+ (tramp-maybe-send-script
+ vec tramp-stat-directory-files-and-attributes
+ "tramp_stat_directory_files_and_attributes")
(tramp-send-command-and-read
- vec
- (format
- (concat
- ;; We must care about file names with spaces, or starting with
- ;; "-"; this would confuse xargs. "ls -aQ" might be a solution,
- ;; but it does not work on all remote systems. Therefore, we use
- ;; \000 as file separator. `tramp-sh--quoting-style-options' do
- ;; not work for file names with spaces piped to "xargs".
- ;; Apostrophes in the stat output are masked as
- ;; `tramp-stat-marker', in order to make a proper shell escape of
- ;; them in file names.
- "cd %s && echo \"(\"; (%s %s -a | tr '\\n\\r' '\\000\\000' | "
- "xargs -0 %s -c "
- "'(%s%%n%s (%s%%N%s) %%h %s %s %%X %%Y %%Z %%s %s%%A%s t %%i -1)' "
- "-- 2>%s | sed -e 's/\"/\\\\\"/g' -e 's/%s/\"/g'); echo \")\"")
- (tramp-shell-quote-argument localname)
- (tramp-get-ls-command vec)
- ;; On systems which have no quoting style, file names with special
- ;; characters could fail.
- (tramp-sh--quoting-style-options vec)
- (tramp-get-remote-stat vec)
- tramp-stat-marker tramp-stat-marker
- tramp-stat-marker tramp-stat-marker
- (if (eq id-format 'integer)
- "%u"
- (eval-when-compile (concat tramp-stat-marker "%U" tramp-stat-marker)))
- (if (eq id-format 'integer)
- "%g"
- (eval-when-compile (concat tramp-stat-marker "%G" tramp-stat-marker)))
- tramp-stat-marker tramp-stat-marker
- (tramp-get-remote-null-device vec)
- tramp-stat-quoted-marker)))
+ vec (format "tramp_stat_directory_files_and_attributes %s"
+ (tramp-shell-quote-argument localname))))
;; This function should return "foo/" for directories and "bar" for
;; files.
(defun tramp-sh-handle-file-name-all-completions (filename directory)
"Like `file-name-all-completions' for Tramp files."
- (unless (tramp-compat-string-search "/" filename)
- (all-completions
- filename
- (with-parsed-tramp-file-name (expand-file-name directory) nil
+ (with-parsed-tramp-file-name (expand-file-name directory) nil
+ (when (and (not (tramp-compat-string-search "/" filename))
+ (tramp-connectable-p v))
+ (all-completions
+ filename
(with-tramp-file-property v localname "file-name-all-completions"
(let (result)
;; Get a list of directories and files, including reliably
@@ -1900,59 +1888,62 @@ ID-FORMAT valid values are `string' and `integer'."
(defun tramp-sh-handle-copy-directory
(dirname newname &optional keep-date parents copy-contents)
"Like `copy-directory' for Tramp files."
- (let ((t1 (tramp-tramp-file-p dirname))
- (t2 (tramp-tramp-file-p newname))
- target)
- (with-parsed-tramp-file-name (if t1 dirname newname) nil
- (unless (file-exists-p dirname)
- (tramp-error v 'file-missing dirname))
-
- ;; `copy-directory-create-symlink' exists since Emacs 28.1.
- (if (and (bound-and-true-p copy-directory-create-symlink)
- (setq target (file-symlink-p dirname))
- (tramp-equal-remote dirname newname))
- (make-symbolic-link
- target
- (if (directory-name-p newname)
- (concat newname (file-name-nondirectory dirname)) newname)
- t)
-
- (if (and (not copy-contents)
- (tramp-get-method-parameter v 'tramp-copy-recursive)
- ;; When DIRNAME and NEWNAME are remote, they must
- ;; have the same method.
- (or (null t1) (null t2)
- (string-equal
- (tramp-file-name-method (tramp-dissect-file-name dirname))
- (tramp-file-name-method
- (tramp-dissect-file-name newname)))))
- ;; scp or rsync DTRT.
- (progn
- (when (and (file-directory-p newname)
- (not (directory-name-p newname)))
- (tramp-error v 'file-already-exists newname))
- (setq dirname (directory-file-name (expand-file-name dirname))
- newname (directory-file-name (expand-file-name newname)))
- (when (and (file-directory-p newname)
- (not (string-equal (file-name-nondirectory dirname)
- (file-name-nondirectory newname))))
- (setq newname
- (expand-file-name
- (file-name-nondirectory dirname) newname)))
- (unless (file-directory-p (file-name-directory newname))
- (make-directory (file-name-directory newname) parents))
- (tramp-do-copy-or-rename-file-out-of-band
- 'copy dirname newname 'ok-if-already-exists keep-date))
-
- ;; We must do it file-wise.
- (tramp-run-real-handler
- #'copy-directory
- (list dirname newname keep-date parents copy-contents))))
-
- ;; When newname did exist, we have wrong cached values.
- (when t2
- (with-parsed-tramp-file-name newname nil
- (tramp-flush-file-properties v localname))))))
+ (tramp-skeleton-copy-directory
+ dirname newname keep-date parents copy-contents
+ (let ((t1 (tramp-tramp-file-p dirname))
+ (t2 (tramp-tramp-file-p newname))
+ target)
+ (with-parsed-tramp-file-name (if t1 dirname newname) nil
+ (unless (file-exists-p dirname)
+ (tramp-error v 'file-missing dirname))
+
+ ;; `copy-directory-create-symlink' exists since Emacs 28.1.
+ (if (and (bound-and-true-p copy-directory-create-symlink)
+ (setq target (file-symlink-p dirname))
+ (tramp-equal-remote dirname newname))
+ (make-symbolic-link
+ target
+ (if (directory-name-p newname)
+ (concat newname (file-name-nondirectory dirname)) newname)
+ t)
+
+ (if (and (not copy-contents)
+ (tramp-get-method-parameter v 'tramp-copy-recursive)
+ ;; When DIRNAME and NEWNAME are remote, they must
+ ;; have the same method.
+ (or (null t1) (null t2)
+ (string-equal
+ (tramp-file-name-method
+ (tramp-dissect-file-name dirname))
+ (tramp-file-name-method
+ (tramp-dissect-file-name newname)))))
+ ;; scp or rsync DTRT.
+ (progn
+ (when (and (file-directory-p newname)
+ (not (directory-name-p newname)))
+ (tramp-error v 'file-already-exists newname))
+ (setq dirname (directory-file-name (expand-file-name dirname))
+ newname (directory-file-name (expand-file-name newname)))
+ (when (and (file-directory-p newname)
+ (not (string-equal (file-name-nondirectory dirname)
+ (file-name-nondirectory newname))))
+ (setq newname
+ (expand-file-name
+ (file-name-nondirectory dirname) newname)))
+ (unless (file-directory-p (file-name-directory newname))
+ (make-directory (file-name-directory newname) parents))
+ (tramp-do-copy-or-rename-file-out-of-band
+ 'copy dirname newname 'ok-if-already-exists keep-date))
+
+ ;; We must do it file-wise.
+ (tramp-run-real-handler
+ #'copy-directory
+ (list dirname newname keep-date parents copy-contents))))
+
+ ;; When newname did exist, we have wrong cached values.
+ (when t2
+ (with-parsed-tramp-file-name newname nil
+ (tramp-flush-file-properties v localname)))))))
(defun tramp-sh-handle-rename-file
(filename newname &optional ok-if-already-exists)
@@ -1997,98 +1988,101 @@ file names."
(copy-directory filename newname keep-date t)
(when (eq op 'rename) (delete-directory filename 'recursive)))
+ ;; FIXME: This should be optimized. Computing `file-attributes'
+ ;; checks already, whether the file exists.
(let ((t1 (tramp-tramp-file-p filename))
(t2 (tramp-tramp-file-p newname))
(length (file-attribute-size
(file-attributes (file-truename filename))))
- (attributes (and preserve-extended-attributes
- (file-extended-attributes filename)))
(msg-operation (if (eq op 'copy) "Copying" "Renaming")))
(with-parsed-tramp-file-name (if t1 filename newname) nil
- (unless (file-exists-p filename)
+ (unless length
(tramp-error v 'file-missing filename))
- (when (and (not ok-if-already-exists) (file-exists-p newname))
- (tramp-error v 'file-already-exists newname))
- (when (and (file-directory-p newname)
- (not (directory-name-p newname)))
- (tramp-error v 'file-error "File is a directory %s" newname))
+ (tramp-barf-if-file-missing v filename
+ (when (and (not ok-if-already-exists) (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+ (when (and (file-directory-p newname)
+ (not (directory-name-p newname)))
+ (tramp-error v 'file-error "File is a directory %s" newname))
- (with-tramp-progress-reporter
- v 0 (format "%s %s to %s" msg-operation filename newname)
+ (with-tramp-progress-reporter
+ v 0 (format "%s %s to %s" msg-operation filename newname)
- (cond
- ;; Both are Tramp files.
- ((and t1 t2)
- (with-parsed-tramp-file-name filename v1
- (with-parsed-tramp-file-name newname v2
- (cond
- ;; Shortcut: if method, host, user are the same for
- ;; both files, we invoke `cp' or `mv' on the remote
- ;; host directly.
- ((tramp-equal-remote filename newname)
- (tramp-do-copy-or-rename-file-directly
- op filename newname
- ok-if-already-exists keep-date preserve-uid-gid))
-
- ;; Try out-of-band operation.
- ((and
- (tramp-method-out-of-band-p v1 length)
- (tramp-method-out-of-band-p v2 length))
- (tramp-do-copy-or-rename-file-out-of-band
- op filename newname ok-if-already-exists keep-date))
-
- ;; No shortcut was possible. So we copy the file
- ;; first. If the operation was `rename', we go back
- ;; and delete the original file (if the copy was
- ;; successful). The approach is simple-minded: we
- ;; create a new buffer, insert the contents of the
- ;; source file into it, then write out the buffer to
- ;; the target file. The advantage is that it doesn't
- ;; matter which file name handlers are used for the
- ;; source and target file.
- (t
- (tramp-do-copy-or-rename-file-via-buffer
- op filename newname ok-if-already-exists keep-date))))))
-
- ;; One file is a Tramp file, the other one is local.
- ((or t1 t2)
(cond
- ;; Fast track on local machine.
- ((tramp-local-host-p v)
- (tramp-do-copy-or-rename-file-directly
- op filename newname
- ok-if-already-exists keep-date preserve-uid-gid))
-
- ;; If the Tramp file has an out-of-band method, the
- ;; corresponding copy-program can be invoked.
- ((tramp-method-out-of-band-p v length)
- (tramp-do-copy-or-rename-file-out-of-band
- op filename newname ok-if-already-exists keep-date))
-
- ;; Use the inline method via a Tramp buffer.
- (t (tramp-do-copy-or-rename-file-via-buffer
- op filename newname ok-if-already-exists keep-date))))
-
- (t
- ;; One of them must be a Tramp file.
- (error "Tramp implementation says this cannot happen")))
-
- ;; Handle `preserve-extended-attributes'. We ignore possible
- ;; errors, because ACL strings could be incompatible.
- (when attributes
- (ignore-errors
- (set-file-extended-attributes newname attributes)))
-
- ;; In case of `rename', we must flush the cache of the source file.
- (when (and t1 (eq op 'rename))
- (with-parsed-tramp-file-name filename v1
- (tramp-flush-file-properties v1 v1-localname)))
-
- ;; When newname did exist, we have wrong cached values.
- (when t2
- (with-parsed-tramp-file-name newname v2
- (tramp-flush-file-properties v2 v2-localname))))))))
+ ;; Both are Tramp files.
+ ((and t1 t2)
+ (with-parsed-tramp-file-name filename v1
+ (with-parsed-tramp-file-name newname v2
+ (cond
+ ;; Shortcut: if method, host, user are the same for
+ ;; both files, we invoke `cp' or `mv' on the remote
+ ;; host directly.
+ ((tramp-equal-remote filename newname)
+ (tramp-do-copy-or-rename-file-directly
+ op filename newname
+ ok-if-already-exists keep-date preserve-uid-gid))
+
+ ;; Try out-of-band operation.
+ ((and
+ (tramp-method-out-of-band-p v1 length)
+ (tramp-method-out-of-band-p v2 length))
+ (tramp-do-copy-or-rename-file-out-of-band
+ op filename newname ok-if-already-exists keep-date))
+
+ ;; No shortcut was possible. So we copy the file
+ ;; first. If the operation was `rename', we go
+ ;; back and delete the original file (if the copy
+ ;; was successful). The approach is simple-minded:
+ ;; we create a new buffer, insert the contents of
+ ;; the source file into it, then write out the
+ ;; buffer to the target file. The advantage is
+ ;; that it doesn't matter which file name handlers
+ ;; are used for the source and target file.
+ (t
+ (tramp-do-copy-or-rename-file-via-buffer
+ op filename newname ok-if-already-exists keep-date))))))
+
+ ;; One file is a Tramp file, the other one is local.
+ ((or t1 t2)
+ (cond
+ ;; Fast track on local machine.
+ ((tramp-local-host-p v)
+ (tramp-do-copy-or-rename-file-directly
+ op filename newname
+ ok-if-already-exists keep-date preserve-uid-gid))
+
+ ;; If the Tramp file has an out-of-band method, the
+ ;; corresponding copy-program can be invoked.
+ ((tramp-method-out-of-band-p v length)
+ (tramp-do-copy-or-rename-file-out-of-band
+ op filename newname ok-if-already-exists keep-date))
+
+ ;; Use the inline method via a Tramp buffer.
+ (t (tramp-do-copy-or-rename-file-via-buffer
+ op filename newname ok-if-already-exists keep-date))))
+
+ (t
+ ;; One of them must be a Tramp file.
+ (error "Tramp implementation says this cannot happen")))
+
+ ;; Handle `preserve-extended-attributes'. We ignore
+ ;; possible errors, because ACL strings could be
+ ;; incompatible.
+ (when-let ((attributes (and preserve-extended-attributes
+ (file-extended-attributes filename))))
+ (ignore-errors
+ (set-file-extended-attributes newname attributes)))
+
+ ;; In case of `rename', we must flush the cache of the source file.
+ (when (and t1 (eq op 'rename))
+ (with-parsed-tramp-file-name filename v1
+ (tramp-flush-file-properties v1 v1-localname)))
+
+ ;; When newname did exist, we have wrong cached values.
+ (when t2
+ (with-parsed-tramp-file-name newname v2
+ (tramp-flush-file-properties v2 v2-localname)))))))))
(defun tramp-do-copy-or-rename-file-via-buffer
(op filename newname ok-if-already-exists keep-date)
@@ -2208,6 +2202,8 @@ the uid and gid from FILENAME."
(file-name-directory (concat prefix localname2)))
(or (file-directory-p (concat prefix localname2))
(file-writable-p (concat prefix localname2))))
+ (with-parsed-tramp-file-name prefix nil
+ (tramp-flush-file-properties v localname2))
(tramp-do-copy-or-rename-file-directly
op (concat prefix localname1) (concat prefix localname2)
ok-if-already-exists keep-date preserve-uid-gid)
@@ -2417,52 +2413,52 @@ The method used must be an out-of-band method."
(with-temp-buffer
(unwind-protect
- (with-tramp-saved-connection-property v "process-name"
- (with-tramp-saved-connection-property v "process-buffer"
- ;; The default directory must be remote.
- (let ((default-directory
- (file-name-directory (if v1 filename newname)))
- (process-environment (copy-sequence process-environment)))
- ;; Set the transfer process properties.
- (tramp-set-connection-property
- v "process-name" (buffer-name (current-buffer)))
- (tramp-set-connection-property
- v "process-buffer" (current-buffer))
- (when copy-env
- (tramp-message
- v 6 "%s=\"%s\""
- (car copy-env) (string-join (cdr copy-env) " "))
- (setenv (car copy-env) (string-join (cdr copy-env) " ")))
- (setq
- copy-args
- (append
- copy-args
- (if remote-copy-program
- (list (if v1 (concat ">" target) (concat "<" source)))
- (list source target)))
- ;; Use an asynchronous process. By this, password
- ;; can be handled. We don't set a timeout, because
- ;; the copying of large files can last longer than
- ;; 60 secs.
- p (let ((default-directory
- tramp-compat-temporary-file-directory))
- (apply
- #'start-process
- (tramp-get-connection-name v)
- (tramp-get-connection-buffer v)
- copy-program copy-args)))
- (tramp-message v 6 "%s" (string-join (process-command p) " "))
- (process-put p 'vector v)
- (process-put p 'adjust-window-size-function #'ignore)
- (set-process-query-on-exit-flag p nil)
-
- ;; We must adapt `tramp-local-end-of-line' for sending
- ;; the password. Also, we indicate that perhaps several
- ;; password prompts might appear.
- (let ((tramp-local-end-of-line tramp-rsh-end-of-line)
- (tramp-password-prompt-not-unique (and v1 v2)))
- (tramp-process-actions
- p v nil tramp-actions-copy-out-of-band)))))
+ (with-tramp-saved-connection-properties
+ v '("process-name" "process-buffer")
+ ;; The default directory must be remote.
+ (let ((default-directory
+ (file-name-directory (if v1 filename newname)))
+ (process-environment (copy-sequence process-environment)))
+ ;; Set the transfer process properties.
+ (tramp-set-connection-property
+ v "process-name" (buffer-name (current-buffer)))
+ (tramp-set-connection-property
+ v "process-buffer" (current-buffer))
+ (when copy-env
+ (tramp-message
+ v 6 "%s=\"%s\""
+ (car copy-env) (string-join (cdr copy-env) " "))
+ (setenv (car copy-env) (string-join (cdr copy-env) " ")))
+ (setq
+ copy-args
+ (append
+ copy-args
+ (if remote-copy-program
+ (list (if v1 (concat ">" target) (concat "<" source)))
+ (list source target)))
+ ;; Use an asynchronous process. By this, password
+ ;; can be handled. We don't set a timeout, because
+ ;; the copying of large files can last longer than 60
+ ;; secs.
+ p (let ((default-directory
+ tramp-compat-temporary-file-directory))
+ (apply
+ #'start-process
+ (tramp-get-connection-name v)
+ (tramp-get-connection-buffer v)
+ copy-program copy-args)))
+ (tramp-message v 6 "%s" (string-join (process-command p) " "))
+ (process-put p 'vector v)
+ (process-put p 'adjust-window-size-function #'ignore)
+ (set-process-query-on-exit-flag p nil)
+
+ ;; We must adapt `tramp-local-end-of-line' for sending
+ ;; the password. Also, we indicate that perhaps
+ ;; several password prompts might appear.
+ (let ((tramp-local-end-of-line tramp-rsh-end-of-line)
+ (tramp-password-prompt-not-unique (and v1 v2)))
+ (tramp-process-actions
+ p v nil tramp-actions-copy-out-of-band))))
;; Clear the remote prompt.
(when (and remote-copy-program
@@ -2521,12 +2517,12 @@ The method used must be an out-of-band method."
"Like `delete-file' for Tramp files."
(setq filename (expand-file-name filename))
(with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)
(if (and delete-by-moving-to-trash trash)
(move-file-to-trash filename)
(tramp-barf-unless-okay
v (format "rm -f %s" (tramp-shell-quote-argument localname))
- "Couldn't delete %s" filename))))
+ "Couldn't delete %s" filename))
+ (tramp-flush-file-properties v localname)))
;; Dired.
@@ -2851,7 +2847,10 @@ implementation will be used."
(signal 'wrong-type-argument (list #'symbolp coding)))
(when (eq connection-type t)
(setq connection-type 'pty))
- (unless (memq connection-type '(nil pipe pty))
+ (unless (or (and (consp connection-type)
+ (memq (car connection-type) '(nil pipe pty))
+ (memq (cdr connection-type) '(nil pipe pty)))
+ (memq connection-type '(nil pipe pty)))
(signal 'wrong-type-argument (list #'symbolp connection-type)))
(unless (or (null filter) (eq filter t) (functionp filter))
(signal 'wrong-type-argument (list #'functionp filter)))
@@ -2977,102 +2976,102 @@ implementation will be used."
name1 (format "%s<%d>" name i)))
(setq name name1)
- (with-tramp-saved-connection-property v "process-name"
- (with-tramp-saved-connection-property v "process-buffer"
- ;; Set the new process properties.
- (tramp-set-connection-property v "process-name" name)
- (tramp-set-connection-property v "process-buffer" buffer)
- (with-current-buffer (tramp-get-connection-buffer v)
- (unwind-protect
- ;; We catch this event. Otherwise,
- ;; `make-process' could be called on the local
- ;; host.
- (save-excursion
- (save-restriction
- ;; Activate narrowing in order to save
- ;; BUFFER contents. Clear also the
- ;; modification time; otherwise we might be
- ;; interrupted by `verify-visited-file-modtime'.
- (let ((buffer-undo-list t)
- (inhibit-read-only t)
- (mark (point-max))
- (coding-system-for-write
- (if (symbolp coding) coding (car coding)))
- (coding-system-for-read
- (if (symbolp coding) coding (cdr coding))))
- (clear-visited-file-modtime)
+ (with-tramp-saved-connection-properties
+ v '("process-name" "process-buffer")
+ ;; Set the new process properties.
+ (tramp-set-connection-property v "process-name" name)
+ (tramp-set-connection-property v "process-buffer" buffer)
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (unwind-protect
+ ;; We catch this event. Otherwise, `make-process'
+ ;; could be called on the local host.
+ (save-excursion
+ (save-restriction
+ ;; Activate narrowing in order to save BUFFER
+ ;; contents. Clear also the modification
+ ;; time; otherwise we might be interrupted by
+ ;; `verify-visited-file-modtime'.
+ (let ((buffer-undo-list t)
+ (inhibit-read-only t)
+ (mark (point-max))
+ (coding-system-for-write
+ (if (symbolp coding) coding (car coding)))
+ (coding-system-for-read
+ (if (symbolp coding) coding (cdr coding))))
+ (clear-visited-file-modtime)
+ (narrow-to-region (point-max) (point-max))
+ (catch 'suppress
+ ;; Set the pid of the remote shell. This
+ ;; is needed when sending signals
+ ;; remotely.
+ (let ((pid
+ (tramp-send-command-and-read v "echo $$")))
+ (setq p (tramp-get-connection-process v))
+ (process-put p 'remote-pid pid)
+ (tramp-set-connection-property
+ p "remote-pid" pid))
+ ;; Disable carriage return to newline
+ ;; translation. This does not work on
+ ;; macOS, see Bug#50748.
+ (when (and (memq connection-type '(nil pipe))
+ (not
+ (tramp-check-remote-uname v "Darwin")))
+ (tramp-send-command v "stty -icrnl"))
+ ;; `tramp-maybe-open-connection' and
+ ;; `tramp-send-command-and-read' could
+ ;; have trashed the connection buffer.
+ ;; Remove this.
+ (widen)
+ (delete-region mark (point-max))
(narrow-to-region (point-max) (point-max))
- (catch 'suppress
- ;; Set the pid of the remote shell. This is
- ;; needed when sending signals remotely.
- (let ((pid
- (tramp-send-command-and-read v "echo $$")))
- (setq p (tramp-get-connection-process v))
- (process-put p 'remote-pid pid)
- (tramp-set-connection-property
- p "remote-pid" pid))
- ;; Disable carriage return to newline
- ;; translation. This does not work on
- ;; macOS, see Bug#50748.
- (when (and (memq connection-type '(nil pipe))
- (not
- (tramp-check-remote-uname v "Darwin")))
- (tramp-send-command v "stty -icrnl"))
- ;; `tramp-maybe-open-connection' and
- ;; `tramp-send-command-and-read' could have
- ;; trashed the connection buffer. Remove this.
- (widen)
- (delete-region mark (point-max))
- (narrow-to-region (point-max) (point-max))
- ;; Now do it.
- (if command
- ;; Send the command.
- (tramp-send-command v command nil t) ; nooutput
- ;; Check, whether a pty is associated.
- (unless (process-get p 'remote-tty)
- (tramp-error
- v 'file-error
- "pty association is not supported for `%s'"
- name))))
- ;; Set sentinel and filter.
- (when sentinel
- (set-process-sentinel p sentinel))
- (when filter
- (set-process-filter p filter))
- (process-put p 'remote-command orig-command)
- (tramp-set-connection-property
- p "remote-command" orig-command)
- ;; Set query flag and process marker for
- ;; this process. We ignore errors,
- ;; because the process could have finished
- ;; already.
- (ignore-errors
- (set-process-query-on-exit-flag p (null noquery))
- (set-marker (process-mark p) (point)))
- ;; We must flush them here already;
- ;; otherwise `delete-file' will fail.
- (tramp-flush-connection-property v "process-name")
- (tramp-flush-connection-property v "process-buffer")
- ;; Kill stderr process and delete named pipe.
- (when (bufferp stderr)
- (add-function
- :after (process-sentinel p)
- (lambda (_proc _msg)
- (ignore-errors
- (while (accept-process-output
- (get-buffer-process stderr) 0 nil t))
- (delete-process (get-buffer-process stderr)))
- (ignore-errors
- (delete-file remote-tmpstderr)))))
- ;; Return process.
- p)))
-
- ;; Save exit.
- (if (string-prefix-p tramp-temp-buffer-name (buffer-name))
- (ignore-errors
- (set-process-buffer p nil)
- (kill-buffer (current-buffer)))
- (set-buffer-modified-p bmp))))))))))))
+ ;; Now do it.
+ (if command
+ ;; Send the command.
+ (tramp-send-command v command nil t) ; nooutput
+ ;; Check, whether a pty is associated.
+ (unless (process-get p 'remote-tty)
+ (tramp-error
+ v 'file-error
+ "pty association is not supported for `%s'"
+ name))))
+ ;; Set sentinel and filter.
+ (when sentinel
+ (set-process-sentinel p sentinel))
+ (when filter
+ (set-process-filter p filter))
+ (process-put p 'remote-command orig-command)
+ (tramp-set-connection-property
+ p "remote-command" orig-command)
+ ;; Set query flag and process marker for
+ ;; this process. We ignore errors, because
+ ;; the process could have finished already.
+ (ignore-errors
+ (set-process-query-on-exit-flag p (null noquery))
+ (set-marker (process-mark p) (point)))
+ ;; We must flush them here already;
+ ;; otherwise `delete-file' will fail.
+ (tramp-flush-connection-property v "process-name")
+ (tramp-flush-connection-property v "process-buffer")
+ ;; Kill stderr process and delete named pipe.
+ (when (bufferp stderr)
+ (add-function
+ :after (process-sentinel p)
+ (lambda (_proc _msg)
+ (ignore-errors
+ (while (accept-process-output
+ (get-buffer-process stderr) 0 nil t))
+ (delete-process (get-buffer-process stderr)))
+ (ignore-errors
+ (delete-file remote-tmpstderr)))))
+ ;; Return process.
+ p)))
+
+ ;; Save exit.
+ (if (string-prefix-p tramp-temp-buffer-name (buffer-name))
+ (ignore-errors
+ (set-process-buffer p nil)
+ (kill-buffer (current-buffer)))
+ (set-buffer-modified-p bmp)))))))))))
(defun tramp-sh-get-signal-strings (vec)
"Strings to return by `process-file' in case of signals."
@@ -3102,7 +3101,7 @@ implementation will be used."
(cond
;; Some predefined values, which aren't reported sometimes,
;; or would raise problems (all Stopped signals).
- ((= i 0) 0)
+ ((zerop i) 0)
((string-equal (nth i signals) "HUP") "Hangup")
((string-equal (nth i signals) "INT") "Interrupt")
((string-equal (nth i signals) "QUIT") "Quit")
@@ -3126,7 +3125,7 @@ implementation will be used."
(with-current-buffer (tramp-get-connection-buffer vec)
(goto-char (point-min))
(buffer-substring (point-at-bol) (point-at-eol)))))
- (if (string-equal res "")
+ (if (string-empty-p res)
(format "Signal %d" i)
res)))
result))
@@ -3253,7 +3252,7 @@ implementation will be used."
;; because the remote process could have changed them.
(when tmpinput (delete-file tmpinput))
(when process-file-side-effects
- (tramp-flush-directory-properties v ""))
+ (tramp-flush-directory-properties v "/"))
;; Return exit status.
(if (equal ret -1)
@@ -3269,18 +3268,16 @@ implementation will be used."
(defun tramp-sh-handle-file-local-copy (filename)
"Like `file-local-copy' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (unless (file-exists-p (file-truename filename))
- (tramp-error v 'file-missing filename))
-
- (let* ((size (file-attribute-size
- (file-attributes (file-truename filename))))
- (rem-enc (tramp-get-inline-coding v "remote-encoding" size))
- (loc-dec (tramp-get-inline-coding v "local-decoding" size))
- (tmpfile (tramp-compat-make-temp-file filename)))
+ (tramp-skeleton-file-local-copy filename
+ (if-let ((size (file-attribute-size (file-attributes filename)))
+ (rem-enc (tramp-get-inline-coding v "remote-encoding" size))
+ (loc-dec (tramp-get-inline-coding v "local-decoding" size)))
(condition-case err
(cond
+ ;; Empty file.
+ ((zerop size))
+
;; `copy-file' handles direct copy and out-of-band methods.
((or (tramp-local-host-p v)
(tramp-method-out-of-band-p v size))
@@ -3296,6 +3293,11 @@ implementation will be used."
v (format rem-enc (tramp-shell-quote-argument localname))
"Encoding remote file failed"))
+ ;; Check error. `rem-enc' could be a pipe, which doesn't
+ ;; flag the error in the first command.
+ (when (zerop (buffer-size (tramp-get-buffer v)))
+ (tramp-error v 'file-error' "Encoding remote file failed"))
+
(with-tramp-progress-reporter
v 3 (format-message
"Decoding local file `%s' with `%s'" tmpfile loc-dec)
@@ -3308,7 +3310,7 @@ implementation will be used."
(let (file-name-handler-alist
(coding-system-for-write 'binary)
(default-directory
- tramp-compat-temporary-file-directory))
+ tramp-compat-temporary-file-directory))
(with-temp-file tmpfile
(set-buffer-multibyte nil)
(insert-buffer-substring (tramp-get-buffer v))
@@ -3343,203 +3345,210 @@ implementation will be used."
(delete-file tmpfile)
(signal (car err) (cdr err))))
- (run-hooks 'tramp-handle-file-local-copy-hook)
- tmpfile)))
+ ;; Impossible to copy. Trigger `file-missing' error.
+ (setq tmpfile nil))))
(defun tramp-sh-handle-write-region
(start end filename &optional append visit lockname mustbenew)
"Like `write-region' for Tramp files."
(tramp-skeleton-write-region start end filename append visit lockname mustbenew
- (if (and (tramp-local-host-p v)
- ;; `file-writable-p' calls `file-expand-file-name'. We
- ;; cannot use `tramp-run-real-handler' therefore.
- (file-writable-p (file-name-directory localname))
- (or (file-directory-p localname)
- (file-writable-p localname)))
- ;; Short track: if we are on the local host, we can run directly.
- (let ((create-lockfiles (not file-locked)))
- (write-region start end localname append 'no-message lockname))
-
- (let* ((modes (tramp-default-file-modes
- filename (and (eq mustbenew 'excl) 'nofollow)))
- ;; We use this to save the value of
- ;; `last-coding-system-used' after writing the tmp file.
- ;; At the end of the function, we set
- ;; `last-coding-system-used' to this saved value. This
- ;; way, any intermediary coding systems used while
- ;; talking to the remote shell or suchlike won't hose
- ;; this variable. This approach was snarfed from
- ;; ange-ftp.el.
- coding-system-used
- ;; Write region into a tmp file. This isn't really
- ;; needed if we use an encoding function, but currently
- ;; we use it always because this makes the logic simpler.
- ;; We must also set `temporary-file-directory', because
- ;; it could point to a remote directory.
- (temporary-file-directory
- tramp-compat-temporary-file-directory)
- (tmpfile (or tramp-temp-buffer-file-name
- (tramp-compat-make-temp-file filename))))
-
- ;; If `append' is non-nil, we copy the file locally, and let
- ;; the native `write-region' implementation do the job.
- (when (and append (file-exists-p filename))
- (copy-file filename tmpfile 'ok))
-
- ;; We say `no-message' here because we don't want the visited
- ;; file modtime data to be clobbered from the temp file. We
- ;; call `set-visited-file-modtime' ourselves later on. We
- ;; must ensure that `file-coding-system-alist' matches
- ;; `tmpfile'.
- (let ((file-coding-system-alist
- (tramp-find-file-name-coding-system-alist filename tmpfile))
- create-lockfiles)
- (condition-case err
- (write-region start end tmpfile append 'no-message)
- ((error quit)
- (setq tramp-temp-buffer-file-name nil)
- (delete-file tmpfile)
- (signal (car err) (cdr err))))
-
- ;; Now, `last-coding-system-used' has the right value.
- ;; Remember it.
- (setq coding-system-used last-coding-system-used))
-
- ;; The permissions of the temporary file should be set. If
- ;; FILENAME does not exist (eq modes nil) it has been renamed
- ;; to the backup file. This case `save-buffer' handles
- ;; permissions. Ensure that it is still readable.
- (when modes
- (set-file-modes tmpfile (logior (or modes 0) #o0400)))
-
- ;; This is a bit lengthy due to the different methods possible
- ;; for file transfer. First, we check whether the method uses
- ;; an scp program. If so, we call it. Otherwise, both
- ;; encoding and decoding command must be specified. However,
- ;; if the method _also_ specifies an encoding function, then
- ;; that is used for encoding the contents of the tmp file.
- (let* ((size (file-attribute-size (file-attributes tmpfile)))
- (rem-dec (tramp-get-inline-coding v "remote-decoding" size))
- (loc-enc (tramp-get-inline-coding v "local-encoding" size)))
- (cond
- ;; `copy-file' handles direct copy and out-of-band methods.
- ((or (tramp-local-host-p v)
- (tramp-method-out-of-band-p v size))
- (if (and (not (stringp start))
- (= (or end (point-max)) (point-max))
- (= (or start (point-min)) (point-min))
- (tramp-get-method-parameter
- v 'tramp-copy-keep-tmpfile))
- (progn
- (setq tramp-temp-buffer-file-name tmpfile)
- (condition-case err
- ;; We keep the local file for performance
- ;; reasons, useful for "rsync".
- (copy-file tmpfile filename t)
- ((error quit)
- (setq tramp-temp-buffer-file-name nil)
- (delete-file tmpfile)
- (signal (car err) (cdr err)))))
- (setq tramp-temp-buffer-file-name nil)
- ;; Don't rename, in order to keep context in SELinux.
+ ;; If `start' is the empty string, it is likely that a temporary
+ ;; file is created. Do it directly.
+ (if (and (stringp start) (string-empty-p start))
+ (tramp-send-command
+ v (format "cat <%s >%s"
+ (tramp-get-remote-null-device v)
+ (tramp-shell-quote-argument localname)))
+
+ ;; Short track: if we are on the local host, we can run directly.
+ (if (and (tramp-local-host-p v)
+ ;; `file-writable-p' calls `file-expand-file-name'. We
+ ;; cannot use `tramp-run-real-handler' therefore.
+ (file-writable-p (file-name-directory localname))
+ (or (file-directory-p localname)
+ (file-writable-p localname)))
+ (let ((create-lockfiles (not file-locked)))
+ (write-region start end localname append 'no-message lockname))
+
+ (let* ((modes (tramp-default-file-modes
+ filename (and (eq mustbenew 'excl) 'nofollow)))
+ ;; We use this to save the value of
+ ;; `last-coding-system-used' after writing the tmp
+ ;; file. At the end of the function, we set
+ ;; `last-coding-system-used' to this saved value. This
+ ;; way, any intermediary coding systems used while
+ ;; talking to the remote shell or suchlike won't hose
+ ;; this variable. This approach was snarfed from
+ ;; ange-ftp.el.
+ coding-system-used
+ ;; Write region into a tmp file. This isn't really
+ ;; needed if we use an encoding function, but currently
+ ;; we use it always because this makes the logic
+ ;; simpler. We must also set
+ ;; `temporary-file-directory', because it could point
+ ;; to a remote directory.
+ (temporary-file-directory
+ tramp-compat-temporary-file-directory)
+ (tmpfile (or tramp-temp-buffer-file-name
+ (tramp-compat-make-temp-file filename))))
+
+ ;; If `append' is non-nil, we copy the file locally, and let
+ ;; the native `write-region' implementation do the job.
+ (when (and append (file-exists-p filename))
+ (copy-file filename tmpfile 'ok))
+
+ ;; We say `no-message' here because we don't want the
+ ;; visited file modtime data to be clobbered from the temp
+ ;; file. We call `set-visited-file-modtime' ourselves later
+ ;; on. We must ensure that `file-coding-system-alist'
+ ;; matches `tmpfile'.
+ (let ((file-coding-system-alist
+ (tramp-find-file-name-coding-system-alist filename tmpfile))
+ create-lockfiles)
+ (condition-case err
+ (write-region start end tmpfile append 'no-message)
+ ((error quit)
+ (setq tramp-temp-buffer-file-name nil)
+ (delete-file tmpfile)
+ (signal (car err) (cdr err))))
+
+ ;; Now, `last-coding-system-used' has the right value.
+ ;; Remember it.
+ (setq coding-system-used last-coding-system-used))
+
+ ;; The permissions of the temporary file should be set. If
+ ;; FILENAME does not exist (eq modes nil) it has been
+ ;; renamed to the backup file. This case `save-buffer'
+ ;; handles permissions. Ensure that it is still readable.
+ (when modes
+ (set-file-modes tmpfile (logior (or modes 0) #o0400)))
+
+ ;; This is a bit lengthy due to the different methods
+ ;; possible for file transfer. First, we check whether the
+ ;; method uses an scp program. If so, we call it.
+ ;; Otherwise, both encoding and decoding command must be
+ ;; specified. However, if the method _also_ specifies an
+ ;; encoding function, then that is used for encoding the
+ ;; contents of the tmp file.
+ (let* ((size (file-attribute-size (file-attributes tmpfile)))
+ (rem-dec (tramp-get-inline-coding v "remote-decoding" size))
+ (loc-enc (tramp-get-inline-coding v "local-encoding" size)))
+ (cond
+ ;; `copy-file' handles direct copy and out-of-band methods.
+ ((or (tramp-local-host-p v)
+ (tramp-method-out-of-band-p v size))
+ (if (and (not (stringp start))
+ (= (or end (point-max)) (point-max))
+ (= (or start (point-min)) (point-min))
+ (tramp-get-method-parameter
+ v 'tramp-copy-keep-tmpfile))
+ (progn
+ (setq tramp-temp-buffer-file-name tmpfile)
+ (condition-case err
+ ;; We keep the local file for performance
+ ;; reasons, useful for "rsync".
+ (copy-file tmpfile filename t)
+ ((error quit)
+ (setq tramp-temp-buffer-file-name nil)
+ (delete-file tmpfile)
+ (signal (car err) (cdr err)))))
+ (setq tramp-temp-buffer-file-name nil)
+ ;; Don't rename, in order to keep context in SELinux.
+ (unwind-protect
+ (copy-file tmpfile filename t)
+ (delete-file tmpfile))))
+
+ ;; Use inline file transfer.
+ (rem-dec
+ ;; Encode tmpfile.
(unwind-protect
- (copy-file tmpfile filename t)
- (delete-file tmpfile))))
-
- ;; Use inline file transfer.
- (rem-dec
- ;; Encode tmpfile.
- (unwind-protect
- (with-temp-buffer
- (set-buffer-multibyte nil)
- ;; Use encoding function or command.
- (with-tramp-progress-reporter
- v 3 (format-message
- "Encoding local file `%s' using `%s'"
- tmpfile loc-enc)
- (if (functionp loc-enc)
- ;; The following `let' is a workaround for the
- ;; base64.el that comes with pgnus-0.84. If
- ;; both of the following conditions are
- ;; satisfied, it tries to write to a local
- ;; file in default-directory, but at this
- ;; point, default-directory is remote.
- ;; (`call-process-region' can't write to
- ;; remote files, it seems.) The file in
- ;; question is a tmp file anyway.
- (let ((coding-system-for-read 'binary)
- (default-directory
- tramp-compat-temporary-file-directory))
- (insert-file-contents-literally tmpfile)
- (funcall loc-enc (point-min) (point-max)))
-
- (unless (zerop (tramp-call-local-coding-command
- loc-enc tmpfile t))
- (tramp-error
- v 'file-error
- (concat "Cannot write to `%s', "
- "local encoding command `%s' failed")
- filename loc-enc))))
-
- ;; Send buffer into remote decoding command which
- ;; writes to remote file. Because this happens on
- ;; the remote host, we cannot use the function.
- (with-tramp-progress-reporter
- v 3 (format-message
- "Decoding remote file `%s' using `%s'"
- filename rem-dec)
- (goto-char (point-max))
- (unless (bolp) (newline))
- (tramp-send-command
- v
- (format
- (concat rem-dec " <<'%s'\n%s%s")
- (tramp-shell-quote-argument localname)
- tramp-end-of-heredoc
- (buffer-string)
- tramp-end-of-heredoc))
- (tramp-barf-unless-okay
- v nil
- "Couldn't write region to `%s', decode using `%s' failed"
- filename rem-dec)
- ;; When `file-precious-flag' is set, the region is
- ;; written to a temporary file. Check that the
- ;; checksum is equal to that from the local tmpfile.
- (when file-precious-flag
- (erase-buffer)
- (and
- ;; cksum runs locally, if possible.
- (zerop (tramp-call-process v "cksum" tmpfile t))
- ;; cksum runs remotely.
- (tramp-send-command-and-check
- v
- (format
- "cksum <%s"
- (tramp-shell-quote-argument localname)))
- ;; ... they are different.
- (not
- (string-equal
- (buffer-string)
- (tramp-get-buffer-string (tramp-get-buffer v))))
- (tramp-error
- v 'file-error
- "Couldn't write region to `%s', decode using `%s' failed"
- filename rem-dec)))))
-
- ;; Save exit.
- (delete-file tmpfile)))
-
- ;; That's not expected.
- (t
- (tramp-error
- v 'file-error
- (concat "Method `%s' should specify both encoding and "
- "decoding command or an scp program")
- method))))
+ (with-temp-buffer
+ (set-buffer-multibyte nil)
+ ;; Use encoding function or command.
+ (with-tramp-progress-reporter
+ v 3 (format-message
+ "Encoding local file `%s' using `%s'"
+ tmpfile loc-enc)
+ (if (functionp loc-enc)
+ ;; The following `let' is a workaround for
+ ;; the base64.el that comes with pgnus-0.84.
+ ;; If both of the following conditions are
+ ;; satisfied, it tries to write to a local
+ ;; file in default-directory, but at this
+ ;; point, default-directory is remote.
+ ;; (`call-process-region' can't write to
+ ;; remote files, it seems.) The file in
+ ;; question is a tmp file anyway.
+ (let ((coding-system-for-read 'binary)
+ (default-directory
+ tramp-compat-temporary-file-directory))
+ (insert-file-contents-literally tmpfile)
+ (funcall loc-enc (point-min) (point-max)))
+
+ (unless (zerop (tramp-call-local-coding-command
+ loc-enc tmpfile t))
+ (tramp-error
+ v 'file-error
+ (concat "Cannot write to `%s', "
+ "local encoding command `%s' failed")
+ filename loc-enc))))
+
+ ;; Send buffer into remote decoding command which
+ ;; writes to remote file. Because this happens on
+ ;; the remote host, we cannot use the function.
+ (with-tramp-progress-reporter
+ v 3 (format-message
+ "Decoding remote file `%s' using `%s'"
+ filename rem-dec)
+ (goto-char (point-max))
+ (unless (bolp) (newline))
+ (tramp-barf-unless-okay
+ v (format
+ (concat rem-dec " <<'%s'\n%s%s")
+ (tramp-shell-quote-argument localname)
+ tramp-end-of-heredoc
+ (buffer-string)
+ tramp-end-of-heredoc)
+ "Couldn't write region to `%s', decode using `%s' failed"
+ filename rem-dec)
+ ;; When `file-precious-flag' is set, the region
+ ;; is written to a temporary file. Check that
+ ;; the checksum is equal to that from the local
+ ;; tmpfile.
+ (when file-precious-flag
+ (erase-buffer)
+ (and
+ ;; cksum runs locally, if possible.
+ (zerop (tramp-call-process v "cksum" tmpfile t))
+ ;; cksum runs remotely.
+ (tramp-send-command-and-check
+ v (format
+ "cksum <%s" (tramp-shell-quote-argument localname)))
+ ;; ... they are different.
+ (not
+ (string-equal
+ (buffer-string)
+ (tramp-get-buffer-string (tramp-get-buffer v))))
+ (tramp-error
+ v 'file-error
+ (concat "Couldn't write region to `%s',"
+ " decode using `%s' failed")
+ filename rem-dec)))))
- ;; Make `last-coding-system-used' have the right value.
- (when coding-system-used
- (setq last-coding-system-used coding-system-used))))))
+ ;; Save exit.
+ (delete-file tmpfile)))
+
+ ;; That's not expected.
+ (t
+ (tramp-error
+ v 'file-error
+ (concat "Method `%s' should specify both encoding and "
+ "decoding command or an scp program")
+ method))))
+
+ ;; Make `last-coding-system-used' have the right value.
+ (when coding-system-used
+ (setq last-coding-system-used coding-system-used)))))))
(defvar tramp-vc-registered-file-names nil
"List used to collect file names, which are checked during `vc-registered'.")
@@ -3814,8 +3823,7 @@ Fall back to normal file name handler if no Tramp handler exists."
(setq pos (match-end 0))
(cond
((getenv "EMACS_EMBA_CI") 'GInotifyFileMonitor)
- ((eq system-type 'cygwin) 'GPollFileMonitor)
- (t nil)))
+ ((eq system-type 'cygwin) 'GPollFileMonitor)))
;; TODO: What happens, if several monitor names are reported?
((string-match "\
Supported arguments for GIO_USE_FILE_MONITOR environment variable:
@@ -3927,14 +3935,14 @@ Supported arguments for GIO_USE_FILE_MONITOR environment variable:
(defun tramp-expand-script (vec script)
"Expand SCRIPT with remote files or commands.
-\"%a\", \"%h\", \"%o\" and \"%p\" format specifiers are replaced
-by the respective `awk', `hexdump', `od' and `perl' commands.
-\"%n\" is replaced by \"2>/dev/null\", and \"%t\" is replaced by
-a temporary file name.
-If VEC is nil, the respective local commands are used.
-If there is a format specifier which cannot be expanded, this
+\"%a\", \"%h\", \"%l\", \"%o\", \"%p\", \"%r\" and \"%s\" format
+specifiers are replaced by the respective `awk', `hexdump', `ls',
+`od', `perl', `readlink' and `stat' commands. \"%n\" is replaced
+by \"2>/dev/null\", and \"%t\" is replaced by a temporary file
+name. If VEC is nil, the respective local commands are used. If
+there is a format specifier which cannot be expanded, this
function returns nil."
- (if (not (string-match-p "\\(^\\|[^%]\\)%[ahnopt]" script))
+ (if (not (string-match-p "\\(^\\|[^%]\\)%[ahlnoprst]" script))
script
(catch 'wont-work
(let ((awk (when (string-match-p "\\(^\\|[^%]\\)%a" script)
@@ -3952,6 +3960,11 @@ function returns nil."
(if (eq system-type 'windows-nt) ""
(concat "2>" null-device)))
(throw 'wont-work nil))))
+ (ls (when (string-match-p "\\(^\\|[^%]\\)%l" script)
+ (format "%s %s"
+ (or (tramp-get-ls-command vec)
+ (throw 'wont-work nil))
+ (tramp-sh--quoting-style-options vec))))
(od (when (string-match-p "\\(^\\|[^%]\\)%o" script)
(or (if vec (tramp-get-remote-od vec) (executable-find "od"))
(throw 'wont-work nil))))
@@ -3960,6 +3973,17 @@ function returns nil."
(if vec
(tramp-get-remote-perl vec) (executable-find "perl"))
(throw 'wont-work nil))))
+ (readlink (when (string-match-p "\\(^\\|[^%]\\)%r" script)
+ (or
+ (if vec
+ (tramp-get-remote-readlink vec)
+ (executable-find "readlink"))
+ (throw 'wont-work nil))))
+ (stat (when (string-match-p "\\(^\\|[^%]\\)%s" script)
+ (or
+ (if vec
+ (tramp-get-remote-stat vec) (executable-find "stat"))
+ (throw 'wont-work nil))))
(tmp (when (string-match-p "\\(^\\|[^%]\\)%t" script)
(or
(if vec
@@ -3968,7 +3992,9 @@ function returns nil."
(throw 'wont-work nil)))))
(format-spec
script
- (format-spec-make ?a awk ?h hdmp ?n dev ?o od ?p perl ?t tmp))))))
+ (format-spec-make
+ ?a awk ?h hdmp ?l ls ?n dev ?o od ?p perl
+ ?r readlink ?s stat ?t tmp))))))
(defun tramp-maybe-send-script (vec script name)
"Define in remote shell function NAME implemented as SCRIPT.
@@ -4184,14 +4210,17 @@ file exists and nonzero exit status otherwise."
;; by some sh implementations (eg, bash when called as sh) on
;; startup; this way, we avoid the startup file clobbering $PS1.
;; $PROMPT_COMMAND is another way to set the prompt in /bin/bash,
- ;; it must be discarded as well. $HISTFILE is set according to
- ;; `tramp-histfile-override'. $TERM and $INSIDE_EMACS set here to
- ;; ensure they have the correct values when the shell starts, not
- ;; just processes run within the shell. (Which processes include
- ;; our initial probes to ensure the remote shell is usable.)
- ;; For the time being, we assume that all shells interpret -i as
- ;; interactive shell. Must be the last argument, because (for
- ;; example) bash expects long options first.
+ ;; it must be discarded as well. Some ssh daemons (for example,
+ ;; on Android devices) do not acknowledge the $PS1 setting in
+ ;; that call, so we make a further sanity check. (Bug#57044)
+ ;; $HISTFILE is set according to `tramp-histfile-override'. $TERM
+ ;; and $INSIDE_EMACS set here to ensure they have the correct
+ ;; values when the shell starts, not just processes run within the
+ ;; shell. (Which processes include our initial probes to ensure
+ ;; the remote shell is usable.) For the time being, we assume
+ ;; that all shells interpret -i as interactive shell. Must be the
+ ;; last argument, because (for example) bash expects long options
+ ;; first.
(tramp-send-command
vec (format
(concat
@@ -4207,7 +4236,21 @@ file exists and nonzero exit status otherwise."
""))
(tramp-shell-quote-argument tramp-end-of-output)
shell (or (tramp-get-sh-extra-args shell) ""))
- t)
+ t t)
+
+ ;; Sanity check.
+ (tramp-barf-if-no-shell-prompt
+ (tramp-get-connection-process vec) 10
+ "Couldn't find remote shell prompt for %s" shell)
+ (unless
+ (tramp-check-for-regexp
+ (tramp-get-connection-process vec) (regexp-quote tramp-end-of-output))
+ (tramp-message vec 5 "Setting shell prompt")
+ (tramp-send-command
+ vec (format "PS1=%s PS2='' PS3='' PROMPT_COMMAND=''"
+ (tramp-shell-quote-argument tramp-end-of-output))
+ t))
+
;; Check proper HISTFILE setting. We give up when not working.
(when (and (stringp tramp-histfile-override)
(file-name-directory tramp-histfile-override))
@@ -4234,8 +4277,10 @@ file exists and nonzero exit status otherwise."
(with-tramp-connection-property vec "remote-shell"
;; CCC: "root" does not exist always, see my QNAP
;; TS-459. Which check could we apply instead?
- (tramp-send-command vec "echo ~root" t)
- (if (or (string-match-p "^~root$" (buffer-string))
+ (tramp-send-command
+ vec (format "echo ~%s" tramp-root-id-string) t)
+ (if (or (string-match-p
+ (format "^~%s$" tramp-root-id-string) (buffer-string))
;; The default shell (ksh93) of OpenSolaris
;; and Solaris is buggy. We've got reports
;; for "SunOS 5.10" and "SunOS 5.11" so far.
@@ -4284,8 +4329,7 @@ seconds. If not, it produces an error message with the given ERROR-ARGS."
"Set up an interactive shell.
Mainly sets the prompt and the echo correctly. PROC is the shell
process to set up. VEC specifies the connection."
- (let ((tramp-end-of-output tramp-initial-end-of-output)
- (case-fold-search t))
+ (let ((case-fold-search t))
(tramp-open-shell vec (tramp-get-method-parameter vec 'tramp-remote-shell))
(tramp-message vec 5 "Setting up remote shell environment")
@@ -4312,12 +4356,6 @@ process to set up. VEC specifies the connection."
;; width magic interferes with them.
(tramp-send-command vec "stty icanon erase ^H cols 32767" t))))
- (tramp-message vec 5 "Setting shell prompt")
- (tramp-send-command
- vec (format "PS1=%s PS2='' PS3='' PROMPT_COMMAND=''"
- (tramp-shell-quote-argument tramp-end-of-output))
- t)
-
;; Check whether the output of "uname -sr" has been changed. If
;; yes, this is a strong indication that we must expire all
;; connection properties. We start again with
@@ -4442,7 +4480,7 @@ process to set up. VEC specifies the connection."
(copy-sequence tramp-remote-process-environment))))
(setq item (split-string item "=" 'omit))
(setcdr item (string-join (cdr item) "="))
- (if (and (stringp (cdr item)) (not (string-equal (cdr item) "")))
+ (if (and (stringp (cdr item)) (not (string-empty-p (cdr item))))
(push (format "%s %s" (car item) (cdr item)) vars)
(push (car item) unset)))
(when vars
@@ -5264,16 +5302,23 @@ executed in a subshell, ie surrounded by parentheses. If
DONT-SUPPRESS-ERR is non-nil, stderr won't be sent to \"/dev/null\".
Optional argument EXIT-STATUS, if non-nil, triggers the return of
the exit status."
- (tramp-send-command
- vec
- (concat (if subshell "( " "")
- command
- (if command
- (if dont-suppress-err
- "; " (format " 2>%s; " (tramp-get-remote-null-device vec)))
- "")
- "echo tramp_exit_status $?"
- (if subshell " )" "")))
+ (let (cmd data)
+ (if (and (stringp command)
+ (string-match (format ".*<<'%s'.*" tramp-end-of-heredoc) command))
+ (setq cmd (match-string 0 command)
+ data (substring command (match-end 0)))
+ (setq cmd command))
+ (tramp-send-command
+ vec
+ (concat (if subshell "( " "")
+ cmd
+ (if cmd
+ (if dont-suppress-err
+ "; " (format " 2>%s; " (tramp-get-remote-null-device vec)))
+ "")
+ "echo tramp_exit_status $?"
+ (if subshell " )" "")
+ data)))
(with-current-buffer (tramp-get-connection-buffer vec)
(unless (tramp-search-regexp "tramp_exit_status [[:digit:]]+")
(tramp-error
@@ -5328,94 +5373,6 @@ raises an error."
"`%s' does not return a valid Lisp expression: `%s'"
command (buffer-string))))))))
-;; FIXME: Move to tramp.el?
-;;;###tramp-autoload
-(defun tramp-convert-file-attributes (vec attr)
- "Convert `file-attributes' ATTR generated by perl script, stat or ls.
-Convert file mode bits to string and set virtual device number.
-Return ATTR."
- (when attr
- (save-match-data
- ;; Remove color escape sequences from symlink.
- (when (stringp (car attr))
- (while (string-match tramp-display-escape-sequence-regexp (car attr))
- (setcar attr (replace-match "" nil nil (car attr)))))
- ;; Convert uid and gid. Use `tramp-unknown-id-integer' as
- ;; indication of unusable value.
- (when (and (numberp (nth 2 attr)) (< (nth 2 attr) 0))
- (setcar (nthcdr 2 attr) tramp-unknown-id-integer))
- (when (and (floatp (nth 2 attr))
- (<= (nth 2 attr) most-positive-fixnum))
- (setcar (nthcdr 2 attr) (round (nth 2 attr))))
- (when (and (numberp (nth 3 attr)) (< (nth 3 attr) 0))
- (setcar (nthcdr 3 attr) tramp-unknown-id-integer))
- (when (and (floatp (nth 3 attr))
- (<= (nth 3 attr) most-positive-fixnum))
- (setcar (nthcdr 3 attr) (round (nth 3 attr))))
- ;; Convert last access time.
- (unless (listp (nth 4 attr))
- (setcar (nthcdr 4 attr) (seconds-to-time (nth 4 attr))))
- ;; Convert last modification time.
- (unless (listp (nth 5 attr))
- (setcar (nthcdr 5 attr) (seconds-to-time (nth 5 attr))))
- ;; Convert last status change time.
- (unless (listp (nth 6 attr))
- (setcar (nthcdr 6 attr) (seconds-to-time (nth 6 attr))))
- ;; Convert file size.
- (when (< (nth 7 attr) 0)
- (setcar (nthcdr 7 attr) -1))
- (when (and (floatp (nth 7 attr))
- (<= (nth 7 attr) most-positive-fixnum))
- (setcar (nthcdr 7 attr) (round (nth 7 attr))))
- ;; Convert file mode bits to string.
- (unless (stringp (nth 8 attr))
- (setcar (nthcdr 8 attr) (tramp-file-mode-from-int (nth 8 attr)))
- (when (stringp (car attr))
- (aset (nth 8 attr) 0 ?l)))
- ;; Convert directory indication bit.
- (when (string-prefix-p "d" (nth 8 attr))
- (setcar attr t))
- ;; Convert symlink from `tramp-do-file-attributes-with-stat'.
- ;; Decode also multibyte string.
- (when (consp (car attr))
- (setcar attr
- (and (stringp (caar attr))
- (string-match ".+ -> .\\(.+\\)." (caar attr))
- (decode-coding-string
- (match-string 1 (caar attr)) 'utf-8))))
- ;; Set file's gid change bit.
- (setcar (nthcdr 9 attr)
- (if (numberp (nth 3 attr))
- (not (= (nth 3 attr)
- (tramp-get-remote-gid vec 'integer)))
- (not (string-equal
- (nth 3 attr)
- (tramp-get-remote-gid vec 'string)))))
- ;; Convert inode.
- (when (floatp (nth 10 attr))
- (setcar (nthcdr 10 attr)
- (condition-case nil
- (let ((high (nth 10 attr))
- middle low)
- (if (<= high most-positive-fixnum)
- (floor high)
- ;; The low 16 bits.
- (setq low (mod high #x10000)
- high (/ high #x10000))
- (if (<= high most-positive-fixnum)
- (cons (floor high) (floor low))
- ;; The middle 24 bits.
- (setq middle (mod high #x1000000)
- high (/ high #x1000000))
- (cons (floor high)
- (cons (floor middle) (floor low))))))
- ;; Inodes can be incredible huge. We must hide this.
- (error (tramp-get-inode vec)))))
- ;; Set virtual device number.
- (setcar (nthcdr 11 attr)
- (tramp-get-device vec)))
- attr))
-
(defun tramp-shell-case-fold (string)
"Convert STRING to shell glob pattern which ignores case."
(mapconcat
@@ -5591,10 +5548,14 @@ Nonexistent directories are removed from spec."
;; "--color=never" argument (for example on FreeBSD).
(when (tramp-send-command-and-check
vec (format "%s -lnd /" result))
- (when (tramp-send-command-and-check
- vec (format
- "%s --color=never -al %s"
- result (tramp-get-remote-null-device vec)))
+ (when (and (tramp-send-command-and-check
+ vec (format
+ "%s --color=never -al %s"
+ result (tramp-get-remote-null-device vec)))
+ (not (string-match-p
+ (regexp-quote "\e")
+ (tramp-get-buffer-string
+ (tramp-get-buffer vec)))))
(setq result (concat result " --color=never")))
(throw 'ls-found result))
(setq dl (cdr dl))))))
@@ -5797,18 +5758,25 @@ This command is returned only if `delete-by-moving-to-trash' is non-nil."
(while (and dl (setq result (tramp-find-executable vec cmd dl t t)))
;; Check POSIX parameter.
(when (tramp-send-command-and-check vec (format "%s -u" result))
+ (tramp-set-connection-property
+ vec "uid-integer"
+ (with-current-buffer (tramp-get-connection-buffer vec)
+ (goto-char (point-min))
+ (read (current-buffer))))
(throw 'id-found result))
(setq dl (cdr dl))))))))
(defun tramp-get-remote-uid-with-id (vec id-format)
"Implement `tramp-get-remote-uid' for Tramp files using `id'."
- (tramp-send-command-and-read
- vec
- (format "%s -u%s %s"
- (tramp-get-remote-id vec)
- (if (equal id-format 'integer) "" "n")
- (if (equal id-format 'integer)
- "" "| sed -e s/^/\\\"/ -e s/\\$/\\\"/"))))
+ ;; `tramp-get-remote-id' sets already connection property "uid-integer".
+ (with-tramp-connection-property vec (format "uid-%s" id-format)
+ (tramp-send-command-and-read
+ vec
+ (format "%s -u%s %s"
+ (tramp-get-remote-id vec)
+ (if (equal id-format 'integer) "" "n")
+ (if (equal id-format 'integer)
+ "" "| sed -e s/^/\\\"/ -e s/\\$/\\\"/")))))
(defun tramp-get-remote-uid-with-perl (vec id-format)
"Implement `tramp-get-remote-uid' for Tramp files using a Perl script."
@@ -5825,7 +5793,6 @@ This command is returned only if `delete-by-moving-to-trash' is non-nil."
(with-tramp-connection-property vec "python"
(tramp-message vec 5 "Finding a suitable `python' command")
(or (tramp-find-executable vec "python" (tramp-get-remote-path vec))
- (tramp-find-executable vec "python2" (tramp-get-remote-path vec))
(tramp-find-executable vec "python3" (tramp-get-remote-path vec)))))
(defun tramp-get-remote-uid-with-python (vec id-format)
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index b717c4dcc38..a81a8f13636 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -232,7 +232,7 @@ See `tramp-actions-before-shell' for more info.")
(delete-file . tramp-smb-handle-delete-file)
;; `diff-latest-backup-file' performed by default handler.
(directory-file-name . tramp-handle-directory-file-name)
- (directory-files . tramp-smb-handle-directory-files)
+ (directory-files . tramp-handle-directory-files)
(directory-files-and-attributes
. tramp-handle-directory-files-and-attributes)
(dired-compress-file . ignore)
@@ -416,111 +416,115 @@ arguments to pass to the OPERATION."
(defun tramp-smb-handle-copy-directory
(dirname newname &optional keep-date parents copy-contents)
"Like `copy-directory' for Tramp files."
- (let ((t1 (tramp-tramp-file-p dirname))
- (t2 (tramp-tramp-file-p newname))
- target)
- (with-parsed-tramp-file-name (if t1 dirname newname) nil
- (unless (file-exists-p dirname)
- (tramp-error v 'file-missing dirname))
-
- ;; `copy-directory-create-symlink' exists since Emacs 28.1.
- (if (and (bound-and-true-p copy-directory-create-symlink)
- (setq target (file-symlink-p dirname))
- (tramp-equal-remote dirname newname))
- (make-symbolic-link
- target
- (if (directory-name-p newname)
- (concat newname (file-name-nondirectory dirname)) newname)
- t)
-
- (if copy-contents
- ;; We must do it file-wise.
- (tramp-run-real-handler
- #'copy-directory
- (list dirname newname keep-date parents copy-contents))
-
- (setq dirname (expand-file-name dirname)
- newname (expand-file-name newname))
- (with-tramp-progress-reporter
- v 0 (format "Copying %s to %s" dirname newname)
- (unless (file-exists-p dirname)
- (tramp-error v 'file-missing dirname))
- (when (and (file-directory-p newname)
- (not (directory-name-p newname)))
- (tramp-error v 'file-already-exists newname))
- (cond
- ;; We must use a local temporary directory.
- ((and t1 t2)
- (let ((tmpdir (tramp-compat-make-temp-name)))
- (unwind-protect
- (progn
- (make-directory tmpdir)
- (copy-directory
- dirname (file-name-as-directory tmpdir)
- keep-date 'parents)
- (copy-directory
- (expand-file-name (file-name-nondirectory dirname) tmpdir)
- newname keep-date parents))
- (delete-directory tmpdir 'recursive))))
-
- ;; We can copy recursively.
- ;; TODO: Does not work reliably.
- (nil ;(and (or t1 t2) (tramp-smb-get-cifs-capabilities v))
+ (tramp-skeleton-copy-directory
+ dirname newname keep-date parents copy-contents
+ (let ((t1 (tramp-tramp-file-p dirname))
+ (t2 (tramp-tramp-file-p newname))
+ target)
+ (with-parsed-tramp-file-name (if t1 dirname newname) nil
+ (unless (file-exists-p dirname)
+ (tramp-error v 'file-missing dirname))
+
+ ;; `copy-directory-create-symlink' exists since Emacs 28.1.
+ (if (and (bound-and-true-p copy-directory-create-symlink)
+ (setq target (file-symlink-p dirname))
+ (tramp-equal-remote dirname newname))
+ (make-symbolic-link
+ target
+ (if (directory-name-p newname)
+ (concat newname (file-name-nondirectory dirname)) newname)
+ t)
+
+ (if copy-contents
+ ;; We must do it file-wise.
+ (tramp-run-real-handler
+ #'copy-directory
+ (list dirname newname keep-date parents copy-contents))
+
+ (setq dirname (expand-file-name dirname)
+ newname (expand-file-name newname))
+ (with-tramp-progress-reporter
+ v 0 (format "Copying %s to %s" dirname newname)
(when (and (file-directory-p newname)
- (not (string-equal (file-name-nondirectory dirname)
- (file-name-nondirectory newname))))
- (setq newname
- (expand-file-name
- (file-name-nondirectory dirname) newname))
- (if t2 (setq v (tramp-dissect-file-name newname))))
- (if (not (file-directory-p newname))
- (make-directory newname parents))
-
- (let* ((share (tramp-smb-get-share v))
- (localname (file-name-as-directory
- (tramp-compat-string-replace
- "\\" "/" (tramp-smb-get-localname v))))
- (tmpdir (tramp-compat-make-temp-name))
- (args (list (concat "//" host "/" share) "-E"))
- (options tramp-smb-options))
-
- (if (not (zerop (length user)))
- (setq args (append args (list "-U" user)))
- (setq args (append args (list "-N"))))
-
- (when domain (setq args (append args (list "-W" domain))))
- (when port (setq args (append args (list "-p" port))))
- (when tramp-smb-conf
- (setq args (append args (list "-s" tramp-smb-conf))))
- (while options
- (setq args
- (append args `("--option" ,(format "%s" (car options))))
- options (cdr options)))
- (setq args
- (if t1
- ;; Source is remote.
+ (not (directory-name-p newname)))
+ (tramp-error v 'file-already-exists newname))
+ (cond
+ ;; We must use a local temporary directory.
+ ((and t1 t2)
+ (let ((tmpdir (tramp-compat-make-temp-name)))
+ (unwind-protect
+ (progn
+ (make-directory tmpdir)
+ (copy-directory
+ dirname (file-name-as-directory tmpdir)
+ keep-date 'parents)
+ (copy-directory
+ (expand-file-name
+ (file-name-nondirectory dirname) tmpdir)
+ newname keep-date parents))
+ (delete-directory tmpdir 'recursive))))
+
+ ;; We can copy recursively.
+ ;; FIXME: Does not work reliably.
+ (nil ;(and (or t1 t2) (tramp-smb-get-cifs-capabilities v))
+ (when (and (file-directory-p newname)
+ (not (string-equal (file-name-nondirectory dirname)
+ (file-name-nondirectory newname))))
+ (setq newname
+ (expand-file-name
+ (file-name-nondirectory dirname) newname))
+ (if t2 (setq v (tramp-dissect-file-name newname))))
+ (if (not (file-directory-p newname))
+ (make-directory newname parents))
+
+ (let* ((share (tramp-smb-get-share v))
+ (localname (file-name-as-directory
+ (tramp-compat-string-replace
+ "\\" "/" (tramp-smb-get-localname v))))
+ (tmpdir (tramp-compat-make-temp-name))
+ (args (list (concat "//" host "/" share) "-E"))
+ (options tramp-smb-options))
+
+ (if (not (zerop (length user)))
+ (setq args (append args (list "-U" user)))
+ (setq args (append args (list "-N"))))
+
+ (when domain (setq args (append args (list "-W" domain))))
+ (when port (setq args (append args (list "-p" port))))
+ (when tramp-smb-conf
+ (setq args (append args (list "-s" tramp-smb-conf))))
+ (while options
+ (setq args
(append args
+ `("--option" ,(format "%s" (car options))))
+ options (cdr options)))
+ (setq args
+ (if t1
+ ;; Source is remote.
+ (append args
+ (list "-D"
+ (tramp-unquote-shell-quote-argument
+ localname)
+ "-c"
+ (tramp-unquote-shell-quote-argument
+ "tar qc - *")
+ "|" "tar" "xfC" "-"
+ (tramp-unquote-shell-quote-argument
+ tmpdir)))
+ ;; Target is remote.
+ (append (list
+ "tar" "cfC" "-"
+ (tramp-unquote-shell-quote-argument dirname)
+ "." "|")
+ args
(list "-D" (tramp-unquote-shell-quote-argument
localname)
"-c" (tramp-unquote-shell-quote-argument
- "tar qc - *")
- "|" "tar" "xfC" "-"
- (tramp-unquote-shell-quote-argument
- tmpdir)))
- ;; Target is remote.
- (append (list
- "tar" "cfC" "-"
- (tramp-unquote-shell-quote-argument dirname)
- "." "|")
- args
- (list "-D" (tramp-unquote-shell-quote-argument
- localname)
- "-c" (tramp-unquote-shell-quote-argument
- "tar qx -")))))
-
- (unwind-protect
- (with-tramp-saved-connection-property v "process-name"
- (with-tramp-saved-connection-property v "process-buffer"
+ "tar qx -")))))
+
+ (unwind-protect
+ (with-tramp-saved-connection-properties
+ v '("process-name" "process-buffer")
(with-temp-buffer
;; Set the transfer process properties.
(tramp-set-connection-property
@@ -553,38 +557,40 @@ arguments to pass to the OPERATION."
(tramp-message
v 6 "%s" (string-join (process-command p) " "))
(process-put p 'vector v)
- (process-put p 'adjust-window-size-function #'ignore)
+ (process-put
+ p 'adjust-window-size-function #'ignore)
(set-process-query-on-exit-flag p nil)
(tramp-process-actions
p v nil tramp-smb-actions-with-tar)
(while (process-live-p p)
(sleep-for 0.1))
- (tramp-message v 6 "\n%s" (buffer-string))))))
+ (tramp-message v 6 "\n%s" (buffer-string)))))
- ;; Save exit.
- (when t1 (delete-directory tmpdir 'recursive))))
+ ;; Save exit.
+ (when t1 (delete-directory tmpdir 'recursive))))
- ;; Handle KEEP-DATE argument.
- (when keep-date
- (tramp-compat-set-file-times
- newname
- (file-attribute-modification-time (file-attributes dirname))
- (unless ok-if-already-exists 'nofollow)))
+ ;; Handle KEEP-DATE argument.
+ (when keep-date
+ (tramp-compat-set-file-times
+ newname
+ (file-attribute-modification-time (file-attributes dirname))
+ (unless ok-if-already-exists 'nofollow)))
- ;; Set the mode.
- (unless keep-date
- (set-file-modes newname (tramp-default-file-modes dirname)))
+ ;; Set the mode.
+ (unless keep-date
+ (set-file-modes newname (tramp-default-file-modes dirname)))
- ;; When newname did exist, we have wrong cached values.
- (when t2
- (with-parsed-tramp-file-name newname nil
- (tramp-flush-file-properties v localname))))
+ ;; When newname did exist, we have wrong cached values.
+ (when t2
+ (with-parsed-tramp-file-name newname nil
+ (tramp-flush-file-properties v localname))))
- ;; We must do it file-wise.
- (t
- (tramp-run-real-handler
- #'copy-directory (list dirname newname keep-date parents))))))))))
+ ;; We must do it file-wise.
+ (t
+ (tramp-run-real-handler
+ #'copy-directory
+ (list dirname newname keep-date parents)))))))))))
(defun tramp-smb-handle-copy-file
(filename newname &optional ok-if-already-exists keep-date
@@ -706,37 +712,6 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
(search-forward-regexp tramp-smb-errors nil t)
(tramp-error v 'file-error "%s `%s'" (match-string 0) filename)))))))
-(defun tramp-smb-handle-directory-files
- (directory &optional full match nosort count)
- "Like `directory-files' for Tramp files."
- (unless (file-exists-p directory)
- (tramp-error (tramp-dissect-file-name directory) 'file-missing directory))
- (let ((result (mapcar #'directory-file-name
- (file-name-all-completions "" directory))))
- ;; Discriminate with regexp.
- (when match
- (setq result
- (delete nil
- (mapcar (lambda (x) (when (string-match-p match x) x))
- result))))
-
- ;; Sort them if necessary.
- (unless nosort
- (setq result (sort result #'string-lessp)))
-
- ;; Return count number of results.
- (when (and (natnump count) (> count 0))
- (setq result (nbutlast result (- (length result) count))))
-
- ;; Prepend directory.
- (when full
- (setq result
- (mapcar
- (lambda (x) (format "%s/%s" (directory-file-name directory) x))
- result)))
-
- result))
-
(defun tramp-smb-handle-expand-file-name (name &optional dir)
"Like `expand-file-name' for Tramp files."
;; If DIR is not given, use DEFAULT-DIRECTORY or "/".
@@ -776,6 +751,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
localname
(tramp-run-real-handler #'expand-file-name (list localname)))))))
+(defun tramp-smb-remote-acl-p (_vec)
+ "Check, whether ACL is enabled on the remote host."
+ (and (stringp tramp-smb-acl-program) (executable-find tramp-smb-acl-program)))
+
(defun tramp-smb-action-get-acl (proc vec)
"Read ACL data from connection buffer."
(unless (process-live-p proc)
@@ -799,7 +778,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
(ignore-errors
(with-parsed-tramp-file-name filename nil
(with-tramp-file-property v localname "file-acl"
- (when (executable-find tramp-smb-acl-program)
+ (when (tramp-smb-remote-acl-p v)
(let* ((share (tramp-smb-get-share v))
(localname (tramp-compat-string-replace
"\\" "/" (tramp-smb-get-localname v)))
@@ -824,52 +803,49 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
(concat "2>" (tramp-get-remote-null-device v)))))
(unwind-protect
- (with-tramp-saved-connection-property v "process-name"
- (with-tramp-saved-connection-property v "process-buffer"
- (with-temp-buffer
- ;; Set the transfer process properties.
- (tramp-set-connection-property
- v "process-name" (buffer-name (current-buffer)))
- (tramp-set-connection-property
- v "process-buffer" (current-buffer))
-
- ;; Use an asynchronous process. By this,
- ;; password can be handled.
- (let ((p (apply
- #'start-process
- (tramp-get-connection-name v)
- (tramp-get-connection-buffer v)
- tramp-smb-acl-program args)))
-
- (tramp-message
- v 6 "%s" (string-join (process-command p) " "))
- (process-put p 'vector v)
- (process-put p 'adjust-window-size-function #'ignore)
- (set-process-query-on-exit-flag p nil)
- (tramp-process-actions p v nil tramp-smb-actions-get-acl)
- (when (> (point-max) (point-min))
- (substring-no-properties (buffer-string))))))))))))))
+ (with-tramp-saved-connection-properties
+ v '("process-name" "process-buffer")
+ (with-temp-buffer
+ ;; Set the transfer process properties.
+ (tramp-set-connection-property
+ v "process-name" (buffer-name (current-buffer)))
+ (tramp-set-connection-property
+ v "process-buffer" (current-buffer))
+
+ ;; Use an asynchronous process. By this, password
+ ;; can be handled.
+ (let ((p (apply
+ #'start-process
+ (tramp-get-connection-name v)
+ (tramp-get-connection-buffer v)
+ tramp-smb-acl-program args)))
+
+ (tramp-message
+ v 6 "%s" (string-join (process-command p) " "))
+ (process-put p 'vector v)
+ (process-put p 'adjust-window-size-function #'ignore)
+ (set-process-query-on-exit-flag p nil)
+ (tramp-process-actions p v nil tramp-smb-actions-get-acl)
+ (when (> (point-max) (point-min))
+ (substring-no-properties (buffer-string)))))))))))))
(defun tramp-smb-handle-file-attributes (filename &optional id-format)
"Like `file-attributes' for Tramp files."
- (unless id-format (setq id-format 'integer))
- (ignore-errors
- (with-parsed-tramp-file-name filename nil
- (with-tramp-file-property
- v localname (format "file-attributes-%s" id-format)
+ ;; The result is cached in `tramp-convert-file-attributes'.
+ (with-parsed-tramp-file-name filename nil
+ (tramp-convert-file-attributes v localname id-format
+ (ignore-errors
(if (tramp-smb-get-stat-capability v)
- (tramp-smb-do-file-attributes-with-stat v id-format)
- ;; Reading just the filename entry via "dir localname" is not
- ;; possible, because when filename is a directory, some
- ;; smbclient versions return the content of the directory, and
- ;; other versions don't. Therefore, the whole content of the
- ;; upper directory is retrieved, and the entry of the filename
- ;; is extracted from.
+ (tramp-smb-do-file-attributes-with-stat v)
+ ;; Reading just the filename entry via "dir localname" is
+ ;; not possible, because when filename is a directory, some
+ ;; smbclient versions return the content of the directory,
+ ;; and other versions don't. Therefore, the whole content
+ ;; of the upper directory is retrieved, and the entry of the
+ ;; filename is extracted from.
(let* ((entries (tramp-smb-get-file-entries
(file-name-directory filename)))
(entry (assoc (file-name-nondirectory filename) entries))
- (uid (if (equal id-format 'string) "nobody" -1))
- (gid (if (equal id-format 'string) "nogroup" -1))
(inode (tramp-get-inode v))
(device (tramp-get-device v)))
@@ -877,19 +853,21 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
(when entry
(list (and (tramp-compat-string-search "d" (nth 1 entry))
t) ;0 file type
- -1 ;1 link count
- uid ;2 uid
- gid ;3 gid
+ -1 ;1 link count
+ (cons
+ tramp-unknown-id-string tramp-unknown-id-integer) ;2 uid
+ (cons
+ tramp-unknown-id-string tramp-unknown-id-integer) ;3 gid
tramp-time-dont-know ;4 atime
(nth 3 entry) ;5 mtime
tramp-time-dont-know ;6 ctime
(nth 2 entry) ;7 size
(nth 1 entry) ;8 mode
- nil ;9 gid weird
- inode ;10 inode number
+ nil ;9 gid weird
+ inode ;10 inode number
device)))))))) ;11 file system number
-(defun tramp-smb-do-file-attributes-with-stat (vec &optional id-format)
+(defun tramp-smb-do-file-attributes-with-stat (vec)
"Implement `file-attributes' for Tramp files using `stat' command."
(tramp-message
vec 5 "file attributes with stat: %s" (tramp-file-name-localname vec))
@@ -920,10 +898,8 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
"Uid:\\s-+\\([[:digit:]]+\\)\\s-+"
"Gid:\\s-+\\([[:digit:]]+\\)"))
(setq mode (match-string 1)
- uid (if (equal id-format 'string) (match-string 2)
- (string-to-number (match-string 2)))
- gid (if (equal id-format 'string) (match-string 3)
- (string-to-number (match-string 3)))))
+ uid (match-string 2)
+ gid (match-string 3)))
((looking-at
(concat
"Access:\\s-+"
@@ -977,26 +953,23 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
;; Return the result.
(when (or id link uid gid atime mtime ctime size mode inode)
- (list id link uid gid atime mtime ctime size mode nil inode
- (tramp-get-device vec))))))))
+ (list id link (cons uid (string-to-number uid))
+ (cons gid (string-to-number gid)) gid atime mtime ctime size
+ mode nil inode (tramp-get-device vec))))))))
(defun tramp-smb-handle-file-local-copy (filename)
"Like `file-local-copy' for Tramp files."
- (with-parsed-tramp-file-name (file-truename filename) nil
- (unless (file-exists-p (file-truename filename))
- (tramp-error v 'file-missing filename))
- (let ((tmpfile (tramp-compat-make-temp-file filename)))
- (with-tramp-progress-reporter
- v 3 (format "Fetching %s to tmp file %s" filename tmpfile)
- (unless (tramp-smb-send-command
- v (format "get %s %s"
- (tramp-smb-shell-quote-localname v)
- (tramp-smb-shell-quote-argument tmpfile)))
- ;; Oops, an error. We shall cleanup.
- (delete-file tmpfile)
- (tramp-error
- v 'file-error "Cannot make local copy of file `%s'" filename)))
- tmpfile)))
+ (tramp-skeleton-file-local-copy filename
+ (with-tramp-progress-reporter
+ v 3 (format "Fetching %s to tmp file %s" filename tmpfile)
+ (unless (tramp-smb-send-command
+ v (format "get %s %s"
+ (tramp-smb-shell-quote-localname v)
+ (tramp-smb-shell-quote-argument tmpfile)))
+ ;; Oops, an error. We shall cleanup.
+ (delete-file tmpfile)
+ (tramp-error
+ v 'file-error "Cannot make local copy of file `%s'" filename)))))
;; This function should return "foo/" for directories and "bar" for
;; files.
@@ -1342,32 +1315,32 @@ component is used as the target of the symlink."
;; Call it.
(condition-case nil
- (with-tramp-saved-connection-property v "process-name"
- (with-tramp-saved-connection-property v "process-buffer"
- ;; Set the new process properties.
- (tramp-set-connection-property v "process-name" name1)
- (tramp-set-connection-property
- v "process-buffer"
- (or outbuf (generate-new-buffer tramp-temp-buffer-name)))
- (with-current-buffer (tramp-get-connection-buffer v)
- ;; Preserve buffer contents.
- (narrow-to-region (point-max) (point-max))
- (tramp-smb-call-winexe v)
- (when (tramp-smb-get-share v)
- (tramp-smb-send-command
- v (format "cd //%s%s" host
- (tramp-smb-shell-quote-argument
- (file-name-directory localname)))))
- (tramp-smb-send-command v command)
- ;; Preserve command output.
- (narrow-to-region (point-max) (point-max))
- (let ((p (tramp-get-connection-process v)))
- (tramp-smb-send-command v "exit $lasterrorcode")
- (while (process-live-p p)
- (sleep-for 0.1)
- (setq ret (process-exit-status p))))
- (delete-region (point-min) (point-max))
- (widen))))
+ (with-tramp-saved-connection-properties
+ v '("process-name" "process-buffer")
+ ;; Set the new process properties.
+ (tramp-set-connection-property v "process-name" name1)
+ (tramp-set-connection-property
+ v "process-buffer"
+ (or outbuf (generate-new-buffer tramp-temp-buffer-name)))
+ (with-current-buffer (tramp-get-connection-buffer v)
+ ;; Preserve buffer contents.
+ (narrow-to-region (point-max) (point-max))
+ (tramp-smb-call-winexe v)
+ (when (tramp-smb-get-share v)
+ (tramp-smb-send-command
+ v (format "cd //%s%s" host
+ (tramp-smb-shell-quote-argument
+ (file-name-directory localname)))))
+ (tramp-smb-send-command v command)
+ ;; Preserve command output.
+ (narrow-to-region (point-max) (point-max))
+ (let ((p (tramp-get-connection-process v)))
+ (tramp-smb-send-command v "exit $lasterrorcode")
+ (while (process-live-p p)
+ (sleep-for 0.1)
+ (setq ret (process-exit-status p))))
+ (delete-region (point-min) (point-max))
+ (widen)))
;; When the user did interrupt, we should do it also. We use
;; return code -1 as marker.
@@ -1387,7 +1360,7 @@ component is used as the target of the symlink."
(unless outbuf
(kill-buffer (tramp-get-connection-property v "process-buffer")))
(when process-file-side-effects
- (tramp-flush-directory-properties v ""))
+ (tramp-flush-directory-properties v "/"))
;; Return exit status.
(if (equal ret -1)
@@ -1458,7 +1431,7 @@ component is used as the target of the symlink."
(with-parsed-tramp-file-name filename nil
(tramp-flush-file-property v localname "file-acl")
- (when (and (stringp acl-string) (executable-find tramp-smb-acl-program))
+ (when (and (stringp acl-string) (tramp-smb-remote-acl-p v))
(let* ((share (tramp-smb-get-share v))
(localname (tramp-compat-string-replace
"\\" "/" (tramp-smb-get-localname v)))
@@ -1486,52 +1459,50 @@ component is used as the target of the symlink."
"||" "echo" "tramp_exit_status" "1")))
(unwind-protect
- (with-tramp-saved-connection-property v "process-name"
- (with-tramp-saved-connection-property v "process-buffer"
- (with-temp-buffer
- ;; Set the transfer process properties.
- (tramp-set-connection-property
- v "process-name" (buffer-name (current-buffer)))
- (tramp-set-connection-property
- v "process-buffer" (current-buffer))
-
- ;; Use an asynchronous process. By this, password
- ;; can be handled.
- (let ((p (apply
- #'start-process
- (tramp-get-connection-name v)
- (tramp-get-connection-buffer v)
- tramp-smb-acl-program args)))
-
- (tramp-message
- v 6 "%s" (string-join (process-command p) " "))
- (process-put p 'vector v)
- (process-put p 'adjust-window-size-function #'ignore)
- (set-process-query-on-exit-flag p nil)
- (tramp-process-actions p v nil tramp-smb-actions-set-acl)
- ;; This is meant for traces, and returning from
- ;; the function. No error is propagated
- ;; outside, due to the `ignore-errors' closure.
- (unless
- (tramp-search-regexp "tramp_exit_status [[:digit:]]+")
- (tramp-error
- v 'file-error
- "Couldn't find exit status of `%s'"
- tramp-smb-acl-program))
- (skip-chars-forward "^ ")
- (when (zerop (read (current-buffer)))
- ;; Success.
- (tramp-set-file-property
- v localname "file-acl" acl-string)
- t)))))))))))
+ (with-tramp-saved-connection-properties
+ v '("process-name" "process-buffer")
+ (with-temp-buffer
+ ;; Set the transfer process properties.
+ (tramp-set-connection-property
+ v "process-name" (buffer-name (current-buffer)))
+ (tramp-set-connection-property
+ v "process-buffer" (current-buffer))
+
+ ;; Use an asynchronous process. By this, password
+ ;; can be handled.
+ (let ((p (apply
+ #'start-process
+ (tramp-get-connection-name v)
+ (tramp-get-connection-buffer v)
+ tramp-smb-acl-program args)))
+
+ (tramp-message
+ v 6 "%s" (string-join (process-command p) " "))
+ (process-put p 'vector v)
+ (process-put p 'adjust-window-size-function #'ignore)
+ (set-process-query-on-exit-flag p nil)
+ (tramp-process-actions p v nil tramp-smb-actions-set-acl)
+ ;; This is meant for traces, and returning from
+ ;; the function. No error is propagated outside,
+ ;; due to the `ignore-errors' closure.
+ (unless
+ (tramp-search-regexp "tramp_exit_status [[:digit:]]+")
+ (tramp-error
+ v 'file-error
+ "Couldn't find exit status of `%s'"
+ tramp-smb-acl-program))
+ (skip-chars-forward "^ ")
+ (when (zerop (read (current-buffer)))
+ ;; Success.
+ (tramp-set-file-property v localname "file-acl" acl-string)
+ t))))))))))
(defun tramp-smb-handle-set-file-modes (filename mode &optional flag)
"Like `set-file-modes' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- ;; smbclient chmod does not support nofollow.
- (unless (and (eq flag 'nofollow) (file-symlink-p filename))
+ ;; smbclient chmod does not support nofollow.
+ (unless (and (eq flag 'nofollow) (file-symlink-p filename))
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(when (tramp-smb-get-cifs-capabilities v)
- (tramp-flush-file-properties v localname)
(unless (tramp-smb-send-command
v
(format "chmod %s %o" (tramp-smb-shell-quote-localname v) mode))
@@ -1555,38 +1526,38 @@ component is used as the target of the symlink."
(i 0)
p)
(unwind-protect
- (with-tramp-saved-connection-property v "process-name"
- (with-tramp-saved-connection-property v "process-buffer"
- (save-excursion
- (save-restriction
- (while (get-process name1)
- ;; NAME must be unique as process name.
- (setq i (1+ i)
- name1 (format "%s<%d>" name i)))
- ;; Set the new process properties.
- (tramp-set-connection-property v "process-name" name1)
- (tramp-set-connection-property v "process-buffer" buffer)
- ;; Activate narrowing in order to save BUFFER contents.
- (with-current-buffer (tramp-get-connection-buffer v)
- (let ((buffer-undo-list t))
- (narrow-to-region (point-max) (point-max))
- (tramp-smb-call-winexe v)
- (when (tramp-smb-get-share v)
- (tramp-smb-send-command
- v (format
- "cd //%s%s"
- host
- (tramp-smb-shell-quote-argument
- (file-name-directory localname)))))
- (tramp-message v 6 "(%s); exit" command)
- (tramp-send-string v command)))
- (setq p (tramp-get-connection-process v))
- (when program
- (process-put p 'remote-command (cons program args))
- (tramp-set-connection-property
- p "remote-command" (cons program args)))
- ;; Return value.
- p))))
+ (with-tramp-saved-connection-properties
+ v '("process-name" "process-buffer")
+ (save-excursion
+ (save-restriction
+ (while (get-process name1)
+ ;; NAME must be unique as process name.
+ (setq i (1+ i)
+ name1 (format "%s<%d>" name i)))
+ ;; Set the new process properties.
+ (tramp-set-connection-property v "process-name" name1)
+ (tramp-set-connection-property v "process-buffer" buffer)
+ ;; Activate narrowing in order to save BUFFER contents.
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (let ((buffer-undo-list t))
+ (narrow-to-region (point-max) (point-max))
+ (tramp-smb-call-winexe v)
+ (when (tramp-smb-get-share v)
+ (tramp-smb-send-command
+ v (format
+ "cd //%s%s"
+ host
+ (tramp-smb-shell-quote-argument
+ (file-name-directory localname)))))
+ (tramp-message v 6 "(%s); exit" command)
+ (tramp-send-string v command)))
+ (setq p (tramp-get-connection-process v))
+ (when program
+ (process-put p 'remote-command (cons program args))
+ (tramp-set-connection-property
+ p "remote-command" (cons program args)))
+ ;; Return value.
+ p)))
;; Save exit.
;; FIXME: Does `tramp-get-connection-buffer' return the proper value?
@@ -1964,7 +1935,7 @@ If ARGUMENT is non-nil, use it as argument for
tramp-smb-version
(tramp-get-connection-property
vec "smbclient-version" tramp-smb-version))
- (tramp-flush-directory-properties vec "")
+ (tramp-flush-directory-properties vec "/")
(tramp-flush-connection-properties vec))
(tramp-set-connection-property
@@ -2060,24 +2031,6 @@ If ARGUMENT is non-nil, use it as argument for
tramp-smb-actions-with-share
tramp-smb-actions-without-share))
- ;; Check server version.
- ;; FIXME: With recent smbclient versions, this
- ;; information isn't printed anymore.
- ;; (unless argument
- ;; (with-current-buffer (tramp-get-connection-buffer vec)
- ;; (goto-char (point-min))
- ;; (search-forward-regexp tramp-smb-server-version nil t)
- ;; (let ((smbserver-version (match-string 0)))
- ;; (unless
- ;; (string-equal
- ;; smbserver-version
- ;; (tramp-get-connection-property
- ;; vec "smbserver-version" smbserver-version))
- ;; (tramp-flush-directory-properties vec "")
- ;; (tramp-flush-connection-properties vec))
- ;; (tramp-set-connection-property
- ;; vec "smbserver-version" smbserver-version))))
-
;; Set chunksize to 1. smbclient reads its input
;; character by character; if we send the string
;; at once, it is read painfully slow.
diff --git a/lisp/net/tramp-sshfs.el b/lisp/net/tramp-sshfs.el
index d7c918fbc83..a9225db434e 100644
--- a/lisp/net/tramp-sshfs.el
+++ b/lisp/net/tramp-sshfs.el
@@ -333,7 +333,7 @@ arguments to pass to the OPERATION."
;; them.
(when tmpinput (delete-file tmpinput))
(when process-file-side-effects
- (tramp-flush-directory-properties v ""))))))
+ (tramp-flush-directory-properties v "/"))))))
(defun tramp-sshfs-handle-rename-file
(filename newname &optional ok-if-already-exists)
@@ -355,18 +355,15 @@ arguments to pass to the OPERATION."
(defun tramp-sshfs-handle-set-file-modes (filename mode &optional flag)
"Like `set-file-modes' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (unless (and (eq flag 'nofollow) (file-symlink-p filename))
- (tramp-flush-file-properties v localname)
+ (unless (and (eq flag 'nofollow) (file-symlink-p filename))
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(tramp-compat-set-file-modes
(tramp-fuse-local-file-name filename) mode flag))))
(defun tramp-sshfs-handle-set-file-times (filename &optional timestamp flag)
"Like `set-file-times' for Tramp files."
- (or (file-exists-p filename) (write-region "" nil filename nil 0))
- (with-parsed-tramp-file-name filename nil
- (unless (and (eq flag 'nofollow) (file-symlink-p filename))
- (tramp-flush-file-properties v localname)
+ (unless (and (eq flag 'nofollow) (file-symlink-p filename))
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(tramp-compat-set-file-times
(tramp-fuse-local-file-name filename) timestamp flag))))
diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el
index 420a593644f..0de2e0ef69a 100644
--- a/lisp/net/tramp-sudoedit.el
+++ b/lisp/net/tramp-sudoedit.el
@@ -48,7 +48,8 @@
("-p" "Password:") ("--")))
(tramp-password-previous-hop t)))
- (add-to-list 'tramp-default-user-alist '("\\`sudoedit\\'" nil "root"))
+ (add-to-list 'tramp-default-user-alist
+ `("\\`sudoedit\\'" nil ,tramp-root-id-string))
(tramp-set-completion-function
tramp-sudoedit-method tramp-completion-function-alist-su))
@@ -241,6 +242,8 @@ absolute file names."
(copy-directory filename newname keep-date t)
(when (eq op 'rename) (delete-directory filename 'recursive)))
+ ;; FIXME: This should be optimized. Computing `file-attributes'
+ ;; checks already, whether the file exists.
(let ((t1 (tramp-sudoedit-file-name-p filename))
(t2 (tramp-sudoedit-file-name-p newname))
(file-times (file-attribute-modification-time
@@ -256,62 +259,61 @@ absolute file names."
(msg-operation (if (eq op 'copy) "Copying" "Renaming")))
(with-parsed-tramp-file-name (if t1 filename newname) nil
- (unless (file-exists-p filename)
- (tramp-error v 'file-missing filename))
- (when (and (not ok-if-already-exists) (file-exists-p newname))
- (tramp-error v 'file-already-exists newname))
- (when (and (file-directory-p newname)
- (not (directory-name-p newname)))
- (tramp-error v 'file-error "File is a directory %s" newname))
-
- (if (or (and (file-remote-p filename) (not t1))
- (and (file-remote-p newname) (not t2)))
- ;; We cannot copy or rename directly.
- (let ((tmpfile (tramp-compat-make-temp-file filename)))
- (if (eq op 'copy)
- (copy-file filename tmpfile t)
- (rename-file filename tmpfile t))
- (rename-file tmpfile newname ok-if-already-exists))
-
- ;; Direct action.
- (with-tramp-progress-reporter
- v 0 (format "%s %s to %s" msg-operation filename newname)
- (unless (tramp-sudoedit-send-command
- v sudoedit-operation
- (tramp-unquote-file-local-name filename)
- (tramp-unquote-file-local-name newname))
- (tramp-error
- v 'file-error
- "Error %s `%s' `%s'" msg-operation filename newname))))
-
- ;; When `newname' is local, we must change the ownership to
- ;; the local user.
- (unless (file-remote-p newname)
- (tramp-set-file-uid-gid
- (concat (file-remote-p filename) newname)
- (tramp-get-local-uid 'integer)
- (tramp-get-local-gid 'integer)))
-
- ;; Set the time and mode. Mask possible errors.
- (when keep-date
- (ignore-errors
- (tramp-compat-set-file-times
- newname file-times (unless ok-if-already-exists 'nofollow))
- (set-file-modes newname file-modes)))
-
- ;; Handle `preserve-extended-attributes'. We ignore possible
- ;; errors, because ACL strings could be incompatible.
- (when attributes
- (ignore-errors
- (set-file-extended-attributes newname attributes)))
-
- (when (and t1 (eq op 'rename))
- (with-parsed-tramp-file-name filename v1
- (tramp-flush-file-properties v1 v1-localname)))
-
- (when t2
- (with-parsed-tramp-file-name newname v2
- (tramp-flush-file-properties v2 v2-localname)))))))
+ (tramp-barf-if-file-missing v filename
+ (when (and (not ok-if-already-exists) (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+ (when (and (file-directory-p newname)
+ (not (directory-name-p newname)))
+ (tramp-error v 'file-error "File is a directory %s" newname))
+
+ (if (or (and (file-remote-p filename) (not t1))
+ (and (file-remote-p newname) (not t2)))
+ ;; We cannot copy or rename directly.
+ (let ((tmpfile (tramp-compat-make-temp-file filename)))
+ (if (eq op 'copy)
+ (copy-file filename tmpfile t)
+ (rename-file filename tmpfile t))
+ (rename-file tmpfile newname ok-if-already-exists))
+
+ ;; Direct action.
+ (with-tramp-progress-reporter
+ v 0 (format "%s %s to %s" msg-operation filename newname)
+ (unless (tramp-sudoedit-send-command
+ v sudoedit-operation
+ (tramp-unquote-file-local-name filename)
+ (tramp-unquote-file-local-name newname))
+ (tramp-error
+ v 'file-error
+ "Error %s `%s' `%s'" msg-operation filename newname))))
+
+ ;; When `newname' is local, we must change the ownership to
+ ;; the local user.
+ (unless (file-remote-p newname)
+ (tramp-set-file-uid-gid
+ (concat (file-remote-p filename) newname)
+ (tramp-get-local-uid 'integer)
+ (tramp-get-local-gid 'integer)))
+
+ ;; Set the time and mode. Mask possible errors.
+ (when keep-date
+ (ignore-errors
+ (tramp-compat-set-file-times
+ newname file-times (unless ok-if-already-exists 'nofollow))
+ (set-file-modes newname file-modes)))
+
+ ;; Handle `preserve-extended-attributes'. We ignore possible
+ ;; errors, because ACL strings could be incompatible.
+ (when attributes
+ (ignore-errors
+ (set-file-extended-attributes newname attributes)))
+
+ (when (and t1 (eq op 'rename))
+ (with-parsed-tramp-file-name filename v1
+ (tramp-flush-file-properties v1 v1-localname)))
+
+ (when t2
+ (with-parsed-tramp-file-name newname v2
+ (tramp-flush-file-properties v2 v2-localname))))))))
(defun tramp-sudoedit-handle-copy-file
(filename newname &optional ok-if-already-exists keep-date
@@ -407,34 +409,30 @@ the result will be a local, non-Tramp, file name."
;; provided by `tramp-sudoedit-send-command-string'. Add it.
(and (stringp result) (concat result "\n"))))))
+(defconst tramp-sudoedit-file-attributes
+ (format
+ ;; Apostrophes in the stat output are masked as
+ ;; `tramp-stat-marker', in order to make a proper shell escape of
+ ;; them in file names. They are replaced in
+ ;; `tramp-sudoedit-send-command-and-read'.
+ (concat "((%s%%N%s) %%h (%s%%U%s . %%u) (%s%%G%s . %%g)"
+ " %%X %%Y %%Z %%s %s%%A%s t %%i -1)")
+ tramp-stat-marker tramp-stat-marker ; %%N
+ tramp-stat-marker tramp-stat-marker ; %%U
+ tramp-stat-marker tramp-stat-marker ; %%G
+ tramp-stat-marker tramp-stat-marker) ; %%A
+ "stat format string to produce output suitable for use with
+`file-attributes' on the remote file system.")
+
(defun tramp-sudoedit-handle-file-attributes (filename &optional id-format)
"Like `file-attributes' for Tramp files."
- (unless id-format (setq id-format 'integer))
+ ;; The result is cached in `tramp-convert-file-attributes'.
(with-parsed-tramp-file-name (expand-file-name filename) nil
- (with-tramp-file-property
- v localname (format "file-attributes-%s" id-format)
- (tramp-message v 5 "file attributes: %s" localname)
- (ignore-errors
- (tramp-convert-file-attributes
- v
- (tramp-sudoedit-send-command-and-read
- v "env" "QUOTING_STYLE=locale" "stat" "-c"
- (format
- ;; Apostrophes in the stat output are masked as
- ;; `tramp-stat-marker', in order to make a proper shell
- ;; escape of them in file names.
- "((%s%%N%s) %%h %s %s %%X %%Y %%Z %%s %s%%A%s t %%i -1)"
- tramp-stat-marker tramp-stat-marker
- (if (eq id-format 'integer)
- "%u"
- (eval-when-compile
- (concat tramp-stat-marker "%U" tramp-stat-marker)))
- (if (eq id-format 'integer)
- "%g"
- (eval-when-compile
- (concat tramp-stat-marker "%G" tramp-stat-marker)))
- tramp-stat-marker tramp-stat-marker)
- (tramp-compat-file-name-unquote localname)))))))
+ (tramp-convert-file-attributes v localname id-format
+ (tramp-sudoedit-send-command-and-read
+ v "env" "QUOTING_STYLE=locale" "stat" "-c"
+ tramp-sudoedit-file-attributes
+ (tramp-compat-file-name-unquote localname)))))
(defun tramp-sudoedit-handle-file-executable-p (filename)
"Like `file-executable-p' for Tramp files."
@@ -487,10 +485,9 @@ the result will be a local, non-Tramp, file name."
(defun tramp-sudoedit-handle-set-file-modes (filename mode &optional flag)
"Like `set-file-modes' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- ;; It is unlikely that "chmod -h" works.
- (unless (and (eq flag 'nofollow) (file-symlink-p filename))
- (tramp-flush-file-properties v localname)
+ ;; It is unlikely that "chmod -h" works.
+ (unless (and (eq flag 'nofollow) (file-symlink-p filename))
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(unless (tramp-sudoedit-send-command
v "chmod" (format "%o" mode)
(tramp-compat-file-name-unquote localname))
@@ -545,8 +542,7 @@ the result will be a local, non-Tramp, file name."
(defun tramp-sudoedit-handle-set-file-times (filename &optional time flag)
"Like `set-file-times' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-properties v localname)
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
(let ((time
(if (or (null time)
(tramp-compat-time-equal-p time tramp-time-doesnt-exist)
@@ -718,6 +714,7 @@ VEC or USER, or if there is no home directory, return nil."
(defun tramp-sudoedit-handle-get-remote-uid (vec id-format)
"The uid of the remote connection VEC, in ID-FORMAT.
ID-FORMAT valid values are `string' and `integer'."
+ ;; The result is cached in `tramp-get-remote-uid'.
(if (equal id-format 'integer)
(tramp-sudoedit-send-command-and-read vec "id" "-u")
(tramp-sudoedit-send-command-string vec "id" "-un")))
@@ -725,19 +722,20 @@ ID-FORMAT valid values are `string' and `integer'."
(defun tramp-sudoedit-handle-get-remote-gid (vec id-format)
"The gid of the remote connection VEC, in ID-FORMAT.
ID-FORMAT valid values are `string' and `integer'."
+ ;; The result is cached in `tramp-get-remote-gid'.
(if (equal id-format 'integer)
(tramp-sudoedit-send-command-and-read vec "id" "-g")
(tramp-sudoedit-send-command-string vec "id" "-gn")))
(defun tramp-sudoedit-handle-set-file-uid-gid (filename &optional uid gid)
"Like `tramp-set-file-uid-gid' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (tramp-sudoedit-send-command
- v "chown"
- (format "%d:%d"
- (or uid (tramp-get-remote-uid v 'integer))
- (or gid (tramp-get-remote-gid v 'integer)))
- (tramp-unquote-file-local-name filename))))
+ (tramp-skeleton-set-file-modes-times-uid-gid filename
+ (tramp-sudoedit-send-command
+ v "chown"
+ (format "%d:%d"
+ (or uid (tramp-get-remote-uid v 'integer))
+ (or gid (tramp-get-remote-gid v 'integer)))
+ (tramp-unquote-file-local-name filename))))
;; Internal functions.
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 0198aacf15a..ed40245e8a0 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -77,7 +77,8 @@
:link '(custom-manual "(tramp)Top")
:version "22.1")
-(eval-and-compile ;; So it's also available in tramp-loaddefs.el!
+;;;###tramp-autoload
+(progn
(defvar tramp--startup-hook nil
"Forms to be executed at the end of tramp.el.")
(put 'tramp--startup-hook 'tramp-suppress-trace t)
@@ -95,6 +96,7 @@
If it is set to nil, all remote file names are used literally."
:type 'boolean)
+;;;###tramp-autoload
(defcustom tramp-verbose 3
"Verbosity level for Tramp messages.
Any level x includes messages for all levels 1 .. x-1. The levels are
@@ -186,9 +188,11 @@ See the variable `tramp-encoding-shell' for more information."
;; Since Emacs 26.1, `system-name' can return nil at build time if
;; Emacs is compiled with "--no-build-details". We do expect it to be
;; a string. (Bug#44481, Bug#54294)
+;;;###tramp-autoload
(defconst tramp-system-name (or (system-name) "")
"The system name Tramp is running locally.")
+;;;###tramp-autoload
(defvar tramp-methods nil
"Alist of methods for remote files.
This is a list of entries of the form (NAME PARAM1 PARAM2 ...).
@@ -259,6 +263,7 @@ pair of the form (KEY VALUE). The following KEYs are defined:
argument if it is supported.
- \"%z\" is replaced by the `tramp-scp-direct-remote-copying'
argument if it is supported.
+ - \"%d\" is replaced by the device detected by `tramp-adb-get-device'.
The existence of `tramp-login-args', combined with the
absence of `tramp-copy-args', is an indication that the
@@ -403,6 +408,7 @@ See `tramp-methods' for possibilities.
Also see `tramp-default-method-alist'."
:type 'string)
+;;;###tramp-autoload
(defcustom tramp-default-method-alist nil
;; FIXME: This is not an "alist", because its elements are not of
;; the form (KEY . VAL) but (KEY1 KEY2 VAL).
@@ -432,6 +438,7 @@ It is nil by default; otherwise settings in configuration files like
This variable is regarded as obsolete, and will be removed soon."
:type '(choice (const nil) string))
+;;;###tramp-autoload
(defcustom tramp-default-user-alist nil
;; FIXME: This is not an "alist", because its elements are not of
;; the form (KEY . VAL) but (KEY1 KEY2 VAL).
@@ -453,6 +460,7 @@ empty string for the method name."
Useful for su and sudo methods mostly."
:type 'string)
+;;;###tramp-autoload
(defcustom tramp-default-host-alist nil
;; FIXME: This is not an "alist", because its elements are not of
;; the form (KEY . VAL) but (KEY1 KEY2 VAL).
@@ -518,6 +526,7 @@ host runs a restricted shell, it shall be added to this list, too."
:version "27.1"
:type '(repeat (regexp :tag "Host regexp")))
+;;;###tramp-autoload
(defcustom tramp-local-host-regexp
(concat
"\\`"
@@ -679,6 +688,7 @@ The regexp should match at end of buffer.
See also `tramp-yesno-prompt-regexp'."
:type 'regexp)
+;;;###tramp-autoload
(defcustom tramp-terminal-type "dumb"
"Value of TERM environment variable for logging in to remote host.
Because Tramp wants to parse the output of the remote shell, it is easily
@@ -1045,6 +1055,13 @@ Derived from `tramp-postfix-host-format'.")
(defconst tramp-unknown-id-integer -1
"Integer used to denote an unknown user or group.")
+;;;###tramp-autoload
+(defconst tramp-root-id-string "root"
+ "String used to denote the root user or group.")
+
+(defconst tramp-root-id-integer 0
+ "Integer used to denote the root user or group.")
+
;;; File name format:
(defun tramp-build-remote-file-name-spec-regexp ()
@@ -1415,6 +1432,7 @@ Operations not mentioned here will be handled by Tramp's file
name handler functions, or the normal Emacs functions.")
;; Handlers for foreign methods, like FTP or SMB, shall be plugged here.
+;;;###autoload
(defvar tramp-foreign-file-name-handler-alist nil
"Alist of elements (FUNCTION . HANDLER) for foreign methods handled specially.
If (FUNCTION FILENAME) returns non-nil, then all I/O on that file is done by
@@ -1429,9 +1447,11 @@ calling HANDLER.")
;; The basic structure for remote file names. We must autoload it in
;; tramp-loaddefs.el, because some functions, which need it, wouldn't
;; work otherwise when unloading / reloading Tramp. (Bug#50869)
+;;;###tramp-autoload(require 'cl-lib)
;;;###tramp-autoload
-(cl-defstruct (tramp-file-name (:type list) :named)
- method user domain host port localname hop)
+(progn
+ (cl-defstruct (tramp-file-name (:type list) :named)
+ method user domain host port localname hop))
(put #'tramp-file-name-method 'tramp-suppress-trace t)
(put #'tramp-file-name-user 'tramp-suppress-trace t)
@@ -1474,13 +1494,22 @@ If nil, return `tramp-default-port'."
(put #'tramp-file-name-port-or-default 'tramp-suppress-trace t)
-(defun tramp-file-name-unify (vec)
+;;;###tramp-autoload
+(defun tramp-file-name-unify (vec &optional localname)
"Unify VEC by removing localname and hop from `tramp-file-name' structure.
+If LOCALNAME is a string, set it as localname.
Objects returned by this function compare `equal' if they refer to the
same connection. Make a copy in order to avoid side effects."
(when (tramp-file-name-p vec)
(setq vec (copy-tramp-file-name vec))
- (setf (tramp-file-name-localname vec) nil
+ (setf (tramp-file-name-localname vec)
+ (and (stringp localname)
+ ;; FIXME: This is a sanity check. When this error
+ ;; doesn't happen for a while, it can be removed.
+ (or (file-name-absolute-p localname)
+ (tramp-error
+ vec 'file-error "File `%s' must be absolute" localname))
+ (tramp-compat-file-name-unquote (directory-file-name localname)))
(tramp-file-name-hop vec) nil))
vec)
@@ -1514,6 +1543,7 @@ entry does not exist, return nil."
"Return unquoted localname component of VEC."
(tramp-compat-file-name-unquote (tramp-file-name-localname vec)))
+;;;###tramp-autoload
(defun tramp-tramp-file-p (name)
"Return t if NAME is a string with Tramp file name syntax."
(and tramp-mode (stringp name)
@@ -1535,6 +1565,7 @@ entry does not exist, return nil."
;; However, it is more performant than `file-local-name', and might be
;; useful where performance matters, like in operations over a bulk
;; list of file names.
+;;;###tramp-autoload
(defun tramp-file-local-name (name)
"Return the local name component of NAME.
This function removes from NAME the specification of the remote
@@ -1558,7 +1589,7 @@ of `process-file', `start-file-process', or `shell-command'."
This is METHOD, if non-nil. Otherwise, do a lookup in
`tramp-default-method-alist' and `tramp-default-method'."
(when (and method
- (or (string-equal method "")
+ (or (string-empty-p method)
(string-equal method tramp-default-method-marker)))
(setq method nil))
(let ((result
@@ -1626,6 +1657,7 @@ This is HOST, if non-nil. Otherwise, do a lookup in
(put #'tramp-find-host 'tramp-suppress-trace t)
+;;;###tramp-autoload
(defun tramp-dissect-file-name (name &optional nodefault)
"Return a `tramp-file-name' structure of NAME, a remote file name.
The structure consists of method, user, domain, host, port,
@@ -1693,6 +1725,7 @@ default values are used."
(put #'tramp-dissect-file-name 'tramp-suppress-trace t)
+;;;###tramp-autoload
(defun tramp-ensure-dissected-file-name (vec-or-filename)
"Return a `tramp-file-name' structure for VEC-OR-FILENAME.
@@ -1735,6 +1768,7 @@ See `tramp-dissect-file-name' for details."
(put #'tramp-buffer-name 'tramp-suppress-trace t)
+;;;###tramp-autoload
(defun tramp-make-tramp-file-name (&rest args)
"Construct a Tramp file name from ARGS.
@@ -1844,6 +1878,7 @@ Unless DONT-CREATE, the buffer is created when it doesn't exist yet."
(tramp-make-tramp-file-name vec 'noloc))
(current-buffer)))))
+;;;###tramp-autoload
(defun tramp-get-connection-buffer (vec &optional dont-create)
"Get the connection buffer to be used for VEC.
Unless DONT-CREATE, the buffer is created when it doesn't exist yet.
@@ -1900,8 +1935,7 @@ version, the function does nothing."
"Return `default-directory' of BUFFER."
(buffer-local-value 'default-directory buffer))
-(put #'tramp-get-default-directory 'tramp-suppress-trace t)
-
+;;;###tramp-autoload
(defsubst tramp-get-buffer-string (&optional buffer)
"Return contents of BUFFER.
If BUFFER is not a buffer or a buffer name, return the contents
@@ -1909,8 +1943,6 @@ of `current-buffer'."
(with-current-buffer (or buffer (current-buffer))
(substring-no-properties (buffer-string))))
-(put #'tramp-get-buffer-string 'tramp-suppress-trace t)
-
(defun tramp-debug-buffer-name (vec)
"A name for the debug buffer for VEC."
(let ((method (tramp-file-name-method vec))
@@ -1957,7 +1989,8 @@ The outline level is equal to the verbosity of the Tramp message."
They are completed by \"M-x TAB\" only in Tramp debug buffers."
(with-current-buffer buffer
(string-equal
- (buffer-substring (point-min) (min (+ (point-min) 10) (point-max))) ";; Emacs:")))
+ (buffer-substring (point-min) (min (+ (point-min) 10) (point-max)))
+ ";; Emacs:")))
(put #'tramp-debug-buffer-command-completion-p 'tramp-suppress-trace t)
@@ -1984,6 +2017,7 @@ They are completed by \"M-x TAB\" only in Tramp debug buffers."
,(eval tramp-debug-font-lock-keywords t)))
;; Do not edit the debug buffer.
(use-local-map special-mode-map)
+ (set-buffer-modified-p nil)
;; For debugging purposes.
(local-set-key "\M-n" 'clone-buffer)
(add-hook 'clone-buffer-hook #'tramp-setup-debug-buffer nil 'local))
@@ -2020,6 +2054,7 @@ They are completed by \"M-x TAB\" only in Tramp debug buffers."
(defvar tramp-trace-functions nil
"A list of non-Tramp functions to be traced with `tramp-verbose' > 10.")
+;;;###tramp-autoload
(defun tramp-debug-message (vec fmt-string &rest arguments)
"Append message to debug buffer of VEC.
Message is formatted with FMT-STRING as control string and the remaining
@@ -2093,10 +2128,12 @@ ARGUMENTS to actually emit the message (if applicable)."
(put #'tramp-debug-message 'tramp-suppress-trace t)
+;;;###tramp-autoload
(defvar tramp-inhibit-progress-reporter nil
"Show Tramp progress reporter in the minibuffer.
This variable is used to disable concurrent progress reporter messages.")
+;;;###tramp-autoload
(defsubst tramp-message (vec-or-proc level fmt-string &rest arguments)
"Emit a message depending on verbosity level.
VEC-OR-PROC identifies the Tramp buffer to use. It can be either a
@@ -2149,8 +2186,6 @@ applicable)."
(concat (format "(%d) # " level) fmt-string)
arguments))))))
-(put #'tramp-message 'tramp-suppress-trace t)
-
(defsubst tramp-backtrace (&optional vec-or-proc force)
"Dump a backtrace into the debug buffer.
If VEC-OR-PROC is nil, the buffer *debug tramp* is used. FORCE
@@ -2163,8 +2198,6 @@ This function is meant for debugging purposes."
vec-or-proc 10 "\n%s" (with-output-to-string (backtrace)))
(with-output-to-temp-buffer "*debug tramp*" (backtrace))))))
-(put #'tramp-backtrace 'tramp-suppress-trace t)
-
(defun tramp-error (vec-or-proc signal fmt-string &rest arguments)
"Emit an error.
VEC-OR-PROC identifies the connection to use, SIGNAL is the
@@ -2232,8 +2265,6 @@ an input event arrives. The other arguments are passed to `tramp-error'."
(when (tramp-file-name-equal-p vec (car tramp-current-connection))
(setcdr tramp-current-connection (current-time)))))))
-(put #'tramp-error-with-buffer 'tramp-suppress-trace t)
-
;; We must make it a defun, because it is used earlier already.
(defun tramp-user-error (vec-or-proc fmt-string &rest arguments)
"Signal a user error (or \"pilot error\")."
@@ -2270,7 +2301,21 @@ the resulting error message."
(progn ,@body)
(error (tramp-message ,vec-or-proc 3 ,format ,err) nil))))
-(put #'tramp-with-demoted-errors 'tramp-suppress-trace t)
+;; This macro shall optimize the cases where an `file-exists-p' call
+;; is invoked first. Often, the file exists, so the remote command is
+;; superfluous.
+(defmacro tramp-barf-if-file-missing (vec filename &rest body)
+ "Execute BODY and return the result.
+In case if an error, raise a `file-missing' error if FILENAME
+does not exist, otherwise propagate the error."
+ (declare (indent 2) (debug (symbolp form body)))
+ (let ((err (make-symbol "err")))
+ `(condition-case ,err
+ (progn ,@body)
+ (error
+ (if (not (file-exists-p ,filename))
+ (tramp-error ,vec 'file-missing ,filename)
+ (signal (car ,err) (cdr ,err)))))))
(defun tramp-test-message (fmt-string &rest arguments)
"Emit a Tramp message according `default-directory'."
@@ -2367,45 +2412,6 @@ without a visible progress reporter."
(if tm (cancel-timer tm))
(tramp-message ,vec ,level "%s...%s" ,message cookie)))))
-(defmacro with-tramp-file-property (vec file property &rest body)
- "Check in Tramp cache for PROPERTY, otherwise execute BODY and set cache.
-FILE must be a local file name on a connection identified via VEC."
- (declare (indent 3) (debug t))
- `(if (file-name-absolute-p ,file)
- (let ((value (tramp-get-file-property
- ,vec ,file ,property tramp-cache-undefined)))
- (when (eq value tramp-cache-undefined)
- ;; We cannot pass @body as parameter to
- ;; `tramp-set-file-property' because it mangles our debug
- ;; messages.
- (setq value (progn ,@body))
- (tramp-set-file-property ,vec ,file ,property value))
- value)
- ,@body))
-
-(defmacro with-tramp-connection-property (key property &rest body)
- "Check in Tramp for property PROPERTY, otherwise execute BODY and set."
- (declare (indent 2) (debug t))
- `(let ((value (tramp-get-connection-property
- ,key ,property tramp-cache-undefined)))
- (when (eq value tramp-cache-undefined)
- ;; We cannot pass ,@body as parameter to
- ;; `tramp-set-connection-property' because it mangles our debug
- ;; messages.
- (setq value (progn ,@body))
- (tramp-set-connection-property ,key ,property value))
- value))
-
-(defmacro with-tramp-saved-connection-property (key property &rest body)
- "Save PROPERTY, run BODY, reset PROPERTY."
- (declare (indent 2) (debug t))
- `(let ((value (tramp-get-connection-property
- ,key ,property tramp-cache-undefined)))
- (unwind-protect (progn ,@body)
- (if (eq value tramp-cache-undefined)
- (tramp-flush-connection-property ,key ,property)
- (tramp-set-connection-property ,key ,property value)))))
-
(defun tramp-drop-volume-letter (name)
"Cut off unnecessary drive letter from file NAME.
The functions `tramp-*-handle-expand-file-name' call `expand-file-name'
@@ -2424,6 +2430,7 @@ letter into the file name. This function removes it."
(defconst tramp-dns-sd-service-regexp "^_[-[:alnum:]]+\\._tcp$"
"DNS-SD service regexp.")
+;;;###tramp-autoload
(defun tramp-set-completion-function (method function-list)
"Set the list of completion functions for METHOD.
FUNCTION-LIST is a list of entries of the form (FUNCTION FILE).
@@ -2664,6 +2671,7 @@ Must be handled by the callers."
res)))
;; Main function.
+;;;###autoload
(defun tramp-file-name-handler (operation &rest args)
"Invoke Tramp file name handler for OPERATION and ARGS.
Fall back to normal file name handler if no Tramp file name handler exists."
@@ -2859,6 +2867,7 @@ remote file names."
(tramp--with-startup (tramp-register-file-name-handlers))
+;;;###tramp-autoload
(defun tramp-register-foreign-file-name-handler
(func handler &optional append)
"Register (FUNC . HANDLER) in `tramp-foreign-file-name-handler-alist'.
@@ -3339,14 +3348,11 @@ Host is always \"localhost\"."
(defun tramp-parse-netrc (filename)
"Return a list of (user host) tuples allowed to access.
User may be nil."
- ;; The declaration is not sufficient at runtime, because netrc.el is
- ;; not autoloaded.
- (autoload 'netrc-parse "netrc")
(mapcar
(lambda (item)
(and (assoc "machine" item)
`(,(cdr (assoc "login" item)) ,(cdr (assoc "machine" item)))))
- (netrc-parse filename)))
+ (tramp-compat-auth-source-netrc-parse-all filename)))
(defun tramp-parse-putty (registry-or-dirname)
"Return a list of (user host) tuples allowed to access.
@@ -3375,6 +3381,20 @@ User is always nil."
;;; Skeleton macros for file name handler functions.
+(defmacro tramp-skeleton-copy-directory
+ (directory _newname &optional _keep-date _parents _copy-contents &rest body)
+ "Skeleton for `tramp-*-handle-copy-directory'.
+BODY is the backend specific code."
+ (declare (indent 5) (debug t))
+ ;; `copy-directory' creates NEWNAME before running this check. So
+ ;; we do it ourselves. Therefore, we cannot also run
+ ;; `tramp-barf-if-file-missing'.
+ `(progn
+ (unless (file-exists-p ,directory)
+ (tramp-error
+ (tramp-dissect-file-name ,directory) 'file-missing ,directory))
+ ,@body))
+
(defmacro tramp-skeleton-delete-directory (directory recursive trash &rest body)
"Skeleton for `tramp-*-handle-delete-directory'.
BODY is the backend specific code."
@@ -3390,7 +3410,116 @@ BODY is the backend specific code."
,@body)
(tramp-flush-directory-properties v localname)))
-(put #'tramp-skeleton-delete-directory 'tramp-suppress-trace t)
+(defmacro tramp-skeleton-directory-files
+ (directory &optional full match nosort count &rest body)
+ "Skeleton for `tramp-*-handle-directory-files'.
+BODY is the backend specific code."
+ (declare (indent 5) (debug t))
+ `(or
+ (with-parsed-tramp-file-name ,directory nil
+ (tramp-barf-if-file-missing v ,directory
+ (when (file-directory-p ,directory)
+ (setq ,directory
+ (file-name-as-directory (expand-file-name ,directory)))
+ (let ((temp
+ (with-tramp-file-property v localname "directory-files" ,@body))
+ result item)
+ (while temp
+ (setq item (directory-file-name (pop temp)))
+ (when (or (null ,match) (string-match-p ,match item))
+ (push (if ,full (concat ,directory item) item)
+ result)))
+ (unless ,nosort
+ (setq result (sort result #'string<)))
+ (when (and (natnump ,count) (> ,count 0))
+ (setq result (tramp-compat-ntake ,count result)))
+ result))))
+
+ ;; Error handling.
+ (if (not (file-exists-p ,directory))
+ (tramp-error
+ (tramp-dissect-file-name ,directory) 'file-missing ,directory)
+ nil)))
+
+(defmacro tramp-skeleton-directory-files-and-attributes
+ (directory &optional full match nosort id-format count &rest body)
+ "Skeleton for `tramp-*-handle-directory-files-and-attributes'.
+BODY is the backend specific code."
+ (declare (indent 6) (debug t))
+ `(or
+ (with-parsed-tramp-file-name ,directory nil
+ (tramp-barf-if-file-missing v ,directory
+ (when (file-directory-p ,directory)
+ (let ((temp
+ (copy-tree
+ (mapcar
+ (lambda (x)
+ (cons
+ (car x)
+ (tramp-convert-file-attributes
+ v (expand-file-name (car x) localname)
+ ,id-format (cdr x))))
+ (with-tramp-file-property
+ v localname "directory-files-and-attributes"
+ ,@body))))
+ result item)
+
+ (while temp
+ (setq item (pop temp))
+ (when (or (null ,match) (string-match-p ,match (car item)))
+ (when ,full
+ (setcar item (expand-file-name (car item) ,directory)))
+ (push item result)))
+
+ (unless ,nosort
+ (setq result
+ (sort result (lambda (x y) (string< (car x) (car y))))))
+
+ (when (and (natnump ,count) (> ,count 0))
+ (setq result (tramp-compat-ntake ,count result)))
+
+ (or result
+ ;; The scripts could fail, for example with huge file size.
+ (tramp-handle-directory-files-and-attributes
+ ,directory ,full ,match ,nosort ,id-format ,count))))))
+
+ ;; Error handling.
+ (if (not (file-exists-p ,directory))
+ (tramp-error
+ (tramp-dissect-file-name ,directory) 'file-missing ,directory)
+ nil)))
+
+(defmacro tramp-skeleton-file-local-copy (filename &rest body)
+ "Skeleton for `tramp-*-handle-file-local-copy'.
+BODY is the backend specific code."
+ (declare (indent 1) (debug t))
+ `(with-parsed-tramp-file-name (file-truename ,filename) nil
+ (tramp-barf-if-file-missing v ,filename
+ (or
+ (let ((tmpfile (tramp-compat-make-temp-file ,filename)))
+ ,@body
+ (run-hooks 'tramp-handle-file-local-copy-hook)
+ tmpfile)
+
+ ;; Trigger the `file-missing' error.
+ (signal 'error nil)))))
+
+(defmacro tramp-skeleton-set-file-modes-times-uid-gid
+ (filename &rest body)
+ "Skeleton for `tramp-*-set-file-{modes,times,uid-gid}'.
+BODY is the backend specific code."
+ (declare (indent 1) (debug t))
+ `(with-parsed-tramp-file-name ,filename nil
+ (when (not (file-exists-p ,filename))
+ (tramp-error v 'file-missing ,filename))
+ (with-tramp-saved-file-properties
+ v localname
+ ;; We cannot add "file-attributes", "file-executable-p",
+ ;; "file-ownership-preserved-p", "file-readable-p",
+ ;; "file-writable-p".
+ '("file-directory-p" "file-exists-p" "file-symlinkp" "file-truename")
+ (tramp-flush-file-properties v localname))
+ ,@body))
(defmacro tramp-skeleton-write-region
(start end filename append visit lockname mustbenew &rest body)
@@ -3451,6 +3580,9 @@ BODY is the backend specific code."
;; We must also flush the cache of the directory, because
;; `file-attributes' reads the values from there.
(tramp-flush-file-properties v localname)
+ ;; Set the "file-exists-p" file property, because it is
+ ;; likely that it is needed shortly after `write-region'.
+ (tramp-set-file-property v localname "file-exists-p" t)
;; We must protect `last-coding-system-used', now we have
;; set it to its correct value.
@@ -3494,8 +3626,6 @@ BODY is the backend specific code."
(tramp-message v 0 "Wrote %s" filename))
(run-hooks 'tramp-handle-write-region-hook))))))
-(put #'tramp-skeleton-write-region 'tramp-suppress-trace t)
-
;;; Common file name handler functions for different backends:
(defvar tramp-handle-file-local-copy-hook nil
@@ -3585,14 +3715,12 @@ Let-bind it when necessary.")
(defun tramp-handle-copy-directory
(directory newname &optional keep-date parents copy-contents)
"Like `copy-directory' for Tramp files."
- ;; `copy-directory' creates NEWNAME before running this check. So
- ;; we do it ourselves.
- (unless (file-exists-p directory)
- (tramp-error (tramp-dissect-file-name directory) 'file-missing directory))
- ;; We must do it file-wise.
- (tramp-run-real-handler
- #'copy-directory
- (list directory newname keep-date parents copy-contents)))
+ (tramp-skeleton-copy-directory
+ directory newname keep-date parents copy-contents
+ ;; We must do it file-wise.
+ (tramp-run-real-handler
+ #'copy-directory
+ (list directory newname keep-date parents copy-contents))))
(defun tramp-handle-directory-file-name (directory)
"Like `directory-file-name' for Tramp files."
@@ -3608,23 +3736,8 @@ Let-bind it when necessary.")
(defun tramp-handle-directory-files (directory &optional full match nosort count)
"Like `directory-files' for Tramp files."
- (unless (file-exists-p directory)
- (tramp-error (tramp-dissect-file-name directory) 'file-missing directory))
- (when (file-directory-p directory)
- (setq directory (file-name-as-directory (expand-file-name directory)))
- (let ((temp (nreverse (file-name-all-completions "" directory)))
- result item)
-
- (while temp
- (setq item (directory-file-name (pop temp)))
- (when (or (null match) (string-match-p match item))
- (push (if full (concat directory item) item)
- result)))
- (unless nosort
- (setq result (sort result #'string<)))
- (when (and (natnump count) (> count 0))
- (setq result (nbutlast result (- (length result) count))))
- result)))
+ (tramp-skeleton-directory-files directory full match nosort count
+ (nreverse (file-name-all-completions "" directory))))
(defun tramp-handle-directory-files-and-attributes
(directory &optional full match nosort id-format count)
@@ -3709,7 +3822,9 @@ Let-bind it when necessary.")
;; We don't want to run it when `non-essential' is t, or there is
;; no connection process yet.
(when (tramp-connectable-p filename)
- (not (null (file-attributes filename)))))
+ (with-parsed-tramp-file-name filename nil
+ (with-tramp-file-property v localname "file-exists-p"
+ (not (null (file-attributes filename)))))))
(defun tramp-handle-file-in-directory-p (filename directory)
"Like `file-in-directory-p' for Tramp files."
@@ -3722,12 +3837,8 @@ Let-bind it when necessary.")
(defun tramp-handle-file-local-copy (filename)
"Like `file-local-copy' for Tramp files."
- (with-parsed-tramp-file-name filename nil
- (unless (file-exists-p filename)
- (tramp-error v 'file-missing filename))
- (let ((tmpfile (tramp-compat-make-temp-file filename)))
- (copy-file filename tmpfile 'ok-if-already-exists 'keep-time)
- tmpfile)))
+ (tramp-skeleton-file-local-copy filename
+ (copy-file filename tmpfile 'ok-if-already-exists 'keep-time)))
(defun tramp-handle-file-modes (filename &optional flag)
"Like `file-modes' for Tramp files."
@@ -3993,9 +4104,10 @@ Let-bind it when necessary.")
(when (and (not tramp-allow-unsafe-temporary-files)
(not backup-inhibited)
(file-in-directory-p (car result) temporary-file-directory)
- (zerop (or (file-attribute-user-id
- (file-attributes filename 'integer))
- tramp-unknown-id-integer))
+ (= (or (file-attribute-user-id
+ (file-attributes filename 'integer))
+ tramp-unknown-id-integer)
+ tramp-root-id-integer)
(not (with-tramp-connection-property
(tramp-get-process v) "unsafe-temporary-file"
(yes-or-no-p
@@ -4048,13 +4160,10 @@ Let-bind it when necessary.")
(let (result local-copy remote-copy)
(with-parsed-tramp-file-name filename nil
(unwind-protect
- (if (not (file-exists-p filename))
- (let ((tramp-verbose (if visit 0 tramp-verbose)))
- (tramp-error v 'file-missing filename))
-
- (with-tramp-progress-reporter
- v 3 (format-message "Inserting `%s'" filename)
- (condition-case err
+ (condition-case err
+ (tramp-barf-if-file-missing v filename
+ (with-tramp-progress-reporter
+ v 3 (format-message "Inserting `%s'" filename)
(if (and (tramp-local-host-p v)
(let (file-name-handler-alist)
(file-readable-p localname)))
@@ -4067,7 +4176,7 @@ Let-bind it when necessary.")
;; When we shall insert only a part of the file, we
;; copy this part. This works only for the shell file
- ;; name handlers. It doesn't work for crypted files.
+ ;; name handlers. It doesn't work for encrypted files.
(when (and (or beg end)
(tramp-sh-file-name-handler-p v)
(null tramp-crypt-enabled))
@@ -4131,12 +4240,16 @@ Let-bind it when necessary.")
filename local-copy)))
(setq result
(insert-file-contents
- local-copy visit beg end replace))))
- (error
- (add-hook 'find-file-not-found-functions
- `(lambda () (signal ',(car err) ',(cdr err)))
- nil t)
- (signal (car err) (cdr err))))))
+ local-copy visit beg end replace))))))
+
+ (file-error
+ (let ((tramp-verbose (if visit 0 tramp-verbose)))
+ (tramp-error v 'file-missing filename)))
+ (error
+ (add-hook 'find-file-not-found-functions
+ `(lambda () (signal ',(car err) ',(cdr err)))
+ nil t)
+ (signal (car err) (cdr err))))
;; Save exit.
(when visit
@@ -4288,8 +4401,7 @@ It is not guaranteed, that all process attributes as described in
(funcall (cdr elt)))
((null (cdr elt))
(search-forward-regexp "\\s-+")
- (buffer-substring (point) (line-end-position)))
- (t nil)))
+ (buffer-substring (point) (line-end-position)))))
res))
;; `nice' could be `-'.
(setq res (rassq-delete-all '- res))
@@ -4315,7 +4427,7 @@ Return nil when there is no lockfile."
(buffer-string))))))
(defvar tramp-lock-pid nil
- "A random nunber local for every connection.
+ "A random number local for every connection.
Do not set it manually, it is used buffer-local in `tramp-get-lock-pid'.")
(defun tramp-get-lock-pid (file)
@@ -4378,9 +4490,10 @@ Do not set it manually, it is used buffer-local in `tramp-get-lock-pid'.")
(when (and (not tramp-allow-unsafe-temporary-files)
create-lockfiles
(file-in-directory-p lockname temporary-file-directory)
- (zerop (or (file-attribute-user-id
- (file-attributes file 'integer))
- tramp-unknown-id-integer))
+ (= (or (file-attribute-user-id
+ (file-attributes file 'integer))
+ tramp-unknown-id-integer)
+ tramp-root-id-integer)
(not (with-tramp-connection-property
(tramp-get-process v) "unsafe-temporary-file"
(yes-or-no-p
@@ -4605,7 +4718,10 @@ substitution. SPEC-LIST is a list of char/value pairs used for
(signal 'wrong-type-argument (list #'symbolp coding)))
(when (eq connection-type t)
(setq connection-type 'pty))
- (unless (memq connection-type '(nil pipe pty))
+ (unless (or (and (consp connection-type)
+ (memq (car connection-type) '(nil pipe pty))
+ (memq (cdr connection-type) '(nil pipe pty)))
+ (memq connection-type '(nil pipe pty)))
(signal 'wrong-type-argument (list #'symbolp connection-type)))
(unless (or (null filter) (eq filter t) (functionp filter))
(signal 'wrong-type-argument (list #'functionp filter)))
@@ -4649,6 +4765,7 @@ substitution. SPEC-LIST is a list of char/value pairs used for
;; is different between tramp-sh.el, and tramp-adb.el or
;; tramp-sshfs.el.
(let* ((sh-file-name-handler-p (tramp-sh-file-name-handler-p v))
+ (adb-file-name-handler-p (tramp-adb-file-name-p v))
(login-program
(tramp-get-method-parameter v 'tramp-login-program))
;; We don't create the temporary file. In fact, it
@@ -4668,6 +4785,10 @@ substitution. SPEC-LIST is a list of char/value pairs used for
(when sh-file-name-handler-p
(tramp-compat-funcall
'tramp-ssh-controlmaster-options v)))
+ (device
+ (when adb-file-name-handler-p
+ (tramp-compat-funcall
+ 'tramp-adb-get-device v)))
login-args p)
;; Replace `login-args' place holders. Split
@@ -4684,7 +4805,7 @@ substitution. SPEC-LIST is a list of char/value pairs used for
v 'tramp-login-args
?h (or host "") ?u (or user "") ?p (or port "")
?c (format-spec (or options "") (format-spec-make ?t tmpfile))
- ?l ""))))
+ ?d (or device "") ?l ""))))
p (make-process
:name name :buffer buffer
:command (append `(,login-program) login-args command)
@@ -4822,11 +4943,7 @@ support symbolic links."
;; Run the process.
(setq p (start-file-process-shell-command
(buffer-name output-buffer) buffer command))
- ;; Insert error messages if they were separated.
- (when error-file
- (with-current-buffer error-buffer
- (insert-file-contents-literally error-file)))
- (if (process-live-p p)
+ (when (process-live-p p)
;; Display output.
(with-current-buffer output-buffer
(setq mode-line-process '(":%s"))
@@ -4842,11 +4959,15 @@ support symbolic links."
(insert-file-contents-literally
error-file nil nil nil 'replace))
(delete-file error-file))))
- (display-buffer output-buffer '(nil (allow-no-window . t))))
+ (display-buffer output-buffer '(nil (allow-no-window . t)))))
- (when error-file
- (delete-file error-file)))))
+ ;; Insert error messages if they were separated.
+ (when (and error-file (not (process-live-p p)))
+ (with-current-buffer error-buffer
+ (insert-file-contents-literally error-file))
+ (delete-file error-file))))
+ ;; Synchronous case.
(prog1
;; Run the process.
(process-file-shell-command command nil buffer)
@@ -5199,8 +5320,7 @@ Wait, until the connection buffer changes."
(tramp-message vec 3 "Process has finished.")
(throw 'tramp-action 'ok))
(tramp-message vec 3 "Process has died.")
- (throw 'tramp-action 'out-of-band-failed))))
- (t nil)))
+ (throw 'tramp-action 'out-of-band-failed))))))
;;; Functions for processing the actions:
@@ -5491,7 +5611,7 @@ the remote host use line-endings as defined in the variable
(when vec
(tramp-message vec 5 "Sentinel called: `%S' `%s'" proc event)
(tramp-flush-connection-properties proc)
- (tramp-flush-directory-properties vec ""))
+ (tramp-flush-directory-properties vec "/"))
(when (buffer-live-p buf)
(with-current-buffer buf
(when (and prompt (tramp-search-regexp (regexp-quote prompt)))
@@ -5711,51 +5831,142 @@ VEC is used for tracing."
"Check `file-attributes' caches for VEC.
Return t if according to the cache access type ACCESS is known to
be granted."
- (let (result
- (offset (cond
- ((eq ?r access) 1)
- ((eq ?w access) 2)
- ((eq ?x access) 3)
- ((eq ?s access) 3))))
- (dolist (suffix '("string" "integer") result)
- (setq
- result
- (or
- result
- (let ((file-attr
- (or
- (tramp-get-file-property
- vec (tramp-file-name-localname vec)
- (concat "file-attributes-" suffix) nil)
- (file-attributes
- (tramp-make-tramp-file-name vec) (intern suffix))))
- (remote-uid (tramp-get-remote-uid vec (intern suffix)))
- (remote-gid (tramp-get-remote-gid vec (intern suffix)))
- (unknown-id
- (if (string-equal suffix "string")
- tramp-unknown-id-string tramp-unknown-id-integer)))
- (and
- file-attr
- (or
- ;; Not a symlink.
- (eq t (file-attribute-type file-attr))
- (null (file-attribute-type file-attr)))
- (or
- ;; World accessible.
- (eq access (aref (file-attribute-modes file-attr) (+ offset 6)))
- ;; User accessible and owned by user.
- (and
- (eq access (aref (file-attribute-modes file-attr) offset))
- (or (equal remote-uid unknown-id)
- (equal remote-uid (file-attribute-user-id file-attr))
- (equal unknown-id (file-attribute-user-id file-attr))))
- ;; Group accessible and owned by user's principal group.
- (and
- (eq access
- (aref (file-attribute-modes file-attr) (+ offset 3)))
- (or (equal remote-gid unknown-id)
- (equal remote-gid (file-attribute-group-id file-attr))
- (equal unknown-id (file-attribute-group-id file-attr))))))))))))
+ (when-let ((offset (cond
+ ((eq ?r access) 1)
+ ((eq ?w access) 2)
+ ((eq ?x access) 3)
+ ((eq ?s access) 3)))
+ (file-attr (file-attributes (tramp-make-tramp-file-name vec)))
+ (remote-uid (tramp-get-remote-uid vec 'integer))
+ (remote-gid (tramp-get-remote-gid vec 'integer)))
+ (or
+ ;; Not a symlink.
+ (eq t (file-attribute-type file-attr))
+ (null (file-attribute-type file-attr)))
+ (or
+ ;; World accessible.
+ (eq access (aref (file-attribute-modes file-attr) (+ offset 6)))
+ ;; User accessible and owned by user.
+ (and
+ (eq access (aref (file-attribute-modes file-attr) offset))
+ (or (equal remote-uid tramp-root-id-integer)
+ (equal remote-uid tramp-unknown-id-integer)
+ (equal remote-uid (file-attribute-user-id file-attr))
+ (equal tramp-unknown-id-integer (file-attribute-user-id file-attr))))
+ ;; Group accessible and owned by user's principal group.
+ (and
+ (eq access
+ (aref (file-attribute-modes file-attr) (+ offset 3)))
+ (or (equal remote-gid tramp-root-id-integer)
+ (equal remote-gid tramp-unknown-id-integer)
+ (equal remote-gid (file-attribute-group-id file-attr))
+ (equal tramp-unknown-id-integer
+ (file-attribute-group-id file-attr)))))))
+
+(defmacro tramp-convert-file-attributes (vec localname id-format attr)
+ "Convert `file-attributes' ATTR generated Tramp backend functions.
+Convert file mode bits to string and set virtual device number.
+Set file uid and gid according to ID-FORMAT. LOCALNAME is used
+to cache the result. Return the modified ATTR."
+ (declare (indent 3) (debug t))
+ `(with-tramp-file-property
+ ,vec ,localname (format "file-attributes-%s" (or ,id-format 'integer))
+ (when-let
+ ((result
+ (with-tramp-file-property ,vec ,localname "file-attributes"
+ (when-let ((attr ,attr))
+ (save-match-data
+ ;; Remove color escape sequences from symlink.
+ (when (stringp (car attr))
+ (while (string-match
+ tramp-display-escape-sequence-regexp (car attr))
+ (setcar attr (replace-match "" nil nil (car attr)))))
+ ;; Convert uid and gid. Use `tramp-unknown-id-integer'
+ ;; as indication of unusable value.
+ (when (consp (nth 2 attr))
+ (when (and (numberp (cdr (nth 2 attr)))
+ (< (cdr (nth 2 attr)) 0))
+ (setcdr (car (nthcdr 2 attr)) tramp-unknown-id-integer))
+ (when (and (floatp (cdr (nth 2 attr)))
+ (<= (cdr (nth 2 attr)) most-positive-fixnum))
+ (setcdr (car (nthcdr 2 attr)) (round (cdr (nth 2 attr))))))
+ (when (consp (nth 3 attr))
+ (when (and (numberp (cdr (nth 3 attr)))
+ (< (cdr (nth 3 attr)) 0))
+ (setcdr (car (nthcdr 3 attr)) tramp-unknown-id-integer))
+ (when (and (floatp (cdr (nth 3 attr)))
+ (<= (cdr (nth 3 attr)) most-positive-fixnum))
+ (setcdr (car (nthcdr 3 attr)) (round (cdr (nth 3 attr))))))
+ ;; Convert last access time.
+ (unless (listp (nth 4 attr))
+ (setcar (nthcdr 4 attr) (seconds-to-time (nth 4 attr))))
+ ;; Convert last modification time.
+ (unless (listp (nth 5 attr))
+ (setcar (nthcdr 5 attr) (seconds-to-time (nth 5 attr))))
+ ;; Convert last status change time.
+ (unless (listp (nth 6 attr))
+ (setcar (nthcdr 6 attr) (seconds-to-time (nth 6 attr))))
+ ;; Convert file size.
+ (when (< (nth 7 attr) 0)
+ (setcar (nthcdr 7 attr) -1))
+ (when (and (floatp (nth 7 attr))
+ (<= (nth 7 attr) most-positive-fixnum))
+ (setcar (nthcdr 7 attr) (round (nth 7 attr))))
+ ;; Convert file mode bits to string.
+ (unless (stringp (nth 8 attr))
+ (setcar (nthcdr 8 attr)
+ (tramp-file-mode-from-int (nth 8 attr)))
+ (when (stringp (car attr))
+ (aset (nth 8 attr) 0 ?l)))
+ ;; Convert directory indication bit.
+ (when (string-prefix-p "d" (nth 8 attr))
+ (setcar attr t))
+ ;; Convert symlink from `tramp-do-file-attributes-with-stat'.
+ ;; Decode also multibyte string.
+ (when (consp (car attr))
+ (setcar attr
+ (and (stringp (caar attr))
+ (string-match ".+ -> .\\(.+\\)." (caar attr))
+ (decode-coding-string
+ (match-string 1 (caar attr)) 'utf-8))))
+ ;; Set file's gid change bit.
+ (setcar
+ (nthcdr 9 attr)
+ (not (= (cdr (nth 3 attr))
+ (or (tramp-get-remote-gid ,vec 'integer)
+ tramp-unknown-id-integer))))
+ ;; Convert inode.
+ (when (floatp (nth 10 attr))
+ (setcar (nthcdr 10 attr)
+ (condition-case nil
+ (let ((high (nth 10 attr))
+ middle low)
+ (if (<= high most-positive-fixnum)
+ (floor high)
+ ;; The low 16 bits.
+ (setq low (mod high #x10000)
+ high (/ high #x10000))
+ (if (<= high most-positive-fixnum)
+ (cons (floor high) (floor low))
+ ;; The middle 24 bits.
+ (setq middle (mod high #x1000000)
+ high (/ high #x1000000))
+ (cons (floor high)
+ (cons (floor middle) (floor low))))))
+ ;; Inodes can be incredible huge. We
+ ;; must hide this.
+ (error (tramp-get-inode ,vec)))))
+ ;; Set virtual device number.
+ (setcar (nthcdr 11 attr)
+ (tramp-get-device ,vec))
+ attr)))))
+
+ ;; Return normalized result.
+ (append (tramp-compat-take 2 result)
+ (if (eq ,id-format 'string)
+ (list (car (nth 2 result)) (car (nth 3 result)))
+ (list (cdr (nth 2 result)) (cdr (nth 3 result))))
+ (nthcdr 4 result)))))
(defun tramp-get-home-directory (vec &optional user)
"The remote home directory for connection VEC as local file name.
@@ -5800,18 +6011,18 @@ This handles also chrooted environments, which are not regarded as local."
;; handlers. `tramp-local-host-p' is also called for "smb" and
;; alike, where it must fail.
(tramp-sh-file-name-handler-p vec)
- ;; Direct actions aren't possible for crypted directories.
+ ;; Direct actions aren't possible for encrypted directories.
(null tramp-crypt-enabled)
;; The local temp directory must be writable for the other user.
(file-writable-p
(tramp-make-tramp-file-name vec tramp-compat-temporary-file-directory))
;; On some systems, chown runs only for root.
(or (zerop (user-uid))
- (zerop (tramp-get-remote-uid vec 'integer))))))
+ (= (tramp-get-remote-uid vec 'integer) tramp-root-id-integer)))))
(defun tramp-get-remote-tmpdir (vec)
"Return directory for temporary files on the remote host identified by VEC."
- (with-tramp-connection-property vec "tmpdir"
+ (with-tramp-connection-property (tramp-get-process vec) "remote-tmpdir"
(let ((dir
(tramp-make-tramp-file-name
vec (or (tramp-get-method-parameter vec 'tramp-tmpdir) "/tmp"))))
@@ -5828,21 +6039,16 @@ This handles also chrooted environments, which are not regarded as local."
(defun tramp-make-tramp-temp-file (vec)
"Create a temporary file on the remote host identified by VEC.
Return the local name of the temporary file."
- (let (result)
- (while (not result)
- ;; `make-temp-file' would be the natural choice for
- ;; implementation. But it calls `write-region' internally,
- ;; which also needs a temporary file - we would end in an
- ;; infinite loop.
- (setq result (tramp-make-tramp-temp-name vec))
- (if (file-exists-p result)
- (setq result nil)
- ;; This creates the file by side effect.
- (set-file-times result)
- (set-file-modes result #o0700)))
-
- ;; Return the local part.
- (tramp-file-local-name result)))
+ (let (create-lockfiles)
+ (cl-letf (((symbol-function 'tramp-remote-acl-p) #'ignore)
+ ((symbol-function 'tramp-remote-selinux-p) #'ignore)
+ ((symbol-function 'tramp-smb-remote-acl-p) #'ignore)
+ ((symbol-function 'tramp-sudoedit-remote-acl-p) #'ignore)
+ ((symbol-function 'tramp-sudoedit-remote-selinux-p) #'ignore))
+ (tramp-file-local-name
+ (make-temp-file
+ (expand-file-name
+ tramp-temp-name-prefix (tramp-get-remote-tmpdir vec)))))))
(defun tramp-delete-temp-file-function ()
"Remove temporary files related to current buffer."
@@ -5898,9 +6104,10 @@ this file, if that variable is non-nil."
(when (and (not tramp-allow-unsafe-temporary-files)
auto-save-default
(file-in-directory-p result temporary-file-directory)
- (zerop (or (file-attribute-user-id
- (file-attributes filename 'integer))
- tramp-unknown-id-integer))
+ (= (or (file-attribute-user-id
+ (file-attributes filename 'integer))
+ tramp-unknown-id-integer)
+ tramp-root-id-integer)
(not (with-tramp-connection-property
(tramp-get-process v) "unsafe-temporary-file"
(yes-or-no-p
diff --git a/lisp/nxml/rng-dt.el b/lisp/nxml/rng-dt.el
index b88653f79ec..0523e8132bf 100644
--- a/lisp/nxml/rng-dt.el
+++ b/lisp/nxml/rng-dt.el
@@ -52,7 +52,7 @@ a datatype library.")
(rng-dt-error "The string datatype does not take any parameters")))
((eq name 'token)
(if (null params)
- '(t rng-collapse-space)
+ '(t string-clean-whitespace)
(rng-dt-error "The token datatype does not take any parameters")))
(t
(rng-dt-error "There is no built-in datatype %s" name))))
diff --git a/lisp/nxml/rng-loc.el b/lisp/nxml/rng-loc.el
index 0fa455cbb59..40332aacd50 100644
--- a/lisp/nxml/rng-loc.el
+++ b/lisp/nxml/rng-loc.el
@@ -354,7 +354,7 @@ NS is t if the document has a non-nil, but not otherwise known namespace."
(or (cdr (assq 'uri props))
(let ((type-id (cdr (assq 'typeId props))))
(and type-id
- (cons (rng-collapse-space type-id) nil)))))
+ (cons (string-clean-whitespace type-id) nil)))))
(defun rng-possible-type-ids-using (file type-ids)
(let ((rules (rng-get-parsed-schema-locating-file file))
@@ -366,7 +366,7 @@ NS is t if the document has a non-nil, but not otherwise known namespace."
(let ((id (cdr (assq 'id (cdr rule)))))
(when id
(setq type-ids
- (cons (rng-collapse-space id)
+ (cons (string-clean-whitespace id)
type-ids)))))
((eq (car rule) 'include)
(let ((uri (cdr (assq 'rules (cdr rule)))))
@@ -390,7 +390,7 @@ or nil."
(cond ((and (eq (car rule) 'typeId)
(let ((id (assq 'id (cdr rule))))
(and id
- (string= (rng-collapse-space (cdr id)) type-id))))
+ (string= (string-clean-whitespace (cdr id)) type-id))))
(setq schema (rng-match-default-rule (cdr rule))))
((eq (car rule) 'include)
(let ((uri (cdr (assq 'rules (cdr rule)))))
@@ -414,7 +414,7 @@ or nil."
(setq rng-schema-locating-file-alist
(delq cached rng-schema-locating-file-alist)))
nil)
- ((and cached (equal (nth 1 cached) mtime))
+ ((and cached (time-equal-p (nth 1 cached) mtime))
(nth 2 cached))
(t
(setq parsed (rng-parse-schema-locating-file file))
diff --git a/lisp/nxml/rng-match.el b/lisp/nxml/rng-match.el
index e767a9333b5..f3549681f25 100644
--- a/lisp/nxml/rng-match.el
+++ b/lisp/nxml/rng-match.el
@@ -1154,7 +1154,7 @@ list may contain duplicates."
(if (or (rng--ipattern-nullable
(rng-data-deriv child value))
(and (rng--ipattern-nullable child)
- (rng-blank-p value)))
+ (string-blank-p value)))
(rng--ipattern-after ipattern)
rng-not-allowed-ipattern)))
((eq type 'data)
diff --git a/lisp/nxml/rng-parse.el b/lisp/nxml/rng-parse.el
index 76cb94b144c..1c08d77f56f 100644
--- a/lisp/nxml/rng-parse.el
+++ b/lisp/nxml/rng-parse.el
@@ -62,7 +62,7 @@ be signaled in the same way as when it is not well-formed."
(unless (rng-match-element-value (or text ""))
(cons "Invalid data" (and text 'text))))
((and text
- (not (rng-blank-p text))
+ (not (string-blank-p text))
(not (rng-match-mixed-text)))
(cons "Text not allowed" 'text))
((not start-tag)
diff --git a/lisp/nxml/rng-util.el b/lisp/nxml/rng-util.el
index 74f405410ac..7ac6db25f43 100644
--- a/lisp/nxml/rng-util.el
+++ b/lisp/nxml/rng-util.el
@@ -36,8 +36,6 @@
(defconst rng-builtin-datatypes-uri (rng-make-datatypes-uri ""))
-(defun rng-blank-p (str) (string-match "\\`[ \t\n\r]*\\'" str))
-
(defun rng-substq (new old list)
"Replace first member of LIST (if any) that is `eq' to OLD by NEW.
LIST is not modified."
@@ -73,24 +71,15 @@ LIST is not modified."
s
t))
-(defun rng-collapse-space (string)
- (setq string
- (replace-regexp-in-string "[ \t\r\n]+" " " string t t))
- (when (string-match "\\` " string)
- (setq string (substring string 1)))
- (when (string-match " \\'" string)
- (setq string (substring string 0 -1)))
- string)
-
(define-error 'rng-error nil)
-;; Obsolete.
-
(defun rng-uniquify-eq (list)
(declare (obsolete seq-uniq "28.1"))
(seq-uniq list #'eq))
(define-obsolete-function-alias 'rng-uniquify-equal #'seq-uniq "28.1")
+(define-obsolete-function-alias 'rng-blank-p #'string-blank-p "29.1")
+(define-obsolete-function-alias 'rng-collapse-space #'string-clean-whitespace "29.1")
(provide 'rng-util)
diff --git a/lisp/nxml/rng-valid.el b/lisp/nxml/rng-valid.el
index b9c980222e2..ad5c9c7a15c 100644
--- a/lisp/nxml/rng-valid.el
+++ b/lisp/nxml/rng-valid.el
@@ -1275,7 +1275,7 @@ Return nil at end of buffer, t otherwise."
(defun rng-segment-blank-p (segment)
(if (car segment)
- (rng-blank-p (car segment))
+ (string-blank-p (car segment))
(apply #'rng-region-blank-p
(cdr segment))))
@@ -1303,7 +1303,7 @@ string between START and END."
((not (or (and whitespace
(or (eq whitespace t)
(if value
- (rng-blank-p value)
+ (string-blank-p value)
(rng-region-blank-p start end))))
(rng-match-mixed-text)))
(rng-mark-invalid "Text not allowed" start (or end (point))))))
diff --git a/lisp/emacs-lisp/autoload.el b/lisp/obsolete/autoload.el
index eed88b6faf4..a30f8271a3b 100644
--- a/lisp/emacs-lisp/autoload.el
+++ b/lisp/obsolete/autoload.el
@@ -5,6 +5,7 @@
;; Author: Roland McGrath <roland@gnu.org>
;; Keywords: maint
;; Package: emacs
+;; Obsolete-since: 29.1
;; This file is part of GNU Emacs.
@@ -28,8 +29,11 @@
;; Lisp source files in various useful ways. To learn more, read the
;; source; if you're going to use this, you'd better be able to.
-;; The functions in this file have been largely superseded by
-;; loaddefs-gen.el.
+;; The functions in this file have been superseded by loaddefs-gen.el.
+
+;; Note: When removing this file, also remove the references to
+;; `make-directory-autoloads' and `update-directory-autoloads' in
+;; subr.el.
;;; Code:
@@ -267,12 +271,6 @@ if `autoload-timestamps' is non-nil, otherwise a fixed fake time is inserted)."
(hack-local-variables))
(current-buffer)))
-(defalias 'autoload-insert-section-header
- #'loaddefs-generate--insert-section-header)
-
-(defvar no-update-autoloads nil
- "File local variable to prevent scanning this file for autoload cookies.")
-
(defalias 'autoload-file-load-name #'loaddefs-generate--file-load-name)
(defun generate-file-autoloads (file)
@@ -735,6 +733,7 @@ its autoloads into the specified file instead.
The function does NOT recursively descend into subdirectories of the
directory or directories specified."
+ (declare (obsolete loaddefs-generate "29.1"))
(interactive "DUpdate autoloads from directory: \nFWrite to file: ")
(let* ((files-re (let ((tmp nil))
(dolist (suf (get-load-suffixes))
@@ -908,7 +907,8 @@ should be non-nil)."
(let ((args command-line-args-left))
(batch-update-autoloads--summary args)
(setq command-line-args-left nil)
- (make-directory-autoloads args generated-autoload-file)))
+ (with-suppressed-warnings ((obsolete make-directory-autoloads))
+ (make-directory-autoloads args generated-autoload-file))))
(provide 'autoload)
diff --git a/lisp/obsolete/fast-lock.el b/lisp/obsolete/fast-lock.el
deleted file mode 100644
index 1614935f03a..00000000000
--- a/lisp/obsolete/fast-lock.el
+++ /dev/null
@@ -1,730 +0,0 @@
-;;; fast-lock.el --- automagic text properties caching for fast Font Lock mode -*- lexical-binding: t; -*-
-
-;; Copyright (C) 1994-1998, 2001-2022 Free Software Foundation, Inc.
-
-;; Author: Simon Marshall <simon@gnu.org>
-;; Maintainer: emacs-devel@gnu.org
-;; Keywords: faces files
-;; Version: 3.14
-;; Obsolete-since: 22.1
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Fast Lock mode is a Font Lock support mode.
-;; It makes visiting a file in Font Lock mode faster by restoring its face text
-;; properties from automatically saved associated Font Lock cache files.
-;;
-;; See caveats and feedback below.
-;; See also the lazy-lock package. (But don't use the two at the same time!)
-
-;; Installation:
-;;
-;; Put in your ~/.emacs:
-;;
-;; (setq font-lock-support-mode 'fast-lock-mode)
-;;
-;; Start up a new Emacs and use font-lock as usual (except that you can use the
-;; so-called "gaudier" fontification regexps on big files without frustration).
-;;
-;; When you visit a file (which has `font-lock-mode' enabled) that has a
-;; corresponding Font Lock cache file associated with it, the Font Lock cache
-;; will be loaded from that file instead of being generated by Font Lock code.
-
-;; Caveats:
-;;
-;; A cache will be saved when visiting a compressed file using crypt++, but not
-;; be read. This is a "feature"/"consequence"/"bug" of crypt++.
-;;
-;; Version control packages are likely to stamp all over file modification
-;; times. Therefore the act of checking out may invalidate a cache.
-
-;; History:
-;;
-;; 0.02--1.00:
-;; - Changed name from turbo-prop to fast-lock. Automagic for font-lock only
-;; - Made `fast-lock-mode' a minor mode, like G. Dinesh Dutt's fss-mode
-;; 1.00--1.01:
-;; - Turn on `fast-lock-mode' only if `buffer-file-name' or `interactive-p'
-;; - Made `fast-lock-file-name' use `buffer-name' if `buffer-file-name' is nil
-;; - Moved save-all conditions to `fast-lock-save-cache'
-;; - Added `fast-lock-save-text-properties' to `kill-buffer-hook'
-;; 1.01--2.00: complete rewrite---not worth the space to document
-;; - Changed structure of text properties cache and threw out file mod checks
-;; 2.00--2.01:
-;; - Made `condition-case' forms understand `quit'.
-;; - Made `fast-lock' require `font-lock'
-;; - Made `fast-lock-cache-name' chase links (from Ben Liblit)
-;; 2.01--3.00:
-;; - Changed structure of cache to include `font-lock-keywords' (from rms)
-;; - Changed `fast-lock-cache-mechanisms' to `fast-lock-cache-directories'
-;; - Removed `fast-lock-read-others'
-;; - Made `fast-lock-read-cache' ignore cache owner
-;; - Made `fast-lock-save-cache-external' create cache directory
-;; - Made `fast-lock-save-cache-external' save `font-lock-keywords'
-;; - Made `fast-lock-cache-data' check `font-lock-keywords'
-;; 3.00--3.01: incorporated port of 2.00 to Lucid, made by Barry Warsaw
-;; - Package now provides itself
-;; - Lucid: Use `font-lock-any-extents-p' for `font-lock-any-properties-p'
-;; - Lucid: Use `list-faces' for `face-list'
-;; - Lucid: Added `set-text-properties'
-;; - Lucid: Made `turn-on-fast-lock' pass 1 not t to `fast-lock-mode'
-;; - Removed test for `fast-lock-mode' from `fast-lock-read-cache'
-;; - Lucid: Added Lucid-specific `fast-lock-get-face-properties'
-;; 3.01--3.02: now works with Lucid Emacs, thanks to Barry Warsaw
-;; - Made `fast-lock-cache-name' map ":" to ";" for OS/2 (from Serganova Vera)
-;; - Made `fast-lock-cache-name' use abbreviated file name (from Barry Warsaw)
-;; - Lucid: Separated handlers for `error' and `quit' for `condition-case'
-;; 3.02--3.03:
-;; - Changed `fast-lock-save-cache-external' to `fast-lock-save-cache-data'
-;; - Lucid: Added Lucid-specific `fast-lock-set-face-properties'
-;; 3.03--3.04:
-;; - Corrected `subrp' test of Lucid code
-;; - Replaced `font-lock-any-properties-p' with `text-property-not-all'
-;; - Lucid: Made `fast-lock-set-face-properties' put `text-prop' on extents
-;; - Made `fast-lock-cache-directories' a regexp alist (from Colin Rafferty)
-;; - Made `fast-lock-cache-directory' to return a usable cache file directory
-;; 3.04--3.05:
-;; - Lucid: Fix for XEmacs 19.11 `text-property-not-all'
-;; - Replaced `subrp' test of Lucid code with `emacs-version' `string-match'
-;; - Made `byte-compile-warnings' omit `unresolved' on compilation
-;; - Made `fast-lock-save-cache-data' use a buffer (from Rick Sladkey)
-;; - Reverted to old `fast-lock-get-face-properties' (from Rick Sladkey)
-;; 3.05--3.06: incorporated hack of 3.03, made by Jonathan Stigelman (Stig)
-;; - Reverted to 3.04 version of `fast-lock-get-face-properties'
-;; - XEmacs: Removed `list-faces' `defalias'
-;; - Made `fast-lock-mode' and `turn-on-fast-lock' succeed `autoload' cookies
-;; - Added `fast-lock-submit-bug-report'
-;; - Renamed `fast-lock-save-size' to `fast-lock-minimum-size'
-;; - Made `fast-lock-save-cache' output a message if no save ever attempted
-;; - Made `fast-lock-save-cache-data' output a message if save attempted
-;; - Made `fast-lock-cache-data' output a message if load attempted
-;; - Made `fast-lock-save-cache-data' do `condition-case' not `unwind-protect'
-;; - Made `fast-lock-save-cache' and `fast-lock-read-cache' return nothing
-;; - Made `fast-lock-save-cache' check `buffer-modified-p' (Stig)
-;; - Added `fast-lock-save-events'
-;; - Added `fast-lock-after-save-hook' to `after-save-hook' (Stig)
-;; - Added `fast-lock-kill-buffer-hook' to `kill-buffer-hook'
-;; - Changed `fast-lock-save-caches' to `fast-lock-kill-emacs-hook'
-;; - Added `fast-lock-kill-emacs-hook' to `kill-emacs-hook'
-;; - Made `fast-lock-save-cache' check `verify-visited-file-modtime' (Stig)
-;; - Made `visited-file-modtime' be the basis of the timestamp (Stig)
-;; - Made `fast-lock-save-cache-1' and `fast-lock-cache-data' use/reformat it
-;; - Added `fast-lock-cache-filename' to keep track of the cache file name
-;; - Added `fast-lock-after-fontify-buffer'
-;; - Added `fast-lock-save-faces' list of faces to save (idea from Stig/Tibor)
-;; - Made `fast-lock-get-face-properties' functions use it
-;; - XEmacs: Made `fast-lock-set-face-properties' do extents the Font Lock way
-;; - XEmacs: Removed fix for `text-property-not-all' (19.11 support dropped)
-;; - Made `fast-lock-mode' ensure `font-lock-mode' is on
-;; - Made `fast-lock-save-cache' do `cdr-safe' not `cdr' (from Dave Foster)
-;; - Made `fast-lock-save-cache' do `set-buffer' first (from Dave Foster)
-;; - Made `fast-lock-save-cache' loop until saved or quit (from Georg Nikodym)
-;; - Made `fast-lock-cache-data' check `buffer-modified-p'
-;; - Made `fast-lock-cache-data' do `font-lock-compile-keywords' if necessary
-;; - XEmacs: Made `font-lock-compile-keywords' `defalias'
-;; 3.06--3.07:
-;; - XEmacs: Add `fast-lock-after-fontify-buffer' to the Font Lock hook
-;; - Made `fast-lock-cache-name' explain the use of `directory-abbrev-alist'
-;; - Made `fast-lock-mode' use `buffer-file-truename' not `buffer-file-name'
-;; 3.07--3.08:
-;; - Made `fast-lock-read-cache' set `fast-lock-cache-filename'
-;; 3.08--3.09:
-;; - Made `fast-lock-save-cache' cope if `fast-lock-minimum-size' is a list
-;; - Made `fast-lock-mode' respect the value of `font-lock-inhibit-thing-lock'
-;; - Added `fast-lock-after-unfontify-buffer'
-;; 3.09--3.10:
-;; - Rewrite for Common Lisp macros
-;; - Made fast-lock.el barf on a crap 8+3 pseudo-OS (Eli Zaretskii help)
-;; - XEmacs: Made `add-minor-mode' succeed `autoload' cookie
-;; - XEmacs: Made `fast-lock-save-faces' default to `font-lock-face-list'
-;; - Made `fast-lock-save-cache' use `font-lock-value-in-major-mode'
-;; - Wrap with `save-buffer-state' (Ray Van Tassle report)
-;; - Made `fast-lock-mode' wrap `font-lock-support-mode'
-;; 3.10--3.11:
-;; - Made `fast-lock-get-face-properties' cope with face lists
-;; - Added `fast-lock-verbose'
-;; - XEmacs: Add `font-lock-value-in-major-mode' if necessary
-;; - Removed `fast-lock-submit-bug-report' and bade farewell
-;; 3.11--3.12:
-;; - Added Custom support (Hrvoje Nikšić help)
-;; - Made `save-buffer-state' wrap `inhibit-point-motion-hooks'
-;; - Made `fast-lock-cache-data' simplify calls of `font-lock-compile-keywords'
-;; 3.12--3.13:
-;; - Removed `byte-*' variables from `eval-when-compile' (Erik Naggum hint)
-;; - Changed structure of cache to include `font-lock-syntactic-keywords'
-;; - Made `fast-lock-save-cache-1' save syntactic fontification data
-;; - Made `fast-lock-cache-data' take syntactic fontification data
-;; - Added `fast-lock-get-syntactic-properties'
-;; - Renamed `fast-lock-set-face-properties' to `fast-lock-add-properties'
-;; - Made `fast-lock-add-properties' add syntactic and face fontification data
-;; 3.13--3.14:
-;; - Made `fast-lock-cache-name' cope with `windowsnt' (Geoff Voelker fix)
-;; - Made `fast-lock-verbose' use `other' widget (Andreas Schwab fix)
-;; - Used `with-temp-message' where possible to make messages temporary.
-
-;;; Code:
-
-(require 'font-lock)
-
-(declare-function msdos-long-file-names "msdos.c")
-
-;; Make sure fast-lock.el is supported.
-(if (and (eq system-type 'ms-dos) (not (msdos-long-file-names)))
- (error "`fast-lock' was written for long file name systems"))
-
-(defvar font-lock-face-list)
-
-(eval-when-compile
- ;;
- ;; We use this to verify that a face should be saved.
- (defmacro fast-lock-save-facep (face)
- "Return non-nil if FACE is one of `fast-lock-save-faces'."
- `(or (null fast-lock-save-faces)
- (if (symbolp ,face)
- (memq ,face fast-lock-save-faces)
- (let ((faces ,face))
- (while (unless (memq (car faces) fast-lock-save-faces)
- (setq faces (cdr faces))))
- faces)))))
-
-(defgroup fast-lock nil
- "Font Lock support mode to cache fontification."
- :load 'fast-lock
- :group 'font-lock)
-
-(defvar fast-lock-mode nil) ; Whether we are turned on.
-(defvar fast-lock-cache-timestamp nil) ; For saving/reading.
-(defvar fast-lock-cache-filename nil) ; For deleting.
-
-;; User Variables:
-
-(defcustom fast-lock-minimum-size 25600
- "Minimum size of a buffer for cached fontification.
-Only buffers more than this can have associated Font Lock cache files saved.
-If nil, means cache files are never created.
-If a list, each element should be a cons pair of the form (MAJOR-MODE . SIZE),
-where MAJOR-MODE is a symbol or t (meaning the default). For example:
- ((c-mode . 25600) (c++-mode . 25600) (rmail-mode . 1048576))
-means that the minimum size is 25K for buffers in C or C++ modes, one megabyte
-for buffers in Rmail mode, and size is irrelevant otherwise."
- :type '(choice (const :tag "none" nil)
- (integer :tag "size")
- (repeat :menu-tag "mode specific" :tag "mode specific"
- :value ((t . nil))
- (cons :tag "Instance"
- (radio :tag "Mode"
- (const :tag "all" t)
- (symbol :tag "name"))
- (radio :tag "Size"
- (const :tag "none" nil)
- (integer :tag "size"))))))
-
-(defcustom fast-lock-cache-directories '("~/.emacs-flc")
-; - `internal', keep each file's Font Lock cache file in the same file.
-; - `external', keep each file's Font Lock cache file in the same directory.
- "Directories in which Font Lock cache files are saved and read.
-Each item should be either DIR or a cons pair of the form (REGEXP . DIR) where
-DIR is a directory name (relative or absolute) and REGEXP is a regexp.
-
-An attempt will be made to save or read Font Lock cache files using these items
-until one succeeds (i.e., until a readable or writable one is found). If an
-item contains REGEXP, DIR is used only if the buffer file name matches REGEXP.
-For example:
-
- (let ((home (expand-file-name (abbreviate-file-name (file-truename \"~/\")))))
- (list (cons (concat \"^\" (regexp-quote home)) \".\") \"~/.emacs-flc\"))
- =>
- ((\"^/your/true/home/directory/\" . \".\") \"~/.emacs-flc\")
-
-would cause a file's current directory to be used if the file is under your
-home directory hierarchy, or otherwise the absolute directory `~/.emacs-flc'.
-For security reasons, it is not advisable to use the file's current directory
-to avoid the possibility of using the cache of another user."
- :type '(repeat (radio (directory :tag "directory")
- (cons :tag "Matching"
- (regexp :tag "regexp")
- (directory :tag "directory")))))
-(put 'fast-lock-cache-directories 'risky-local-variable t)
-
-(defcustom fast-lock-save-events '(kill-buffer kill-emacs)
- "Events under which caches will be saved.
-Valid events are `save-buffer', `kill-buffer' and `kill-emacs'.
-If concurrent editing sessions use the same associated cache file for a file's
-buffer, then you should add `save-buffer' to this list."
- :type '(set (const :tag "buffer saving" save-buffer)
- (const :tag "buffer killing" kill-buffer)
- (const :tag "emacs killing" kill-emacs)))
-
-(defcustom fast-lock-save-others t
- "If non-nil, save Font Lock cache files irrespective of file owner.
-If nil, means only buffer files known to be owned by you can have associated
-Font Lock cache files saved. Ownership may be unknown for networked files."
- :type 'boolean)
-
-(defcustom fast-lock-verbose font-lock-verbose
- "If non-nil, means show status messages for cache processing.
-If a number, only buffers greater than this size have processing messages."
- :type '(choice (const :tag "never" nil)
- (other :tag "always" t)
- (integer :tag "size")))
-
-(defvar fast-lock-save-faces nil
- "Faces that will be saved in a Font Lock cache file.
-If nil, means information for all faces will be saved.")
-
-;; User Functions:
-
-;;;###autoload
-(defun fast-lock-mode (&optional arg)
- "Toggle Fast Lock mode.
-With arg, turn Fast Lock mode on if and only if arg is positive and the buffer
-is associated with a file. Enable it automatically in your `~/.emacs' by:
-
- (setq font-lock-support-mode \\='fast-lock-mode)
-
-If Fast Lock mode is enabled, and the current buffer does not contain any text
-properties, any associated Font Lock cache is used if its timestamp matches the
-buffer's file, and its `font-lock-keywords' match those that you are using.
-
-Font Lock caches may be saved:
-- When you save the file's buffer.
-- When you kill an unmodified file's buffer.
-- When you exit Emacs, for all unmodified or saved buffers.
-Depending on the value of `fast-lock-save-events'.
-See also the commands `fast-lock-read-cache' and `fast-lock-save-cache'.
-
-Use \\[font-lock-fontify-buffer] to fontify the buffer if the cache is bad.
-
-Various methods of control are provided for the Font Lock cache. In general,
-see variable `fast-lock-cache-directories' and function `fast-lock-cache-name'.
-For saving, see variables `fast-lock-minimum-size', `fast-lock-save-events',
-`fast-lock-save-others' and `fast-lock-save-faces'."
- (interactive "P")
- ;; Only turn on if we are visiting a file. We could use `buffer-file-name',
- ;; but many packages temporarily wrap that to nil when doing their own thing.
- (set (make-local-variable 'fast-lock-mode)
- (and buffer-file-truename
- (not (memq 'fast-lock-mode font-lock-inhibit-thing-lock))
- (if arg (> (prefix-numeric-value arg) 0) (not fast-lock-mode))))
- (if (and fast-lock-mode (not font-lock-mode))
- ;; Turned on `fast-lock-mode' rather than `font-lock-mode'.
- (progn
- (message "Use font-lock-support-mode rather than calling fast-lock-mode")
- (sit-for 2))
- ;; Let's get down to business.
- (set (make-local-variable 'fast-lock-cache-timestamp) nil)
- (set (make-local-variable 'fast-lock-cache-filename) nil)
- (when (and fast-lock-mode (not font-lock-fontified))
- (fast-lock-read-cache))))
-
-(defun fast-lock-read-cache ()
- "Read the Font Lock cache for the current buffer.
-
-The following criteria must be met for a Font Lock cache file to be read:
-- Fast Lock mode must be turned on in the buffer.
-- The buffer must not be modified.
-- The buffer's `font-lock-keywords' must match the cache's.
-- The buffer file's timestamp must match the cache's.
-- Criteria imposed by `fast-lock-cache-directories'.
-
-See `fast-lock-mode'."
- (interactive)
- (let ((directories fast-lock-cache-directories)
- (modified (buffer-modified-p)) (inhibit-read-only t)
- (fontified font-lock-fontified))
- (set (make-local-variable 'font-lock-fontified) nil)
- ;; Keep trying directories until fontification is turned off.
- (while (and directories (not font-lock-fontified))
- (let ((directory (fast-lock-cache-directory (car directories) nil)))
- (condition-case nil
- (when directory
- (setq fast-lock-cache-filename (fast-lock-cache-name directory))
- (when (file-readable-p fast-lock-cache-filename)
- (load fast-lock-cache-filename t t t)))
- (error nil) (quit nil))
- (setq directories (cdr directories))))
- ;; Unset `fast-lock-cache-filename', and restore `font-lock-fontified', if
- ;; we don't use a cache. (Note that `fast-lock-cache-data' sets the value
- ;; of `fast-lock-cache-timestamp'.)
- (set-buffer-modified-p modified)
- (unless font-lock-fontified
- (setq fast-lock-cache-filename nil font-lock-fontified fontified))))
-
-(defun fast-lock-save-cache (&optional buffer)
- "Save the Font Lock cache of BUFFER or the current buffer.
-
-The following criteria must be met for a Font Lock cache file to be saved:
-- Fast Lock mode must be turned on in the buffer.
-- The event must be one of `fast-lock-save-events'.
-- The buffer must be at least `fast-lock-minimum-size' bytes long.
-- The buffer file must be owned by you, or `fast-lock-save-others' must be t.
-- The buffer must contain at least one `face' text property.
-- The buffer must not be modified.
-- The buffer file's timestamp must be the same as the file's on disk.
-- The on disk file's timestamp must be different than the buffer's cache.
-- Criteria imposed by `fast-lock-cache-directories'.
-
-See `fast-lock-mode'."
- (interactive)
- (save-excursion
- (when buffer
- (set-buffer buffer))
- (let ((min-size (font-lock-value-in-major-mode fast-lock-minimum-size))
- (file-timestamp (visited-file-modtime)) (saved nil))
- (when (and fast-lock-mode
- ;;
- ;; "Only save if the buffer matches the file, the file has
- ;; changed, and it was changed by the current emacs session."
- ;;
- ;; Only save if the buffer is not modified,
- ;; (i.e., so we don't save for something not on disk)
- (not (buffer-modified-p))
- ;; and the file's timestamp is the same as the buffer's,
- ;; (i.e., someone else hasn't written the file in the meantime)
- (verify-visited-file-modtime (current-buffer))
- ;; and the file's timestamp is different from the cache's.
- ;; (i.e., a save has occurred since the cache was read)
- (not (equal fast-lock-cache-timestamp file-timestamp))
- ;;
- ;; Only save if user's restrictions are satisfied.
- (and min-size (>= (buffer-size) min-size))
- (or fast-lock-save-others
- (eq (user-uid) (file-attribute-user-id
- (file-attributes buffer-file-name))))
- ;;
- ;; Only save if there are `face' properties to save.
- (text-property-not-all (point-min) (point-max) 'face nil))
- ;;
- ;; Try each directory until we manage to save or the user quits.
- (let ((directories fast-lock-cache-directories))
- (while (and directories (memq saved '(nil error)))
- (let* ((dir (fast-lock-cache-directory (car directories) t))
- (file (and dir (fast-lock-cache-name dir))))
- (when (and file (file-writable-p file))
- (setq saved (fast-lock-save-cache-1 file file-timestamp)))
- (setq directories (cdr directories)))))))))
-
-;;;###autoload
-(defun turn-on-fast-lock ()
- "Unconditionally turn on Fast Lock mode."
- (fast-lock-mode t))
-
-;;; API Functions:
-
-(defun fast-lock-after-fontify-buffer ()
- ;; Delete the Font Lock cache file used to restore fontification, if any.
- (when fast-lock-cache-filename
- (if (file-writable-p fast-lock-cache-filename)
- (delete-file fast-lock-cache-filename)
- (message "File %s font lock cache cannot be deleted" (buffer-name))))
- ;; Flag so that a cache will be saved later even if the file is never saved.
- (setq fast-lock-cache-timestamp nil))
-
-(defalias 'fast-lock-after-unfontify-buffer #'ignore)
-
-;; Miscellaneous Functions:
-
-(defun fast-lock-save-cache-after-save-file ()
- ;; Do `fast-lock-save-cache' if `save-buffer' is on `fast-lock-save-events'.
- (when (memq 'save-buffer fast-lock-save-events)
- (fast-lock-save-cache)))
-
-(defun fast-lock-save-cache-before-kill-buffer ()
- ;; Do `fast-lock-save-cache' if `kill-buffer' is on `fast-lock-save-events'.
- (when (memq 'kill-buffer fast-lock-save-events)
- (fast-lock-save-cache)))
-
-(defun fast-lock-save-caches-before-kill-emacs ()
- ;; Do `fast-lock-save-cache's if `kill-emacs' is on `fast-lock-save-events'.
- (when (memq 'kill-emacs fast-lock-save-events)
- (mapcar #'fast-lock-save-cache (buffer-list))))
-
-(defun fast-lock-cache-directory (directory create)
- "Return usable directory based on DIRECTORY.
-Returns nil if the directory does not exist, or, if CREATE non-nil, cannot be
-created. DIRECTORY may be a string or a cons pair of the form (REGEXP . DIR).
-See `fast-lock-cache-directories'."
- (let ((dir
- (cond ((not buffer-file-name)
- ;; Should never be nil, but `crypt++' screws it up.
- nil)
- ((stringp directory)
- ;; Just a directory.
- directory)
- (t
- ;; A directory if the file name matches the regexp.
- (let ((bufile (expand-file-name buffer-file-truename))
- (case-fold-search nil))
- (when (save-match-data (string-match (car directory) bufile))
- (cdr directory)))))))
- (cond ((not dir)
- nil)
- ((file-accessible-directory-p dir)
- dir)
- (create
- (condition-case nil
- (progn (make-directory dir t) dir)
- (error nil))))))
-
-;; If you are wondering why we only hash if the directory is not ".", rather
-;; than if `file-name-absolute-p', it is because if we just appended ".flc" for
-;; relative cache directories (that are not ".") then it is possible that more
-;; than one file would have the same cache name in that directory, if the luser
-;; made a link from one relative cache directory to another. (Phew!)
-(defun fast-lock-cache-name (directory)
- "Return full cache file name using caching DIRECTORY.
-If DIRECTORY is `.', the file name is the buffer file name appended with `.flc'.
-Otherwise, the file name is constructed from DIRECTORY and the buffer's true
-abbreviated file name, with all `/' characters in the name replaced with `#'
-characters, and appended with `.flc'.
-
-If the same file has different cache file names when edited on different
-machines, e.g., on one machine the cache file name has the prefix `#home',
-perhaps due to automount, try putting in your `~/.emacs' something like:
-
- (setq directory-abbrev-alist (cons \\='(\"^/home/\" . \"/\") directory-abbrev-alist))
-
-Emacs automagically removes the common `/tmp_mnt' automount prefix by default.
-
-See `fast-lock-cache-directory'."
- (if (string-equal directory ".")
- (concat buffer-file-name ".flc")
- (let* ((bufile (expand-file-name buffer-file-truename))
- (chars-alist
- (if (memq system-type '(windows-nt cygwin))
- '((?/ . (?#)) (?# . (?# ?#)) (?: . (?\;)) (?\; . (?\; ?\;)))
- '((?/ . (?#)) (?# . (?# ?#)))))
- (mapchars
- (function (lambda (c) (or (cdr (assq c chars-alist)) (list c))))))
- (concat
- (file-name-as-directory (expand-file-name directory))
- (mapconcat #'char-to-string (apply #'append (mapcar mapchars bufile)) "")
- ".flc"))))
-
-;; Font Lock Cache Processing Functions:
-
-;; The version 3 format of the cache is:
-;;
-;; (fast-lock-cache-data VERSION TIMESTAMP
-;; font-lock-syntactic-keywords SYNTACTIC-PROPERTIES
-;; font-lock-keywords FACE-PROPERTIES)
-
-(defun fast-lock-save-cache-1 (file timestamp)
- ;; Save the FILE with the TIMESTAMP plus fontification data.
- ;; Returns non-nil if a save was attempted to a writable cache file.
- (let ((tpbuf (generate-new-buffer " *fast-lock*"))
- (verbose (if (numberp fast-lock-verbose)
- (> (buffer-size) fast-lock-verbose)
- fast-lock-verbose))
- (saved t))
- (with-temp-message
- (when verbose
- (format "Saving %s font lock cache..." (buffer-name)))
- (condition-case nil
- (save-excursion
- (print (list 'fast-lock-cache-data 3
- (list 'quote timestamp)
- (list 'quote font-lock-syntactic-keywords)
- (list 'quote (fast-lock-get-syntactic-properties))
- (list 'quote font-lock-keywords)
- (list 'quote (fast-lock-get-face-properties)))
- tpbuf)
- (set-buffer tpbuf)
- (write-region (point-min) (point-max) file nil 'quietly)
- (setq fast-lock-cache-timestamp timestamp
- fast-lock-cache-filename file))
- (error (setq saved 'error)) (quit (setq saved 'quit)))
- (kill-buffer tpbuf))
- (cond ((eq saved 'quit)
- (message "Saving %s font lock cache...quit" (buffer-name)))
- ((eq saved 'error)
- (message "Saving %s font lock cache...failed" (buffer-name))))
- ;; We return non-nil regardless of whether a failure occurred.
- saved))
-
-(defun fast-lock-cache-data (version timestamp
- syntactic-keywords syntactic-properties
- keywords face-properties
- &rest _ignored)
- ;; Find value of syntactic keywords in case it is a symbol.
- (setq font-lock-syntactic-keywords (font-lock-eval-keywords
- font-lock-syntactic-keywords))
- ;; Compile all keywords in case some are and some aren't.
- (when font-lock-syntactic-keywords
- (setq font-lock-syntactic-keywords (font-lock-compile-keywords
- font-lock-syntactic-keywords t)))
- (when syntactic-keywords
- (setq syntactic-keywords (font-lock-compile-keywords syntactic-keywords t)))
- (setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords)
- keywords (font-lock-compile-keywords keywords))
- ;; Use the Font Lock cache SYNTACTIC-PROPERTIES and FACE-PROPERTIES if we're
- ;; using cache VERSION format 3, the current buffer's file timestamp matches
- ;; the TIMESTAMP, the current buffer's `font-lock-syntactic-keywords' are the
- ;; same as SYNTACTIC-KEYWORDS, and the current buffer's `font-lock-keywords'
- ;; are the same as KEYWORDS.
- (let ((buf-timestamp (visited-file-modtime))
- (verbose (if (numberp fast-lock-verbose)
- (> (buffer-size) fast-lock-verbose)
- fast-lock-verbose))
- (loaded t))
- (if (or (/= version 3)
- (buffer-modified-p)
- (not (equal timestamp buf-timestamp))
- (not (equal syntactic-keywords font-lock-syntactic-keywords))
- (not (equal keywords font-lock-keywords)))
- (setq loaded nil)
- (with-temp-message
- (when verbose
- (format "Loading %s font lock cache..." (buffer-name)))
- (condition-case nil
- (fast-lock-add-properties syntactic-properties face-properties)
- (error (setq loaded 'error)) (quit (setq loaded 'quit))))
- (cond ((eq loaded 'quit)
- (message "Loading %s font lock cache...quit" (buffer-name)))
- ((eq loaded 'error)
- (message "Loading %s font lock cache...failed" (buffer-name)))))
- (setq font-lock-fontified (eq loaded t)
- fast-lock-cache-timestamp (and (eq loaded t) timestamp))))
-
-;; Text Properties Processing Functions:
-
-;; This is fast, but fails if adjacent characters have different `face' text
-;; properties. Maybe that's why I dropped it in the first place?
-;(defun fast-lock-get-face-properties ()
-; "Return a list of `face' text properties in the current buffer.
-;Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
-;where VALUE is a `face' property value and STARTx and ENDx are positions."
-; (save-restriction
-; (widen)
-; (let ((start (text-property-not-all (point-min) (point-max) 'face nil))
-; (limit (point-max)) end properties value cell)
-; (while start
-; (setq end (next-single-property-change start 'face nil limit)
-; value (get-text-property start 'face))
-; ;; Make, or add to existing, list of regions with same `face'.
-; (if (setq cell (assq value properties))
-; (setcdr cell (cons start (cons end (cdr cell))))
-; (setq properties (cons (list value start end) properties)))
-; (setq start (next-single-property-change end 'face)))
-; properties)))
-
-;; This is slow, but copes if adjacent characters have different `face' text
-;; properties, but fails if they are lists.
-;(defun fast-lock-get-face-properties ()
-; "Return a list of `face' text properties in the current buffer.
-;Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
-;where VALUE is a `face' property value and STARTx and ENDx are positions.
-;Only those `face' VALUEs in `fast-lock-save-faces' are returned."
-; (save-restriction
-; (widen)
-; (let ((faces (or fast-lock-save-faces (face-list))) (limit (point-max))
-; properties regions face start end)
-; (while faces
-; (setq face (car faces) faces (cdr faces) regions () end (point-min))
-; ;; Make a list of start/end regions with `face' property face.
-; (while (setq start (text-property-any end limit 'face face))
-; (setq end (or (text-property-not-all start limit 'face face) limit)
-; regions (cons start (cons end regions))))
-; ;; Add `face' face's regions, if any, to properties.
-; (when regions
-; (push (cons face regions) properties)))
-; properties)))
-
-(defun fast-lock-get-face-properties ()
- "Return a list of `face' text properties in the current buffer.
-Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
-where VALUE is a `face' property value and STARTx and ENDx are positions."
- (save-restriction
- (widen)
- (let ((start (text-property-not-all (point-min) (point-max) 'face nil))
- end properties value cell)
- (while start
- (setq end (next-single-property-change start 'face nil (point-max))
- value (get-text-property start 'face))
- ;; Make, or add to existing, list of regions with same `face'.
- (cond ((setq cell (assoc value properties))
- (setcdr cell (cons start (cons end (cdr cell)))))
- ((fast-lock-save-facep value)
- (push (list value start end) properties)))
- (setq start (text-property-not-all end (point-max) 'face nil)))
- properties)))
-
-(defun fast-lock-get-syntactic-properties ()
- "Return a list of `syntax-table' text properties in the current buffer.
-See `fast-lock-get-face-properties'."
- (save-restriction
- (widen)
- (let ((start (text-property-not-all (point-min) (point-max) 'syntax-table
- nil))
- end properties value cell)
- (while start
- (setq end (next-single-property-change start 'syntax-table nil
- (point-max))
- value (get-text-property start 'syntax-table))
- ;; Make, or add to existing, list of regions with same `syntax-table'.
- (if (setq cell (assoc value properties))
- (setcdr cell (cons start (cons end (cdr cell))))
- (push (list value start end) properties))
- (setq start (text-property-not-all end (point-max) 'syntax-table nil)))
- properties)))
-
-(defun fast-lock-add-properties (syntactic-properties face-properties)
- "Add `syntax-table' and `face' text properties to the current buffer.
-Any existing `syntax-table' and `face' text properties are removed first.
-See `fast-lock-get-face-properties'."
- (with-silent-modifications
- (let ((inhibit-point-motion-hooks t))
- (save-restriction
- (widen)
- (font-lock-unfontify-region (point-min) (point-max))
- ;;
- ;; Set the `syntax-table' property for each start/end region.
- (pcase-dolist (`(,plist . ,regions) syntactic-properties)
- (while regions
- (add-text-properties (nth 0 regions) (nth 1 regions) plist)
- (setq regions (nthcdr 2 regions))))
- ;;
- ;; Set the `face' property for each start/end region.
- (pcase-dolist (`(,plist . ,regions) face-properties)
- (while regions
- (add-text-properties (nth 0 regions) (nth 1 regions) plist)
- (setq regions (nthcdr 2 regions))))))))
-
-
-;; Install ourselves:
-
-(add-hook 'after-save-hook #'fast-lock-save-cache-after-save-file)
-(add-hook 'kill-buffer-hook #'fast-lock-save-cache-before-kill-buffer)
-(unless noninteractive
- (add-hook 'kill-emacs-hook #'fast-lock-save-caches-before-kill-emacs))
-
-;;;###autoload
-(when (fboundp 'add-minor-mode)
- (defvar fast-lock-mode nil)
- (add-minor-mode 'fast-lock-mode nil))
-;;;###dont-autoload
-(unless (assq 'fast-lock-mode minor-mode-alist)
- (setq minor-mode-alist (append minor-mode-alist '((fast-lock-mode nil)))))
-
-(provide 'fast-lock)
-
-;;; fast-lock.el ends here
-
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; End:
diff --git a/lisp/obsolete/gs.el b/lisp/obsolete/gs.el
index 7bf324ceecf..d5a87131298 100644
--- a/lisp/obsolete/gs.el
+++ b/lisp/obsolete/gs.el
@@ -144,7 +144,7 @@ image in pixels."
(defun gs-set-ghostview-colors-window-prop (frame pixel-colors)
"Set the `GHOSTVIEW_COLORS' environment variable depending on FRAME."
- (let ((mode (cond ((x-display-color-p frame) "Color")
+ (let ((mode (cond ((display-color-p frame) "Color")
((x-display-grayscale-p frame) "Grayscale")
(t "Monochrome"))))
(x-change-window-property "GHOSTVIEW_COLORS"
diff --git a/lisp/obsolete/info-edit.el b/lisp/obsolete/info-edit.el
index 6c4c10ca6c2..b9cb83ed971 100644
--- a/lisp/obsolete/info-edit.el
+++ b/lisp/obsolete/info-edit.el
@@ -77,11 +77,12 @@ This feature will be removed in future.")
(buffer-modified-p)
(message "Tags may have changed. Use Info-tagify if necessary")))
-(defvar ibuffer-help-buffer-modes)
-;; Moved here from definition of ibuffer-help-buffer-modes to make
-;; that variable customizable even though this code is obsolete. See
-;; also Bug#30990.
-(add-to-list 'ibuffer-help-buffer-modes 'Info-edit-mode)
+(with-eval-after-load 'ibuffer
+ (defvar ibuffer-help-buffer-modes)
+ ;; Moved here from definition of ibuffer-help-buffer-modes to make
+ ;; that variable customizable even though this code is obsolete. See
+ ;; also Bug#30990.
+ (add-to-list 'ibuffer-help-buffer-modes 'Info-edit-mode))
(provide 'info-edit)
diff --git a/lisp/obsolete/lazy-lock.el b/lisp/obsolete/lazy-lock.el
deleted file mode 100644
index 5c35cb32124..00000000000
--- a/lisp/obsolete/lazy-lock.el
+++ /dev/null
@@ -1,1025 +0,0 @@
-;;; lazy-lock.el --- lazy demand-driven fontification for fast Font Lock mode -*- lexical-binding: t; -*-
-
-;; Copyright (C) 1994-1998, 2001-2022 Free Software Foundation, Inc.
-
-;; Author: Simon Marshall <simon@gnu.org>
-;; Maintainer: emacs-devel@gnu.org
-;; Keywords: faces files
-;; Version: 2.11
-;; Obsolete-since: 22.1
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Purpose:
-;;
-;; Lazy Lock mode is a Font Lock support mode.
-;; It makes visiting buffers in Font Lock mode faster by making fontification
-;; be demand-driven, deferred and stealthy, so that fontification only occurs
-;; when, and where, necessary.
-;;
-;; See caveats and feedback below.
-;; See also the fast-lock package. (But don't use them at the same time!)
-
-;; Installation:
-;;
-;; Put in your ~/.emacs:
-;;
-;; (setq font-lock-support-mode 'lazy-lock-mode)
-;;
-;; Start up a new Emacs and use font-lock as usual (except that you can use the
-;; so-called "gaudier" fontification regexps on big files without frustration).
-;;
-;; In a buffer (which has `font-lock-mode' enabled) which is at least
-;; `lazy-lock-minimum-size' characters long, buffer fontification will not
-;; occur and only the visible portion of the buffer will be fontified. Motion
-;; around the buffer will fontify those visible portions not previously
-;; fontified. If stealth fontification is enabled, buffer fontification will
-;; occur in invisible parts of the buffer after `lazy-lock-stealth-time'
-;; seconds of idle time. If on-the-fly fontification is deferred, on-the-fly
-;; fontification will occur after `lazy-lock-defer-time' seconds of idle time.
-
-;; User-visible differences with version 1:
-;;
-;; - Version 2 can defer on-the-fly fontification. Therefore you need not, and
-;; should not, use defer-lock.el with this version of lazy-lock.el.
-;;
-;; A number of variables have changed meaning:
-;;
-;; - A value of nil for the variable `lazy-lock-minimum-size' means never turn
-;; on demand-driven fontification. In version 1 this meant always turn on
-;; demand-driven fontification. If you really want demand-driven fontification
-;; regardless of buffer size, set this variable to 0.
-;;
-;; - The variable `lazy-lock-stealth-lines' cannot have a nil value. In
-;; version 1 this meant use `window-height' as the maximum number of lines to
-;; fontify as a stealth chunk. This makes no sense; stealth fontification is
-;; of a buffer, not a window.
-
-;; Implementation differences with version 1:
-;;
-;; - Version 1 of lazy-lock.el is a bit of a hack. Version 1 demand-driven
-;; fontification, the core feature of lazy-lock.el, is implemented by placing a
-;; function on `post-command-hook'. This function fontifies where necessary,
-;; i.e., where a window scroll has occurred. However, there are a number of
-;; problems with using `post-command-hook':
-;;
-;; (a) As the name suggests, `post-command-hook' is run after every command,
-;; i.e., frequently and regardless of whether scrolling has occurred.
-;; (b) Scrolling can occur during a command, when `post-command-hook' is not
-;; run, i.e., it is not necessarily run after scrolling has occurred.
-;; (c) When `post-command-hook' is run, there is nothing to suggest where
-;; scrolling might have occurred, i.e., which windows have scrolled.
-;;
-;; Thus lazy-lock.el's function is called almost as often as possible, usually
-;; when it need not be called, yet it is not always called when it is needed.
-;; Also, lazy-lock.el's function must check each window to see if a scroll has
-;; occurred there. Worse still, lazy-lock.el's function must fontify a region
-;; twice as large as necessary to make sure the window is completely fontified.
-;; Basically, `post-command-hook' is completely inappropriate for lazy-lock.el.
-;;
-;; Ideally, we want to attach lazy-lock.el's function to a hook that is run
-;; only when scrolling occurs, e.g., `window-start' has changed, and tells us
-;; as much information as we need, i.e., the window and its new buffer region.
-;; Richard Stallman implemented a `window-scroll-functions' for Emacs 19.30.
-;; Functions on it are run when `window-start' has changed, and are supplied
-;; with the window and the window's new `window-start' position. (It would be
-;; better if it also supplied the window's new `window-end' position, but that
-;; is calculated as part of the redisplay process, and the functions on
-;; `window-scroll-functions' are run before redisplay has finished.) Thus, the
-;; hook deals with the above problems (a), (b) and (c).
-;;
-;; If only life was that easy. Version 2 demand-driven fontification is mostly
-;; implemented by placing a function on `window-scroll-functions'. However,
-;; not all scrolling occurs when `window-start' has changed. A change in
-;; window size, e.g., via C-x 1, or a significant deletion, e.g., of a number
-;; of lines, causes text previously invisible (i.e., after `window-end') to
-;; become visible without changing `window-start'. Arguably, these events are
-;; not scrolling events, but fontification must occur for lazy-lock.el to work.
-;; Hooks `window-size-change-functions' and `redisplay-end-trigger-functions'
-;; were added for these circumstances.
-;;
-;; (Ben Wing thinks these hooks are "horribly horribly kludgy", and implemented
-;; a `pre-idle-hook', a `mother-of-all-post-command-hooks', for XEmacs 19.14.
-;; He then hacked up a version 1 lazy-lock.el to use `pre-idle-hook' rather
-;; than `post-command-hook'. Whereas functions on `post-command-hook' are
-;; called almost as often as possible, functions on `pre-idle-hook' really are
-;; called as often as possible, even when the mouse moves and, on some systems,
-;; while XEmacs is idle. Thus, the hook deals with the above problem (b), but
-;; unfortunately it makes (a) worse and does not address (c) at all.
-;;
-;; I freely admit that `redisplay-end-trigger-functions' and, to a much lesser
-;; extent, `window-size-change-functions' are not pretty. However, I feel that
-;; a `window-scroll-functions' feature is cleaner than a `pre-idle-hook', and
-;; the result is faster and smaller, less intrusive and more targeted, code.
-;; Since `pre-idle-hook' is pretty much like `post-command-hook', there is no
-;; point in making this version of lazy-lock.el work with it. Anyway, that's
-;; Lit 30 of my humble opinion.
-;;
-;; - Version 1 stealth fontification is also implemented by placing a function
-;; on `post-command-hook'. This function waits for a given amount of time,
-;; and, if Emacs remains idle, fontifies where necessary. Again, there are a
-;; number of problems with using `post-command-hook':
-;;
-;; (a) Functions on `post-command-hook' are run sequentially, so this function
-;; can interfere with other functions on the hook, and vice versa.
-;; (b) This function waits for a given amount of time, so it can interfere with
-;; various features that are dealt with by Emacs after a command, e.g.,
-;; region highlighting, asynchronous updating and keystroke echoing.
-;; (c) Fontification may be required during a command, when `post-command-hook'
-;; is not run. (Version 2 deferred fontification only.)
-;;
-;; Again, `post-command-hook' is completely inappropriate for lazy-lock.el.
-;; Richard Stallman and Morten Welinder implemented internal Timers and Idle
-;; Timers for Emacs 19.31. Functions can be run independently at given times
-;; or after given amounts of idle time. Thus, the feature deals with the above
-;; problems (a), (b) and (c). Version 2 deferral and stealth are implemented
-;; by functions on Idle Timers. (A function on XEmacs' `pre-idle-hook' is
-;; similar to an Emacs Idle Timer function with a fixed zero second timeout.)
-
-;; - Version 1 has the following problems (relative to version 2):
-;;
-;; (a) It is slow when it does its job.
-;; (b) It does not always do its job when it should.
-;; (c) It slows all interaction (when it doesn't need to do its job).
-;; (d) It interferes with other package functions on `post-command-hook'.
-;; (e) It interferes with Emacs things within the read-eval loop.
-;;
-;; Ben's hacked-up lazy-lock.el 1.14 almost solved (b) but made (c) worse.
-;;
-;; - Version 2 has the following additional features (relative to version 1):
-;;
-;; (a) It can defer fontification (both on-the-fly and on-scrolling).
-;; (b) It can fontify contextually (syntactically true on-the-fly).
-
-;; Caveats:
-;;
-;; Lazy Lock mode does not work efficiently with Outline mode.
-;; This is because when in Outline mode, although text may be not visible to
-;; you in the window, the text is visible to Emacs Lisp code (not surprisingly)
-;; and Lazy Lock fontifies it mercilessly. Maybe it will be fixed one day.
-;;
-;; Because buffer text is not necessarily fontified, other packages that expect
-;; buffer text to be fontified in Font Lock mode either might not work as
-;; expected, or might not display buffer text as expected. An example of the
-;; latter is `occur', which copies lines of buffer text into another buffer.
-;;
-;; In Emacs 19.30, Lazy Lock mode does not ensure that an existing buffer is
-;; fontified if it is made visible via a minibuffer-less command that replaces
-;; an existing window's buffer (e.g., via the Buffers menu). Upgrade!
-;;
-;; In Emacs 19.30, Lazy Lock mode does not work well with Transient Mark mode
-;; or modes based on Comint mode (e.g., Shell mode), and also interferes with
-;; the echoing of keystrokes in the minibuffer. This is because of the way
-;; deferral and stealth have to be implemented for Emacs 19.30. Upgrade!
-;;
-;; Currently XEmacs does not have the features to support this version of
-;; lazy-lock.el. Maybe it will one day.
-
-;; History:
-;;
-;; 1.15--2.00:
-;; - Rewrite for Emacs 19.30 and the features rms added to support lazy-lock.el
-;; so that it could work correctly and efficiently.
-;; - Many thanks to those who reported bugs, fixed bugs, made suggestions or
-;; otherwise contributed in the version 1 cycle; Jari Aalto, Kevin Broadey,
-;; Ulrik Dickow, Bill Dubuque, Bob Glickstein, Boris Goldowsky,
-;; Jonas Jarnestrom, David Karr, Michael Kifer, Erik Naggum, Rick Sladkey,
-;; Jim Thompson, Ben Wing, Ilya Zakharevich, and Richard Stallman.
-;; 2.00--2.01:
-;; - Made `lazy-lock-fontify-after-command' always `sit-for' and so redisplay
-;; - Use `buffer-name' not `buffer-live-p' (Bill Dubuque hint)
-;; - Made `lazy-lock-install' do `add-to-list' not `setq' of `current-buffer'
-;; - Made `lazy-lock-fontify-after-install' loop over buffer list
-;; - Made `lazy-lock-arrange-before-change' to arrange `window-end' triggering
-;; - Made `lazy-lock-let-buffer-state' wrap both `befter-change-functions'
-;; - Made `lazy-lock-fontify-region' do `condition-case' (Hyman Rosen report)
-;; 2.01--2.02:
-;; - Use `buffer-live-p' as `buffer-name' can barf (Richard Stanton report)
-;; - Made `lazy-lock-install' set `font-lock-fontified' (Kevin Davidson report)
-;; - Made `lazy-lock-install' add hooks only if needed
-;; - Made `lazy-lock-unstall' add `font-lock-after-change-function' if needed
-;; 2.02--2.03:
-;; - Made `lazy-lock-fontify-region' do `condition-case' for `quit' too
-;; - Made `lazy-lock-mode' respect the value of `font-lock-inhibit-thing-lock'
-;; - Added `lazy-lock-after-unfontify-buffer'
-;; - Removed `lazy-lock-fontify-after-install' hack
-;; - Made `lazy-lock-fontify-after-scroll' not `set-buffer' to `window-buffer'
-;; - Made `lazy-lock-fontify-after-trigger' not `set-buffer' to `window-buffer'
-;; - Made `lazy-lock-fontify-after-idle' be interruptible (Scott Burson hint)
-;; 2.03--2.04:
-;; - Rewrite for Emacs 19.31 idle timers
-;; - Renamed `buffer-windows' to `get-buffer-window-list'
-;; - Removed `buffer-live-p'
-;; - Made `lazy-lock-defer-after-change' always save `current-buffer'
-;; - Made `lazy-lock-fontify-after-defer' just process buffers
-;; - Made `lazy-lock-install-hooks' add hooks correctly (Kevin Broadey report)
-;; - Made `lazy-lock-install' cope if `lazy-lock-defer-time' is a list
-;; 2.04--2.05:
-;; - Rewrite for Common Lisp macros
-;; - Added `do-while' macro
-;; - Renamed `lazy-lock-let-buffer-state' macro to `save-buffer-state'
-;; - Returned `lazy-lock-fontify-after-install' hack (Darren Hall hint)
-;; - Added `lazy-lock-defer-on-scrolling' functionality (Scott Byer hint)
-;; - Made `lazy-lock-mode' wrap `font-lock-support-mode'
-;; 2.05--2.06:
-;; - Made `lazy-lock-fontify-after-defer' swap correctly (Scott Byer report)
-;; 2.06--2.07:
-;; - Added `lazy-lock-stealth-load' functionality (Rob Hooft hint)
-;; - Made `lazy-lock-unstall' call `lazy-lock-fontify-region' if needed
-;; - Made `lazy-lock-mode' call `lazy-lock-unstall' only if needed
-;; - Made `lazy-lock-defer-after-scroll' do `set-window-redisplay-end-trigger'
-;; - Added `lazy-lock-defer-contextually' functionality
-;; - Added `lazy-lock-defer-on-the-fly' from `lazy-lock-defer-time'
-;; - Renamed `lazy-lock-defer-driven' to `lazy-lock-defer-on-scrolling'
-;; - Removed `lazy-lock-submit-bug-report' and bade farewell
-;; 2.07--2.08:
-;; - Made `lazy-lock-fontify-conservatively' fontify around `window-point'
-;; - Made `save-buffer-state' wrap `inhibit-point-motion-hooks'
-;; - Added Custom support
-;; 2.08--2.09:
-;; - Removed `byte-*' variables from `eval-when-compile' (Erik Naggum hint)
-;; - Made various wrapping `inhibit-point-motion-hooks' (Vinicius Latorre hint)
-;; - Made `lazy-lock-fontify-after-idle' wrap `minibuffer-auto-raise'
-;; - Made `lazy-lock-fontify-after-defer' paranoid about deferred buffers
-;; 2.09--2.10:
-;; - Use `window-end' UPDATE arg for Emacs 20.4 and later.
-;; - Made deferral `widen' before unfontifying (Dan Nicolaescu report)
-;; - Use `lazy-lock-fontify-after-visage' for hideshow.el (Dan Nicolaescu hint)
-;; - Use `other' widget where possible (Andreas Schwab fix)
-;; 2.10--2.11:
-;; - Used `with-temp-message' where possible to make messages temporary.
-
-;;; Code:
-
-(require 'font-lock)
-(eval-when-compile (require 'cl-lib))
-
-(eval-when-compile
- ;;
- ;; We use this for clarity and speed. Naughty but nice.
- (defmacro do-while (test &rest body)
- "(do-while TEST BODY...): eval BODY... and repeat if TEST yields non-nil.
-The order of execution is thus BODY, TEST, BODY, TEST and so on
-until TEST returns nil."
- (declare (indent 1) (debug t))
- `(while (progn ,@body ,test))))
-
-(defgroup lazy-lock nil
- "Font Lock support mode to fontify lazily."
- :group 'font-lock)
-
-(defvar lazy-lock-mode nil) ; Whether we are turned on.
-(defvar lazy-lock-buffers nil) ; For deferral.
-(defvar lazy-lock-timers (cons nil nil)) ; For deferral and stealth.
-
-;; User Variables:
-
-(defcustom lazy-lock-minimum-size 25600
- "Minimum size of a buffer for demand-driven fontification.
-On-demand fontification occurs if the buffer size is greater than this value.
-If nil, means demand-driven fontification is never performed.
-If a list, each element should be a cons pair of the form (MAJOR-MODE . SIZE),
-where MAJOR-MODE is a symbol or t (meaning the default). For example:
- ((c-mode . 25600) (c++-mode . 25600) (rmail-mode . 1048576))
-means that the minimum size is 25K for buffers in C or C++ modes, one megabyte
-for buffers in Rmail mode, and size is irrelevant otherwise.
-
-The value of this variable is used when Lazy Lock mode is turned on."
- :type '(choice (const :tag "none" nil)
- (integer :tag "size")
- (repeat :menu-tag "mode specific" :tag "mode specific"
- :value ((t . nil))
- (cons :tag "Instance"
- (radio :tag "Mode"
- (const :tag "all" t)
- (symbol :tag "name"))
- (radio :tag "Size"
- (const :tag "none" nil)
- (integer :tag "size"))))))
-
-(defcustom lazy-lock-defer-on-the-fly t
- "If non-nil, means fontification after a change should be deferred.
-If nil, means on-the-fly fontification is performed. This means when changes
-occur in the buffer, those areas are immediately fontified.
-If a list, it should be a list of `major-mode' symbol names for which deferred
-fontification should occur. The sense of the list is negated if it begins with
-`not'. For example:
- (c-mode c++-mode)
-means that on-the-fly fontification is deferred for buffers in C and C++ modes
-only, and deferral does not occur otherwise.
-
-The value of this variable is used when Lazy Lock mode is turned on."
- :type '(choice (const :tag "never" nil)
- (const :tag "always" t)
- (set :menu-tag "mode specific" :tag "modes"
- :value (not)
- (const :tag "Except" not)
- (repeat :inline t (symbol :tag "mode")))))
-
-(defcustom lazy-lock-defer-on-scrolling nil
- "If non-nil, means fontification after a scroll should be deferred.
-If nil, means demand-driven fontification is performed. This means when
-scrolling into unfontified areas of the buffer, those areas are immediately
-fontified. Thus scrolling never presents unfontified areas. However, since
-fontification occurs during scrolling, scrolling may be slow.
-If t, means defer-driven fontification is performed. This means fontification
-of those areas is deferred. Thus scrolling may present momentarily unfontified
-areas. However, since fontification does not occur during scrolling, scrolling
-will be faster than demand-driven fontification.
-If any other value, e.g., `eventually', means demand-driven fontification is
-performed until the buffer is fontified, then buffer fontification becomes
-defer-driven. Thus scrolling never presents unfontified areas until the buffer
-is first fontified, after which subsequent scrolling may present future buffer
-insertions momentarily unfontified. However, since fontification does not
-occur during scrolling after the buffer is first fontified, scrolling will
-become faster. (But, since contextual changes continually occur, such a value
-makes little sense if `lazy-lock-defer-contextually' is non-nil.)
-
-The value of this variable is used when Lazy Lock mode is turned on."
- :type '(choice (const :tag "never" nil)
- (const :tag "always" t)
- (other :tag "eventually" eventually)))
-
-(defcustom lazy-lock-defer-contextually 'syntax-driven
- "If non-nil, means deferred fontification should be syntactically true.
-If nil, means deferred fontification occurs only on those lines modified. This
-means where modification on a line causes syntactic change on subsequent lines,
-those subsequent lines are not refontified to reflect their new context.
-If t, means deferred fontification occurs on those lines modified and all
-subsequent lines. This means those subsequent lines are refontified to reflect
-their new syntactic context, either immediately or when scrolling into them.
-If any other value, e.g., `syntax-driven', means deferred syntactically true
-fontification occurs only if syntactic fontification is performed using the
-buffer mode's syntax table, i.e., only if `font-lock-keywords-only' is nil.
-
-The value of this variable is used when Lazy Lock mode is turned on."
- :type '(choice (const :tag "never" nil)
- (const :tag "always" t)
- (other :tag "syntax-driven" syntax-driven)))
-
-(defcustom lazy-lock-defer-time 0.25
- "Time in seconds to delay before beginning deferred fontification.
-Deferred fontification occurs if there is no input within this time.
-If nil, means fontification is never deferred, regardless of the values of the
-variables `lazy-lock-defer-on-the-fly', `lazy-lock-defer-on-scrolling' and
-`lazy-lock-defer-contextually'.
-
-The value of this variable is used when Lazy Lock mode is turned on."
- :type '(choice (const :tag "never" nil)
- (number :tag "seconds")))
-
-(defcustom lazy-lock-stealth-time 30
- "Time in seconds to delay before beginning stealth fontification.
-Stealth fontification occurs if there is no input within this time.
-If nil, means stealth fontification is never performed.
-
-The value of this variable is used when Lazy Lock mode is turned on."
- :type '(choice (const :tag "never" nil)
- (number :tag "seconds")))
-
-(defcustom lazy-lock-stealth-lines (if font-lock-maximum-decoration 100 250)
- "Maximum size of a chunk of stealth fontification.
-Each iteration of stealth fontification can fontify this number of lines.
-To speed up input response during stealth fontification, at the cost of stealth
-taking longer to fontify, you could reduce the value of this variable."
- :type '(integer :tag "lines"))
-
-(defcustom lazy-lock-stealth-load
- (if (condition-case nil (load-average) (error)) 200)
- "Load in percentage above which stealth fontification is suspended.
-Stealth fontification pauses when the system short-term load average (as
-returned by the function `load-average' if supported) goes above this level,
-thus reducing the demand that stealth fontification makes on the system.
-If nil, means stealth fontification is never suspended.
-To reduce machine load during stealth fontification, at the cost of stealth
-taking longer to fontify, you could reduce the value of this variable.
-See also `lazy-lock-stealth-nice'."
- :type (if (condition-case nil (load-average) (error))
- '(choice (const :tag "never" nil)
- (integer :tag "load"))
- '(const :format "%t: unsupported\n" nil)))
-
-(defcustom lazy-lock-stealth-nice 0.125
- "Time in seconds to pause between chunks of stealth fontification.
-Each iteration of stealth fontification is separated by this amount of time,
-thus reducing the demand that stealth fontification makes on the system.
-If nil, means stealth fontification is never paused.
-To reduce machine load during stealth fontification, at the cost of stealth
-taking longer to fontify, you could increase the value of this variable.
-See also `lazy-lock-stealth-load'."
- :type '(choice (const :tag "never" nil)
- (number :tag "seconds")))
-
-(defcustom lazy-lock-stealth-verbose
- (and (not lazy-lock-defer-contextually) (not (null font-lock-verbose)))
- "If non-nil, means stealth fontification should show status messages."
- :type 'boolean)
-
-;; User Functions:
-
-;;;###autoload
-(defun lazy-lock-mode (&optional arg)
- "Toggle Lazy Lock mode.
-With arg, turn Lazy Lock mode on if and only if arg is positive. Enable it
-automatically in your `~/.emacs' by:
-
- (setq font-lock-support-mode \\='lazy-lock-mode)
-
-For a newer font-lock support mode with similar functionality, see
-`jit-lock-mode'. Eventually, Lazy Lock mode will be deprecated in
-JIT Lock's favor.
-
-When Lazy Lock mode is enabled, fontification can be lazy in a number of ways:
-
-- Demand-driven buffer fontification if `lazy-lock-minimum-size' is non-nil.
- This means initial fontification does not occur if the buffer is greater than
- `lazy-lock-minimum-size' characters in length. Instead, fontification occurs
- when necessary, such as when scrolling through the buffer would otherwise
- reveal unfontified areas. This is useful if buffer fontification is too slow
- for large buffers.
-
-- Deferred scroll fontification if `lazy-lock-defer-on-scrolling' is non-nil.
- This means demand-driven fontification does not occur as you scroll.
- Instead, fontification is deferred until after `lazy-lock-defer-time' seconds
- of Emacs idle time, while Emacs remains idle. This is useful if
- fontification is too slow to keep up with scrolling.
-
-- Deferred on-the-fly fontification if `lazy-lock-defer-on-the-fly' is non-nil.
- This means on-the-fly fontification does not occur as you type. Instead,
- fontification is deferred until after `lazy-lock-defer-time' seconds of Emacs
- idle time, while Emacs remains idle. This is useful if fontification is too
- slow to keep up with your typing.
-
-- Deferred context fontification if `lazy-lock-defer-contextually' is non-nil.
- This means fontification updates the buffer corresponding to true syntactic
- context, after `lazy-lock-defer-time' seconds of Emacs idle time, while Emacs
- remains idle. Otherwise, fontification occurs on modified lines only, and
- subsequent lines can remain fontified corresponding to previous syntactic
- contexts. This is useful where strings or comments span lines.
-
-- Stealthy buffer fontification if `lazy-lock-stealth-time' is non-nil.
- This means remaining unfontified areas of buffers are fontified if Emacs has
- been idle for `lazy-lock-stealth-time' seconds, while Emacs remains idle.
- This is useful if any buffer has any deferred fontification.
-
-Basic Font Lock mode on-the-fly fontification behavior fontifies modified
-lines only. Thus, if `lazy-lock-defer-contextually' is non-nil, Lazy Lock mode
-on-the-fly fontification may fontify differently, albeit correctly. In any
-event, to refontify some lines you can use \\[font-lock-fontify-block].
-
-Stealth fontification only occurs while the system remains unloaded.
-If the system load rises above `lazy-lock-stealth-load' percent, stealth
-fontification is suspended. Stealth fontification intensity is controlled via
-the variable `lazy-lock-stealth-nice' and `lazy-lock-stealth-lines', and
-verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
- (interactive "P")
- (let* ((was-on lazy-lock-mode)
- (now-on (unless (memq 'lazy-lock-mode font-lock-inhibit-thing-lock)
- (if arg (> (prefix-numeric-value arg) 0) (not was-on)))))
- (cond ((and now-on (not font-lock-mode))
- ;; Turned on `lazy-lock-mode' rather than `font-lock-mode'.
- (message "Use font-lock-support-mode rather than calling lazy-lock-mode")
- (sit-for 2))
- (now-on
- ;; Turn ourselves on.
- (set (make-local-variable 'lazy-lock-mode) t)
- (lazy-lock-install))
- (was-on
- ;; Turn ourselves off.
- (set (make-local-variable 'lazy-lock-mode) nil)
- (lazy-lock-unstall)))))
-
-;;;###autoload
-(defun turn-on-lazy-lock ()
- "Unconditionally turn on Lazy Lock mode."
- (lazy-lock-mode t))
-
-(defun lazy-lock-install ()
- (let ((min-size (font-lock-value-in-major-mode lazy-lock-minimum-size))
- (defer-change (and lazy-lock-defer-time lazy-lock-defer-on-the-fly))
- (defer-scroll (and lazy-lock-defer-time lazy-lock-defer-on-scrolling))
- (defer-context (and lazy-lock-defer-time lazy-lock-defer-contextually
- (or (eq lazy-lock-defer-contextually t)
- (null font-lock-keywords-only)))))
- ;;
- ;; Tell Font Lock whether Lazy Lock will do fontification.
- (make-local-variable 'font-lock-fontified)
- (setq font-lock-fontified (and min-size (>= (buffer-size) min-size)))
- ;;
- ;; Add the text properties and fontify.
- (if (not font-lock-fontified)
- (lazy-lock-after-fontify-buffer)
- ;; Make sure we fontify in any existing windows showing the buffer.
- (let ((windows (get-buffer-window-list (current-buffer) 'nomini t)))
- (lazy-lock-after-unfontify-buffer)
- (while windows
- (lazy-lock-fontify-conservatively (car windows))
- (setq windows (cdr windows)))))
- ;;
- ;; Add the fontification hooks.
- (lazy-lock-install-hooks
- font-lock-fontified
- (cond ((eq (car-safe defer-change) 'not)
- (not (memq major-mode (cdr defer-change))))
- ((listp defer-change)
- (memq major-mode defer-change))
- (t
- defer-change))
- (eq defer-scroll t)
- defer-context)
- ;;
- ;; Add the fontification timers.
- (lazy-lock-install-timers
- (if (or defer-change defer-scroll defer-context) lazy-lock-defer-time)
- lazy-lock-stealth-time)))
-
-(defun lazy-lock-install-hooks (fontifying
- defer-change defer-scroll defer-context)
- ;;
- ;; Add hook if lazy-lock.el is fontifying on scrolling or is deferring.
- (when (or fontifying defer-change defer-scroll defer-context)
- (add-hook 'window-scroll-functions (if defer-scroll
- #'lazy-lock-defer-after-scroll
- #'lazy-lock-fontify-after-scroll)
- nil t))
- ;;
- ;; Add hook if lazy-lock.el is fontifying and is not deferring changes.
- (when (and fontifying (not defer-change) (not defer-context))
- (add-hook 'before-change-functions #'lazy-lock-arrange-before-change nil t))
- ;;
- ;; Replace Font Lock mode hook.
- (remove-hook 'after-change-functions #'font-lock-after-change-function t)
- (add-hook 'after-change-functions
- (cond ((and defer-change defer-context)
- #'lazy-lock-defer-rest-after-change)
- (defer-change
- #'lazy-lock-defer-line-after-change)
- (defer-context
- #'lazy-lock-fontify-rest-after-change)
- (t
- #'lazy-lock-fontify-line-after-change))
- nil t)
- ;;
- ;; Add package-specific hook.
- (add-hook 'outline-view-change-hook #'lazy-lock-fontify-after-visage nil t)
- (add-hook 'hs-hide-hook #'lazy-lock-fontify-after-visage nil t))
-
-(defun lazy-lock-install-timers (dtime stime)
- ;; Schedule or re-schedule the deferral and stealth timers.
- ;; The layout of `lazy-lock-timers' is:
- ;; ((DEFER-TIME . DEFER-TIMER) (STEALTH-TIME . STEALTH-TIMER)
- ;; If an idle timeout has changed, cancel the existing idle timer (if there
- ;; is one) and schedule a new one (if the new idle timeout is non-nil).
- (unless (eq dtime (car (car lazy-lock-timers)))
- (let ((defer (car lazy-lock-timers)))
- (when (cdr defer)
- (cancel-timer (cdr defer)))
- (setcar lazy-lock-timers (cons dtime (and dtime
- (run-with-idle-timer dtime t #'lazy-lock-fontify-after-defer))))))
- (unless (eq stime (car (cdr lazy-lock-timers)))
- (let ((stealth (cdr lazy-lock-timers)))
- (when (cdr stealth)
- (cancel-timer (cdr stealth)))
- (setcdr lazy-lock-timers (cons stime (and stime
- (run-with-idle-timer stime t #'lazy-lock-fontify-after-idle)))))))
-
-(defun lazy-lock-unstall ()
- ;;
- ;; If Font Lock mode is still enabled, make sure that the buffer is
- ;; fontified, and reinstall its hook. We must do this first.
- (when font-lock-mode
- (when (lazy-lock-unfontified-p)
- (let ((verbose (if (numberp font-lock-verbose)
- (> (buffer-size) font-lock-verbose)
- font-lock-verbose)))
- (with-temp-message
- (when verbose
- (format "Fontifying %s..." (buffer-name)))
- ;; Make sure we fontify etc. in the whole buffer.
- (save-restriction
- (widen)
- (lazy-lock-fontify-region (point-min) (point-max))))))
- (add-hook 'after-change-functions #'font-lock-after-change-function nil t))
- ;;
- ;; Remove the text properties.
- (lazy-lock-after-unfontify-buffer)
- ;;
- ;; Remove the fontification hooks.
- (remove-hook 'window-scroll-functions #'lazy-lock-fontify-after-scroll t)
- (remove-hook 'window-scroll-functions #'lazy-lock-defer-after-scroll t)
- (remove-hook 'before-change-functions #'lazy-lock-arrange-before-change t)
- (remove-hook 'after-change-functions #'lazy-lock-fontify-line-after-change t)
- (remove-hook 'after-change-functions #'lazy-lock-fontify-rest-after-change t)
- (remove-hook 'after-change-functions #'lazy-lock-defer-line-after-change t)
- (remove-hook 'after-change-functions #'lazy-lock-defer-rest-after-change t)
- (remove-hook 'outline-view-change-hook #'lazy-lock-fontify-after-visage t)
- (remove-hook 'hs-hide-hook #'lazy-lock-fontify-after-visage t))
-
-;; Hook functions.
-
-;; Lazy Lock mode intervenes when (1) a previously invisible buffer region
-;; becomes visible, i.e., for demand- or defer-driven on-the-scroll
-;; fontification, (2) a buffer modification occurs, i.e., for defer-driven
-;; on-the-fly fontification, (3) Emacs becomes idle, i.e., for fontification of
-;; deferred fontification and stealth fontification, and (4) other special
-;; occasions.
-
-;; 1. There are three ways whereby this can happen.
-;;
-;; (a) Scrolling the window, either explicitly (e.g., `scroll-up') or
-;; implicitly (e.g., `search-forward'). Here, `window-start' changes.
-;; Fontification occurs by adding `lazy-lock-fontify-after-scroll' (for
-;; demand-driven fontification) or `lazy-lock-defer-after-scroll' (for
-;; defer-driven fontification) to the hook `window-scroll-functions'.
-
-(defun lazy-lock-fontify-after-scroll (window window-start)
- ;; Called from `window-scroll-functions'.
- ;; Fontify WINDOW from WINDOW-START following the scroll.
- (let ((inhibit-point-motion-hooks t))
- (lazy-lock-fontify-region window-start (window-end window t)))
- ;; A prior deletion that did not cause scrolling, followed by a scroll, would
- ;; result in an unnecessary trigger after this if we did not cancel it now.
- (set-window-redisplay-end-trigger window nil))
-
-(defun lazy-lock-defer-after-scroll (window _window-start)
- ;; Called from `window-scroll-functions'.
- ;; Defer fontification following the scroll. Save the current buffer so that
- ;; we subsequently fontify in all windows showing the buffer.
- (unless (memq (current-buffer) lazy-lock-buffers)
- (push (current-buffer) lazy-lock-buffers))
- ;; A prior deletion that did not cause scrolling, followed by a scroll, would
- ;; result in an unnecessary trigger after this if we did not cancel it now.
- (set-window-redisplay-end-trigger window nil))
-
-;; (b) Resizing the window, either explicitly (e.g., `enlarge-window') or
-;; implicitly (e.g., `delete-other-windows'). Here, `window-end' changes.
-;; Fontification occurs by adding `lazy-lock-fontify-after-resize' to the
-;; hook `window-size-change-functions'.
-
-(defun lazy-lock-fontify-after-resize (frame)
- ;; Called from `window-size-change-functions'.
- ;; Fontify windows in FRAME following the resize. We cannot use
- ;; `window-start' or `window-end' so we fontify conservatively.
- (save-excursion
- (save-selected-window
- (select-frame frame)
- (walk-windows (function (lambda (window)
- (set-buffer (window-buffer window))
- (when lazy-lock-mode
- (lazy-lock-fontify-conservatively window))
- (set-window-redisplay-end-trigger window nil)))
- 'nomini frame))))
-
-;; (c) Deletion in the buffer. Here, a `window-end' marker can become visible.
-;; Fontification occurs by adding `lazy-lock-arrange-before-change' to
-;; `before-change-functions' and `lazy-lock-fontify-after-trigger' to the
-;; hook `redisplay-end-trigger-functions'. Before every deletion, the
-;; marker `window-redisplay-end-trigger' position is set to the soon-to-be
-;; changed `window-end' position. If the marker becomes visible,
-;; `lazy-lock-fontify-after-trigger' gets called. Ouch. Note that we only
-;; have to deal with this eventuality if there is no on-the-fly deferral.
-
-(defun lazy-lock-arrange-before-change (beg end)
- ;; Called from `before-change-functions'.
- ;; Arrange that if text becomes visible it will be fontified (if a deletion
- ;; is pending, text might become visible at the bottom).
- (unless (eq beg end)
- (let ((windows (get-buffer-window-list (current-buffer) 'nomini t)) window)
- (while windows
- (setq window (car windows))
- (unless (markerp (window-redisplay-end-trigger window))
- (set-window-redisplay-end-trigger window (make-marker)))
- (set-marker (window-redisplay-end-trigger window) (window-end window))
- (setq windows (cdr windows))))))
-
-(defun lazy-lock-fontify-after-trigger (window trigger-point)
- ;; Called from `redisplay-end-trigger-functions'.
- ;; Fontify WINDOW from TRIGGER-POINT following the redisplay.
- ;; We could probably just use `lazy-lock-fontify-after-scroll' without loss:
- ;; (inline (lazy-lock-fontify-after-scroll window (window-start window)))
- (let ((inhibit-point-motion-hooks t))
- (lazy-lock-fontify-region trigger-point (window-end window t))))
-
-;; 2. Modified text must be marked as unfontified so it can be identified and
-;; fontified later when Emacs is idle. Deferral occurs by adding one of
-;; `lazy-lock-fontify-*-after-change' (for on-the-fly fontification) or
-;; `lazy-lock-defer-*-after-change' (for deferred fontification) to the
-;; hook `after-change-functions'.
-
-(defalias 'lazy-lock-fontify-line-after-change
- ;; Called from `after-change-functions'.
- ;; Fontify the current change.
- #'font-lock-after-change-function)
-
-(defun lazy-lock-fontify-rest-after-change (beg end old-len)
- ;; Called from `after-change-functions'.
- ;; Fontify the current change and defer fontification of the rest of the
- ;; buffer. Save the current buffer so that we subsequently fontify in all
- ;; windows showing the buffer.
- (lazy-lock-fontify-line-after-change beg end old-len)
- (with-silent-modifications
- (unless (memq (current-buffer) lazy-lock-buffers)
- (push (current-buffer) lazy-lock-buffers))
- (save-restriction
- (widen)
- (remove-text-properties end (point-max) '(lazy-lock nil)))))
-
-(defun lazy-lock-defer-line-after-change (beg end _old-len)
- ;; Called from `after-change-functions'.
- ;; Defer fontification of the current change. Save the current buffer so
- ;; that we subsequently fontify in all windows showing the buffer.
- (with-silent-modifications
- (unless (memq (current-buffer) lazy-lock-buffers)
- (push (current-buffer) lazy-lock-buffers))
- (remove-text-properties (max (1- beg) (point-min))
- (min (1+ end) (point-max))
- '(lazy-lock nil))))
-
-(defun lazy-lock-defer-rest-after-change (beg _end _old-len)
- ;; Called from `after-change-functions'.
- ;; Defer fontification of the rest of the buffer. Save the current buffer so
- ;; that we subsequently fontify in all windows showing the buffer.
- (with-silent-modifications
- (unless (memq (current-buffer) lazy-lock-buffers)
- (push (current-buffer) lazy-lock-buffers))
- (save-restriction
- (widen)
- (remove-text-properties (max (1- beg) (point-min))
- (point-max)
- '(lazy-lock nil)))))
-
-;; 3. Deferred fontification and stealth fontification are done from these two
-;; functions. They are set up as Idle Timers.
-
-(defun lazy-lock-fontify-after-defer ()
- ;; Called from `timer-idle-list'.
- ;; Fontify all windows where deferral has occurred for its buffer.
- (save-excursion
- (while (and lazy-lock-buffers (not (input-pending-p)))
- (let ((buffer (car lazy-lock-buffers)) windows)
- ;; Paranoia: check that the buffer is still live and Lazy Lock mode on.
- (when (buffer-live-p buffer)
- (set-buffer buffer)
- (when lazy-lock-mode
- (setq windows (get-buffer-window-list buffer 'nomini t))
- (while windows
- (lazy-lock-fontify-window (car windows))
- (setq windows (cdr windows)))))
- (setq lazy-lock-buffers (cdr lazy-lock-buffers)))))
- ;; Add hook if fontification should now be defer-driven in this buffer.
- (when (and lazy-lock-mode lazy-lock-defer-on-scrolling
- (memq #'lazy-lock-fontify-after-scroll window-scroll-functions)
- (not (or (input-pending-p) (lazy-lock-unfontified-p))))
- (remove-hook 'window-scroll-functions #'lazy-lock-fontify-after-scroll t)
- (add-hook 'window-scroll-functions #'lazy-lock-defer-after-scroll nil t)))
-
-(defun lazy-lock-fontify-after-idle ()
- ;; Called from `timer-idle-list'.
- ;; Fontify all buffers that need it, stealthily while idle.
- (unless (or executing-kbd-macro (window-minibuffer-p (selected-window)))
- ;; Loop over all buffers, fontify stealthily for each if necessary.
- (let ((buffers (buffer-list)) (continue t)
- message message-log-max minibuffer-auto-raise)
- (save-excursion
- (do-while (and buffers continue)
- (set-buffer (car buffers))
- (if (not (and lazy-lock-mode (lazy-lock-unfontified-p)))
- (setq continue (not (input-pending-p)))
- ;; Fontify regions in this buffer while there is no input.
- (with-temp-message
- (when lazy-lock-stealth-verbose
- "Fontifying stealthily...")
- (do-while (and (lazy-lock-unfontified-p) continue)
- (if (and lazy-lock-stealth-load
- (> (car (load-average)) lazy-lock-stealth-load))
- ;; Wait a while before continuing with the loop.
- (progn
- (when message
- (message "Fontifying stealthily...suspended")
- (setq message nil))
- (setq continue (sit-for (or lazy-lock-stealth-time 30))))
- ;; Fontify a chunk.
- (when lazy-lock-stealth-verbose
- (if message
- (message "Fontifying stealthily... %2d%% of %s"
- (lazy-lock-percent-fontified) (buffer-name))
- (message "Fontifying stealthily...")
- (setq message t)))
- ;; Current buffer may have changed during `sit-for'.
- (set-buffer (car buffers))
- (lazy-lock-fontify-chunk)
- (setq continue (sit-for (or lazy-lock-stealth-nice 0)))))))
- (setq buffers (cdr buffers)))))))
-
-;; 4. Special circumstances.
-
-(defun lazy-lock-fontify-after-visage ()
- ;; Called from `outline-view-change-hook' and `hs-hide-hook'.
- ;; Fontify windows showing the current buffer, as its visibility has changed.
- ;; This is a conspiracy hack between lazy-lock.el, outline.el and
- ;; hideshow.el.
- (let ((windows (get-buffer-window-list (current-buffer) 'nomini t)))
- (while windows
- (lazy-lock-fontify-conservatively (car windows))
- (setq windows (cdr windows)))))
-
-(defun lazy-lock-after-fontify-buffer ()
- ;; Called from `font-lock-after-fontify-buffer'.
- ;; Mark the current buffer as fontified.
- ;; This is a conspiracy hack between lazy-lock.el and font-lock.el.
- (with-silent-modifications
- (add-text-properties (point-min) (point-max) '(lazy-lock t))))
-
-(defun lazy-lock-after-unfontify-buffer ()
- ;; Called from `font-lock-after-unfontify-buffer'.
- ;; Mark the current buffer as unfontified.
- ;; This is a conspiracy hack between lazy-lock.el and font-lock.el.
- (with-silent-modifications
- (remove-text-properties (point-min) (point-max) '(lazy-lock nil))))
-
-;; Fontification functions.
-
-;; If packages want to ensure that some region of the buffer is fontified, they
-;; should use this function. For an example, see ps-print.el.
-(defun lazy-lock-fontify-region (beg end)
- ;; Fontify between BEG and END, where necessary, in the current buffer.
- (save-restriction
- (widen)
- (when (setq beg (text-property-any beg end 'lazy-lock nil))
- (save-excursion
- (with-silent-modifications
- (let ((inhibit-point-motion-hooks t))
- ;; Find successive unfontified regions between BEG and END.
- (condition-case data
- (do-while beg
- (let ((next (or (text-property-any beg end 'lazy-lock t)
- end)))
- ;; Make sure the region end points are at beginning of line.
- (goto-char beg)
- (unless (bolp)
- (beginning-of-line)
- (setq beg (point)))
- (goto-char next)
- (unless (bolp)
- (forward-line)
- (setq next (point)))
- ;; Fontify the region, then flag it as fontified.
- (font-lock-fontify-region beg next)
- (add-text-properties beg next '(lazy-lock t))
- (setq beg (text-property-any next end 'lazy-lock nil))))
- ((error quit) (message "Fontifying region...%s" data)))))))))
-
-(defun lazy-lock-fontify-chunk ()
- ;; Fontify the nearest chunk, for stealth, in the current buffer.
- (let ((inhibit-point-motion-hooks t))
- (save-excursion
- (save-restriction
- (widen)
- ;; Move to end of line in case the character at point is not fontified.
- (end-of-line)
- ;; Find where the previous (next) unfontified regions end (begin).
- (let ((prev (previous-single-property-change (point) 'lazy-lock))
- (next (text-property-any (point) (point-max) 'lazy-lock nil)))
- ;; Fontify from the nearest unfontified position.
- (if (or (null prev) (and next (< (- next (point)) (- (point) prev))))
- ;; The next, or neither, region is the nearest not fontified.
- (lazy-lock-fontify-region
- (progn (goto-char (or next (point-min)))
- (beginning-of-line)
- (point))
- (progn (goto-char (or next (point-min)))
- (forward-line lazy-lock-stealth-lines)
- (point)))
- ;; The previous region is the nearest not fontified.
- (lazy-lock-fontify-region
- (progn (goto-char prev)
- (forward-line (- lazy-lock-stealth-lines))
- (point))
- (progn (goto-char prev)
- (forward-line)
- (point)))))))))
-
-(defun lazy-lock-fontify-window (window)
- ;; Fontify in WINDOW between `window-start' and `window-end'.
- ;; We can only do this when we can use `window-start' and `window-end'.
- (with-current-buffer (window-buffer window)
- (lazy-lock-fontify-region (window-start window) (window-end window))))
-
-(defun lazy-lock-fontify-conservatively (window)
- ;; Fontify in WINDOW conservatively around point.
- ;; Where we cannot use `window-start' and `window-end' we do `window-height'
- ;; lines around point. That way we guarantee to have done enough.
- (with-current-buffer (window-buffer window)
- (let ((inhibit-point-motion-hooks t))
- (lazy-lock-fontify-region
- (save-excursion
- (goto-char (window-point window))
- (vertical-motion (- (window-height window)) window) (point))
- (save-excursion
- (goto-char (window-point window))
- (vertical-motion (window-height window) window) (point))))))
-
-(defun lazy-lock-unfontified-p ()
- ;; Return non-nil if there is anywhere still to be fontified.
- (save-restriction
- (widen)
- (text-property-any (point-min) (point-max) 'lazy-lock nil)))
-
-(defun lazy-lock-percent-fontified ()
- ;; Return the percentage (of characters) of the buffer that are fontified.
- (save-restriction
- (widen)
- (let ((beg (point-min)) (size 0) next)
- ;; Find where the next fontified region begins.
- (while (setq beg (text-property-any beg (point-max) 'lazy-lock t))
- (setq next (or (text-property-any beg (point-max) 'lazy-lock nil)
- (point-max)))
- (cl-incf size (- next beg))
- (setq beg next))
- ;; Float because using integer multiplication will frequently overflow.
- (truncate (* (/ (float size) (point-max)) 100)))))
-
-;; Version dependent workarounds and fixes.
-
-(when (consp lazy-lock-defer-time)
- ;;
- ;; In 2.06.04 and below, `lazy-lock-defer-time' could specify modes and time.
- (with-output-to-temp-buffer "*Help*"
- (princ "The value of the variable `lazy-lock-defer-time' was\n ")
- (princ lazy-lock-defer-time)
- (princ "\n")
- (princ "This variable cannot now be a list of modes and time,\n")
- (princ "so instead use ")
- (princ (substitute-command-keys "\\[customize-option]"))
- (princ " to modify the variables, or put the forms:\n")
- (princ " (setq lazy-lock-defer-time ")
- (princ (cdr lazy-lock-defer-time))
- (princ ")\n")
- (princ " (setq lazy-lock-defer-on-the-fly '")
- (princ (car lazy-lock-defer-time))
- (princ ")\n")
- (princ "in your ~/.emacs. ")
- (princ "The above forms have been evaluated for this editor session,\n")
- (princ "but you should use ")
- (princ (substitute-command-keys "\\[customize-option]"))
- (princ " or change your ~/.emacs now."))
- (setq lazy-lock-defer-on-the-fly (car lazy-lock-defer-time)
- lazy-lock-defer-time (cdr lazy-lock-defer-time)))
-
-(when (boundp 'lazy-lock-defer-driven)
- ;;
- ;; In 2.06.04 and below, `lazy-lock-defer-driven' was the variable name.
- (with-output-to-temp-buffer "*Help*"
- (princ "The value of the variable `lazy-lock-defer-driven' is set to ")
- (if (memq lazy-lock-defer-driven '(nil t))
- (princ lazy-lock-defer-driven)
- (princ "`")
- (princ lazy-lock-defer-driven)
- (princ "'"))
- (princ ".\n")
- (princ "This variable is now called `lazy-lock-defer-on-scrolling',\n")
- (princ "so instead use ")
- (princ (substitute-command-keys "\\[customize-option]"))
- (princ " to modify the variable, or put the form:\n")
- (princ " (setq lazy-lock-defer-on-scrolling ")
- (unless (memq lazy-lock-defer-driven '(nil t))
- (princ "'"))
- (princ lazy-lock-defer-driven)
- (princ ")\n")
- (princ "in your ~/.emacs. ")
- (princ "The above form has been evaluated for this editor session,\n")
- (princ "but you should use ")
- (princ (substitute-command-keys "\\[customize-option]"))
- (princ " or change your ~/.emacs now."))
- (setq lazy-lock-defer-on-scrolling lazy-lock-defer-driven))
-
-;; Install ourselves:
-
-(add-hook 'window-size-change-functions #'lazy-lock-fontify-after-resize)
-(add-hook 'redisplay-end-trigger-functions #'lazy-lock-fontify-after-trigger)
-
-(unless (assq 'lazy-lock-mode minor-mode-alist)
- (setq minor-mode-alist (append minor-mode-alist '((lazy-lock-mode nil)))))
-
-(provide 'lazy-lock)
-
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; End:
-
-;;; lazy-lock.el ends here
diff --git a/lisp/longlines.el b/lisp/obsolete/longlines.el
index 4ad2cab2b23..1e2ae698c6f 100644
--- a/lisp/longlines.el
+++ b/lisp/obsolete/longlines.el
@@ -6,6 +6,7 @@
;; Alex Schroeder <alex@gnu.org>
;; Chong Yidong <cyd@stupidchicken.com>
;; Maintainer: emacs-devel@gnu.org
+;; Obsolete-since: 24.4
;; Keywords: convenience, wp
;; This file is part of GNU Emacs.
diff --git a/lisp/makesum.el b/lisp/obsolete/makesum.el
index 4084358ca90..3e343c95372 100644
--- a/lisp/makesum.el
+++ b/lisp/obsolete/makesum.el
@@ -4,6 +4,7 @@
;; Maintainer: emacs-devel@gnu.org
;; Keywords: help
+;; Obsolete-since: 29.1
;; This file is part of GNU Emacs.
@@ -32,7 +33,6 @@
"Make a summary of current key bindings in the buffer *Summary*.
Previous contents of that buffer are killed first."
(interactive)
- (message "Making command summary...")
;; This puts a description of bindings in a buffer called *Help*.
(save-window-excursion
(describe-bindings))
@@ -68,8 +68,7 @@ Previous contents of that buffer are killed first."
(forward-line -1)
(point)))))
(goto-char (point-min))
- (insert "Emacs command summary, " (substring (current-time-string) 0 10)
- ".\n")
+ (insert "Emacs command summary\n")
;; Delete "key binding" and underlining of dashes.
(delete-region (point) (progn (forward-line 2) (point)))
(forward-line 1) ;Skip blank line
@@ -79,8 +78,7 @@ Previous contents of that buffer are killed first."
(goto-char (point-max)))
(double-column beg (point))
(forward-line 1)))
- (goto-char (point-min)))))
- (message "Making command summary...done"))
+ (goto-char (point-min))))))
(defun double-column (start end)
"Reformat buffer contents from START to END into two columns."
diff --git a/lisp/mh-e/mh-compat.el b/lisp/obsolete/mh-compat.el
index 7a09429e4ef..a5be3bd7426 100644
--- a/lisp/mh-e/mh-compat.el
+++ b/lisp/obsolete/mh-compat.el
@@ -5,6 +5,7 @@
;; Author: Bill Wohler <wohler@newt.com>
;; Keywords: mail
;; See: mh-e.el
+;; Obsolete-since: 29.1
;; This file is part of GNU Emacs.
@@ -42,22 +43,6 @@
(define-obsolete-function-alias 'mh-assoc-string #'assoc-string "29.1")
(define-obsolete-function-alias 'mh-cancel-timer #'cancel-timer "29.1")
-;; Emacs 24 made flet obsolete and suggested either cl-flet or
-;; cl-letf. This macro is based upon gmm-flet from Gnus.
-(defmacro mh-flet (bindings &rest body)
- "Make temporary overriding function definitions.
-That is, temporarily rebind the functions listed in BINDINGS and then
-execute BODY. BINDINGS is a list containing one or more lists of the
-form (FUNCNAME ARGLIST BODY...), similar to defun."
- (declare (indent 1) (debug ((&rest (sexp sexp &rest form)) &rest form)))
- (if (fboundp 'cl-letf)
- `(cl-letf ,(mapcar (lambda (binding)
- `((symbol-function ',(car binding))
- (lambda ,@(cdr binding))))
- bindings)
- ,@body)
- `(flet ,bindings ,@body)))
-
(define-obsolete-function-alias 'mh-display-color-cells
#'display-color-cells "29.1")
@@ -69,6 +54,7 @@ The optional argument COMMON-SUBSTRING, if non-nil, should be a string
specifying a common substring for adding the faces
`completions-first-difference' and `completions-common-part' to
the completions."
+ (declare (obsolete nil "29.1"))
`(display-completion-list
(completion-hilit-commonality ,completions
,(length common-substring) nil)))
@@ -98,7 +84,7 @@ the completions."
(define-obsolete-function-alias 'mh-line-end-position
#'line-end-position "29.1")
-(require 'mailabbrev nil t)
+(require 'mailabbrev)
(define-obsolete-function-alias 'mh-mail-abbrev-make-syntax-table
#'mail-abbrev-make-syntax-table "29.1")
@@ -144,7 +130,6 @@ This is taken from RFC 2396.")
(provide 'mh-compat)
;; Local Variables:
-;; indent-tabs-mode: nil
;; sentence-end-double-space: nil
;; End:
diff --git a/lisp/net/netrc.el b/lisp/obsolete/netrc.el
index c272c07e4c5..f664a77a9b1 100644
--- a/lisp/net/netrc.el
+++ b/lisp/obsolete/netrc.el
@@ -4,6 +4,9 @@
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
+;; Obsolete-since: 29.1
+;;
+;; Instead of using `netrc-parse', use `auth-source-netrc-parse-all'.
;;
;; Modularized by Ted Zlatanov <tzz@lifelogs.com>
;; when it was part of Gnus.
@@ -50,6 +53,7 @@
(defun netrc-parse (&optional file)
"Parse FILE and return a list of all entries in the file."
+ (declare (obsolete auth-source-netrc-parse-all "29.1"))
(interactive "fFile to Parse: ")
(unless file
(setq file netrc-file))
@@ -63,8 +67,9 @@
"port"))
alist elem result pair)
(if (and netrc-cache
- (equal (car netrc-cache) (file-attribute-modification-time
- (file-attributes file))))
+ (time-equal-p (car netrc-cache)
+ (file-attribute-modification-time
+ (file-attributes file))))
(insert (base64-decode-string (rot13-string (cdr netrc-cache))))
(insert-file-contents file)
(when (string-match "\\.gpg\\'" file)
@@ -159,7 +164,8 @@ default ports DEFAULTS to `netrc-machine'.
MODE can be \"login\" or \"password\", suitable for passing to
`netrc-get'."
(let ((authinfo-list (if (stringp authinfo-file-or-list)
- (netrc-parse authinfo-file-or-list)
+ (with-suppressed-warnings ((obsolete netrc-parse))
+ (netrc-parse authinfo-file-or-list))
authinfo-file-or-list))
(ports (or ports '(nil)))
(defaults (or defaults '(nil)))
@@ -222,7 +228,8 @@ MODE can be \"login\" or \"password\", suitable for passing to
"Return a user name/password pair.
Port specifications will be prioritized in the order they are
listed in the PORTS list."
- (let ((list (netrc-parse))
+ (let ((list (with-suppressed-warnings ((obsolete netrc-parse))
+ (netrc-parse)))
found)
(if (not ports)
(setq found (netrc-machine list machine))
diff --git a/lisp/obsolete/ps-def.el b/lisp/obsolete/ps-def.el
new file mode 100644
index 00000000000..0f7f7609ca1
--- /dev/null
+++ b/lisp/obsolete/ps-def.el
@@ -0,0 +1,54 @@
+;;; ps-def.el --- Emacs definitions for ps-print -*- lexical-binding: t -*-
+
+;; Copyright (C) 2007-2022 Free Software Foundation, Inc.
+
+;; Author: Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>
+;; Kenichi Handa <handa@gnu.org> (multi-byte characters)
+;; Keywords: wp, print, PostScript
+;; URL: https://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre
+;; Package: ps-print
+;; Obsolete-since: 29.1
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; See ps-print.el for documentation.
+
+;;; Code:
+
+
+;; Emacs Definitions
+
+(defun ps-mark-active-p ()
+ (declare (obsolete mark-active "29.1"))
+ mark-active)
+
+(defun ps-face-foreground-name (face)
+ (declare (obsolete face-foreground "29.1"))
+ (face-foreground face nil t))
+
+(defun ps-face-background-name (face)
+ (declare (obsolete face-background "29.1"))
+ (face-background face nil t))
+
+(define-obsolete-function-alias 'ps-frame-parameter #'frame-parameter "28.1")
+(define-obsolete-function-alias 'ps-color-device #'display-color-p "29.1")
+(define-obsolete-function-alias 'ps-color-values #'color-values "28.1")
+
+(provide 'ps-def)
+
+;;; ps-def.el ends here
diff --git a/lisp/net/quickurl.el b/lisp/obsolete/quickurl.el
index 61cae43a88a..5ac10323d18 100644
--- a/lisp/net/quickurl.el
+++ b/lisp/obsolete/quickurl.el
@@ -5,6 +5,7 @@
;; Author: Dave Pearson <davep@davep.org>
;; Created: 1999-05-28
;; Keywords: hypermedia
+;; Obsolete-since: 29.1
;; This file is part of GNU Emacs.
diff --git a/lisp/obsolete/rcompile.el b/lisp/obsolete/rcompile.el
index fbfc0c6bbca..ceffb072cb4 100644
--- a/lisp/obsolete/rcompile.el
+++ b/lisp/obsolete/rcompile.el
@@ -167,7 +167,7 @@ See \\[compile]."
(compilation-start compile-command)
;; Set comint-file-name-prefix in the compilation buffer so
;; compilation-parse-errors will find referenced files by Tramp.
- (with-current-buffer compilation-last-buffer
+ (with-current-buffer next-error-last-buffer
(when (fboundp 'tramp-make-tramp-file-name)
(set (make-local-variable 'comint-file-name-prefix)
(funcall
diff --git a/lisp/url/url-about.el b/lisp/obsolete/url-about.el
index 3943cae9e59..608df3f2a5d 100644
--- a/lisp/url/url-about.el
+++ b/lisp/obsolete/url-about.el
@@ -1,8 +1,9 @@
;;; url-about.el --- Show internal URLs -*- lexical-binding: t; -*-
-;; Copyright (C) 2001, 2004-2022 Free Software Foundation, Inc.
+;; Copyright (C) 2001-2022 Free Software Foundation, Inc.
;; Keywords: comm, data, processes, hypermedia
+;; Obsolete-since: 29.1
;; This file is part of GNU Emacs.
;;
@@ -38,7 +39,7 @@
(if (string-match "url-\\(.*\\).el$" f)
(push (match-string 1 f) schemes)))
(directory-files d nil "\\`url-.*\\.el\\'")))
- load-path)
+ (seq-filter #'file-exists-p load-path))
(put 'url-extension-protocols 'schemes schemes)
schemes)))))
diff --git a/lisp/url/url-dired.el b/lisp/obsolete/url-dired.el
index e2c23a8b6d9..40057fb1747 100644
--- a/lisp/url/url-dired.el
+++ b/lisp/obsolete/url-dired.el
@@ -3,6 +3,7 @@
;; Copyright (C) 1996-1999, 2004-2022 Free Software Foundation, Inc.
;; Keywords: comm, files
+;; Obsolete-since: 29.1
;; This file is part of GNU Emacs.
@@ -27,7 +28,7 @@
(defvar-keymap url-dired-minor-mode-map
:doc "Keymap used when browsing directories."
- "C-m" #'url-dired-find-file
+ "RET" #'url-dired-find-file
"<mouse-2>" #'url-dired-find-file-mouse)
(defun url-dired-find-file ()
diff --git a/lisp/org/ob-core.el b/lisp/org/ob-core.el
index 04af84d2e44..3b114703cdc 100644
--- a/lisp/org/ob-core.el
+++ b/lisp/org/ob-core.el
@@ -136,8 +136,7 @@ used."
:type 'string
:safe (lambda (v)
(and (stringp v)
- (eq (compare-strings "RESULTS" nil nil v nil nil t)
- t))))
+ (string-equal-ignore-case "RESULTS" v))))
(defcustom org-babel-noweb-wrap-start "<<"
"String used to begin a noweb reference in a code block.
@@ -489,13 +488,13 @@ arguments, imagine you'd like to set the file name output of a
latex source block to a sha1 of its contents. We could achieve
this with:
-(defun org-src-sha ()
- (let ((elem (org-element-at-point)))
- (concat (sha1 (org-element-property :value elem)) \".svg\")))
+ (defun org-src-sha ()
+ (let ((elem (org-element-at-point)))
+ (concat (sha1 (org-element-property :value elem)) \".svg\")))
-(setq org-babel-default-header-args:latex
- `((:results . \"file link replace\")
- (:file . (lambda () (org-src-sha)))))
+ (setq org-babel-default-header-args:latex
+ `((:results . \"file link replace\")
+ (:file . (lambda () (org-src-sha)))))
Because the closure is evaluated with point at the source block,
the call to `org-element-at-point' above will always retrieve
@@ -2435,7 +2434,7 @@ INFO may provide the values of these header arguments (in the
;; Escape contents from "export" wrap. Wrap
;; inline results within an export snippet with
;; appropriate value.
- ((eq t (compare-strings type nil nil "export" nil nil t))
+ ((string-equal-ignore-case type "export")
(let ((backend (pcase split
(`(,_) "none")
(`(,_ ,b . ,_) b))))
@@ -2446,14 +2445,14 @@ INFO may provide the values of these header arguments (in the
backend) "@@)}}}")))
;; Escape contents from "example" wrap. Mark
;; inline results as verbatim.
- ((eq t (compare-strings type nil nil "example" nil nil t))
+ ((string-equal-ignore-case type "example")
(funcall wrap
opening-line closing-line
nil nil
"{{{results(=" "=)}}}"))
;; Escape contents from "src" wrap. Mark
;; inline results as inline source code.
- ((eq t (compare-strings type nil nil "src" nil nil t))
+ ((string-equal-ignore-case type "src")
(let ((inline-open
(pcase split
(`(,_)
diff --git a/lisp/org/ob-lilypond.el b/lisp/org/ob-lilypond.el
index 15538b50374..dd204d7f6b1 100644
--- a/lisp/org/ob-lilypond.el
+++ b/lisp/org/ob-lilypond.el
@@ -36,6 +36,7 @@
(declare-function org-show-all "org" (&optional types))
+;; FIXME: Doesn't this rather belong in lilypond-mode.el?
(defalias 'lilypond-mode 'LilyPond-mode)
(add-to-list 'org-babel-tangle-lang-exts '("LilyPond" . "ly"))
diff --git a/lisp/org/ob-tangle.el b/lisp/org/ob-tangle.el
index 566258eba4a..525d27bc070 100644
--- a/lisp/org/ob-tangle.el
+++ b/lisp/org/ob-tangle.el
@@ -581,7 +581,10 @@ which enable the original code blocks to be found."
(error "Not in tangled code"))
(setq body (buffer-substring body-start end)))
;; Go to the beginning of the relative block in Org file.
- (org-link-open-from-string link)
+ ;; Explicitly allow fuzzy search even if user customized
+ ;; otherwise.
+ (let (org-link-search-must-match-exact-headline)
+ (org-link-open-from-string link))
(setq target-buffer (current-buffer))
(if (string-match "[^ \t\n\r]:\\([[:digit:]]+\\)" block-name)
(let ((n (string-to-number (match-string 1 block-name))))
diff --git a/lisp/org/oc-basic.el b/lisp/org/oc-basic.el
index 9ed1b810fab..8c76e200e4f 100644
--- a/lisp/org/oc-basic.el
+++ b/lisp/org/oc-basic.el
@@ -73,6 +73,7 @@
(require 'seq)
(declare-function org-open-at-point "org" (&optional arg))
+(declare-function org-open-file "org" (path &optional in-emacs line search))
(declare-function org-element-interpret-data "org-element" (data))
(declare-function org-element-property "org-element" (property element))
diff --git a/lisp/org/ol.el b/lisp/org/ol.el
index a0dad926bc2..a9e613e0d4e 100644
--- a/lisp/org/ol.el
+++ b/lisp/org/ol.el
@@ -646,7 +646,7 @@ followed by another \"%[A-F0-9]{2}\" group."
(cons 6 128))))
(when (>= val 192) (setq eat (car shift-xor)))
(setq val (logxor val (cdr shift-xor)))
- (setq sum (+ (lsh sum (car shift-xor)) val))
+ (setq sum (+ (ash sum (car shift-xor)) val))
(when (> eat 0) (setq eat (- eat 1)))
(cond
((= 0 eat) ;multi byte
@@ -937,7 +937,7 @@ characters that should be escaped."
(defun org-link-decode (s)
"Decode percent-encoded parts in string S.
-E.g. \"%C3%B6\" becomes the german o-Umlaut."
+E.g. \"%C3%B6\" becomes the German o-Umlaut."
(replace-regexp-in-string "\\(%[0-9A-Za-z]\\{2\\}\\)+"
#'org-link--decode-compound s t t))
diff --git a/lisp/org/org-compat.el b/lisp/org/org-compat.el
index 3e394fbab1c..085e32d6774 100644
--- a/lisp/org/org-compat.el
+++ b/lisp/org/org-compat.el
@@ -113,6 +113,11 @@ the symbol of the calling function, for example."
;;; Emacs < 27.1 compatibility
+(if (version< emacs-version "27.1")
+ (defsubst org-replace-buffer-contents (source &optional _max-secs _max-costs)
+ (replace-buffer-contents source))
+ (defalias 'org-replace-buffer-contents #'replace-buffer-contents))
+
(unless (fboundp 'proper-list-p)
;; `proper-list-p' was added in Emacs 27.1. The function below is
;; taken from Emacs subr.el 200195e824b^.
@@ -929,6 +934,14 @@ Implements `define-error' for older emacsen."
(put name 'error-conditions
(copy-sequence (cons name (get 'error 'error-conditions))))))
+(unless (fboundp 'string-equal-ignore-case)
+ ;; From Emacs subr.el.
+ (defun string-equal-ignore-case (string1 string2)
+ "Like `string-equal', but case-insensitive.
+Upper-case and lower-case letters are treated as equal.
+Unibyte strings are converted to multibyte for comparison."
+ (eq t (compare-strings string1 0 nil string2 0 nil t))))
+
(unless (fboundp 'string-suffix-p)
;; From Emacs subr.el.
(defun string-suffix-p (suffix string &optional ignore-case)
@@ -1120,10 +1133,8 @@ ELEMENT is the element at point."
(and log
(let ((drawer (org-element-lineage element '(drawer))))
(and drawer
- (eq (compare-strings
- log nil nil
- (org-element-property :drawer-name drawer) nil nil t)
- t)))))
+ (string-equal-ignore-case
+ log (org-element-property :drawer-name drawer))))))
nil)
(t
(cl-case (org-element-type element)
diff --git a/lisp/org/org-lint.el b/lisp/org/org-lint.el
index 83c2d08a907..6d8cf3f2374 100644
--- a/lisp/org/org-lint.el
+++ b/lisp/org/org-lint.el
@@ -334,10 +334,8 @@ called with one argument, the key used for comparison."
ast
'node-property
(lambda (property)
- (and (eq (compare-strings "CUSTOM_ID" nil nil
- (org-element-property :key property) nil nil
- t)
- t)
+ (and (string-equal-ignore-case
+ "CUSTOM_ID" (org-element-property :key property))
(org-element-property :value property)))
(lambda (property _) (org-element-property :begin property))
(lambda (key) (format "Duplicate CUSTOM_ID property \"%s\"" key))))
diff --git a/lisp/org/org-plot.el b/lisp/org/org-plot.el
index 7cce678a81b..831c84befcb 100644
--- a/lisp/org/org-plot.el
+++ b/lisp/org/org-plot.el
@@ -622,7 +622,7 @@ manner suitable for prepending to a user-specified script."
(dolist (img-overlay org-inline-image-overlays)
(when (string= img-file (plist-get (cdr (overlay-get img-overlay 'display)) :file))
(when (file-exists-p img-file)
- (image-refresh (overlay-get img-overlay 'display))))))
+ (image-flush (overlay-get img-overlay 'display))))))
;;-----------------------------------------------------------------------------
;; facade functions
@@ -682,9 +682,10 @@ line directly before or after the table."
(looking-at "[[:space:]]*#\\+"))
(setf params (org-plot/collect-options params))))
;; Dump table to datafile
- (if-let ((dump-func (plist-get type :data-dump)))
- (funcall dump-func table data-file num-cols params)
- (org-plot/gnuplot-to-data table data-file params))
+ (let ((dump-func (plist-get type :data-dump)))
+ (if dump-func
+ (funcall dump-func table data-file num-cols params)
+ (org-plot/gnuplot-to-data table data-file params)))
;; Check type of ind column (timestamp? text?)
(when (plist-get params :check-ind-type)
(let* ((ind (1- (plist-get params :ind)))
diff --git a/lisp/org/org-src.el b/lisp/org/org-src.el
index 54f901252f2..89d0c28a432 100644
--- a/lisp/org/org-src.el
+++ b/lisp/org/org-src.el
@@ -1235,7 +1235,7 @@ Throw an error if there is no such buffer."
(insert (with-current-buffer write-back-buf (buffer-string))))
(save-restriction
(narrow-to-region beg end)
- (replace-buffer-contents write-back-buf 0.1 nil)
+ (org-replace-buffer-contents write-back-buf 0.1 nil)
(goto-char (point-max))))
(when (and expecting-bol (not (bolp))) (insert "\n")))
(kill-buffer write-back-buf)
@@ -1283,7 +1283,7 @@ Throw an error if there is no such buffer."
(buffer-string))))
(save-restriction
(narrow-to-region beg end)
- (replace-buffer-contents write-back-buf 0.1 nil)
+ (org-replace-buffer-contents write-back-buf 0.1 nil)
(goto-char (point-max))))
(when (and expecting-bol (not (bolp))) (insert "\n")))))
(when write-back-buf (kill-buffer write-back-buf))
diff --git a/lisp/org/org-version.el b/lisp/org/org-version.el
index 2a500fe5106..915c3f63c7d 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."
(defun org-git-version ()
"The Git version of Org mode.
Inserted by installing Org or when a release is made."
- (let ((org-git-version "release_9.5.4-3-g6dc785"))
+ (let ((org-git-version "release_9.5.4-17-g6e991f"))
org-git-version))
(provide 'org-version)
diff --git a/lisp/org/org.el b/lisp/org/org.el
index 008230500d7..df708a2159d 100644
--- a/lisp/org/org.el
+++ b/lisp/org/org.el
@@ -82,8 +82,8 @@
(or (eq this-command 'eval-buffer)
(condition-case nil
(load (concat (file-name-directory load-file-name)
- "org-loaddefs.el")
- nil t t t)
+ "org-loaddefs")
+ nil t nil t)
(error
(message "WARNING: No org-loaddefs.el file could be found from where org.el is loaded.")
(sit-for 3)
@@ -1357,7 +1357,7 @@ Possible values for the file identifier are:
to open [[file:document.pdf::5]] with evince at page 5.
`directory' Matches a directory
- `remote' Matches a remote file, accessible through tramp or efs.
+ `remote' Matches a remote file, accessible through tramp.
Remote files most likely should be visited through Emacs
because external applications cannot handle such paths.
`auto-mode' Matches files that are matched by any entry in `auto-mode-alist',
@@ -1694,7 +1694,7 @@ OK to kill that hidden subtree. When nil, kill without remorse."
(const :tag "Never kill a hidden subtree with C-k" error)))
(defcustom org-special-ctrl-o t
- "Non-nil means, make `C-o' insert a row in tables."
+ "Non-nil means, make `open-line' (\\[open-line]) insert a row in tables."
:group 'org-edit-structure
:type 'boolean)
@@ -3807,10 +3807,6 @@ This is needed for font-lock setup.")
(declare-function dired-get-filename
"dired"
(&optional localp no-error-if-not-filep))
-(declare-function iswitchb-read-buffer
- "iswitchb"
- (prompt &optional
- default require-match _predicate start matches-set))
(declare-function org-agenda-change-all-lines
"org-agenda"
(newhead hdmarker &optional fixface just-this))
@@ -3844,7 +3840,6 @@ This is needed for font-lock setup.")
(defvar calc-embedded-open-formula)
(defvar calc-embedded-open-mode)
(defvar font-lock-unfontify-region-function)
-(defvar iswitchb-temp-buflist)
(defvar org-agenda-tags-todo-honor-ignore-options)
(defvar remember-data-file)
(defvar texmathp-why)
@@ -9319,6 +9314,7 @@ TYPE is the dynamic block type, as a string."
"List all defined dynamic block types."
(mapcar #'car org-dynamic-block-alist))
+;;;###org-autoload
(defun org-dynamic-block-define (type func)
"Define dynamic block TYPE with FUNC.
TYPE is a string. FUNC is the function creating the dynamic
@@ -16486,7 +16482,7 @@ INCLUDE-LINKED is passed to `org-display-inline-images'."
(org-toggle-inline-images)))
;; For without-x builds.
-(declare-function image-refresh "image" (spec &optional frame))
+(declare-function image-flush "image" (spec &optional frame))
(defcustom org-display-remote-inline-images 'skip
"How to display remote inline images.
@@ -16627,7 +16623,7 @@ buffer boundaries with possible narrowing."
(org-element-property :begin link)
'org-image-overlay)))
(if (and (car-safe old) refresh)
- (image-refresh (overlay-get (cdr old) 'display))
+ (image-flush (overlay-get (cdr old) 'display))
(let ((image (org--create-inline-image file width)))
(when image
(let ((ov (make-overlay
diff --git a/lisp/org/ox-ascii.el b/lisp/org/ox-ascii.el
index 38b2a5772c1..76a1a71fabe 100644
--- a/lisp/org/ox-ascii.el
+++ b/lisp/org/ox-ascii.el
@@ -948,12 +948,18 @@ channel."
(when description
(let ((dest (if (equal type "fuzzy")
(org-export-resolve-fuzzy-link link info)
- (org-export-resolve-id-link link info))))
- (concat
- (org-ascii--fill-string
- (format "[%s] %s" anchor (org-ascii--describe-datum dest info))
- width info)
- "\n\n"))))
+ ;; Ignore broken links. On broken link,
+ ;; `org-export-resolve-id-link' will throw an
+ ;; error and we will return nil.
+ (condition-case nil
+ (org-export-resolve-id-link link info)
+ (org-link-broken nil)))))
+ (when dest
+ (concat
+ (org-ascii--fill-string
+ (format "[%s] %s" anchor (org-ascii--describe-datum dest info))
+ width info)
+ "\n\n")))))
;; Do not add a link that cannot be resolved and doesn't have
;; any description: destination is already visible in the
;; paragraph.
diff --git a/lisp/org/ox-md.el b/lisp/org/ox-md.el
index ad684d80333..3551e4184e5 100644
--- a/lisp/org/ox-md.el
+++ b/lisp/org/ox-md.el
@@ -193,11 +193,11 @@ of contents can refer to headlines."
;; A link refers internally to HEADLINE.
(org-element-map (plist-get info :parse-tree) 'link
(lambda (link)
- (eq headline
- (pcase (org-element-property :type link)
- ((or "custom-id" "id") (org-export-resolve-id-link link info))
- ("fuzzy" (org-export-resolve-fuzzy-link link info))
- (_ nil))))
+ (equal headline
+ ;; Ignore broken links.
+ (condition-case nil
+ (org-export-resolve-id-link link info)
+ (org-link-broken nil))))
info t))))
(defun org-md--headline-title (style level title &optional anchor tags)
diff --git a/lisp/org/ox.el b/lisp/org/ox.el
index ae7e41e576b..9a2a69b2c16 100644
--- a/lisp/org/ox.el
+++ b/lisp/org/ox.el
@@ -80,6 +80,7 @@
(require 'org-element)
(require 'org-macro)
(require 'tabulated-list)
+(require 'subr-x)
(declare-function org-src-coderef-format "org-src" (&optional element))
(declare-function org-src-coderef-regexp "org-src" (fmt &optional label))
@@ -1908,8 +1909,10 @@ Return a string."
(org-element-property :archivedp data)))
(let ((transcoder (org-export-transcoder data info)))
(or (and (functionp transcoder)
- (broken-link-handler
- (funcall transcoder data nil info)))
+ (if (eq type 'link)
+ (broken-link-handler
+ (funcall transcoder data nil info))
+ (funcall transcoder data nil info)))
;; Export snippets never return a nil value so
;; that white spaces following them are never
;; ignored.
@@ -4434,15 +4437,12 @@ INFO is a plist used as a communication channel.
Return value can be a radio-target object or nil. Assume LINK
has type \"radio\"."
- (let ((path (replace-regexp-in-string
- "[ \r\t\n]+" " " (org-element-property :path link))))
+ (let ((path (string-clean-whitespace (org-element-property :path link))))
(org-element-map (plist-get info :parse-tree) 'radio-target
(lambda (radio)
- (and (eq (compare-strings
- (replace-regexp-in-string
- "[ \r\t\n]+" " " (org-element-property :value radio))
- nil nil path nil nil t)
- t)
+ (and (string-equal-ignore-case
+ (string-clean-whitespace (org-element-property :value radio))
+ path)
radio))
info 'first-match)))
@@ -6479,7 +6479,7 @@ to send the output file through additional processing, e.g,
(let ((outfile (org-export-output-file-name \".tex\" subtreep)))
(org-export-to-file \\='latex outfile
async subtreep visible-only body-only ext-plist
- #'org-latex-compile)))
+ #\\='org-latex-compile)))
When expressed as an anonymous function, using `lambda',
POST-PROCESS needs to be quoted.
diff --git a/lisp/outline.el b/lisp/outline.el
index 38a37fb74d3..3250b62f1e7 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -35,6 +35,7 @@
;;; Code:
(eval-when-compile (require 'cl-lib))
+(require 'icons)
(defgroup outlines nil
"Support for hierarchical outlining."
@@ -280,23 +281,33 @@ This option is only in effect when `outline-minor-mode-cycle' is non-nil."
[outline-1 outline-2 outline-3 outline-4
outline-5 outline-6 outline-7 outline-8])
-(defcustom outline-minor-mode-use-buttons nil
- "If non-nil, use clickable buttons on the headings.
-Note that this feature is not meant to be used in editing
-buffers (yet) -- that will be amended in a future version.
+(defcustom outline-minor-mode-use-buttons '(derived-mode . help-mode)
+ "Whether to display clickable buttons on the headings.
+The value should be a `buffer-match-p' condition.
-The `outline-minor-mode-buttons' variable specifies how the
-buttons should look."
- :type 'boolean
+These buttons can be used to hide and show the body under the heading.
+Note that this feature is not meant to be used in editing
+buffers (yet) -- that will be amended in a future version."
+ ;; FIXME -- is there a `buffer-match-p' defcustom type somewhere?
+ :type 'sexp
:safe #'booleanp
:version "29.1")
-(defcustom outline-minor-mode-buttons
- '(("▶️" "🔽" outline--valid-emoji-p)
- ("▶" "▼" outline--valid-char-p))
- "List of close/open pairs to use if using buttons."
- :type 'sexp
- :version "29.1")
+(define-icon outline-open button
+ '((emoji "🔽")
+ (symbol " ▼ ")
+ (text " open "))
+ "Icon used for buttons for opening a section in outline buffers."
+ :version "29.1"
+ :help-echo "Open this section")
+
+(define-icon outline-close button
+ '((emoji "▶️")
+ (symbol " ▶ ")
+ (text " close "))
+ "Icon used for buttons for closing a section in outline buffers."
+ :version "29.1"
+ :help-echo "Close this section")
(defvar outline-level #'outline-level
@@ -316,6 +327,7 @@ data reflects the `outline-regexp'.")
(defvar outline-view-change-hook nil
"Normal hook to be run after outline visibility changes.")
+(make-obsolete-variable 'outline-view-change-hook nil "29.1")
(defvar outline-mode-hook nil
"This hook is run when outline mode starts.")
@@ -423,7 +435,7 @@ outline font-lock faces to those of major mode."
(goto-char (match-beginning 0))
(not (get-text-property (point) 'face))))
(overlay-put overlay 'face (outline-font-lock-face)))
- (when outline-minor-mode-use-buttons
+ (when (and (outline--use-buttons-p) (outline-on-heading-p))
(outline--insert-open-button)))
(goto-char (match-end 0))))))
@@ -440,11 +452,10 @@ See the command `outline-mode' for more information on this mode."
(if outline-minor-mode
(progn
(when outline-minor-mode-highlight
- (if (and global-font-lock-mode (font-lock-specified-p major-mode))
- (progn
- (font-lock-add-keywords nil outline-font-lock-keywords t)
- (font-lock-flush))
- (outline-minor-mode-highlight-buffer)))
+ (when (and global-font-lock-mode (font-lock-specified-p major-mode))
+ (font-lock-add-keywords nil outline-font-lock-keywords t)
+ (font-lock-flush))
+ (outline-minor-mode-highlight-buffer))
;; Turn off this mode if we change major modes.
(add-hook 'change-major-mode-hook
(lambda () (outline-minor-mode -1))
@@ -464,6 +475,10 @@ See the command `outline-mode' for more information on this mode."
;; When turning off outline mode, get rid of any outline hiding.
(outline-show-all)))
+(defun outline--use-buttons-p ()
+ (and outline-minor-mode
+ (buffer-match-p outline-minor-mode-use-buttons (current-buffer))))
+
(defvar-local outline-heading-alist ()
"Alist associating a heading for every possible level.
Each entry is of the form (HEADING . LEVEL).
@@ -846,7 +861,6 @@ If FLAG is nil then text is shown, while if FLAG is t the text is hidden."
(or outline-isearch-open-invisible-function
#'outline-isearch-open-invisible))))
(outline--fix-up-all-buttons from to)
- ;; Seems only used by lazy-lock. I.e. obsolete.
(run-hooks 'outline-view-change-hook))
(defun outline-reveal-toggle-invisible (o hidep)
@@ -968,26 +982,10 @@ If non-nil, EVENT should be a mouse event."
(interactive (list last-nonmenu-event))
(when (mouse-event-p event)
(mouse-set-point event))
- (when (and outline-minor-mode-use-buttons outline-minor-mode)
+ (when (outline--use-buttons-p)
(outline--insert-close-button))
(outline-flag-subtree t))
-(defun outline--make-button (type)
- (cl-loop for (close open test) in outline-minor-mode-buttons
- when (and (funcall test close) (funcall test open))
- return (concat (if (eq type 'close)
- close
- open)
- " " (buffer-substring (point) (1+ (point))))))
-
-(defun outline--valid-emoji-p (string)
- (when-let ((font (and (display-multi-font-p)
- (car (internal-char-font nil ?😀)))))
- (font-has-char-p font (aref string 0))))
-
-(defun outline--valid-char-p (string)
- (char-displayable-p (aref string 0)))
-
(defun outline--make-button-overlay (type)
(let ((o (seq-find (lambda (o)
(overlay-get o 'outline-button))
@@ -997,35 +995,56 @@ If non-nil, EVENT should be a mouse event."
(overlay-put o 'follow-link 'mouse-face)
(overlay-put o 'mouse-face 'highlight)
(overlay-put o 'outline-button t))
- (overlay-put o 'display (outline--make-button type))
+ (let ((icon
+ (icon-elements (if (eq type 'close) 'outline-close 'outline-open)))
+ (inhibit-read-only t))
+ ;; In editing buffers we use overlays only, but in other buffers
+ ;; we use a mix of text properties, text and overlays to make
+ ;; movement commands work more logically.
+ (when (derived-mode-p 'special-mode)
+ (put-text-property (point) (1+ (point)) 'face (plist-get icon 'face)))
+ (when-let ((image (plist-get icon 'image)))
+ (overlay-put o 'display image))
+ (overlay-put o 'display (plist-get icon 'string))
+ (overlay-put o 'face (plist-get icon 'face)))
o))
(defun outline--insert-open-button ()
- (save-excursion
- (beginning-of-line)
- (let ((o (outline--make-button-overlay 'open)))
- (overlay-put o 'help-echo "Click to hide")
- (overlay-put o 'keymap
- (define-keymap
- "RET" #'outline-hide-subtree
- "<mouse-2>" #'outline-hide-subtree)))))
+ (with-silent-modifications
+ (save-excursion
+ (beginning-of-line)
+ (when (derived-mode-p 'special-mode)
+ (let ((inhibit-read-only t))
+ (insert " ")
+ (beginning-of-line)))
+ (let ((o (outline--make-button-overlay 'open)))
+ (overlay-put o 'help-echo "Click to hide")
+ (overlay-put o 'keymap
+ (define-keymap
+ "RET" #'outline-hide-subtree
+ "<mouse-2>" #'outline-hide-subtree))))))
(defun outline--insert-close-button ()
- (save-excursion
- (beginning-of-line)
- (let ((o (outline--make-button-overlay 'close)))
- (overlay-put o 'help-echo "Click to show")
- (overlay-put o 'keymap
- (define-keymap
- "RET" #'outline-show-subtree
- "<mouse-2>" #'outline-show-subtree)))))
+ (with-silent-modifications
+ (save-excursion
+ (beginning-of-line)
+ (when (derived-mode-p 'special-mode)
+ (let ((inhibit-read-only t))
+ (insert " ")
+ (beginning-of-line)))
+ (let ((o (outline--make-button-overlay 'close)))
+ (overlay-put o 'help-echo "Click to show")
+ (overlay-put o 'keymap
+ (define-keymap
+ "RET" #'outline-show-subtree
+ "<mouse-2>" #'outline-show-subtree))))))
(defun outline--fix-up-all-buttons (&optional from to)
(when from
(save-excursion
(goto-char from)
(setq from (line-beginning-position))))
- (when outline-minor-mode-use-buttons
+ (when (outline--use-buttons-p)
(outline-map-region
(lambda ()
;; `outline--cycle-state' will fail if we're in a totally
@@ -1056,7 +1075,7 @@ If non-nil, EVENT should be a mouse event."
(interactive (list last-nonmenu-event))
(when (mouse-event-p event)
(mouse-set-point event))
- (when (and outline-minor-mode-use-buttons outline-minor-mode)
+ (when (outline--use-buttons-p)
(outline--insert-open-button))
(outline-flag-subtree nil))
diff --git a/lisp/pgtk-dnd.el b/lisp/pgtk-dnd.el
index f9532269d62..b37bf9ba60a 100644
--- a/lisp/pgtk-dnd.el
+++ b/lisp/pgtk-dnd.el
@@ -336,18 +336,32 @@ Currently XDND, Motif and old KDE 1.x protocols are recognized."
(declare-function pgtk-update-drop-status "pgtkselect.c")
(declare-function pgtk-drop-finish "pgtkselect.c")
+(defvar pgtk-dnd-clear-data-on-motion nil
+ "Whether or not to obtain the new list of targets upon the next drag motion.
+For more details, see the function `pgtk-dnd-handle-gdk'.")
+
(defun pgtk-dnd-handle-gdk (event frame window client-message)
"Handle drag-n-drop EVENT on FRAME.
WINDOW should be the window the event happened on top of.
CLIENT-MESSAGE is the detailed description of the drag-and-drop
message."
(cond
- ;; We can't handle `drag-leave' here, since that signal is also
- ;; sent right before `drag-drop', and there is no reliable way to
- ;; distinguish the two.
+ ;; We can't handle `drag-leave' immediately, since that signal is
+ ;; also sent right before `drag-drop', and there is no reliable way
+ ;; to distinguish a signal sent because the source left from one
+ ;; sent prior to a drop. Instead, set a flag that tells Emacs to
+ ;; clear the drag-and-drop state if anything other than a drop is
+ ;; received.
+ ((not client-message) ; drag-leave
+ (setq pgtk-dnd-clear-data-on-motion t))
((eq (car client-message) 'lambda) ; drag-motion
(let ((state (pgtk-dnd-get-state-for-frame frame)))
- (unless (aref state 0) ;; This is actually an entry.
+ (unless (and (aref state 0) ;; This is actually an entry.
+ (not pgtk-dnd-clear-data-on-motion))
+ (setq pgtk-dnd-clear-data-on-motion nil)
+ ;; Forget the drop first, or else the list of targets will not
+ ;; be cleared if it is nil.
+ (pgtk-dnd-forget-drop window)
(pgtk-dnd-save-state window nil nil
(pgtk-get-selection-internal
(nth 1 client-message) 'TARGETS)
diff --git a/lisp/pixel-scroll.el b/lisp/pixel-scroll.el
index fc7e680c262..6dba733b9c4 100644
--- a/lisp/pixel-scroll.el
+++ b/lisp/pixel-scroll.el
@@ -759,6 +759,10 @@ It is a vector of the form [ VELOCITY TIME SIGN ]."
(interactive "e")
(when pixel-scroll-precision-use-momentum
(let ((window (mwheel-event-window event))
+ ;; The animations are smoother if the GC threshold is
+ ;; reduced for the duration of the animation.
+ (gc-cons-threshold (min most-positive-fixnum
+ (* gc-cons-threshold 3)))
(state nil))
(when (framep window)
(setq window (frame-selected-window window)))
@@ -767,43 +771,43 @@ It is a vector of the form [ VELOCITY TIME SIGN ]."
(listp (aref state 0)))
(condition-case nil
(while-no-input
- (unwind-protect (progn
- (aset state 0 (pixel-scroll-calculate-velocity state))
- (when (> (abs (aref state 0))
- pixel-scroll-precision-momentum-min-velocity)
- (let* ((velocity (aref state 0))
- (original-velocity velocity)
- (time-spent 0))
- (if (> velocity 0)
- (while (and (> velocity 0)
- (<= time-spent
- pixel-scroll-precision-momentum-seconds))
- (when (> (round velocity) 0)
- (with-selected-window window
- (pixel-scroll-precision-scroll-up (round velocity))))
- (setq velocity (- velocity
- (/ original-velocity
- (/ pixel-scroll-precision-momentum-seconds
- pixel-scroll-precision-momentum-tick))))
- (redisplay t)
- (sit-for pixel-scroll-precision-momentum-tick)
- (setq time-spent (+ time-spent
- pixel-scroll-precision-momentum-tick))))
- (while (and (< velocity 0)
- (<= time-spent
- pixel-scroll-precision-momentum-seconds))
- (when (> (round (abs velocity)) 0)
- (with-selected-window window
- (pixel-scroll-precision-scroll-down (round
- (abs velocity)))))
- (setq velocity (+ velocity
- (/ (abs original-velocity)
- (/ pixel-scroll-precision-momentum-seconds
- pixel-scroll-precision-momentum-tick))))
- (redisplay t)
- (sit-for pixel-scroll-precision-momentum-tick)
- (setq time-spent (+ time-spent
- pixel-scroll-precision-momentum-tick))))))
+ (unwind-protect
+ (progn
+ (aset state 0 (pixel-scroll-calculate-velocity state))
+ (when (> (abs (aref state 0))
+ pixel-scroll-precision-momentum-min-velocity)
+ (let* ((velocity (aref state 0))
+ (original-velocity velocity)
+ (time-spent 0))
+ (if (> velocity 0)
+ (while (and (> velocity 0)
+ (<= time-spent
+ pixel-scroll-precision-momentum-seconds))
+ (when (> (round velocity) 0)
+ (with-selected-window window
+ (pixel-scroll-precision-scroll-up (round velocity))))
+ (setq velocity (- velocity
+ (/ original-velocity
+ (/ pixel-scroll-precision-momentum-seconds
+ pixel-scroll-precision-momentum-tick))))
+ (sit-for pixel-scroll-precision-momentum-tick)
+ (setq time-spent (+ time-spent
+ pixel-scroll-precision-momentum-tick))))
+ (while (and (< velocity 0)
+ (<= time-spent
+ pixel-scroll-precision-momentum-seconds))
+ (when (> (round (abs velocity)) 0)
+ (with-selected-window window
+ (pixel-scroll-precision-scroll-down (round
+ (abs velocity)))))
+ (setq velocity (+ velocity
+ (/ (abs original-velocity)
+ (/ pixel-scroll-precision-momentum-seconds
+ pixel-scroll-precision-momentum-tick))))
+ (redisplay t)
+ (sit-for pixel-scroll-precision-momentum-tick)
+ (setq time-spent (+ time-spent
+ pixel-scroll-precision-momentum-tick))))))
(aset state 0 (make-ring 30))
(aset state 1 nil)))
(beginning-of-buffer
diff --git a/lisp/play/5x5.el b/lisp/play/5x5.el
index 8fe72ddf593..fb944f4d76a 100644
--- a/lisp/play/5x5.el
+++ b/lisp/play/5x5.el
@@ -82,13 +82,6 @@
;; Non-customize variables.
-(defmacro 5x5-defvar-local (var value doc)
- "Define VAR to VALUE with documentation DOC and make it buffer local."
- (declare (obsolete defvar-local "28.1"))
- `(progn
- (defvar ,var ,value ,doc)
- (make-variable-buffer-local (quote ,var))))
-
(defvar-local 5x5-grid nil
"5x5 grid contents.")
@@ -930,14 +923,15 @@ lest."
;; Support functions
-(define-obsolete-function-alias '5x5-xor 'xor "27.1")
-
(defun 5x5-y-or-n-p (prompt)
"5x5 wrapper for `y-or-n-p' which respects the `5x5-hassle-me' setting."
(if 5x5-hassle-me
(y-or-n-p prompt)
t))
+(define-obsolete-function-alias '5x5-xor #'xor "27.1")
+(define-obsolete-function-alias '5x5-defvar-local #'defvar-local "28.1")
+
(provide '5x5)
;;; 5x5.el ends here
diff --git a/lisp/play/bubbles.el b/lisp/play/bubbles.el
index 93fbc3b51b7..808fc82d19a 100644
--- a/lisp/play/bubbles.el
+++ b/lisp/play/bubbles.el
@@ -30,6 +30,8 @@
;; Bubbles is an implementation of the "Same Game", similar to "Same
;; GNOME" and many others, see <https://en.wikipedia.org/wiki/SameGame>.
+;;; Code:
+
;; ======================================================================
;;; History:
@@ -70,8 +72,6 @@
;; ======================================================================
-;;; Code:
-
(require 'gamegrid)
;; User options
@@ -812,7 +812,7 @@ static char * dot3d_xpm[] = {
(defvar-keymap bubbles-mode-map
:doc "Mode map for `bubbles'."
:name 'bubbles-mode-map
- "q" #'bubbles-quit
+ "q" #'quit-window
"C-j" #'bubbles-plop
"SPC" #'bubbles-plop
"C-m" #'bubbles-plop
@@ -871,7 +871,7 @@ static char * dot3d_xpm[] = {
["Save all settings" bubbles-save-settings]
"---"
["New game" bubbles]
- ["Quit" bubbles-quit]))
+ ["Quit" quit-window]))
;; bind menu to mouse
(define-key bubbles-mode-map [down-mouse-3] bubbles-menu)
@@ -910,6 +910,7 @@ columns on its right towards the left.
(defun bubbles-quit ()
"Quit Bubbles."
+ (declare (obsolete quit-window "29.1"))
(interactive nil bubbles-mode)
(message "bubbles-quit")
(bury-buffer))
diff --git a/lisp/play/cookie1.el b/lisp/play/cookie1.el
index fcdd2a7ce94..7ede8e358aa 100644
--- a/lisp/play/cookie1.el
+++ b/lisp/play/cookie1.el
@@ -123,7 +123,8 @@ Emit STARTMSG and ENDMSG before and after. Cache the result; second
and subsequent calls on the same file won't go to disk."
(setq phrase-file (cookie-check-file phrase-file))
(let ((sym (intern-soft phrase-file cookie-cache)))
- (and sym (not (equal (symbol-function sym)
+ (and sym (not (time-equal-p
+ (symbol-function sym)
(file-attribute-modification-time
(file-attributes phrase-file))))
(yes-or-no-p (concat phrase-file
diff --git a/lisp/play/doctor.el b/lisp/play/doctor.el
index b93d768cbe3..f87068e113c 100644
--- a/lisp/play/doctor.el
+++ b/lisp/play/doctor.el
@@ -1,7 +1,6 @@
;;; doctor.el --- psychological help for frustrated users -*- lexical-binding: t -*-
-;; Copyright (C) 1985, 1987, 1994, 1996, 2000-2022 Free Software
-;; Foundation, Inc.
+;; Copyright (C) 1985-2022 Free Software Foundation, Inc.
;; Maintainer: emacs-devel@gnu.org
;; Keywords: games
@@ -136,14 +135,14 @@ Like Text mode with Auto Fill mode
except that RET when point is after a newline, or LFD at any time,
reads the sentence before point, and prints the Doctor's answer."
:interactive nil
- (make-doctor-variables)
+ (doctor-make-variables)
(turn-on-auto-fill)
(doctor-type '(i am the psychotherapist \.
(doc$ doctor--please) (doc$ doctor--describe) your (doc$ doctor--problems) \.
each time you are finished talking\, type \R\E\T twice \.))
(insert "\n"))
-(defun make-doctor-variables ()
+(defun doctor-make-variables ()
(setq-local doctor--typos
(mapcar (lambda (x)
(put (car x) 'doctor-correction (cadr x))
@@ -1577,13 +1576,14 @@ Hack on previous word, setting global variable DOCTOR-OWNER to correct result."
(equal doctor-found 'killing))
(memq 'yourself doctor-sent)))
(setq doctor--suicide-flag t)
- (doctor-type '(If you are really suicidal\, you might
- want to contact the Samaritans via
- E-mail: jo@samaritans.org or\, at your option\,
- anonymous E-mail: samaritans@anon.twwells.com\ \.
- or find a Befrienders crisis center at
- https://www.befrienders.org/\ \.
- (doc$ doctor--please) (doc$ doctor--continue) \.)))
+ (doctor-type '( If you are really suicidal\, you might
+ want to contact the Samaritans via
+ e-mail: jo@samaritans.org \.
+ or find a Befrienders crisis center at
+ https://www.befrienders.org/\ \.
+ you can also find other suicide crisis lines at
+ https://en.wikipedia.org/wiki/List_of_suicide_crisis_lines \.
+ (doc$ doctor--please) (doc$ doctor--continue) \.)))
(t (doctor-type (doc$ doctor--deathlst)))))
(defun doctor-foul ()
@@ -1619,6 +1619,8 @@ Hack on previous word, setting global variable DOCTOR-OWNER to correct result."
(defun doctor-chat () (doctor-type (doc$ doctor--chatlst)))
+(define-obsolete-function-alias 'make-doctor-variables #'doctor-make-variables "29.1")
+
(provide 'doctor)
;;; doctor.el ends here
diff --git a/lisp/play/dunnet.el b/lisp/play/dunnet.el
index b859176bb47..94392901be1 100644
--- a/lisp/play/dunnet.el
+++ b/lisp/play/dunnet.el
@@ -2324,7 +2324,7 @@ Also prints current score to let user know he has scored."
;;;;
(define-key dun-mode-map "\r" 'dun-parse)
-(defvar dungeon-batch-map (make-keymap))
+(defvar-keymap dungeon-batch-map :full t)
(let (n)
(setq n 32)
(while (< 0 (setq n (- n 1)))
diff --git a/lisp/play/fortune.el b/lisp/play/fortune.el
index 3bc51f6d68e..0973f2bc5f2 100644
--- a/lisp/play/fortune.el
+++ b/lisp/play/fortune.el
@@ -1,6 +1,6 @@
;;; fortune.el --- use fortune to create signatures -*- lexical-binding: t -*-
-;; Copyright (C) 1999, 2001-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1999-2022 Free Software Foundation, Inc.
;; Author: Holger Schauer <Holger.Schauer@gmx.de>
;; Keywords: games utils mail
@@ -21,38 +21,48 @@
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
+
;; This utility allows you to automatically cut regions to a fortune
;; file. In case that the region stems from an article buffer (mail or
;; news), it will try to automatically determine the author of the
-;; fortune. It will also allow you to compile your fortune-database
+;; fortune. It will also allow you to compile your fortune database
;; as well as providing a function to extract a fortune for use as your
;; signature.
+;;
;; Of course, it can simply display a fortune, too.
;; Use prefix arguments to specify different fortune databases.
-
+;;
;;; Installation:
-
-;; Please check the customize settings -- you will at least have to
-;; modify the values of `fortune-dir' and `fortune-file'.
-
+;;
+;; Please type `M-x customize-group RET fortune RET' -- you will at
+;; least have to modify the user options `fortune-dir' and
+;; `fortune-file'.
+;;
;; I then use this in my .gnus:
-;;(message "Making new signature: %s" (fortune-to-signature "~/fortunes/"))
+;;
+;; (message "Making new signature: %s"
+;; (fortune-to-signature "~/fortunes/"))
+;;
;; This automagically creates a new signature when starting up Gnus.
-;; Note that the call to fortune-to-signature specifies a directory in which
-;; several fortune-files and their databases are stored.
-
-;; If you like to get a new signature for every message, you can also hook
-;; it into message-mode:
-;; (add-hook 'message-setup-hook 'fortune-to-signature)
-;; This time no fortune-file is specified, so fortune-to-signature would use
-;; the default-file as specified by fortune-file.
-
-;; I have also this in my .gnus:
-;;(add-hook 'gnus-article-mode-hook
-;; (lambda ()
-;; (define-key gnus-article-mode-map "i" 'fortune-from-region)))
+;; Note that the call to `fortune-to-signature' specifies a directory
+;; in which several fortune files and their databases are stored.
+;;
+;; To get a new signature for every message, you can hook it into
+;; `message-mode':
+;;
+;; (add-hook 'message-setup-hook #'fortune-to-signature)
+;;
+;; This time no fortune file is specified, so `fortune-to-signature'
+;; would use the default file as specified by `fortune-file'.
+;;
+;; I also have this in my .gnus:
+;;
+;; (add-hook 'gnus-article-mode-hook
+;; (lambda ()
+;; (define-key gnus-article-mode-map "i" #'fortune-from-region)))
+;;
;; which allows marking a region and then pressing "i" so that the marked
-;; region will be automatically added to my favorite fortune-file.
+;; region will be automatically added to my favorite fortune file.
;;; Code:
@@ -166,7 +176,7 @@ If INTERACTIVE is non-nil, don't compile the fortune file afterwards."
(fortune-compile file)))))
(defun fortune-ask-file ()
- "Asks the user for a file-name."
+ "Ask the user for the file name of the fortune file."
(expand-file-name
(read-file-name
"Fortune file to use: "
diff --git a/lisp/play/hanoi.el b/lisp/play/hanoi.el
index 227dd790af5..58fb82b6ed0 100644
--- a/lisp/play/hanoi.el
+++ b/lisp/play/hanoi.el
@@ -73,7 +73,7 @@
"Non-nil means that hanoi poles are oriented horizontally."
:type 'boolean)
-(defcustom hanoi-move-period 1.0
+(defcustom hanoi-move-period 1
"Time, in seconds, for each pole-to-pole move of a ring.
If nil, move rings as fast as possible while displaying all
intermediate positions."
@@ -112,35 +112,32 @@ intermediate positions."
(prefix-numeric-value current-prefix-arg))))
(if (< nrings 0)
(error "Negative number of rings"))
- (hanoi-internal nrings (make-list nrings 0) (float-time)))
+ (hanoi-internal nrings (make-list nrings 0) (time-convert nil 'integer)))
;;;###autoload
(defun hanoi-unix ()
- "Towers of Hanoi, UNIX doomsday version.
-Displays 32-ring towers that have been progressing at one move per
-second since 1970-01-01 00:00:00 GMT.
+ "Towers of Hanoi, 32-bit UNIX doomsday version.
+Display 32-ring towers that have been progressing at one move per
+second since 1970-01-01 00:00:00 UTC.
Repent before ring 31 moves."
(interactive)
- (let* ((start (ftruncate (float-time)))
- (bits (cl-loop repeat 32
- for x = (/ start (expt 2.0 31)) then (* x 2.0)
- collect (truncate (mod x 2.0))))
- (hanoi-move-period 1.0))
+ (let* ((start (time-convert nil 'integer))
+ (bits (nreverse (cl-loop repeat 32
+ for x = start then (ash x -1)
+ collect (logand x 1))))
+ (hanoi-move-period 1))
(hanoi-internal 32 bits start)))
;;;###autoload
(defun hanoi-unix-64 ()
- "Like `hanoi-unix', but pretend to have a 64-bit clock.
-This is, necessarily (as of Emacs 20.3), a crock. When the
-`current-time' interface is made s2G-compliant, hanoi.el will need
-to be updated."
+ "Like `hanoi-unix', but with a 64-bit clock."
(interactive)
- (let* ((start (ftruncate (float-time)))
- (bits (cl-loop repeat 64
- for x = (/ start (expt 2.0 63)) then (* x 2.0)
- collect (truncate (mod x 2.0))))
- (hanoi-move-period 1.0))
+ (let* ((start (time-convert nil 'integer))
+ (bits (nreverse (cl-loop repeat 64
+ for x = start then (ash x -1)
+ collect (logand x 1))))
+ (hanoi-move-period 1))
(hanoi-internal 64 bits start)))
(defun hanoi-internal (nrings bits start-time)
@@ -378,9 +375,10 @@ BITS must be of length nrings. Start at START-TIME."
(/ (- tick flyward-ticks fly-ticks)
ticks-per-pole-step))))))))
(if hanoi-move-period
- (cl-loop for elapsed = (- (float-time) start-time)
- while (< elapsed hanoi-move-period)
- with tick-period = (/ (float hanoi-move-period) total-ticks)
+ (cl-loop for elapsed = (float-time (time-subtract nil start-time))
+ while (time-less-p elapsed hanoi-move-period)
+ with tick-period = (/ (float-time hanoi-move-period)
+ total-ticks)
for tick = (ceiling elapsed tick-period) do
(hanoi-ring-to-pos ring (funcall tick-to-pos tick))
(hanoi-sit-for (- (* tick tick-period) elapsed)))
@@ -389,7 +387,7 @@ BITS must be of length nrings. Start at START-TIME."
(hanoi-sit-for 0)))
;; Always make last move to keep pole and ring data consistent
(hanoi-ring-to-pos ring (car to))
- (if hanoi-move-period (+ start-time hanoi-move-period))))
+ (if hanoi-move-period (time-add start-time hanoi-move-period))))
;; update display and pause, quitting with a pithy comment if the user
;; hits a key.
diff --git a/lisp/play/mpuz.el b/lisp/play/mpuz.el
index 1cacf01a20c..177b6eecf01 100644
--- a/lisp/play/mpuz.el
+++ b/lisp/play/mpuz.el
@@ -156,7 +156,7 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
;; A puzzle also uses a board displaying a multiplication.
-;; Every digit appears in the board, crypted or not.
+;; Every digit appears in the board, encrypted or not.
;;------------------------------------------------------
(defvar mpuz-board (make-vector 10 nil)
"The board associates to any digit the list of squares where it appears.")
diff --git a/lisp/printing.el b/lisp/printing.el
index b9bc3581c43..534b45c772b 100644
--- a/lisp/printing.el
+++ b/lisp/printing.el
@@ -4,16 +4,9 @@
;; Author: Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>
;; Keywords: wp, print, PostScript
-;; Version: 6.9.3
+;; Old-Version: 6.9.3
;; URL: https://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre
-(defconst pr-version "6.9.3"
- "printing.el, v 6.9.3 <2007/12/09 vinicius>
-
-Please send all bug fixes and enhancements to
- bug-gnu-emacs@gnu.org and Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>
-")
-
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
@@ -63,10 +56,6 @@ Please send all bug fixes and enhancements to
;; spool and to despool PostScript buffer. So, `printing' provides an
;; interface to ps-print package and it also provides some extra stuff.
;;
-;; To download the latest ps-print package see
-;; `https://www.emacswiki.org/cgi-bin/wiki/PsPrintPackage'.
-;; Please, see README file for ps-print installation instructions.
-;;
;; `printing' was inspired by:
;;
;; print-nt.el Frederic Corne <frederic.corne@erli.fr>
@@ -942,11 +931,6 @@ Please send all bug fixes and enhancements to
;;
;; Below are some URL where you can find good utilities.
;;
-;; * For `printing' package:
-;;
-;; printing `https://www.emacswiki.org/cgi-bin/emacs/download/printing.el'
-;; ps-print `https://www.emacswiki.org/cgi-bin/wiki/PsPrintPackage'
-;;
;; * For GNU or Unix system:
;;
;; gs, gv `https://www.gnu.org/software/ghostscript/ghostscript.html'
@@ -1015,10 +999,6 @@ Please send all bug fixes and enhancements to
(require 'lpr)
(require 'ps-print)
-(and (string< ps-print-version "6.6.4")
- (error "`printing' requires `ps-print' package version 6.6.4 or later"))
-
-
(defconst pr-cygwin-system
(and lpr-windows-system (getenv "OSTYPE")
(string-match "cygwin" (getenv "OSTYPE"))))
@@ -2782,7 +2762,7 @@ See `pr-ps-printer-alist'.")
["4-up" (pr-ps-buffer-preview 4 t) t]
["Other..." (pr-ps-buffer-preview nil t)
:keys "\\[pr-ps-buffer-preview]"])
- ("Region" :active (and (not pr-spool-p) (ps-mark-active-p))
+ ("Region" :active (and (not pr-spool-p) mark-active)
["1-up" (pr-ps-region-preview 1 t) t]
["2-up" (pr-ps-region-preview 2 t) t]
["4-up" (pr-ps-region-preview 4 t) t]
@@ -2837,7 +2817,7 @@ See `pr-ps-printer-alist'.")
["4-up" (pr-ps-buffer-ps-print 4 t) t]
["Other..." (pr-ps-buffer-ps-print nil t)
:keys "\\[pr-ps-buffer-ps-print]"])
- ("Region" :active (ps-mark-active-p)
+ ("Region" :active mark-active
["1-up" (pr-ps-region-ps-print 1 t) t]
["2-up" (pr-ps-region-ps-print 2 t) t]
["4-up" (pr-ps-region-ps-print 4 t) t]
@@ -2887,12 +2867,12 @@ See `pr-ps-printer-alist'.")
"Replace non-printing chars with printable representations."
["Directory" pr-printify-directory t]
["Buffer" pr-printify-buffer t]
- ["Region" pr-printify-region (ps-mark-active-p)])
+ ["Region" pr-printify-region mark-active])
("Print" :included (pr-visible-p 'text)
:help "Send text to printer"
["Directory" pr-txt-directory t]
["Buffer" pr-txt-buffer t]
- ["Region" pr-txt-region (ps-mark-active-p)]
+ ["Region" pr-txt-region mark-active]
["Mode" pr-txt-mode (pr-mode-alist-p)])
["Text Printers" pr-update-menus
:active pr-txt-printer-alist :included (pr-visible-p 'text)
@@ -3007,9 +2987,7 @@ Calls `pr-update-menus' to adjust menus."
(defconst pr-help-message
- (concat "printing.el version " pr-version
- " ps-print.el version " ps-print-version
- "\n\n
+ "\
Menu Layout
-----------
@@ -3215,14 +3193,12 @@ VI. Customization:
23. Show current settings for `printing', `ps-print' or `lpr'.
24. Quick help for printing menu layout.
-")
+"
"Printing help message.")
(defconst pr-interface-help-message
- (concat "printing.el version " pr-version
- " ps-print.el version " ps-print-version
- "\n\n
+ "\
The printing interface buffer has the same functionality as the printing menu.
The major difference is that the states (like sending PostScript generated to a
file, n-up printing, etc.) are set and saved between printing buffer
@@ -3449,7 +3425,7 @@ The printing interface buffer has the following sections:
Quick help for printing interface buffer and printing menu layout. You can
also quit the printing interface buffer or kill all printing help buffer.
-")
+"
"Printing buffer interface help message.")
@@ -4402,7 +4378,6 @@ Or choose the menu option Printing/Show Settings/printing."
(mapconcat
#'ps-print-quote
(list
- (concat "\n;;; printing.el version " pr-version "\n")
";; internal vars"
(ps-comment-string "emacs-version " emacs-version)
(ps-comment-string "pr-txt-command " pr-txt-command)
@@ -5585,7 +5560,7 @@ COMMAND.exe, COMMAND.bat and COMMAND.com in this order."
(defun pr-create-interface ()
"Create the front end for printing package."
(setq pr-i-buffer (buffer-name (current-buffer))
- pr-i-region (ps-mark-active-p)
+ pr-i-region mark-active
pr-i-mode (pr-mode-alist-p)
pr-i-window-configuration (current-window-configuration))
@@ -5597,9 +5572,6 @@ COMMAND.exe, COMMAND.bat and COMMAND.com in this order."
(switch-to-buffer (get-buffer-create pr-buffer-name))
;; header
- (let ((versions (concat "printing v" pr-version
- " ps-print v" ps-print-version)))
- (widget-insert (make-string (- 79 (length versions)) ?\ ) versions))
(pr-insert-italic "\nCurrent Directory : " 1)
(pr-insert-italic default-directory)
@@ -5651,11 +5623,11 @@ COMMAND.exe, COMMAND.bat and COMMAND.com in this order."
(nreverse choices))
" Buffer : " nil
(lambda ()
- (pr-interface-save
- (setq pr-i-region (ps-mark-active-p)
- pr-i-mode (pr-mode-alist-p)))
- (pr-update-checkbox 'pr-i-region)
- (pr-update-checkbox 'pr-i-mode)))
+ (pr-interface-save
+ (setq pr-i-region mark-active
+ pr-i-mode (pr-mode-alist-p)))
+ (pr-update-checkbox 'pr-i-region)
+ (pr-update-checkbox 'pr-i-mode)))
;; 1a. Buffer: Region
(put 'pr-i-region 'pr-widget
(pr-insert-checkbox
@@ -5663,7 +5635,7 @@ COMMAND.exe, COMMAND.bat and COMMAND.com in this order."
'pr-i-region
(lambda (widget &rest _ignore)
(let ((region-p (pr-interface-save
- (ps-mark-active-p))))
+ mark-active)))
(cond ((null (widget-value widget)) ; widget is nil
(setq pr-i-region nil))
(region-p ; widget is true and there is a region
@@ -6213,6 +6185,12 @@ COMMAND.exe, COMMAND.bat and COMMAND.com in this order."
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defconst pr-version "6.9.3"
+ "printing.el, v 6.9.3 <2007/12/09 vinicius>
+
+Please send all bug fixes and enhancements to
+ bug-gnu-emacs@gnu.org and Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>")
+(make-obsolete-variable 'pr-version 'emacs-version "29.1")
(provide 'printing)
diff --git a/lisp/progmodes/antlr-mode.el b/lisp/progmodes/antlr-mode.el
index d6e2ab8a87a..5002a3bbfae 100644
--- a/lisp/progmodes/antlr-mode.el
+++ b/lisp/progmodes/antlr-mode.el
@@ -66,8 +66,6 @@
;;; Installation:
-;; This file requires Emacs-20.3, XEmacs-20.4 or higher and package cc-mode.
-
;; If antlr-mode is not part of your distribution, put this file into your
;; load-path and the following into your init file:
;; (autoload 'antlr-mode "antlr-mode" nil t)
@@ -75,9 +73,6 @@
;; (add-hook 'speedbar-load-hook ; would be too late in antlr-mode.el
;; (lambda () (speedbar-add-supported-extension ".g")))
-;; I strongly recommend to use font-lock with a support mode like
-;; jit-lock (Emacs) / lazy-shot (XEmacs).
-
;; To customize, use menu item "Antlr" -> "Customize Antlr".
;;; Code:
@@ -894,7 +889,7 @@ Used for `antlr-slow-syntactic-context'.")
;;;===========================================================================
-;;; Syntax functions -- Emacs vs XEmacs dependent, part 1
+;;; Syntax functions
;;;===========================================================================
;;;===========================================================================
@@ -2431,8 +2426,6 @@ the default language."
comment-start-skip "/\\*+ *\\|// *")
;; various -----------------------------------------------------------------
(set (make-local-variable 'font-lock-defaults) antlr-font-lock-defaults)
- (when (featurep 'xemacs)
- (easy-menu-add antlr-mode-menu))
(set (make-local-variable 'imenu-create-index-function)
#'antlr-imenu-create-index-function)
(set (make-local-variable 'imenu-generic-expression) t) ; fool stupid test
diff --git a/lisp/progmodes/autoconf.el b/lisp/progmodes/autoconf.el
index d0acd36f4b4..fd8bf1f7ec8 100644
--- a/lisp/progmodes/autoconf.el
+++ b/lisp/progmodes/autoconf.el
@@ -35,7 +35,7 @@
;;; Code:
-(defvar autoconf-mode-map (make-sparse-keymap))
+(defvar-keymap autoconf-mode-map)
(defvar autoconf-mode-hook nil
"Hook run by `autoconf-mode'.")
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index 82268f49433..38e9d6011df 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -328,9 +328,6 @@ after special characters such as brace, comma, semi-colon, and colon."
(c-update-modeline)
(c-keep-region-active))
-(defalias 'c-toggle-auto-state 'c-toggle-auto-newline)
-(make-obsolete 'c-toggle-auto-state 'c-toggle-auto-newline "22.1")
-
(defun c-toggle-hungry-state (&optional arg)
"Toggle hungry-delete-key feature.
Optional numeric ARG, if supplied, turns on hungry-delete when
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el
index 9edaf465346..04f519dd0a5 100644
--- a/lisp/progmodes/cc-defs.el
+++ b/lisp/progmodes/cc-defs.el
@@ -425,23 +425,6 @@ to it is returned. This function does not modify the point or the mark."
(defvar lookup-syntax-properties) ;XEmacs.
-(eval-and-compile
- ;; Constant to decide at compilation time whether to use category
- ;; properties. Currently (2010-03) they're available only on GNU Emacs.
- (defconst c-use-category
- (with-temp-buffer
- (let ((parse-sexp-lookup-properties t)
- (lookup-syntax-properties t))
- (set-syntax-table (make-syntax-table))
- (insert "<()>")
- (put-text-property (point-min) (1+ (point-min))
- 'category 'c-<-as-paren-syntax)
- (put-text-property (+ 3 (point-min)) (+ 4 (point-min))
- 'category 'c->-as-paren-syntax)
- (goto-char (point-min))
- (forward-sexp)
- (= (point) (+ 4 (point-min)))))))
-
(defmacro c-is-escaped (pos)
;; Are there an odd number of backslashes before POS?
(declare (debug t))
@@ -1147,11 +1130,13 @@ MODE is either a mode symbol or a list of mode symbols."
(cc-bytecomp-fboundp 'delete-extent)
(cc-bytecomp-fboundp 'map-extents))))
-(defconst c-<-as-paren-syntax '(4 . ?>))
-(put 'c-<-as-paren-syntax 'syntax-table c-<-as-paren-syntax)
+(eval-and-compile
+ (defconst c-<-as-paren-syntax '(4 . ?>))
+ (put 'c-<-as-paren-syntax 'syntax-table c-<-as-paren-syntax))
-(defconst c->-as-paren-syntax '(5 . ?<))
-(put 'c->-as-paren-syntax 'syntax-table c->-as-paren-syntax)
+(eval-and-compile
+ (defconst c->-as-paren-syntax '(5 . ?<))
+ (put 'c->-as-paren-syntax 'syntax-table c->-as-paren-syntax))
;; `c-put-char-property' is complex enough in XEmacs and Emacs < 21 to
;; make it a function.
@@ -1210,6 +1195,26 @@ MODE is either a mode symbol or a list of mode symbols."
`((setq c-syntax-table-hwm (min c-syntax-table-hwm -pos-))))
(put-text-property -pos- (1+ -pos-) ',property ,value))))
+(eval-and-compile
+ ;; Constant to decide at compilation time whether to use category
+ ;; properties. Currently (2010-03) they're available only on GNU
+ ;; Emacs. This defconst must follow the declarations of
+ ;; `c-<-as-paren-syntax' and `c->-as-paren-syntax'.
+ (defconst c-use-category
+ (eval-when-compile
+ (with-temp-buffer
+ (let ((parse-sexp-lookup-properties t)
+ (lookup-syntax-properties t))
+ (set-syntax-table (make-syntax-table))
+ (insert "<()>")
+ (put-text-property (point-min) (1+ (point-min))
+ 'category 'c-<-as-paren-syntax)
+ (put-text-property (+ 3 (point-min)) (+ 4 (point-min))
+ 'category 'c->-as-paren-syntax)
+ (goto-char (point-min))
+ (forward-sexp)
+ (= (point) (+ 4 (point-min))))))))
+
(defmacro c-get-char-property (pos property)
;; Get the value of the given property on the character at POS if
;; it's been put there by `c-put-char-property'. PROPERTY is
@@ -1646,7 +1651,7 @@ with value CHAR in the region [FROM to)."
;; toggle the property in all template brackets simultaneously and
;; cheaply. We use this, for instance, in `c-parse-state'.
(declare (debug t))
- (if c-use-category
+ (if (eval-when-compile c-use-category)
`(c-put-char-property ,pos 'category 'c-<-as-paren-syntax)
`(c-put-char-property ,pos 'syntax-table c-<-as-paren-syntax)))
@@ -1661,7 +1666,7 @@ with value CHAR in the region [FROM to)."
;; toggle the property in all template brackets simultaneously and
;; cheaply. We use this, for instance, in `c-parse-state'.
(declare (debug t))
- (if c-use-category
+ (if (eval-when-compile c-use-category)
`(c-put-char-property ,pos 'category 'c->-as-paren-syntax)
`(c-put-char-property ,pos 'syntax-table c->-as-paren-syntax)))
@@ -1675,7 +1680,9 @@ with value CHAR in the region [FROM to)."
;; toggle the property in all template brackets simultaneously and
;; cheaply. We use this, for instance, in `c-parse-state'.
(declare (debug t))
- `(c-clear-char-property ,pos ,(if c-use-category ''category ''syntax-table)))
+ `(c-clear-char-property ,pos ,(if (eval-when-compile c-use-category)
+ ''category
+ ''syntax-table)))
(defsubst c-suppress-<->-as-parens ()
;; Suppress the syntactic effect of all marked < and > as parens. Note
@@ -1755,7 +1762,7 @@ with value CHAR in the region [FROM to)."
(defmacro c-sc-scan-lists (from count depth)
(declare (debug t))
- (if c-use-category
+ (if (eval-when-compile c-use-category)
`(scan-lists ,from ,count ,depth)
(cond
((and (eq count 1) (eq depth 1))
@@ -1803,7 +1810,7 @@ with value CHAR in the region [FROM to)."
(defmacro c-sc-parse-partial-sexp (from to &optional targetdepth stopbefore
oldstate)
(declare (debug t))
- (if c-use-category
+ (if (eval-when-compile c-use-category)
`(parse-partial-sexp ,from ,to ,targetdepth ,stopbefore ,oldstate)
`(c-sc-parse-partial-sexp-no-category ,from ,to ,targetdepth ,stopbefore
,oldstate)))
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index cfbb668baeb..bc6155dd668 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -1672,9 +1672,13 @@ comment at the start of cc-engine.el for more info."
Return the result of `forward-comment' if it gets called, nil otherwise."
`(if (not comment-end-can-be-escaped)
(forward-comment -1)
- (when (and (< (skip-syntax-backward " >") 0)
- (eq (char-after) ?\n))
- (forward-char))
+ (let ((dist (skip-syntax-backward " >")))
+ (when (and
+ (< dist 0)
+ (progn
+ (skip-syntax-forward " " (- (point) dist 1))
+ (eq (char-after) ?\n)))
+ (forward-char)))
(cond
((and (eq (char-before) ?\n)
(eq (char-before (1- (point))) ?\\))
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el
index 625010b04b2..2495d21a10f 100644
--- a/lisp/progmodes/cc-fonts.el
+++ b/lisp/progmodes/cc-fonts.el
@@ -285,6 +285,7 @@
(byte-compile
`(lambda (limit)
(let (res)
+ (c-skip-comments-and-strings limit)
(while (and (setq res (re-search-forward ,regexp limit t))
(progn
(goto-char (match-beginning 0))
@@ -300,43 +301,45 @@
;; with HIGHLIGHTS, a list of highlighters as specified on page
;; "Search-based Fontification" in the elisp manual. If CHECK-POINT
;; is non-nil, we will check (< (point) limit) in the main loop.
- `(while
- ,(if check-point
- `(and (< (point) limit)
- (re-search-forward ,regexp limit t))
- `(re-search-forward ,regexp limit t))
- (unless (progn
- (goto-char (match-beginning 0))
- (c-skip-comments-and-strings limit))
- (goto-char (match-end 0))
- ,@(mapcar
- (lambda (highlight)
- (if (integerp (car highlight))
- ;; e.g. highlight is (1 font-lock-type-face t)
- (progn
- (unless (eq (nth 2 highlight) t)
- (error
- "The override flag must currently be t in %s"
- highlight))
- (when (nth 3 highlight)
- (error
- "The laxmatch flag may currently not be set in %s"
- highlight))
- `(save-match-data
- (c-put-font-lock-face
- (match-beginning ,(car highlight))
- (match-end ,(car highlight))
- ,(elt highlight 1))))
- ;; highlight is an "ANCHORED HIGHLIGHTER" of the form
- ;; (ANCHORED-MATCHER PRE-FORM POST-FORM SUBEXP-HIGHLIGHTERS...)
- (when (nth 3 highlight)
- (error "Match highlights currently not supported in %s"
+ `(progn
+ (c-skip-comments-and-strings limit)
+ (while
+ ,(if check-point
+ `(and (< (point) limit)
+ (re-search-forward ,regexp limit t))
+ `(re-search-forward ,regexp limit t))
+ (unless (progn
+ (goto-char (match-beginning 0))
+ (c-skip-comments-and-strings limit))
+ (goto-char (match-end 0))
+ ,@(mapcar
+ (lambda (highlight)
+ (if (integerp (car highlight))
+ ;; e.g. highlight is (1 font-lock-type-face t)
+ (progn
+ (unless (eq (nth 2 highlight) t)
+ (error
+ "The override flag must currently be t in %s"
+ highlight))
+ (when (nth 3 highlight)
+ (error
+ "The laxmatch flag may currently not be set in %s"
highlight))
- `(progn
- ,(nth 1 highlight)
- (save-match-data ,(car highlight))
- ,(nth 2 highlight))))
- highlights))))
+ `(save-match-data
+ (c-put-font-lock-face
+ (match-beginning ,(car highlight))
+ (match-end ,(car highlight))
+ ,(elt highlight 1))))
+ ;; highlight is an "ANCHORED HIGHLIGHTER" of the form
+ ;; (ANCHORED-MATCHER PRE-FORM POST-FORM SUBEXP-HIGHLIGHTERS...)
+ (when (nth 3 highlight)
+ (error "Match highlights currently not supported in %s"
+ highlight))
+ `(progn
+ ,(nth 1 highlight)
+ (save-match-data ,(car highlight))
+ ,(nth 2 highlight))))
+ highlights)))))
(defun c-make-font-lock-search-function (regexp &rest highlights)
;; This function makes a byte compiled function that works much like
@@ -416,6 +419,8 @@
;; lambda more easily.
(byte-compile
`(lambda (limit)
+ (let ((lit-start (c-literal-start)))
+ (when lit-start (goto-char lit-start)))
(let ( ;; The font-lock package in Emacs is known to clobber
;; `parse-sexp-lookup-properties' (when it exists).
(parse-sexp-lookup-properties
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index c5964165c8d..75f1660f221 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -850,7 +850,7 @@ This is of the form that fits inside [ ] in a regexp."
"Regexp matching identifiers and keywords (with submatch 0). Assumed
to match if `c-symbol-start' matches on the same position."
t (concat (c-lang-const c-symbol-start)
- "[" (c-lang-const c-symbol-chars) "]*")
+ "[" (c-lang-const c-symbol-chars) "]\\{,1000\\}")
pike (concat
;; Use the value from C here since the operator backquote is
;; covered by the other alternative.
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index 70fc1cb73a9..027fd8f42f5 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -1518,7 +1518,12 @@ Note that the style variables are always made local to the buffer."
;; Move to end of logical line (as it will be after the change, or as it
;; was before unescaping a NL.)
- (re-search-forward "\\(?:\\\\\\(?:.\\|\n\\)\\|[^\\\n\r]\\)*" nil t)
+ (while
+ (progn (end-of-line)
+ (and
+ (eq (char-before) ?\\)
+ (not (eobp))))
+ (forward-line))
;; We're at an EOLL or point-max.
(if (equal (c-get-char-property (point) 'syntax-table) '(15))
(if (memq (char-after) '(?\n ?\r))
@@ -1636,8 +1641,12 @@ Note that the style variables are always made local to the buffer."
(min (1+ end) ; 1+, if we're inside an escaped NL.
(point-max))
end))
- (re-search-forward "\\(?:\\\\\\(?:.\\|\n\\)\\|[^\\\n\r]\\)*"
- nil t)
+ (while
+ (progn (end-of-line)
+ (and
+ (eq (char-before) ?\\)
+ (not (eobp))))
+ (forward-line))
(point))
c-new-END))
s)
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 9f33186d8b1..5ce80e06577 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -860,7 +860,7 @@ You might also use mode hooks to specify it in certain modes, like this:
It's often useful to leave a space at the end of the value."
:type 'string)
-;;;###autoload(put 'compile-command 'safe-local-variable (lambda (a) (and (stringp a) (or (not (boundp 'compilation-read-command)) compilation-read-command))))
+;;;###autoload(put 'compile-command 'safe-local-variable (lambda (a) (and (stringp a) (if (boundp 'compilation-read-command) compilation-read-command t))))
;;;###autoload
(defcustom compilation-disable-input nil
@@ -979,11 +979,6 @@ Faces `compilation-error-face', `compilation-warning-face',
(defvar compilation-leave-directory-face 'font-lock-builtin-face
"Face name to use for leaving directory messages.")
-;; Used for compatibility with the old compile.el.
-(defvar compilation-parse-errors-function nil)
-(make-obsolete-variable 'compilation-parse-errors-function
- 'compilation-error-regexp-alist "24.1")
-
(defcustom compilation-auto-jump-to-first-error nil
"If non-nil, automatically jump to the first error during compilation."
:type '(choice (const :tag "Never" nil)
@@ -1519,34 +1514,28 @@ RULE is the name (symbol) of the rule used or nil if anonymous.
(and proc (memq (process-status proc) '(run open))))
(setq end (line-beginning-position))))
(compilation--remove-properties start end)
- (if compilation-parse-errors-function
- ;; An old package! Try the compatibility code.
- (progn
- (goto-char start)
- (compilation--compat-parse-errors end))
-
- ;; compilation-directory-matcher is the only part that really needs to be
- ;; parsed sequentially. So we could split it out, handle directories
- ;; like syntax-propertize, and the rest as font-lock-keywords. But since
- ;; we want to have it work even when font-lock is off, we'd then need to
- ;; use our own compilation-parsed text-property to keep track of the parts
- ;; that have already been parsed.
- (goto-char start)
- (while (re-search-forward (car compilation-directory-matcher)
- end t)
- (compilation--flush-directory-cache (match-beginning 0) (match-end 0))
- (when compilation-debug
- (font-lock-append-text-property
- (match-beginning 0) (match-end 0)
- 'compilation-debug
- (vector 'directory compilation-directory-matcher)))
- (dolist (elt (cdr compilation-directory-matcher))
- (add-text-properties (match-beginning (car elt))
- (match-end (car elt))
- (compilation-directory-properties
- (car elt) (cdr elt)))))
-
- (compilation-parse-errors start end)))
+ ;; compilation-directory-matcher is the only part that really needs to be
+ ;; parsed sequentially. So we could split it out, handle directories
+ ;; like syntax-propertize, and the rest as font-lock-keywords. But since
+ ;; we want to have it work even when font-lock is off, we'd then need to
+ ;; use our own compilation-parsed text-property to keep track of the parts
+ ;; that have already been parsed.
+ (goto-char start)
+ (while (re-search-forward (car compilation-directory-matcher)
+ end t)
+ (compilation--flush-directory-cache (match-beginning 0) (match-end 0))
+ (when compilation-debug
+ (font-lock-append-text-property
+ (match-beginning 0) (match-end 0)
+ 'compilation-debug
+ (vector 'directory compilation-directory-matcher)))
+ (dolist (elt (cdr compilation-directory-matcher))
+ (add-text-properties (match-beginning (car elt))
+ (match-end (car elt))
+ (compilation-directory-properties
+ (car elt) (cdr elt)))))
+
+ (compilation-parse-errors start end))
(defun compilation--note-type (type)
"Note that a new message with severity TYPE was seen.
@@ -1803,6 +1792,7 @@ Otherwise, construct a buffer name from NAME-OF-MODE."
#'compilation--default-buffer-name)
name-of-mode))
+;;;###autoload
(defun compilation--default-buffer-name (name-of-mode)
(cond ((or (eq major-mode (intern-soft name-of-mode))
(eq major-mode (intern-soft (concat name-of-mode "-mode"))))
@@ -2475,22 +2465,23 @@ commands of Compilation major mode are available. See
(defun compilation-sentinel (proc msg)
"Sentinel for compilation buffers."
(if (memq (process-status proc) '(exit signal))
- (let ((buffer (process-buffer proc)))
- (if (null (buffer-name buffer))
- ;; buffer killed
- (set-process-buffer proc nil)
- (with-current-buffer buffer
- ;; Write something in the compilation buffer
- ;; and hack its mode line.
- (compilation-handle-exit (process-status proc)
- (process-exit-status proc)
- msg)
- ;; Since the buffer and mode line will show that the
- ;; process is dead, we can delete it now. Otherwise it
- ;; will stay around until M-x list-processes.
- (delete-process proc)))
+ (unwind-protect
+ (let ((buffer (process-buffer proc)))
+ (if (null (buffer-name buffer))
+ ;; buffer killed
+ (set-process-buffer proc nil)
+ (with-current-buffer buffer
+ ;; Write something in the compilation buffer
+ ;; and hack its mode line.
+ (compilation-handle-exit (process-status proc)
+ (process-exit-status proc)
+ msg))))
(setq compilation-in-progress (delq proc compilation-in-progress))
- (compilation--update-in-progress-mode-line))))
+ (compilation--update-in-progress-mode-line)
+ ;; Since the buffer and mode line will show that the
+ ;; process is dead, we can delete it now. Otherwise it
+ ;; will stay around until M-x list-processes.
+ (delete-process proc))))
(defun compilation-filter (proc string)
"Process filter for compilation buffers.
@@ -3259,73 +3250,11 @@ TRUE-DIRNAME is the `file-truename' of DIRNAME, if given."
(if (eq v fs) (remhash k compilation-locs)))
compilation-locs)))
-;;; Compatibility with the old compile.el.
-
-(defvaralias 'compilation-last-buffer 'next-error-last-buffer)
-(defvar compilation-parsing-end (make-marker))
-(defvar compilation-error-list nil)
-(defvar compilation-old-error-list nil)
-
-(defun compilation--compat-parse-errors (limit)
- (when compilation-parse-errors-function
- ;; FIXME: We should remove the rest of the compilation keywords
- ;; but we can't do that from here because font-lock is using
- ;; the value right now. --Stef
- (save-excursion
- (setq compilation-error-list nil)
- ;; Reset compilation-parsing-end each time because font-lock
- ;; might force us the re-parse many times (typically because
- ;; some code adds some text-property to the output that we
- ;; already parsed). You might say "why reparse", well:
- ;; because font-lock has just removed the `compilation-message' property
- ;; so have to do it all over again.
- (if compilation-parsing-end
- (set-marker compilation-parsing-end (point))
- (setq compilation-parsing-end (point-marker)))
- (condition-case nil
- ;; Ignore any error: we're calling this function earlier than
- ;; in the old compile.el so things might not all be setup yet.
- (funcall compilation-parse-errors-function limit nil)
- (error nil))
- (dolist (err (if (listp compilation-error-list) compilation-error-list))
- (let* ((src (car err))
- (dst (cdr err))
- (loc (cond ((markerp dst)
- (cons nil
- (compilation--make-cdrloc nil nil dst)))
- ((consp dst)
- (cons (nth 2 dst)
- (compilation--make-cdrloc
- (nth 1 dst)
- (cons (cdar dst) (caar dst))
- nil))))))
- (when loc
- (goto-char src)
- ;; (put-text-property src (line-end-position)
- ;; 'font-lock-face 'font-lock-warning-face)
- (put-text-property src (line-end-position)
- 'compilation-message
- (compilation--make-message loc 2 nil nil)))))))
- (goto-char limit)
- nil)
-
-;; Beware! this is not only compatibility code. New code also uses it. --Stef
(defun compilation-forget-errors ()
;; In case we hit the same file/line specs, we want to recompute a new
;; marker for them, so flush our cache.
(clrhash compilation-locs)
(setq compilation-gcpro nil)
- ;; FIXME: the old code reset the directory-stack, so maybe we should
- ;; put a `directory change' marker of some sort, but where? -stef
- ;;
- ;; FIXME: The old code moved compilation-current-error (which was
- ;; virtually represented by a mix of compilation-parsing-end and
- ;; compilation-error-list) to point-min, but that was only meaningful for
- ;; the internal uses of compilation-forget-errors: all calls from external
- ;; packages seem to be followed by a move of compilation-parsing-end to
- ;; something equivalent to point-max. So we heuristically move
- ;; compilation-current-error to point-max (since the external package
- ;; won't know that it should do it). --Stef
(setq compilation-current-error nil)
(let* ((proc (get-buffer-process (current-buffer)))
(mark (if proc (process-mark proc)))
@@ -3344,6 +3273,10 @@ TRUE-DIRNAME is the `file-truename' of DIRNAME, if given."
(or compilation-auto-jump-to-first-error
(eq compilation-scroll-output 'first-error))))
+(define-obsolete-variable-alias 'compilation-last-buffer
+ ;; Sadly, we forgot to declare this obsolete back then :-(
+ 'next-error-last-buffer "29.1 (tho really since 22.1)")
+
(provide 'compile)
;;; compile.el ends here
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index f51d2fcb115..91c00ad0488 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -32,11 +32,6 @@
;; the MooseX::Declare CPAN module, as well as Perl 5.10 keyword
;; support.
-;; The latest version is available from
-;; https://github.com/jrockway/cperl-mode
-;;
-;; (perhaps in the moosex-declare branch)
-
;; You can either fine-tune the bells and whistles of this mode or
;; bulk enable them by putting
@@ -103,7 +98,7 @@
(let (answer)
(while list
(or answer
- (if (or (x-color-defined-p (car list))
+ (if (or (color-defined-p (car list))
(null (cdr list)))
(setq answer (car list))))
(setq list (cdr list)))
@@ -8420,10 +8415,12 @@ the appropriate statement modifier."
(interactive)
(cperl-perldoc (cperl-word-at-point)))
-(defcustom pod2man-program "pod2man"
+(define-obsolete-variable-alias 'pod2man-program 'cperl-pod2man-program "29.1")
+(defcustom cperl-pod2man-program "pod2man"
"File name for `pod2man'."
:type 'file
- :group 'cperl)
+ :group 'cperl
+ :version "29.1")
;; By Nick Roberts <Nick.Roberts@src.bae.co.uk> (with changes)
(defun cperl-pod-to-manpage ()
@@ -8442,7 +8439,6 @@ the appropriate statement modifier."
(format (cperl-pod2man-build-command) pod2man-args))
'Man-bgproc-sentinel)))))
-;; Updated version by him too
(defun cperl-build-manpage ()
"Create a virtual manpage in Emacs from the POD in the file."
(interactive)
diff --git a/lisp/progmodes/ebnf2ps.el b/lisp/progmodes/ebnf2ps.el
index 96cbcba9be9..6e42da2d54f 100644
--- a/lisp/progmodes/ebnf2ps.el
+++ b/lisp/progmodes/ebnf2ps.el
@@ -4,7 +4,7 @@
;; Author: Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>
;; Keywords: wp, ebnf, PostScript
-;; Version: 4.4
+;; Old-Version: 4.4
;; URL: https://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre
;; This file is part of GNU Emacs.
@@ -22,16 +22,6 @@
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-(defconst ebnf-version "4.4"
- "ebnf2ps.el, v 4.4 <2007/02/12 vinicius>
-
-Vinicius's last change version. When reporting bugs, please also
-report the version of Emacs, if any, that ebnf2ps was running with.
-
-Please send all bug fixes and enhancements to
- Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>.")
-
-
;;; Commentary:
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -45,20 +35,12 @@ Please send all bug fixes and enhancements to
;;
;; (require 'ebnf2ps)
;;
-;; ebnf2ps uses ps-print package (version 5.2.3 or later), so see ps-print to
+;; ebnf2ps uses ps-print package (bundled with Emacs), so see ps-print to
;; know how to set options like landscape printing, page headings, margins,
;; etc.
;;
-;; NOTE: ps-print zebra stripes and line number options doesn't have effect on
-;; ebnf2ps, they behave as it's turned off.
-;;
-;; For good performance, be sure to byte-compile ebnf2ps.el, e.g.
-;;
-;; M-x byte-compile-file <give the path to ebnf2ps.el when prompted>
-;;
-;; This will generate ebnf2ps.elc, which will be loaded instead of ebnf2ps.el.
-;;
-;; ebnf2ps was tested with GNU Emacs 20.4.1.
+;; NOTE: ps-print zebra stripes and line number options don't have an
+;; effect on ebnf2ps, they behave as if it's turned off.
;;
;;
;; Using ebnf2ps
@@ -1154,9 +1136,6 @@ Please send all bug fixes and enhancements to
(require 'ps-print)
(eval-when-compile (require 'cl-lib))
-(and (string< ps-print-version "5.2.3")
- (error "`ebnf2ps' requires `ps-print' package version 5.2.3 or later"))
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; User Variables:
@@ -2037,7 +2016,6 @@ It must be a float between 0.0 (top) and 1.0 (bottom)."
:group 'ebnf2ps)
-;; Printing color requires x-color-values.
(defcustom ebnf-color-p t
"Non-nil means use color."
:type 'boolean
@@ -2456,8 +2434,6 @@ See also `ebnf-syntax-buffer'."
"Return the current ebnf2ps setup."
(format
"
-;;; ebnf2ps.el version %s
-
;;; Emacs version %S
\(setq ebnf-special-show-delimiter %S
@@ -2526,7 +2502,6 @@ See also `ebnf-syntax-buffer'."
;;; ebnf2ps.el - end of settings
"
- ebnf-version
emacs-version
ebnf-special-show-delimiter
(ps-print-quote ebnf-special-font)
@@ -2959,7 +2934,7 @@ See section \"Actions in Comments\" in ebnf2ps documentation.")
(defvar ebnf-eps-file-alist nil
-"Alist associating file name with EPS header and footer.
+ "Alist associating file name with EPS header and footer.
Each element has the following form:
@@ -4524,7 +4499,7 @@ end
(defun ebnf-generate-eps (tree)
(let* ((ebnf-tree tree)
- (ps-color-p (and ebnf-color-p (ps-color-device)))
+ (ps-color-p (and ebnf-color-p (display-color-p)))
(ps-print-color-scale (if ps-color-p
(float (car (color-values "white")))
1.0))
@@ -4626,7 +4601,7 @@ end
(defun ebnf-generate (tree)
(let* ((ebnf-tree tree)
- (ps-color-p (and ebnf-color-p (ps-color-device)))
+ (ps-color-p (and ebnf-color-p (display-color-p)))
(ps-print-color-scale (if ps-color-p
(float (car (color-values "white")))
1.0))
@@ -5243,11 +5218,7 @@ killed after process termination."
(not (search-forward "& ebnf2ps v"
(line-end-position)
t))
- (progn
- ;; adjust creator comment
- (end-of-line)
- ;; (backward-char)
- (insert " & ebnf2ps v" ebnf-version)
+ (progn
;; insert ebnf settings & engine
(goto-char (point-max))
(search-backward "\n%%EndProlog\n")
@@ -5273,7 +5244,7 @@ killed after process termination."
(format "%d %d" (1+ ebnf-eps-upper-x) (1+ ebnf-eps-upper-y))
"\n%%Title: " filename
"\n%%CreationDate: " (format-time-string "%T %b %d %Y")
- "\n%%Creator: " (user-full-name) " (using ebnf2ps v" ebnf-version ")"
+ "\n%%Creator: " (user-full-name) " (using GNU Emacs " emacs-version ")"
"\n%%DocumentNeededResources: font "
(or ebnf-fonts-required
(setq ebnf-fonts-required
@@ -6351,6 +6322,15 @@ killed after process termination."
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defconst ebnf-version "4.4"
+ "ebnf2ps.el, v 4.4 <2007/02/12 vinicius>
+
+Vinicius's last change version. When reporting bugs, please also
+report the version of Emacs, if any, that ebnf2ps was running with.
+
+Please send all bug fixes and enhancements to
+ bug-gnu-emacs@gnu.org and Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>.")
+(make-obsolete-variable 'ebnf-version 'emacs-version "29.1")
(provide 'ebnf2ps)
diff --git a/lisp/progmodes/f90.el b/lisp/progmodes/f90.el
index dcd74f0369c..443281c4f07 100644
--- a/lisp/progmodes/f90.el
+++ b/lisp/progmodes/f90.el
@@ -116,12 +116,11 @@
;; non-nil, the line numbers are never touched.
;; 2) Multi-; statements like "do i=1,20 ; j=j+i ; end do" are not handled
;; correctly, but I imagine them to be rare.
-;; 3) Regexps for hilit19 are no longer supported.
-;; 4) For FIXED FORMAT code, use fortran mode.
-;; 5) Preprocessor directives, i.e., lines starting with # are left-justified
+;; 3) For FIXED FORMAT code, use fortran mode.
+;; 4) Preprocessor directives, i.e., lines starting with # are left-justified
;; and are untouched by all case-changing commands. There is, at present, no
;; mechanism for treating multi-line directives (continued by \ ).
-;; 6) f77 do-loops do 10 i=.. ; ; 10 continue are not correctly indented.
+;; 5) f77 do-loops do 10 i=.. ; ; 10 continue are not correctly indented.
;; You are urged to use f90-do loops (with labels if you wish).
;; List of user commands
diff --git a/lisp/progmodes/flymake-proc.el b/lisp/progmodes/flymake-proc.el
index 4ab16831bc1..249ae9dff2f 100644
--- a/lisp/progmodes/flymake-proc.el
+++ b/lisp/progmodes/flymake-proc.el
@@ -399,10 +399,7 @@ instead of reading master file from disk."
(not (string-match (format "\\.%s\\'" source-file-extension)
inc-name))
(setq inc-name (concat inc-name "." source-file-extension)))
- (when (eq t (compare-strings
- source-file-nondir nil nil
- inc-name (- (length inc-name)
- (length source-file-nondir)) nil))
+ (when (string-suffix-p source-file-nondir inc-name)
(flymake-log 3 "inc-name=%s" inc-name)
(when (flymake-proc--check-include source-file-name inc-name
include-dirs)
diff --git a/lisp/progmodes/fortran.el b/lisp/progmodes/fortran.el
index 786c5ae8042..58d7a2026eb 100644
--- a/lisp/progmodes/fortran.el
+++ b/lisp/progmodes/fortran.el
@@ -1117,7 +1117,7 @@ Auto-indent does not happen if a numeric ARG is used."
(eq ?\t (char-after (line-beginning-position)))
(not (or (eq last-command 'fortran-indent-line)
(eq last-command
- 'fortran-indent-new-line))))
+ 'reindent-then-newline-and-indent))))
(save-excursion
(re-search-backward "[^ \t0-9]"
(line-beginning-position)
@@ -1586,10 +1586,6 @@ Return point or nil."
(if (< (current-column) cfi)
(move-to-column cfi)))))
-;; Historically this was a separate function which advertised itself
-;; as reindenting but only did so where `most likely to be necessary'.
-(defalias 'fortran-indent-new-line 'reindent-then-newline-and-indent)
-
(defun fortran-indent-subprogram ()
"Properly indent the Fortran subprogram containing point."
(interactive "*")
@@ -1926,9 +1922,6 @@ If ALL is nil, only match comments that start in column > 0."
;; Result.
(nth 3 parse-state))))))
-;; From old version.
-(defalias 'fortran-auto-fill-mode 'auto-fill-mode)
-
(defun fortran-fill ()
"Fill the current line at an appropriate point(s)."
(let* ((auto-fill-function #'fortran-auto-fill)
@@ -2215,6 +2208,9 @@ arg DO-SPACE prevents stripping the whitespace."
:active (not (lookup-key (current-local-map) [menu-bar index]))
:help "Add an index menu to the menu-bar"]))
+(define-obsolete-function-alias 'fortran-indent-new-line #'reindent-then-newline-and-indent "29.1")
+(define-obsolete-function-alias 'fortran-auto-fill-mode #'auto-fill-mode "29.1")
+
(provide 'fortran)
;;; fortran.el ends here
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 940710f7c59..c256198b3c1 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -92,6 +92,7 @@
(require 'cl-seq)
(require 'bindat)
(eval-when-compile (require 'pcase))
+(require 'subr-x) ; `string-pad'
(declare-function speedbar-change-initial-expansion-list
"speedbar" (new-default))
@@ -126,9 +127,9 @@ Possible value: main, $rsp, x+3.")
"Address of memory display.")
(defvar-local gdb-memory-last-address nil
"Last successfully accessed memory address.")
-(defvar gdb-memory-next-page nil
+(defvar gdb-memory-next-page nil
"Address of next memory page for program memory buffer.")
-(defvar gdb-memory-prev-page nil
+(defvar gdb-memory-prev-page nil
"Address of previous memory page for program memory buffer.")
(defvar-local gdb--memory-display-warning nil
"Display warning on memory header if t.
@@ -2511,9 +2512,8 @@ means to decode using the coding-system set for the GDB process."
;; Record transactions if logging is enabled.
(when gdb-enable-debug
(push (cons 'recv string) gdb-debug-log)
- (if (and gdb-debug-log-max
- (> (length gdb-debug-log) gdb-debug-log-max))
- (setcdr (nthcdr (1- gdb-debug-log-max) gdb-debug-log) nil)))
+ (when gdb-debug-log-max
+ (setq gdb-debug-log (ntake gdb-debug-log-max gdb-debug-log))))
;; Recall the left over gud-marker-acc from last time.
(setq gud-marker-acc (concat gud-marker-acc string))
@@ -2943,7 +2943,8 @@ Return position where LINE begins."
start-posn)))
(defun gdb-pad-string (string padding)
- (format (concat "%" (number-to-string padding) "s") string))
+ (declare (obsolete string-pad "29.1"))
+ (string-pad string padding nil t))
;; gdb-table struct is a way to programmatically construct simple
;; tables. It help to reliably align columns of data in GDB buffers
@@ -2985,13 +2986,13 @@ calling `gdb-table-string'."
"Return TABLE as a string with columns separated with SEP."
(let ((column-sizes (gdb-table-column-sizes table)))
(mapconcat
- 'identity
+ #'identity
(cl-mapcar
(lambda (row properties)
- (apply 'propertize
- (mapconcat 'identity
- (cl-mapcar (lambda (s x) (gdb-pad-string s x))
- row column-sizes)
+ (apply #'propertize
+ (mapconcat #'identity
+ (cl-mapcar (lambda (s x) (string-pad s x nil t))
+ row column-sizes)
sep)
properties))
(gdb-table-rows table)
@@ -3688,10 +3689,11 @@ in `gdb-memory-format'."
(dolist (row memory)
(insert (concat (gdb-mi--field row 'addr) ":"))
(dolist (column (gdb-mi--field row 'data))
- (insert (gdb-pad-string column
- (+ 2 (gdb-memory-column-width
- gdb-memory-unit
- gdb-memory-format)))))
+ (insert (string-pad column
+ (+ 2 (gdb-memory-column-width
+ gdb-memory-unit
+ gdb-memory-format))
+ nil t)))
(newline)))
;; Show last page instead of empty buffer when out of bounds
(when gdb-memory-last-address
diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el
index 423de7d5818..4c1f801980a 100644
--- a/lisp/progmodes/grep.el
+++ b/lisp/progmodes/grep.el
@@ -66,6 +66,7 @@ SYMBOL should be one of `grep-command', `grep-template',
integer)
:version "22.1")
+;;;###autoload
(defcustom grep-highlight-matches 'auto-detect
"Use special markers to highlight grep matches.
@@ -345,13 +346,14 @@ See `compilation-error-screen-columns'."
(defalias 'kill-grep #'kill-compilation)
-;; override compilation-last-buffer
+;; override next-error-last-buffer
(defvar grep-last-buffer nil
"The most recent grep buffer.
A grep buffer becomes most recent when you select Grep mode in it.
Notice that using \\[next-error] or \\[compile-goto-error] modifies
-`compilation-last-buffer' rather than `grep-last-buffer'.")
+`next-error-last-buffer' rather than `grep-last-buffer'.")
+;;;###autoload
(defvar grep-match-face 'match
"Face name to use for grep matches.")
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index be43effed7d..ccc57205757 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -1577,16 +1577,17 @@ into one that invokes an Emacs-enabled debugging session.
(seen-e nil)
(shift (lambda () (push (pop args) new-args))))
- ;; Pass all switches and -e scripts through.
+ ;; Pass all switches and -E/-e scripts through.
(while (and args
(string-match "^-" (car args))
(not (equal "-" (car args)))
(not (equal "--" (car args))))
- (when (equal "-e" (car args))
+ (when (or (equal "-E" (car args)) (equal "-e" (car args)))
;; -e goes with the next arg, so shift one extra.
- (or (funcall shift)
- ;; -e as the last arg is an error in Perl.
- (error "No code specified for -e"))
+ (funcall shift)
+ (or args
+ ;; -E (or -e) as the last arg is an error in Perl.
+ (error "No code specified for %s" (car new-args)))
(setq seen-e t))
(funcall shift))
@@ -1697,7 +1698,7 @@ The directory containing the perl program becomes the initial
working directory and source-file directory for your debugger."
(interactive
(list (gud-query-cmdline 'perldb
- (concat (or (buffer-file-name) "-e 0") " "))))
+ (concat (or (buffer-file-name) "-E 0") " "))))
(gud-common-init command-line 'gud-perldb-massage-args
'gud-perldb-marker-filter)
diff --git a/lisp/progmodes/hideif.el b/lisp/progmodes/hideif.el
index f2ada676ab7..d09e1f4cdfe 100644
--- a/lisp/progmodes/hideif.el
+++ b/lisp/progmodes/hideif.el
@@ -2521,8 +2521,7 @@ Turn off hiding by calling `show-ifdefs'."
(or hide-ifdef-read-only hif-outside-read-only))
(and hide-ifdef-verbose
(message "Hiding done, %.1f seconds elapsed"
- (float-time (time-subtract (current-time)
- hide-start-time)))))))
+ (float-time (time-subtract nil hide-start-time)))))))
(defun show-ifdefs (&optional start end)
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index a2061fde762..b290854e1b9 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -7528,7 +7528,7 @@ associated TAG, if any."
(setq cl (pop sclasses))
(let ((tags (idlwave-class-tags cl)))
(while tags
- (if (eq t (compare-strings tag 0 nil (car tags) 0 nil t))
+ (if (string-equal-ignore-case tag (car tags))
(throw 'exit cl))
(setq tags (cdr tags))))))))
@@ -8811,7 +8811,7 @@ to reset the variable `idlwave-true-path-alist' to nil."
;; ----------------------------------------------------------------------------
;;
-;; Additions for use with imenu.el and func-menu.el
+;; Additions for use with imenu.el
;; (pop-up a list of IDL units in the current file).
;;
@@ -8835,16 +8835,7 @@ Assumes that point is at the beginning of the unit as found by
"[a-zA-Z_][a-zA-Z0-9$_]+\\(::[a-zA-Z_][a-zA-Z0-9$_]+\\)?")
(buffer-substring-no-properties begin (point))))
-(defalias 'idlwave-function-menu
- (condition-case nil
- (progn
- (require 'func-menu)
- 'function-menu)
- (error (condition-case nil
- (progn
- (require 'imenu)
- 'imenu)
- (error nil)))))
+(define-obsolete-function-alias 'idlwave-function-menu #'imenu "29.1")
(defun idlwave-edit-in-idlde ()
"Edit the current file in IDL Development environment."
@@ -8864,7 +8855,7 @@ Assumes that point is at the beginning of the unit as found by
;; Menus - using easymenu.el
(defvar idlwave-mode-menu-def
'("IDLWAVE"
- ["PRO/FUNC menu" idlwave-function-menu t]
+ ["PRO/FUNC menu" imenu t]
("Motion"
["Subprogram Start" idlwave-beginning-of-subprogram t]
["Subprogram End" idlwave-end-of-subprogram t]
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index eb2a1e4fccc..efad3b52aa9 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -307,9 +307,6 @@ Match group 1 is the name of the macro.")
(defconst js--font-lock-keywords-2
(append js--font-lock-keywords-1
(list (list js--keyword-re 1 font-lock-keyword-face)
- (list "\\_<for\\_>"
- "\\s-+\\(each\\)\\_>" nil nil
- (list 1 'font-lock-keyword-face))
(cons js--basic-type-re font-lock-type-face)
(cons js--constant-re font-lock-constant-face)))
"Level two font lock keywords for `js-mode'.")
@@ -1830,22 +1827,23 @@ context."
(defun js--class-decl-matcher (limit)
"Font lock function used by `js-mode'.
This performs fontification according to `js--class-styles'."
- (cl-loop initially (js--ensure-cache limit)
- while (re-search-forward js--quick-match-re limit t)
- for orig-end = (match-end 0)
- do (goto-char (match-beginning 0))
- if (cl-loop for style in js--class-styles
- for decl-re = (plist-get style :class-decl)
- if (and (memq (plist-get style :framework)
- js-enabled-frameworks)
- (memq (js-syntactic-context)
- (plist-get style :contexts))
- decl-re
- (looking-at decl-re))
- do (goto-char (match-end 0))
- and return t)
- return t
- else do (goto-char orig-end)))
+ (when js-enabled-frameworks
+ (cl-loop initially (js--ensure-cache limit)
+ while (re-search-forward js--quick-match-re limit t)
+ for orig-end = (match-end 0)
+ do (goto-char (match-beginning 0))
+ if (cl-loop for style in js--class-styles
+ for decl-re = (plist-get style :class-decl)
+ if (and (memq (plist-get style :framework)
+ js-enabled-frameworks)
+ (memq (js-syntactic-context)
+ (plist-get style :contexts))
+ decl-re
+ (looking-at decl-re))
+ do (goto-char (match-end 0))
+ and return t)
+ return t
+ else do (goto-char orig-end))))
(defconst js--font-lock-keywords
'(js--font-lock-keywords-3 js--font-lock-keywords-1
@@ -3490,6 +3488,13 @@ This function is intended for use in `after-change-functions'."
;;(syntax-propertize (point-max))
)
+;;;###autoload
+(define-derived-mode js-json-mode js-mode "JSON"
+ (setq-local js-enabled-frameworks nil)
+ ;; Speed up `syntax-ppss': JSON files can be big but can't hold
+ ;; regexp matchers nor #! thingies (and `js-enabled-frameworks' is nil).
+ (setq-local syntax-propertize-function #'ignore))
+
;; Since we made JSX support available and automatically-enabled in
;; the base `js-mode' (for ease of use), now `js-jsx-mode' simply
;; serves as one other interface to unconditionally enable JSX in
diff --git a/lisp/progmodes/meta-mode.el b/lisp/progmodes/meta-mode.el
index f0fd23f3bc3..30d37cf7ecd 100644
--- a/lisp/progmodes/meta-mode.el
+++ b/lisp/progmodes/meta-mode.el
@@ -156,14 +156,14 @@
(cons (concat "\\<" type-keywords "\\>"
"\\([ \t\f]+\\(\\sw+\\)\\)*")
'((1 font-lock-type-face)
- (font-lock-match-meta-declaration-item-and-skip-to-next
+ (meta-font-lock-match-declaration-item-and-skip-to-next
(goto-char (match-end 1)) nil
(1 font-lock-variable-name-face nil t))))
;; argument declarations: expr, suffix, text, ...
(cons (concat "\\<" args-keywords "\\>"
"\\([ \t\f]+\\(\\sw+\\|\\s_+\\)\\)*")
'((1 font-lock-type-face)
- (font-lock-match-meta-declaration-item-and-skip-to-next
+ (meta-font-lock-match-declaration-item-and-skip-to-next
(goto-char (match-end 1)) nil
(1 font-lock-variable-name-face nil t))))
;; special case of arguments: expr x of y
@@ -193,8 +193,7 @@
))
"Default expressions to highlight in Metafont or MetaPost mode.")
-
-(defun font-lock-match-meta-declaration-item-and-skip-to-next (limit)
+(defun meta-font-lock-match-declaration-item-and-skip-to-next (limit)
;; Match and move over Metafont/MetaPost declaration item after point.
;;
;; The expected syntax of an item is either "word" or "symbol",
@@ -803,11 +802,6 @@ The environment marked is the one that contains point or follows point."
(defvar meta-common-mode-map
(let ((map (make-sparse-keymap)))
- ;; Comment Paragraphs:
- ;; (define-key map "\M-a" 'backward-sentence)
- ;; (define-key map "\M-e" 'forward-sentence)
- ;; (define-key map "\M-h" 'mark-paragraph)
- ;; (define-key map "\M-q" 'fill-paragraph)
;; Navigation:
(define-key map "\M-\C-a" 'meta-beginning-of-defun)
(define-key map "\M-\C-e" 'meta-end-of-defun)
@@ -824,10 +818,6 @@ The environment marked is the one that contains point or follows point."
(define-key map "\C-c:" 'meta-uncomment-region)
;; Symbol Completion:
(define-key map "\M-\t" 'completion-at-point)
- ;; Shell Commands:
- ;; (define-key map "\C-c\C-c" 'meta-command-file)
- ;; (define-key map "\C-c\C-k" 'meta-kill-job)
- ;; (define-key map "\C-c\C-l" 'meta-recenter-output)
map)
"Keymap used in Metafont or MetaPost mode.")
@@ -852,10 +842,6 @@ The environment marked is the one that contains point or follows point."
:active mark-active]
"--"
["Complete Symbol" completion-at-point t]
-; "--"
-; ["Command on Buffer" meta-command-file t]
-; ["Kill Job" meta-kill-job t]
-; ["Recenter Output Buffer" meta-recenter-output-buffer t]
))
@@ -936,6 +922,10 @@ The environment marked is the one that contains point or follows point."
(list (list "\\<\\(\\sw+\\)" 1 'meta-symbol-list)
(list "" 'ispell-complete-word))))
+(define-obsolete-function-alias
+ 'font-lock-match-meta-declaration-item-and-skip-to-next
+ #'meta-font-lock-match-declaration-item-and-skip-to-next "29.1")
+
(provide 'meta-mode)
(run-hooks 'meta-mode-load-hook)
diff --git a/lisp/progmodes/opascal.el b/lisp/progmodes/opascal.el
index 63399adf3ae..5ed719b5a78 100644
--- a/lisp/progmodes/opascal.el
+++ b/lisp/progmodes/opascal.el
@@ -29,7 +29,6 @@
;; .pas (and .dpr and .dpk) files. Emacs, by default, will otherwise
;; enter Pascal mode. For example:
;;
-;; (autoload 'opascal-mode "opascal")
;; (add-to-list 'auto-mode-alist
;; '("\\.\\(pas\\|dpr\\|dpk\\)\\'" . opascal-mode))
diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el
index 92b47ce88f6..70cb4605683 100644
--- a/lisp/progmodes/perl-mode.el
+++ b/lisp/progmodes/perl-mode.el
@@ -1120,7 +1120,6 @@ Returns (parse-state) if line starts inside a string."
(t (forward-char -1) (forward-comment (- (point))) t)))))
;; note: this may be slower than the c-mode version, but I can understand it.
-(defalias 'indent-perl-exp 'perl-indent-exp)
(defun perl-indent-exp ()
"Indent each line of the Perl grouping following point."
(interactive)
@@ -1220,7 +1219,6 @@ With argument, repeat that many times; negative args move backward."
(goto-char (point-min)))))
(setq arg (1+ arg)))))
-(defalias 'mark-perl-function 'perl-mark-function)
(defun perl-mark-function ()
"Put mark at end of Perl function, point at beginning."
(interactive)
@@ -1230,6 +1228,9 @@ With argument, repeat that many times; negative args move backward."
(perl-beginning-of-function)
(backward-paragraph))
+(define-obsolete-function-alias 'indent-perl-exp #'perl-indent-exp "29.1")
+(define-obsolete-function-alias 'mark-perl-function #'perl-mark-function "29.1")
+
(provide 'perl-mode)
;;; perl-mode.el ends here
diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el
index 5aba95d4c79..6437bbd4c1c 100644
--- a/lisp/progmodes/prolog.el
+++ b/lisp/progmodes/prolog.el
@@ -84,14 +84,6 @@
;; You can also customize the variable
;; `prolog-program-name' (in the group `prolog-inferior') and provide
;; a full path for your Prolog system (swi, scitus, etc.).
-;;
-;; Note: I (Stefan, the current maintainer) work under XEmacs. Future
-;; developments will thus be biased towards XEmacs (OK, I admit it,
-;; I am biased towards XEmacs in general), though I will do my best
-;; to keep the GNU Emacs compatibility. So if you work under Emacs
-;; and see something that does not work do drop me a line, as I have
-;; a smaller chance to notice this kind of bugs otherwise.
-; [The above comment dates from 2011.]
;; Changelog:
@@ -1620,8 +1612,6 @@ Used for temporary files.")
(defvar prolog-consult-compile-real-file nil
"The file name of the buffer to compile/consult.")
-(defvar compilation-parse-errors-function)
-
(defun prolog-consult-compile (compilep file &optional first-line)
"Consult/compile FILE.
If COMPILEP is non-nil, perform compilation, otherwise perform CONSULTING.
@@ -1647,14 +1637,14 @@ This function must be called from the source code buffer."
;; Setting up font-locking for this buffer
(setq-local font-lock-defaults
'(prolog-font-lock-keywords nil nil ((?_ . "w"))))
- (if (eq prolog-system 'sicstus)
- ;; FIXME: This looks really problematic: not only is this using
- ;; the old compilation-parse-errors-function, but
- ;; prolog-parse-sicstus-compilation-errors only accepts one argument
- ;; whereas compile.el calls it with 2 (and did so at least since
- ;; Emacs-20).
- (setq-local compilation-parse-errors-function
- 'prolog-parse-sicstus-compilation-errors))
+ ;; (if (eq prolog-system 'sicstus)
+ ;; ;; FIXME: This looks really problematic: not only is this using
+ ;; ;; the old compilation-parse-errors-function, but
+ ;; ;; prolog-parse-sicstus-compilation-errors only accepts one
+ ;; ;; argument whereas compile.el calls it with 2 (and did so at
+ ;; ;; least since Emacs-20).
+ ;; (setq-local compilation-parse-errors-function
+ ;; #'prolog-parse-sicstus-compilation-errors))
(setq buffer-read-only nil)
(insert command-string "\n"))
(display-buffer buffer)
@@ -1685,40 +1675,41 @@ This function must be called from the source code buffer."
(defvar compilation-error-list)
-(defun prolog-parse-sicstus-compilation-errors (limit)
- "Parse the prolog compilation buffer for errors.
-Argument LIMIT is a buffer position limiting searching.
-For use with the `compilation-parse-errors-function' variable."
- (setq compilation-error-list nil)
- (message "Parsing SICStus error messages...")
- (let (filepath dir file errorline)
- (while
- (re-search-backward
- "{\\([a-zA-Z ]* ERROR\\|Warning\\):.* in line[s ]*\\([0-9]+\\)"
- limit t)
- (setq errorline (string-to-number (match-string 2)))
- (save-excursion
- (re-search-backward
- "{\\(consulting\\|compiling\\|processing\\) \\(.*\\)\\.\\.\\.}"
- limit t)
- (setq filepath (match-string 2)))
-
- ;; ###### Does this work with SICStus under Windows
- ;; (i.e. backslashes and stuff?)
- (if (string-match "\\(.*/\\)\\([^/]*\\)$" filepath)
- (progn
- (setq dir (match-string 1 filepath))
- (setq file (match-string 2 filepath))))
-
- (setq compilation-error-list
- (cons
- (cons (save-excursion
- (beginning-of-line)
- (point-marker))
- (list (list file dir) errorline))
- compilation-error-list)
- ))
- ))
+;; FIXME: This has been obsolete since Emacs-20!
+;; (defun prolog-parse-sicstus-compilation-errors (limit)
+;; "Parse the prolog compilation buffer for errors.
+;; Argument LIMIT is a buffer position limiting searching.
+;; For use with the `compilation-parse-errors-function' variable."
+;; (setq compilation-error-list nil)
+;; (message "Parsing SICStus error messages...")
+;; (let (filepath dir file errorline)
+;; (while
+;; (re-search-backward
+;; "{\\([a-zA-Z ]* ERROR\\|Warning\\):.* in line[s ]*\\([0-9]+\\)"
+;; limit t)
+;; (setq errorline (string-to-number (match-string 2)))
+;; (save-excursion
+;; (re-search-backward
+;; "{\\(consulting\\|compiling\\|processing\\) \\(.*\\)\\.\\.\\.}"
+;; limit t)
+;; (setq filepath (match-string 2)))
+
+;; ;; ###### Does this work with SICStus under Windows
+;; ;; (i.e. backslashes and stuff?)
+;; (if (string-match "\\(.*/\\)\\([^/]*\\)$" filepath)
+;; (progn
+;; (setq dir (match-string 1 filepath))
+;; (setq file (match-string 2 filepath))))
+
+;; (setq compilation-error-list
+;; (cons
+;; (cons (save-excursion
+;; (beginning-of-line)
+;; (point-marker))
+;; (list (list file dir) errorline))
+;; compilation-error-list)
+;; ))
+;; ))
(defun prolog-consult-compile-filter (process output)
"Filter function for Prolog compilation PROCESS.
diff --git a/lisp/progmodes/ps-mode.el b/lisp/progmodes/ps-mode.el
index 7c9aee2b2a8..89482d86ce2 100644
--- a/lisp/progmodes/ps-mode.el
+++ b/lisp/progmodes/ps-mode.el
@@ -34,7 +34,6 @@
;;; Code:
-(defconst ps-mode-version "1.1i, 17 May 2008")
(defconst ps-mode-maintainer-address
"Peter Kleiweg <p.c.j.kleiweg@rug.nl>, bug-gnu-emacs@gnu.org")
@@ -519,7 +518,7 @@ Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when the cursor is at the number
(defun ps-mode-show-version ()
"Show current version of PostScript mode."
(interactive)
- (message " *** PostScript Mode (ps-mode) Version %s *** " ps-mode-version))
+ (message " *** PostScript Mode (ps-mode) in GNU Emacs %s *** " emacs-version))
;; From reporter.el
(defvar reporter-prompt-for-summary-p)
@@ -534,7 +533,7 @@ Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when the cursor is at the number
ps-run-font-lock-keywords-2)))
(reporter-submit-bug-report
ps-mode-maintainer-address
- (format "ps-mode.el %s [%s]" ps-mode-version system-type)
+ (format "ps-mode.el %s [%s]" emacs-version system-type)
'(ps-mode-tab
ps-mode-paper-size
ps-mode-print-function
@@ -1094,6 +1093,9 @@ Use line numbers if `ps-run-error-line-numbers' is not nil."
;;
(add-hook 'kill-emacs-hook #'ps-run-cleanup)
+(defconst ps-mode-version "1.1i, 17 May 2008")
+(make-obsolete-variable 'ps-mode-version 'emacs-version "29.1")
+
(provide 'ps-mode)
;;; ps-mode.el ends here
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 1c99937c4b9..44df3186b27 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -427,7 +427,19 @@ This variant of `rx' supports common Python named REGEXPS."
(: "vim:" (* space) "set" (+ space)
"fileencoding" (* space) ?= (* space)
(group-n 1 (+ (or word ?-)))
- (* space) ":")))))
+ (* space) ":"))))
+ (bytes-escape-sequence
+ (seq (not "\\")
+ (group (or "\\\\" "\\'" "\\a" "\\b" "\\f"
+ "\\n" "\\r" "\\t" "\\v"
+ (seq "\\" (** 1 3 (in "0-7")))
+ (seq "\\x" hex hex)))))
+ (string-escape-sequence
+ (or bytes-escape-sequence
+ (seq (not "\\")
+ (or (group-n 1 "\\u" (= 4 hex))
+ (group-n 1 "\\U" (= 8 hex))
+ (group-n 1 "\\N{" (*? anychar) "}"))))))
(rx ,@regexps)))
@@ -539,6 +551,37 @@ the {...} holes that appear within f-strings."
(goto-char (min limit (1+ send)))
(setq ppss (syntax-ppss))))))
+(defconst python--not-raw-bytes-literal-start-regexp
+ (rx (or bos (not alnum)) (or "b" "B") (or "\"" "\"\"\"" "'" "'''") eos)
+ "A regular expression matching the start of a not-raw bytes literal.")
+
+(defconst python--not-raw-string-literal-start-regexp
+ (rx bos (or
+ ;; Multi-line string literals
+ (seq (? (? (not alnum)) (or "u" "U" "F" "f")) (or "\"\"\"" "'''"))
+ (seq (? anychar) (not alnum) (or "\"\"\"" "'''"))
+ ;; Single line string literals
+ (seq (? (** 0 2 anychar) (not alnum)) (or "u" "U" "F" "f") (or "'" "\""))
+ (seq (? (** 0 3 anychar) (not (any "'\"" alnum))) (or "'" "\"")))
+ eos)
+ "A regular expression matching the start of a not-raw string literal.")
+
+(defun python--string-bytes-literal-matcher (regexp start-regexp)
+ "Match REGEXP within a string or bytes literal whose start matches START-REGEXP."
+ (lambda (limit)
+ (cl-loop for result = (re-search-forward regexp limit t)
+ for result-valid = (and
+ result
+ (when-let* ((pos (nth 8 (syntax-ppss)))
+ (before-quote
+ (buffer-substring-no-properties
+ (max (- pos 4) (point-min))
+ (min (+ pos 1) (point-max)))))
+ (backward-char)
+ (string-match-p start-regexp before-quote)))
+ until (or (not result) result-valid)
+ finally return (and result-valid result))))
+
(defvar python-font-lock-keywords-level-1
`((,(python-rx symbol-start "def" (1+ space) (group symbol-name))
(1 font-lock-function-name-face))
@@ -716,7 +759,24 @@ sign in chained assignment."
grouped-assignment-target (* space)
(or ")" "]") (* space)
assignment-operator))
- (1 font-lock-variable-name-face)))
+ (1 font-lock-variable-name-face))
+ ;; escape sequences within bytes literals
+ ;; "\\" "\'" "\a" "\b" "\f" "\n" "\r" "\t" "\v"
+ ;; "\ooo" character with octal value ooo
+ ;; "\xhh" character with hex value hh
+ (,(python--string-bytes-literal-matcher
+ (python-rx bytes-escape-sequence)
+ python--not-raw-bytes-literal-start-regexp)
+ (1 font-lock-constant-face t))
+ ;; escape sequences within string literals, the same as appear in bytes
+ ;; literals in addition to:
+ ;; "\uxxxx" Character with 16-bit hex value xxxx
+ ;; "\Uxxxxxxxx" Character with 32-bit hex value xxxxxxxx
+ ;; "\N{name}" Character named name in the Unicode database
+ (,(python--string-bytes-literal-matcher
+ (python-rx string-escape-sequence)
+ python--not-raw-string-literal-start-regexp)
+ (1 'font-lock-constant-face t)))
"Font lock keywords to use in `python-mode' for maximum decoration.
This decoration level includes everything in
@@ -1454,21 +1514,27 @@ With positive ARG search backwards, else search forwards."
(line-beg-pos (line-beginning-position))
(line-content-start (+ line-beg-pos (current-indentation)))
(pos (point-marker))
- (min-indentation (+ (current-indentation)
- (if (python-info-looking-at-beginning-of-defun)
- python-indent-offset 0)))
+ (min-indentation (if (python-info-current-line-empty-p)
+ most-positive-fixnum
+ (current-indentation)))
(body-indentation
(and (> arg 0)
- (save-excursion
- (while (and
- (or (not (python-info-looking-at-beginning-of-defun))
- (>= (current-indentation) min-indentation))
- (setq min-indentation
- (min min-indentation (current-indentation)))
- (python-nav-backward-block)))
- (or (and (python-info-looking-at-beginning-of-defun)
- (+ (current-indentation) python-indent-offset))
- 0))))
+ (or (and (python-info-looking-at-beginning-of-defun nil t)
+ (+ (save-excursion
+ (python-nav-beginning-of-statement)
+ (current-indentation))
+ python-indent-offset))
+ (save-excursion
+ (while
+ (and
+ (python-nav-backward-block)
+ (or (not (python-info-looking-at-beginning-of-defun))
+ (>= (current-indentation) min-indentation))
+ (setq min-indentation
+ (min min-indentation (current-indentation)))))
+ (or (and (python-info-looking-at-beginning-of-defun)
+ (+ (current-indentation) python-indent-offset))
+ 0)))))
(found
(progn
(when (and (python-info-looking-at-beginning-of-defun nil t)
@@ -1703,16 +1769,16 @@ backward to previous statement."
"Move to start of current block."
(interactive "^")
(let ((starting-pos (point)))
+ ;; Go to first line beginning a statement
+ (while (and (not (bobp))
+ (or (and (python-nav-beginning-of-statement) nil)
+ (python-info-current-line-comment-p)
+ (python-info-current-line-empty-p)))
+ (forward-line -1))
(if (progn
(python-nav-beginning-of-statement)
(looking-at (python-rx block-start)))
(point-marker)
- ;; Go to first line beginning a statement
- (while (and (not (bobp))
- (or (and (python-nav-beginning-of-statement) nil)
- (python-info-current-line-comment-p)
- (python-info-current-line-empty-p)))
- (forward-line -1))
(let ((block-matching-indent
(- (current-indentation) python-indent-offset)))
(while
@@ -1756,7 +1822,8 @@ backward to previous block."
(or arg (setq arg 1))
(let ((block-start-regexp
(python-rx line-start (* whitespace) block-start))
- (starting-pos (point)))
+ (starting-pos (point))
+ (orig-arg arg))
(while (> arg 0)
(python-nav-end-of-statement)
(while (and
@@ -1770,7 +1837,8 @@ backward to previous block."
(python-syntax-context-type)))
(setq arg (1+ arg)))
(python-nav-beginning-of-statement)
- (if (not (looking-at (python-rx block-start)))
+ (if (or (and (> orig-arg 0) (< (point) starting-pos))
+ (not (looking-at (python-rx block-start))))
(and (goto-char starting-pos) nil)
(and (not (= (point) starting-pos)) (point-marker)))))
@@ -5165,7 +5233,8 @@ likely an invalid python file."
(while (and (< (point) cur-line)
(setq no-back-indent
(or (> (current-indentation) indentation)
- (python-info-current-line-empty-p))))
+ (python-info-current-line-empty-p)
+ (python-info-current-line-comment-p))))
(forward-line)))
no-back-indent)))
(setq collected-indentations
@@ -5793,11 +5862,6 @@ REPORT-FN is Flymake's callback function."
(add-hook 'flymake-diagnostic-functions #'python-flymake nil t))
-
(provide 'python)
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-
;;; python.el ends here
diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el
index 31d50a1882e..f063fb5a7ca 100644
--- a/lisp/progmodes/verilog-mode.el
+++ b/lisp/progmodes/verilog-mode.el
@@ -5458,9 +5458,11 @@ For example:
becomes:
// surefire lint_line_off UDDONX"
(interactive)
- (let ((buff (if (boundp 'next-error-last-buffer)
+ (let ((buff (if (boundp 'next-error-last-buffer) ;Added to Emacs-22.1
next-error-last-buffer
- compilation-last-buffer)))
+ (verilog--suppressed-warnings
+ ((obsolete compilation-last-buffer))
+ compilation-last-buffer))))
(when (buffer-live-p buff)
(save-excursion
(switch-to-buffer buff)
@@ -10878,10 +10880,10 @@ This repairs those mis-inserted by an AUTOARG."
(setq out (replace-match
(concat (match-string 1 out)
(if (equal (match-string 3 out) ">>")
- (int-to-string (lsh (string-to-number (match-string 2 out))
+ (int-to-string (ash (string-to-number (match-string 2 out))
(* -1 (string-to-number (match-string 4 out))))))
(if (equal (match-string 3 out) "<<")
- (int-to-string (lsh (string-to-number (match-string 2 out))
+ (int-to-string (ash (string-to-number (match-string 2 out))
(string-to-number (match-string 4 out)))))
(if (equal (match-string 3 out) ">>>")
(int-to-string (ash (string-to-number (match-string 2 out))
diff --git a/lisp/progmodes/which-func.el b/lisp/progmodes/which-func.el
index 2e8e8d23192..4fe4edc1648 100644
--- a/lisp/progmodes/which-func.el
+++ b/lisp/progmodes/which-func.el
@@ -61,6 +61,9 @@
;;; Code:
+;; So that we can use the edebug spec in `lisp-current-defun-name'.
+(require 'edebug)
+
;; Variables for customization
;; ---------------------------
;;
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 0213ab3cc58..f3db971bcf2 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -1,7 +1,7 @@
;;; xref.el --- Cross-referencing commands -*-lexical-binding:t-*-
;; Copyright (C) 2014-2022 Free Software Foundation, Inc.
-;; Version: 1.4.1
+;; Version: 1.5.0
;; Package-Requires: ((emacs "26.1"))
;; This is a GNU ELPA :core package. Avoid functionality that is not
@@ -1821,7 +1821,8 @@ to control which program to use when looking for matches."
(when (and (/= (point-min) (point-max))
(not (looking-at grep-re))
;; TODO: Show these matches as well somehow?
- (not (looking-at "Binary file .* matches")))
+ ;; Matching both Grep's and Ripgrep 13's messages.
+ (not (looking-at ".*[bB]inary file.* matches")))
(user-error "Search failed with status %d: %s" status
(buffer-substring (point-min) (line-end-position))))
(while (re-search-forward grep-re nil t)
diff --git a/lisp/progmodes/xscheme.el b/lisp/progmodes/xscheme.el
index 6e21131e4aa..4fb543a3bf5 100644
--- a/lisp/progmodes/xscheme.el
+++ b/lisp/progmodes/xscheme.el
@@ -1,7 +1,6 @@
;;; xscheme.el --- run MIT Scheme under Emacs -*- lexical-binding: t; -*-
-;; Copyright (C) 1986-1987, 1989-1990, 2001-2022 Free Software
-;; Foundation, Inc.
+;; Copyright (C) 1986-2022 Free Software Foundation, Inc.
;; Maintainer: emacs-devel@gnu.org
;; Keywords: languages, lisp
@@ -71,7 +70,9 @@ by the scheme process, so additional control-g's are to be ignored.")
(defvar xscheme-string-receiver nil
"Procedure to send the string argument from the scheme process.")
-(defconst default-xscheme-runlight
+(define-obsolete-variable-alias 'default-xscheme-runlight
+ 'xscheme-default-runlight "29.1")
+(defconst xscheme-default-runlight
'(": " xscheme-runlight-string)
"Default global (shared) xscheme-runlight mode line format.")
@@ -240,7 +241,7 @@ With argument, asks for a command line."
(list (read-buffer "Scheme interaction buffer: "
xscheme-buffer-name
t)))
- (let ((process-name (verify-xscheme-buffer buffer-name nil)))
+ (let ((process-name (xscheme-verify-buffer buffer-name nil)))
(setq-default xscheme-buffer-name buffer-name)
(setq-default xscheme-process-name process-name)
(setq-default xscheme-runlight-string
@@ -248,8 +249,8 @@ With argument, asks for a command line."
xscheme-runlight-string))
(setq-default xscheme-runlight
(if (eq (process-status process-name) 'run)
- default-xscheme-runlight
- ""))))
+ xscheme-default-runlight
+ ""))))
(defun local-set-scheme-interaction-buffer (buffer-name)
"Set the scheme interaction buffer for the current buffer."
@@ -257,7 +258,7 @@ With argument, asks for a command line."
(list (read-buffer "Scheme interaction buffer: "
xscheme-buffer-name
t)))
- (let ((process-name (verify-xscheme-buffer buffer-name t)))
+ (let ((process-name (xscheme-verify-buffer buffer-name t)))
(setq-local xscheme-buffer-name buffer-name)
(setq-local xscheme-process-name process-name)
(setq-local xscheme-runlight
@@ -273,7 +274,7 @@ With argument, asks for a command line."
(kill-local-variable 'xscheme-process-name)
(kill-local-variable 'xscheme-runlight))
-(defun verify-xscheme-buffer (buffer-name localp)
+(defun xscheme-verify-buffer (buffer-name localp)
(if (and localp (xscheme-process-buffer-current-p))
(error "Cannot change the interaction buffer of an interaction buffer"))
(let* ((buffer (get-buffer buffer-name))
@@ -921,8 +922,8 @@ the remaining input.")
(setq scheme-mode-line-process '(": " xscheme-runlight-string))
(xscheme-mode-line-initialize name)
(if (equal name (default-value 'xscheme-buffer-name))
- (setq-default xscheme-runlight default-xscheme-runlight))))
- (if (or (eq xscheme-runlight default-xscheme-runlight)
+ (setq-default xscheme-runlight xscheme-default-runlight))))
+ (if (or (eq xscheme-runlight xscheme-default-runlight)
(equal xscheme-runlight ""))
(setq xscheme-runlight (list ": " 'xscheme-buffer-name ": " "?")))
(rplaca (nthcdr 3 xscheme-runlight)
@@ -1180,6 +1181,8 @@ the remaining input.")
(if (nth 2 state) 'many 'one)))))
(set-syntax-table old-syntax-table)))))
+(define-obsolete-function-alias 'verify-xscheme-buffer #'xscheme-verify-buffer "29.1")
+
(provide 'xscheme)
;;; xscheme.el ends here
diff --git a/lisp/ps-def.el b/lisp/ps-def.el
deleted file mode 100644
index 8c5187ca8bf..00000000000
--- a/lisp/ps-def.el
+++ /dev/null
@@ -1,134 +0,0 @@
-;;; ps-def.el --- Emacs definitions for ps-print -*- lexical-binding: t -*-
-
-;; Copyright (C) 2007-2022 Free Software Foundation, Inc.
-
-;; Author: Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>
-;; Kenichi Handa <handa@gnu.org> (multi-byte characters)
-;; Keywords: wp, print, PostScript
-;; URL: https://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre
-;; Package: ps-print
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; See ps-print.el for documentation.
-
-;;; Code:
-
-(declare-function ps-plot-with-face "ps-print" (from to face))
-(declare-function ps-plot-string "ps-print" (string))
-
-(defvar ps-bold-faces) ; in ps-print.el
-(defvar ps-italic-faces)
-
-
-
-
-;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Emacs Definitions
-
-
-(defun ps-mark-active-p ()
- mark-active)
-
-
-(defun ps-face-foreground-name (face)
- (face-foreground face nil t))
-
-
-(defun ps-face-background-name (face)
- (face-background face nil t))
-
-
-(define-obsolete-function-alias 'ps-frame-parameter #'frame-parameter "28.1")
-
-;; Return t if the device (which can be changed during an emacs session) can
-;; handle colors.
-(defun ps-color-device ()
- (color-values "Green"))
-
-(define-obsolete-function-alias 'ps-color-values #'color-values "28.1")
-
-
-(defun ps-face-bold-p (face)
- (or (face-bold-p face)
- (memq face ps-bold-faces)))
-
-
-(defun ps-face-italic-p (face)
- (or (face-italic-p face)
- (memq face ps-italic-faces)))
-
-
-(defun ps-face-strikeout-p (face)
- (eq (face-attribute face :strike-through) t))
-
-
-(defun ps-face-overline-p (face)
- (eq (face-attribute face :overline) t))
-
-
-(defun ps-face-box-p (face)
- (not (memq (face-attribute face :box) '(nil unspecified))))
-
-
-;; Emacs understands the %f format; we'll use it to limit color RGB values
-;; to three decimals to cut down some on the size of the PostScript output.
-(defvar ps-color-format "%0.3f %0.3f %0.3f")
-(defvar ps-float-format "%0.3f ")
-
-
-(defun ps-generate-postscript-with-faces1 (from to)
- ;; Generate some PostScript.
- (let ((face 'default)
- (position to)
- ;; Emacs
- (property-change from)
- (overlay-change from)
- before-string after-string)
- (while (< from to)
- (and (< property-change to) ; Don't search for property change
- ; unless previous search succeeded.
- (setq property-change (next-property-change from nil to)))
- (and (< overlay-change to) ; Don't search for overlay change
- ; unless previous search succeeded.
- (setq overlay-change (min (next-overlay-change from)
- to)))
- (setq position (min property-change overlay-change)
- before-string nil
- after-string nil)
- (setq face
- (cond ((invisible-p from)
- 'emacs--invisible--face)
- ((get-char-property from 'face))
- (t 'default)))
- ;; Plot up to this record.
- (and before-string
- (ps-plot-string before-string))
- (ps-plot-with-face from position face)
- (and after-string
- (ps-plot-string after-string))
- (setq from position))
- (ps-plot-with-face from to face)))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(provide 'ps-def)
-
-;;; ps-def.el ends here
diff --git a/lisp/ps-print.el b/lisp/ps-print.el
index 885aa3cc7c7..d67c34e11ab 100644
--- a/lisp/ps-print.el
+++ b/lisp/ps-print.el
@@ -8,21 +8,9 @@
;; Kenichi Handa <handa@gnu.org> (multi-byte characters)
;; Maintainer: Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>
;; Keywords: wp, print, PostScript
-;; Version: 7.3.5
+;; Old-Version: 7.3.5
;; URL: https://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre
-(eval-when-compile (require 'cl-lib))
-
-(defconst ps-print-version "7.3.5"
- "ps-print.el, v 7.3.5 <2009/12/23 vinicius>
-
-Vinicius's last change version -- this file may have been edited as part of
-Emacs without changes to the version number. When reporting bugs, please also
-report the version of Emacs, if any, that ps-print was distributed with.
-
-Please send all bug fixes and enhancements to
- bug-gnu-emacs@gnu.org and Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>.")
-
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
@@ -1320,11 +1308,11 @@ Please send all bug fixes and enhancements to
;; Known bugs and limitations of ps-print
;; --------------------------------------
;;
-;; Automatic font-attribute detection doesn't work well, especially with
-;; hilit19 and older versions of get-create-face. Users having problems with
-;; auto-font detection should use the lists `ps-italic-faces', `ps-bold-faces'
-;; and `ps-underlined-faces' and/or turn off automatic detection by setting
-;; `ps-auto-font-detect' to nil.
+;; Automatic font-attribute detection doesn't work well. Users having
+;; problems with auto-font detection should use the lists
+;; `ps-italic-faces', `ps-bold-faces' and `ps-underlined-faces' and/or
+;; turn off automatic detection by setting `ps-auto-font-detect' to
+;; nil.
;;
;; Still too slow; could use some hand-optimization.
;;
@@ -1450,11 +1438,8 @@ Please send all bug fixes and enhancements to
;;; Code:
-
(require 'lpr)
-
-;; Load Emacs definitions
-(require 'ps-def)
+(eval-when-compile (require 'cl-lib))
;; autoloads for secondary file
(require 'ps-print-loaddefs)
@@ -2930,9 +2915,8 @@ Either a float or a cons of floats (LANDSCAPE-SIZE . PORTRAIT-SIZE)."
;;; Colors
-;; Printing color requires x-color-values.
;;;###autoload
-(defcustom ps-print-color-p (fboundp 'x-color-values)
+(defcustom ps-print-color-p t
"Specify how buffer's text color is printed.
Valid values are:
@@ -3601,7 +3585,6 @@ The table depends on the current ps-print setup."
(mapconcat
#'ps-print-quote
(list
- (concat "\n;;; (Emacs) ps-print version " ps-print-version "\n")
";; internal vars"
(ps-comment-string "emacs-version " emacs-version)
(ps-comment-string "lpr-windows-system" lpr-windows-system)
@@ -4510,7 +4493,7 @@ page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
(defun ps-print-preprint-region (prefix)
- (or (ps-mark-active-p)
+ (or mark-active
(error "The mark is not set now"))
(list (point) (mark) (ps-print-preprint prefix)))
@@ -4733,6 +4716,10 @@ page-height == ((floor print-height ((th + ls) * zh)) * ((th + ls) * zh)) - th
(defun ps-output-boolean (name bool)
(ps-output (format "/%s %s def\n" name (if bool "true" "false"))))
+;; Limit color RGB values to three decimals to cut down some on the
+;; size of the PostScript output.
+(defvar ps-color-format "%0.3f %0.3f %0.3f")
+(defvar ps-float-format "%0.3f ")
(defun ps-output-frame-properties (name alist)
(ps-output "/" name " ["
@@ -5348,7 +5335,7 @@ XSTART YSTART are the relative position for the first page in a sheet.")
ps-adobe-tag
"%%Title: " (buffer-name) ; Take job name from name of
; first buffer printed
- "\n%%Creator: ps-print v" ps-print-version
+ "\n%%Creator: GNU Emacs " emacs-version
"\n%%For: " (user-full-name) ;FIXME: may need encoding!
"\n%%CreationDate: " (format-time-string "%T %b %d %Y") ;FIXME: encoding!
"\n%%Orientation: "
@@ -5749,7 +5736,7 @@ XSTART YSTART are the relative position for the first page in a sheet.")
;; Set the color scale. We do it here instead of in the defvar so
;; that ps-print can be dumped into emacs. This expression can't be
;; evaluated at dump-time because X isn't initialized.
- ps-color-p (and ps-print-color-p (ps-color-device))
+ ps-color-p (and ps-print-color-p (display-color-p))
ps-print-color-scale (if ps-color-p
(float (car (color-values "white")))
1.0)
@@ -5762,7 +5749,7 @@ XSTART YSTART are the relative position for the first page in a sheet.")
((eq ps-default-bg 'frame-parameter)
(frame-parameter nil 'background-color))
((eq ps-default-bg t)
- (ps-face-background-name 'default))
+ (face-background 'default nil t))
(t
ps-default-bg))
"unspecified-bg"
@@ -5776,7 +5763,7 @@ XSTART YSTART are the relative position for the first page in a sheet.")
((eq ps-default-fg 'frame-parameter)
(frame-parameter nil 'foreground-color))
((eq ps-default-fg t)
- (ps-face-foreground-name 'default))
+ (face-foreground 'default nil t))
(t
ps-default-fg))
"unspecified-fg"
@@ -6312,6 +6299,22 @@ If FACE is not a valid face name, use default face."
(setq ps-print-face-alist (cons face-map ps-print-face-alist)))
face-map))
+(defun ps-face-bold-p (face)
+ (or (face-bold-p face)
+ (memq face ps-bold-faces)))
+
+(defun ps-face-italic-p (face)
+ (or (face-italic-p face)
+ (memq face ps-italic-faces)))
+
+(defun ps-face-strikeout-p (face)
+ (eq (face-attribute face :strike-through) t))
+
+(defun ps-face-overline-p (face)
+ (eq (face-attribute face :overline) t))
+
+(defun ps-face-box-p (face)
+ (not (memq (face-attribute face :box) '(nil unspecified))))
(defun ps-screen-to-bit-face (face)
(cons face
@@ -6321,9 +6324,41 @@ If FACE is not a valid face name, use default face."
(if (ps-face-strikeout-p face) 8 0) ; strikeout
(if (ps-face-overline-p face) 16 0) ; overline
(if (ps-face-box-p face) 64 0)) ; box
- (ps-face-foreground-name face)
- (ps-face-background-name face))))
+ (face-foreground face nil t)
+ (face-background face nil t))))
+
+(defun ps-generate-postscript-with-faces1 (from to)
+ ;; Generate some PostScript.
+ (let ((face 'default)
+ (position to)
+ (property-change from)
+ (overlay-change from)
+ before-string after-string)
+ (while (< from to)
+ (and (< property-change to) ; Don't search for property change
+ ; unless previous search succeeded.
+ (setq property-change (next-property-change from nil to)))
+ (and (< overlay-change to) ; Don't search for overlay change
+ ; unless previous search succeeded.
+ (setq overlay-change (min (next-overlay-change from)
+ to)))
+ (setq position (min property-change overlay-change)
+ before-string nil
+ after-string nil)
+ (setq face
+ (cond ((invisible-p from)
+ 'emacs--invisible--face)
+ ((get-char-property from 'face))
+ (t 'default)))
+ ;; Plot up to this record.
+ (and before-string
+ (ps-plot-string before-string))
+ (ps-plot-with-face from position face)
+ (and after-string
+ (ps-plot-string after-string))
+ (setq from position))
+ (ps-plot-with-face from to face)))
(defun ps-generate-postscript-with-faces (from to)
;; Some initialization...
@@ -6501,6 +6536,17 @@ If FACE is not a valid face name, use default face."
(unless noninteractive
(add-hook 'kill-emacs-query-functions #'ps-kill-emacs-check))
+(defconst ps-print-version "7.3.5"
+ "ps-print.el, v 7.3.5 <2009/12/23 vinicius>
+
+Vinicius's last change version -- this file may have been edited as part of
+Emacs without changes to the version number. When reporting bugs, please also
+report the version of Emacs, if any, that ps-print was distributed with.
+
+Please send all bug fixes and enhancements to
+ bug-gnu-emacs@gnu.org and Vinicius Jose Latorre <viniciusjl.gnu@gmail.com>.")
+(make-obsolete-variable 'ps-print-version 'emacs-version "29.1")
+
(define-obsolete-function-alias 'ps-print-ensure-fontified #'font-lock-ensure "29.1")
(provide 'ps-print)
diff --git a/lisp/rect.el b/lisp/rect.el
index e717d2ac7e1..6babd046051 100644
--- a/lisp/rect.el
+++ b/lisp/rect.el
@@ -407,7 +407,7 @@ no text on the right side of the rectangle."
(point))))))
;;;###autoload
-(defalias 'close-rectangle 'delete-whitespace-rectangle) ;; Old name
+(define-obsolete-function-alias 'close-rectangle #'delete-whitespace-rectangle "29.1")
;;;###autoload
(defun delete-whitespace-rectangle (start end &optional fill)
@@ -536,7 +536,7 @@ Called from a program, takes three args; START, END and STRING."
(apply-on-rectangle 'string-rectangle-line start end string t)))
;;;###autoload
-(defalias 'replace-rectangle 'string-rectangle)
+(define-obsolete-function-alias 'replace-rectangle #'string-rectangle "29.1")
;;;###autoload
(defun string-insert-rectangle (start end string)
@@ -634,18 +634,17 @@ with a prefix argument, prompt for START-AT and FORMAT."
(add-function :around region-insert-function
#'rectangle--insert-region)
-(defvar rectangle-mark-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [?\C-o] 'open-rectangle)
- (define-key map [?\C-t] 'string-rectangle)
- (define-key map [remap exchange-point-and-mark]
- 'rectangle-exchange-point-and-mark)
- (dolist (cmd '(right-char left-char forward-char backward-char
- next-line previous-line))
- (define-key map (vector 'remap cmd)
- (intern (format "rectangle-%s" cmd))))
- map)
- "Keymap used while marking a rectangular region.")
+(defvar-keymap rectangle-mark-mode-map
+ :doc "Keymap used while marking a rectangular region."
+ "C-o" #'open-rectangle
+ "C-t" #'string-rectangle
+ "<remap> <exchange-point-and-mark>" #'rectangle-exchange-point-and-mark
+ "<remap> <right-char>" #'rectangle-right-char
+ "<remap> <left-char>" #'rectangle-left-char
+ "<remap> <forward-char>" #'rectangle-forward-char
+ "<remap> <backward-char>" #'rectangle-backward-char
+ "<remap> <next-line>" #'rectangle-next-line
+ "<remap> <previous-line>" #'rectangle-previous-line)
;;;###autoload
(define-minor-mode rectangle-mark-mode
@@ -931,6 +930,27 @@ Ignores `line-move-visual'."
(mapc #'delete-overlay (nthcdr 5 rol))
(setcar (cdr rol) nil)))
+(defun rectangle--duplicate-right (n)
+ "Duplicate the rectangular region N times on the right-hand side."
+ (let ((cols (rectangle--pos-cols (point) (mark))))
+ (apply-on-rectangle
+ (lambda (startcol endcol)
+ (let ((lines (list nil)))
+ (extract-rectangle-line startcol endcol lines)
+ (move-to-column endcol t)
+ (dotimes (_ n)
+ (insert (cadr lines)))))
+ (region-beginning) (region-end))
+ ;; Recompute the rectangle state; no crutches should be needed now.
+ (let ((p (point))
+ (m (mark)))
+ (rectangle--reset-crutches)
+ (goto-char m)
+ (move-to-column (cdr cols) t)
+ (set-mark (point))
+ (goto-char p)
+ (move-to-column (car cols) t))))
+
(provide 'rect)
;;; rect.el ends here
diff --git a/lisp/replace.el b/lisp/replace.el
index 54ee64f64a5..2bb9c1b90dc 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -157,7 +157,7 @@ is highlighted lazily using isearch lazy highlighting (see
(defvar replace-count 0
"Number of replacements done so far.
-See `replace-regexp' and `query-replace-regexp-eval'.")
+See `replace-regexp'.")
(defun query-replace-descr (string)
(setq string (copy-sequence string))
@@ -563,84 +563,6 @@ REGION-NONCONTIGUOUS-P are passed to `perform-replace' (which see)."
(define-key esc-map [?\C-%] 'query-replace-regexp)
-(defun query-replace-regexp-eval (regexp to-expr &optional delimited start end region-noncontiguous-p)
- "Replace some things after point matching REGEXP with the result of TO-EXPR.
-
-Interactive use of this function is deprecated in favor of the
-`\\,' feature of `query-replace-regexp'. For non-interactive use, a loop
-using `search-forward-regexp' and `replace-match' is preferred.
-
-As each match is found, the user must type a character saying
-what to do with it. Type SPC or `y' to replace the match,
-DEL or `n' to skip and go to the next match. For more directions,
-type \\[help-command] at that time.
-
-TO-EXPR is a Lisp expression evaluated to compute each replacement. It may
-reference `replace-count' to get the number of replacements already made.
-If the result of TO-EXPR is not a string, it is converted to one using
-`prin1-to-string' with the NOESCAPE argument (which see).
-
-For convenience, when entering TO-EXPR interactively, you can use `\\&'
-to stand for whatever matched the whole of REGEXP, and `\\N' (where
-N is a digit) to stand for whatever matched the Nth `\\(...\\)' (1-based)
-in REGEXP.
-
-Use `\\#&' or `\\#N' if you want a number instead of a string.
-In interactive use, `\\#' in itself stands for `replace-count'.
-
-In Transient Mark mode, if the mark is active, operate on the contents
-of the region. Otherwise, operate from point to the end of the buffer's
-accessible portion.
-
-Use \\<minibuffer-local-map>\\[next-history-element] \
-to pull the last incremental search regexp to the minibuffer
-that reads REGEXP.
-
-Preserves case in each replacement if `case-replace' and `case-fold-search'
-are non-nil and REGEXP has no uppercase letters.
-
-Ignore read-only matches if `query-replace-skip-read-only' is non-nil,
-ignore hidden matches if `search-invisible' is nil, and ignore more
-matches using `isearch-filter-predicate'.
-
-If `replace-regexp-lax-whitespace' is non-nil, a space or spaces in the regexp
-to be replaced will match a sequence of whitespace chars defined by the
-regexp in `search-whitespace-regexp'.
-
-This function is not affected by `replace-char-fold'.
-
-Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
-only matches that are surrounded by word boundaries.
-Fourth and fifth arg START and END specify the region to operate on.
-
-Arguments REGEXP, DELIMITED, START, END, and REGION-NONCONTIGUOUS-P
-are passed to `perform-replace' (which see)."
- (declare (obsolete "use the `\\,' feature of `query-replace-regexp'
-for interactive calls, and `search-forward-regexp'/`replace-match'
-for Lisp calls." "22.1"))
- (interactive
- (progn
- (barf-if-buffer-read-only)
- (let* ((from
- ;; Let-bind the history var to disable the "foo -> bar"
- ;; default. Maybe we shouldn't disable this default, but
- ;; for now I'll leave it off. --Stef
- (let ((query-replace-defaults nil))
- (query-replace-read-from "Query replace regexp" t)))
- (to (list (read-from-minibuffer
- (format "Query replace regexp %s with eval: "
- (query-replace-descr from))
- nil nil t query-replace-to-history-variable from t))))
- ;; We make TO a list because replace-match-string-symbols requires one,
- ;; and the user might enter a single token.
- (replace-match-string-symbols to)
- (list from (car to) current-prefix-arg
- (if (use-region-p) (region-beginning))
- (if (use-region-p) (region-end))
- (if (use-region-p) (region-noncontiguous-p))))))
- (perform-replace regexp (cons #'replace-eval-replacement to-expr)
- t 'literal delimited nil nil start end nil region-noncontiguous-p))
-
(defun map-query-replace-regexp (regexp to-strings &optional n start end region-noncontiguous-p)
"Replace some matches for REGEXP with various strings, in rotation.
The second argument TO-STRINGS contains the replacement strings, separated
@@ -742,7 +664,10 @@ which will run faster and will not set the mark or print anything.
\(You may need a more complex loop if FROM-STRING can match the null string
and TO-STRING is also null.)"
(declare (interactive-only
- "use `search-forward' and `replace-match' instead."))
+ "use `search-forward' and `replace-match' instead.")
+ (interactive-args
+ (start (use-region-beginning))
+ (end (use-region-end))))
(interactive
(let ((common
(query-replace-read-args
@@ -754,8 +679,7 @@ and TO-STRING is also null.)"
(if (use-region-p) " in region" ""))
nil)))
(list (nth 0 common) (nth 1 common) (nth 2 common)
- (if (use-region-p) (region-beginning))
- (if (use-region-p) (region-end))
+ (use-region-beginning) (use-region-end)
(nth 3 common)
(if (use-region-p) (region-noncontiguous-p)))))
(perform-replace from-string to-string nil nil delimited nil nil start end backward region-noncontiguous-p))
@@ -2437,9 +2361,8 @@ See also `multi-occur'."
(if (>= (+ prev-line (length prev-after-lines))
(- curr-line (length before-lines)))
(setq prev-after-lines
- (butlast prev-after-lines
- (- (length prev-after-lines)
- (- curr-line prev-line (length before-lines) 1))))
+ (take (- curr-line prev-line (length before-lines) 1)
+ prev-after-lines))
;; Separate non-overlapping context lines with a dashed line.
(setq separator "-------\n")))
@@ -2720,10 +2643,9 @@ with three arguments, as if it were `search-forward'.")
(defvar replace-re-search-function nil
"Function to use when searching for regexps to replace.
-It is used by `query-replace-regexp', `replace-regexp',
-`query-replace-regexp-eval', and `map-query-replace-regexp'.
-It is called with three arguments, as if it were
-`re-search-forward'.")
+It is used by `query-replace-regexp', `replace-regexp', and
+`map-query-replace-regexp'. It is called with three arguments,
+as if it were `re-search-forward'.")
(defvar replace-regexp-function nil
"Function to convert the FROM string of query-replace commands to a regexp.
@@ -2821,7 +2743,9 @@ to a regexp that is actually used for the search.")
(isearch-case-fold-search case-fold)
(isearch-forward (not backward))
(isearch-other-end match-beg)
- (isearch-error nil))
+ (isearch-error nil)
+ (isearch-lazy-count nil)
+ (lazy-highlight-buffer nil))
(isearch-lazy-highlight-new-loop range-beg range-end))))
(defun replace-dehighlight ()
diff --git a/lisp/saveplace.el b/lisp/saveplace.el
index 3830e4b16cf..4b133313125 100644
--- a/lisp/saveplace.el
+++ b/lisp/saveplace.el
@@ -191,7 +191,7 @@ file names."
;; First check to make sure alist has been loaded in from the master
;; file. If not, do so, then feel free to modify the alist. It
;; will be saved again when Emacs is killed.
- (or save-place-loaded (load-save-place-alist-from-file))
+ (or save-place-loaded (save-place-load-alist-from-file))
(let* ((directory (and (derived-mode-p 'dired-mode)
(boundp 'dired-subdir-alist)
dired-subdir-alist
@@ -278,7 +278,7 @@ may have changed) back to `save-place-alist'."
(file-error (message "Saving places: can't write %s" file)))
(kill-buffer (current-buffer))))))
-(defun load-save-place-alist-from-file ()
+(defun save-place-load-alist-from-file ()
(if (not save-place-loaded)
(progn
(setq save-place-loaded t)
@@ -352,7 +352,7 @@ may have changed) back to `save-place-alist'."
(defun save-place-find-file-hook ()
"Function added to `find-file-hook' by `save-place-mode'.
It runs the hook `save-place-after-find-file-hook'."
- (or save-place-loaded (load-save-place-alist-from-file))
+ (or save-place-loaded (save-place-load-alist-from-file))
(let ((cell (assoc buffer-file-name save-place-alist)))
(if cell
(progn
@@ -367,7 +367,7 @@ It runs the hook `save-place-after-find-file-hook'."
(defun save-place-dired-hook ()
"Position the point in a Dired buffer."
- (or save-place-loaded (load-save-place-alist-from-file))
+ (or save-place-loaded (save-place-load-alist-from-file))
(let* ((directory (and (derived-mode-p 'dired-mode)
(boundp 'dired-subdir-alist)
dired-subdir-alist
@@ -396,5 +396,8 @@ It runs the hook `save-place-after-find-file-hook'."
(if save-place-loaded
(save-place-alist-to-file)))
+(define-obsolete-function-alias 'load-save-place-alist-from-file
+ #'save-place-load-alist-from-file "29.1")
+
(provide 'saveplace)
;;; saveplace.el ends here
diff --git a/lisp/select.el b/lisp/select.el
index 2d501f207f1..5b9cca80a38 100644
--- a/lisp/select.el
+++ b/lisp/select.el
@@ -85,9 +85,6 @@ other programs (X Windows clients or MS Windows programs). But, if this
variable is set, it is used for the next communication only.
After the communication, this variable is set to nil.")
-;; Only declared obsolete in 23.3.
-(define-obsolete-function-alias 'x-selection 'x-get-selection "at least 19.34")
-
(define-obsolete-variable-alias 'x-select-enable-clipboard
'select-enable-clipboard "25.1")
(defcustom select-enable-clipboard t
@@ -676,9 +673,12 @@ two markers or an overlay. Otherwise, it is nil."
(let ((str (cond ((stringp value) value)
((setq value (xselect--selection-bounds value))
(with-current-buffer (nth 2 value)
- (buffer-substring (nth 0 value)
- (nth 1 value)))))))
- (xselect--encode-string type str t)))
+ (when (and (>= (nth 0 value) (point-min))
+ (<= (nth 1 value) (point-max)))
+ (buffer-substring (nth 0 value)
+ (nth 1 value))))))))
+ (when str
+ (xselect--encode-string type str t))))
(defun xselect-convert-to-length (_selection _type value)
(let ((len (cond ((stringp value)
@@ -829,7 +829,8 @@ This function returns the string \"emacs\"."
(concat value [0]))))
(defun xselect-uri-list-available-p (selection _type value)
- "Return whether or not `text/uri-list' is a valid target for SELECTION.
+ "Return non-nil if `text/uri-list' is a valid target for SELECTION.
+Return nil otherwise.
VALUE is the local selection value of SELECTION."
(and (eq selection 'XdndSelection)
(or (stringp value)
@@ -839,13 +840,20 @@ VALUE is the local selection value of SELECTION."
"")
(defun xselect-dt-netfile-available-p (selection _type value)
- "Return whether or not `_DT_NETFILE' is a valid target for SELECTION.
+ "Return non-nil if `_DT_NETFILE' is a valid target for SELECTION.
+Return nil otherwise.
VALUE is SELECTION's local selection value."
(and (eq selection 'XdndSelection)
(stringp value)
(file-exists-p value)
(not (file-remote-p value))))
+(defun xselect-dnd-target-available-p (selection _type _value)
+ "Return non-nil if TYPE is a valid target for SELECTION.
+Return nil otherwise.
+VALUE is SELECTION's local selection value."
+ (eq selection 'XdndSelection))
+
(defun xselect-tt-net-file (file)
"Get the canonical ToolTalk filename for FILE.
FILE must be a local file, or otherwise the conversion will fail.
@@ -890,7 +898,8 @@ VALUE should be SELECTION's local value."
(text/plain\;charset=utf-8 . xselect-convert-to-string)
(text/uri-list . (xselect-uri-list-available-p
. xselect-convert-to-text-uri-list))
- (text/x-xdnd-username . xselect-convert-to-username)
+ (text/x-xdnd-username . (xselect-dnd-target-available-p
+ . xselect-convert-to-username))
(FILE . (xselect-uri-list-available-p
. xselect-convert-to-xm-file))
(TARGETS . xselect-convert-to-targets)
@@ -909,8 +918,10 @@ VALUE should be SELECTION's local value."
(INTEGER . xselect-convert-to-integer)
(SAVE_TARGETS . xselect-convert-to-save-targets)
(_EMACS_INTERNAL . xselect-convert-to-identity)
- (XmTRANSFER_SUCCESS . xselect-convert-xm-special)
- (XmTRANSFER_FAILURE . xselect-convert-xm-special)
+ (XmTRANSFER_SUCCESS . (xselect-dnd-target-available-p
+ . xselect-convert-xm-special))
+ (XmTRANSFER_FAILURE . (xselect-dnd-target-available-p
+ . xselect-convert-xm-special))
(_DT_NETFILE . (xselect-dt-netfile-available-p
. xselect-convert-to-dt-netfile))))
diff --git a/lisp/simple.el b/lisp/simple.el
index 5443d961e13..1e6e5e11e00 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -2229,9 +2229,20 @@ See `extended-command-versions'."
"Alist of prompts and what the extended command predicate should be.
This is used by the \\<minibuffer-local-must-match-map>\\[execute-extended-command-cycle] command when reading an extended command.")
+(defvar-keymap read-extended-command-mode-map
+ :doc "Local keymap added to the current map when reading an extended command."
+ "M-X" #'execute-extended-command-cycle)
+
+(define-minor-mode read-extended-command-mode
+ "Minor mode used for completion in `read-extended-command'.")
+
(defun read-extended-command (&optional prompt)
- "Read command name to invoke in `execute-extended-command'.
-This function uses the `read-extended-command-predicate' user option."
+ "Read command name to invoke via `execute-extended-command'.
+Use `read-extended-command-predicate' to determine which commands
+to include among completion candidates.
+
+This function activates the `read-extended-command-mode' minor
+mode when reading the command name."
(let ((default-predicate read-extended-command-predicate)
(read-extended-command-predicate read-extended-command-predicate)
already-typed ret)
@@ -2270,6 +2281,8 @@ This function uses the `read-extended-command-predicate' user option."
(setq execute-extended-command--last-typed
(minibuffer-contents)))
nil 'local)
+ ;; This is so that we define the `M-X' toggling command.
+ (read-extended-command-mode)
(setq-local minibuffer-default-add-function
(lambda ()
;; Get a command name at point in the original buffer
@@ -3530,10 +3543,7 @@ Return what remains of the list."
(setq visited-file-time
(with-current-buffer (buffer-base-buffer)
(visited-file-modtime))))
- (when (or (equal time visited-file-time)
- (and (consp time)
- (equal (list (car time) (cdr time))
- visited-file-time)))
+ (when (time-equal-p time visited-file-time)
(unlock-buffer)
(set-buffer-modified-p nil))))
;; Element (nil PROP VAL BEG . END) is property change.
@@ -6721,7 +6731,8 @@ If Transient Mark mode is disabled, this function normally does
nothing; but if FORCE is non-nil, it deactivates the mark anyway.
Deactivating the mark sets `mark-active' to nil, updates the
-primary selection according to `select-active-regions', and runs
+primary selection according to `select-active-regions' (unless
+`deactivate-mark' is `dont-save'), and runs
`deactivate-mark-hook'.
If Transient Mark mode was temporarily enabled, reset the value
@@ -6732,6 +6743,7 @@ run `deactivate-mark-hook'."
(when (and (if (eq select-active-regions 'only)
(eq (car-safe transient-mark-mode) 'only)
select-active-regions)
+ (not (eq deactivate-mark 'dont-save))
(region-active-p)
(display-selections-p))
;; The var `saved-region-selection', if non-nil, is the text in
@@ -6853,6 +6865,14 @@ point otherwise."
:version "23.1"
:group 'editing-basics)
+(defun use-region-beginning ()
+ "Return the start of the region if `use-region-p'."
+ (and (use-region-p) (region-beginning)))
+
+(defun use-region-end ()
+ "Return the end of the region if `use-region-p'."
+ (and (use-region-p) (region-end)))
+
(defun use-region-p ()
"Return t if the region is active and it is appropriate to act on it.
This is used by commands that act specially on the region under
@@ -6863,7 +6883,11 @@ mark is active; furthermore, if `use-empty-active-region' is nil,
the region must not be empty. Otherwise, the return value is nil.
For some commands, it may be appropriate to ignore the value of
-`use-empty-active-region'; in that case, use `region-active-p'."
+`use-empty-active-region'; in that case, use `region-active-p'.
+
+Also see the convenience functions `use-region-beginning' and
+`use-region-end', which may be handy when writing `interactive'
+specs."
(and (region-active-p)
(or use-empty-active-region (> (region-end) (region-beginning)))
t))
@@ -7668,11 +7692,33 @@ not vscroll."
;; But don't vscroll in a keyboard macro.
(not defining-kbd-macro)
(not executing-kbd-macro)
+ ;; Lines are not truncated...
+ (not
+ (and
+ (or truncate-lines
+ (and (integerp truncate-partial-width-windows)
+ (< (window-total-width)
+ truncate-partial-width-windows))
+ (and truncate-partial-width-windows
+ (not (integerp truncate-partial-width-windows))
+ (not (window-full-width-p))))
+ ;; ...or if lines are truncated, this buffer
+ ;; doesn't have very long lines.
+ (long-line-optimizations-p)))
(line-move-partial arg noerror))
(set-window-vscroll nil 0 t)
(if (and line-move-visual
;; Display-based column are incompatible with goal-column.
(not goal-column)
+ ;; Lines aren't truncated.
+ (not
+ (or truncate-lines
+ (and (integerp truncate-partial-width-windows)
+ (< (window-width)
+ truncate-partial-width-windows))
+ (and truncate-partial-width-windows
+ (not (integerp truncate-partial-width-windows))
+ (not (window-full-width-p)))))
;; When the text in the window is scrolled to the left,
;; display-based motion doesn't make sense (because each
;; logical line occupies exactly one screen line).
@@ -8109,10 +8155,11 @@ For motion by visual lines, see `beginning-of-visual-line'."
(line-move (1- arg) t)))
;; Move to beginning-of-line, ignoring fields and invisible text.
- (skip-chars-backward "^\n")
- (while (and (not (bobp)) (invisible-p (1- (point))))
- (goto-char (previous-char-property-change (point)))
- (skip-chars-backward "^\n"))
+ (let ((inhibit-field-text-motion t))
+ (goto-char (line-beginning-position))
+ (while (and (not (bobp)) (invisible-p (1- (point))))
+ (goto-char (previous-char-property-change (point)))
+ (goto-char (line-beginning-position))))
;; Now find first visible char in the line.
(while (and (< (point) orig) (invisible-p (point)))
diff --git a/lisp/speedbar.el b/lisp/speedbar.el
index 9184d6c5254..e74d6fd80a9 100644
--- a/lisp/speedbar.el
+++ b/lisp/speedbar.el
@@ -2789,15 +2789,7 @@ to add more types of version control systems."
(not (or (and (featurep 'ange-ftp)
(string-match
(car (symbol-value 'ange-ftp-name-format))
- (expand-file-name default-directory)))
- ;; efs support: Bob Weiner
- (and (featurep 'efs)
- (string-match
- (let ((reg (symbol-value 'efs-directory-regexp)))
- (if (stringp reg)
- reg
- (car reg)))
- (expand-file-name default-directory))))))
+ (expand-file-name default-directory))))))
(setq speedbar-vc-to-do-point 0))
(if (numberp speedbar-vc-to-do-point)
(progn
diff --git a/lisp/startup.el b/lisp/startup.el
index ec4eddf80ef..fe68c0f8a6f 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -802,7 +802,8 @@ It is the default value of the variable `top-level'."
;; objects and regenerate them; currently we do not. As a
;; workaround, we specifically reset the default face's :font
;; attribute here, if it was rescaled. See bug#1785.
- (when (and (not (eq face-font-rescale-alist
+ (when (and (display-multi-font-p)
+ (not (eq face-font-rescale-alist
old-face-font-rescale-alist))
(assoc (font-xlfd-name (face-attribute 'default :font))
face-font-rescale-alist #'string-match-p))
@@ -2850,7 +2851,8 @@ nil default-directory" name)
;; See the commentary in `normal-top-level' for why we do
;; this.
- (when (and (not (eq face-font-rescale-alist
+ (when (and (display-multi-font-p)
+ (not (eq face-font-rescale-alist
old-face-font-rescale-alist))
(assoc (font-xlfd-name (face-attribute 'default :font))
face-font-rescale-alist #'string-match-p))
diff --git a/lisp/subr.el b/lisp/subr.el
index ef2edcff102..cd6a9be099c 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -524,7 +524,14 @@ was called."
"Return VALUE with its bits shifted left by COUNT.
If COUNT is negative, shifting is actually to the right.
In this case, if VALUE is a negative fixnum treat it as unsigned,
-i.e., subtract 2 * `most-negative-fixnum' from VALUE before shifting it."
+i.e., subtract 2 * `most-negative-fixnum' from VALUE before shifting it.
+
+This function is provided for compatibility. In new code, use `ash'
+instead."
+ (declare (compiler-macro
+ (lambda (form)
+ (macroexp-warn-and-return "avoid `lsh'; use `ash' instead"
+ form '(suspicious lsh) t form))))
(when (and (< value 0) (< count 0))
(when (< value most-negative-fixnum)
(signal 'args-out-of-range (list value count)))
@@ -707,11 +714,14 @@ If N is bigger than the length of LIST, return LIST."
(defun butlast (list &optional n)
"Return a copy of LIST with the last N elements removed.
-If N is omitted or nil, the last element is removed from the
-copy."
+If N is omitted or nil, return a copy of LIST without its last element.
+If N is zero or negative, return LIST."
(declare (side-effect-free t))
- (if (and n (<= n 0)) list
- (nbutlast (copy-sequence list) n)))
+ (unless n
+ (setq n 1))
+ (if (<= n 0)
+ list
+ (take (- (length list) n) list)))
(defun nbutlast (list &optional n)
"Modify LIST to remove the last N elements.
@@ -723,11 +733,6 @@ If N is omitted or nil, remove the last element."
(if (> n 0) (setcdr (nthcdr (- (1- m) n) list) nil))
list))))
-;; The function's definition was moved to fns.c,
-;; but it's easier to set properties here.
-(put 'proper-list-p 'pure t)
-(put 'proper-list-p 'side-effect-free 'error-free)
-
(defun delete-dups (list)
"Destructively remove `equal' duplicates from LIST.
Store the result in LIST and return it. LIST must be a proper list.
@@ -858,7 +863,7 @@ Non-strings in LIST are ignored."
(declare (side-effect-free t))
(while (and list
(not (and (stringp (car list))
- (eq t (compare-strings elt 0 nil (car list) 0 nil t)))))
+ (string-equal-ignore-case elt (car list)))))
(setq list (cdr list)))
list)
@@ -1852,13 +1857,11 @@ be a list of the form returned by `event-start' and `event-end'."
(set-advertised-calling-convention 'redirect-frame-focus '(frame focus-frame) "24.3")
(set-advertised-calling-convention 'libxml-parse-xml-region '(start end &optional base-url) "27.1")
(set-advertised-calling-convention 'libxml-parse-html-region '(start end &optional base-url) "27.1")
+(set-advertised-calling-convention 'time-convert '(time form) "29.1")
;;;; Obsolescence declarations for variables, and aliases.
-(make-obsolete-variable 'redisplay-end-trigger-functions 'jit-lock-register "23.1")
(make-obsolete-variable 'redisplay-dont-pause nil "24.5")
-(make-obsolete 'window-redisplay-end-trigger nil "23.1")
-(make-obsolete 'set-window-redisplay-end-trigger nil "23.1")
(make-obsolete-variable 'operating-system-release nil "28.1")
(make-obsolete-variable 'inhibit-changing-match-data 'save-match-data "29.1")
@@ -1915,6 +1918,13 @@ be a list of the form returned by `event-start' and `event-end'."
(define-obsolete-function-alias 'user-original-login-name
#'user-login-name "28.1")
+;; These are in obsolete/autoload.el, but are commonly used by
+;; third-party scripts that assume that they exist without requiring
+;; autoload. These should be removed when obsolete/autoload.el is
+;; removed.
+(autoload 'make-directory-autoloads "autoload" nil t)
+(autoload 'update-directory-autoloads "autoload" nil t)
+
;;;; Hook manipulation functions.
@@ -2698,18 +2708,44 @@ This is to `put' what `defalias' is to `fset'."
(setcdr ps (cons symbol (cdr ps))))))
(put symbol prop val))
-(defun symbol-file (symbol &optional type)
+(defvar comp-native-version-dir)
+(defvar native-comp-eln-load-path)
+(declare-function subr-native-elisp-p "data.c")
+(declare-function native-comp-unit-file "data.c")
+(declare-function subr-native-comp-unit "data.c")
+(declare-function comp-el-to-eln-rel-filename "comp.c")
+
+(defun locate-eln-file (eln-file)
+ "Locate a natively-compiled ELN-FILE by searching its load path.
+This function looks in directories named by `native-comp-eln-load-path'."
+ (or (locate-file-internal (concat comp-native-version-dir "/" eln-file)
+ native-comp-eln-load-path)
+ (locate-file-internal
+ ;; Preloaded *.eln files live in the preloaded/ subdirectory of
+ ;; the last entry in `native-comp-eln-load-path'.
+ (concat comp-native-version-dir "/preloaded/" eln-file)
+ (last native-comp-eln-load-path))))
+
+(defun symbol-file (symbol &optional type native-p)
"Return the name of the file that defined SYMBOL.
The value is normally an absolute file name. It can also be nil,
if the definition is not associated with any file. If SYMBOL
specifies an autoloaded function, the value can be a relative
file name without extension.
-If TYPE is nil, then any kind of definition is acceptable. If
-TYPE is `defun', `defvar', or `defface', that specifies function
+If TYPE is nil, then any kind of SYMBOL's definition is acceptable.
+If TYPE is `defun', `defvar', or `defface', that specifies function
definition, variable definition, or face definition only.
Otherwise TYPE is assumed to be a symbol property.
+If NATIVE-P is non-nil, and SYMBOL was loaded from a .eln file,
+this function will return the absolute file name of that .eln file,
+if found. Note that if the .eln file is older than its source .el
+file, Emacs won't load such an outdated .eln file, and this function
+will not return it. If the .eln file couldn't be found, or is
+outdated, the function returns the corresponding .elc or .el file
+instead.
+
This function only works for symbols defined in Lisp files. For
symbols that are defined in C files, use `help-C-file-name'
instead."
@@ -2717,24 +2753,59 @@ instead."
(symbolp symbol)
(autoloadp (symbol-function symbol)))
(nth 1 (symbol-function symbol))
- (catch 'found
- (pcase-dolist (`(,file . ,elems) load-history)
- (when (if type
- (if (eq type 'defvar)
- ;; Variables are present just as their names.
- (member symbol elems)
- ;; Many other types are represented as (TYPE . NAME).
- (or (member (cons type symbol) elems)
- (memq symbol (alist-get type
- (alist-get 'define-symbol-props
- elems)))))
- ;; We accept all types, so look for variable def
- ;; and then for any other kind.
- (or (member symbol elems)
- (let ((match (rassq symbol elems)))
- (and match
- (not (eq 'require (car match)))))))
- (throw 'found file))))))
+ (if (and native-p (or (null type) (eq type 'defun))
+ (symbolp symbol)
+ (native-comp-available-p)
+ ;; If it's a defun, we have a shortcut.
+ (subr-native-elisp-p (symbol-function symbol)))
+ ;; native-comp-unit-file returns unnormalized file names.
+ (expand-file-name (native-comp-unit-file (subr-native-comp-unit
+ (symbol-function symbol))))
+ (let ((elc-file
+ (catch 'found
+ (pcase-dolist (`(,file . ,elems) load-history)
+ (when (if type
+ (if (eq type 'defvar)
+ ;; Variables are present just as their
+ ;; names.
+ (member symbol elems)
+ ;; Many other types are represented as
+ ;; (TYPE . NAME).
+ (or (member (cons type symbol) elems)
+ (memq
+ symbol
+ (alist-get type
+ (alist-get 'define-symbol-props
+ elems)))))
+ ;; We accept all types, so look for variable def
+ ;; and then for any other kind.
+ (or (member symbol elems)
+ (let ((match (rassq symbol elems)))
+ (and match
+ (not (eq 'require (car match)))))))
+ (throw 'found file))))))
+ ;; If they asked for the .eln file, try to find it.
+ (or (and elc-file
+ native-p
+ (native-comp-available-p)
+ (let* ((sans-ext (file-name-sans-extension elc-file))
+ (el-file
+ (and (fboundp 'zlib-available-p)
+ (zlib-available-p)
+ (concat sans-ext ".el.gz")))
+ (el-file-backup (concat sans-ext ".el")))
+ (or (and el-file (file-exists-p el-file))
+ (and (file-exists-p el-file-backup)
+ (setq el-file el-file-backup))
+ (setq el-file nil))
+ (when (stringp el-file)
+ (let ((eln-file (locate-eln-file
+ (comp-el-to-eln-rel-filename el-file))))
+ ;; Emacs will not load an outdated .eln file,
+ ;; so we mimic this behavior here.
+ (if (file-newer-than-file-p eln-file el-file)
+ eln-file)))))
+ elc-file)))))
(declare-function read-library-name "find-func" nil)
@@ -3306,9 +3377,7 @@ while calling this function, then pressing `help-char'
causes it to evaluate `help-form' and display the result.
There is no need to explicitly add `help-char' to CHARS;
`help-char' is bound automatically to `help-form-show'."
- (defvar empty-history)
- (let* ((empty-history '())
- (map (if (consp chars)
+ (let* ((map (if (consp chars)
(or (gethash (list help-form (cons help-char chars))
read-char-from-minibuffer-map-hash)
(let ((map (make-sparse-keymap))
@@ -3335,9 +3404,7 @@ There is no need to explicitly add `help-char' to CHARS;
read-char-from-minibuffer-map))
;; Protect this-command when called from pre-command-hook (bug#45029)
(this-command this-command)
- (result
- (read-from-minibuffer prompt nil map nil
- (or history 'empty-history)))
+ (result (read-from-minibuffer prompt nil map nil (or history t)))
(char
(if (> (length result) 0)
;; We have a string (with one character), so return the first one.
@@ -3538,9 +3605,7 @@ like) while `y-or-n-p' is running)."
(discard-input)))
(t
(setq prompt (funcall padded prompt))
- (defvar empty-history)
- (let* ((empty-history '())
- (enable-recursive-minibuffers t)
+ (let* ((enable-recursive-minibuffers t)
(msg help-form)
(keymap (let ((map (make-composed-keymap
y-or-n-p-map query-replace-map)))
@@ -3557,7 +3622,7 @@ like) while `y-or-n-p' is running)."
(this-command this-command)
(str (read-from-minibuffer
prompt nil keymap nil
- (or y-or-n-p-history-variable 'empty-history))))
+ (or y-or-n-p-history-variable t))))
(setq answer (if (member str '("y" "Y")) 'act 'skip)))))
(let ((ret (eq answer 'act)))
(unless noninteractive
@@ -4019,6 +4084,12 @@ Otherwise, return nil."
(or (eq 'macro (car def))
(and (autoloadp def) (memq (nth 4 def) '(macro t)))))))
+(defun compiled-function-p (object)
+ "Return non-nil if OBJECT is a function that has been compiled.
+Does not distinguish between functions implemented in machine code
+or byte-code."
+ (or (subrp object) (byte-code-function-p object)))
+
(defun field-at-pos (pos)
"Return the field at position POS, taking stickiness etc into account."
(let ((raw-field (get-char-property (field-beginning pos) 'field)))
@@ -5298,10 +5369,18 @@ and replace a sub-expression, e.g.
(setq matches (cons (substring string start l) matches)) ; leftover
(apply #'concat (nreverse matches)))))
+(defsubst string-equal-ignore-case (string1 string2)
+ "Like `string-equal', but case-insensitive.
+Upper-case and lower-case letters are treated as equal.
+Unibyte strings are converted to multibyte for comparison."
+ (declare (pure t) (side-effect-free t))
+ (eq t (compare-strings string1 0 nil string2 0 nil t)))
+
(defun string-prefix-p (prefix string &optional ignore-case)
"Return non-nil if PREFIX is a prefix of STRING.
If IGNORE-CASE is non-nil, the comparison is done without paying attention
to case differences."
+ (declare (pure t) (side-effect-free t))
(let ((prefix-length (length prefix)))
(if (> prefix-length (length string)) nil
(eq t (compare-strings prefix 0 prefix-length string
@@ -5311,6 +5390,7 @@ to case differences."
"Return non-nil if SUFFIX is a suffix of STRING.
If IGNORE-CASE is non-nil, the comparison is done without paying
attention to case differences."
+ (declare (pure t) (side-effect-free t))
(let ((start-pos (- (length string) (length suffix))))
(and (>= start-pos 0)
(eq t (compare-strings suffix nil nil
@@ -6572,7 +6652,7 @@ Also, \"-GIT\", \"-CVS\" and \"-NNN\" are treated as snapshot versions."
(version-list-= (version-to-list v1) (version-to-list v2)))
(defvar package--builtin-versions
- ;; Mostly populated by loaddefs.el via autoload-builtin-package-versions.
+ ;; Mostly populated by loaddefs.el.
(purecopy `((emacs . ,(version-to-list emacs-version))))
"Alist giving the version of each versioned builtin package.
I.e. each element of the list is of the form (NAME . VERSION) where
@@ -6815,7 +6895,7 @@ This means that OBJECT can be printed out and then read back
again by the Lisp reader. This function returns nil if OBJECT is
unreadable, and the printed representation (from `prin1') of
OBJECT if it is readable."
- (declare (side-effect-free t))
+ (declare (side-effect-free error-free))
(catch 'unreadable
(let ((print-unreadable-function
(lambda (_object _escape)
@@ -6891,6 +6971,8 @@ lines."
(defun buffer-match-p (condition buffer-or-name &optional arg)
"Return non-nil if BUFFER-OR-NAME matches CONDITION.
CONDITION is either:
+- the symbol t, to always match,
+- the symbol nil, which never matches,
- a regular expression, to match a buffer name,
- a predicate function that takes a buffer object and ARG as
arguments, and returns non-nil if the buffer matches,
@@ -6913,6 +6995,7 @@ CONDITION is either:
(catch 'match
(dolist (condition conditions)
(when (cond
+ ((eq condition t))
((stringp condition)
(string-match-p condition (buffer-name buffer)))
((functionp condition)
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index c769dbabce4..cf5ae09a247 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -200,7 +200,9 @@ a list of frames to update."
(t frames))))
;; Loop over all frames and update `tab-bar-lines'
(dolist (frame frame-lst)
- (unless (frame-parameter frame 'tab-bar-lines-keep-state)
+ (unless (or (frame-parameter frame 'tab-bar-lines-keep-state)
+ (and (eq auto-resize-tab-bars 'grow-only)
+ (> (frame-parameter frame 'tab-bar-lines) 1)))
(set-frame-parameter frame 'tab-bar-lines
(tab-bar--tab-bar-lines-for-frame frame)))))
;; Update `default-frame-alist'
@@ -2409,7 +2411,7 @@ When `switch-to-buffer-obey-display-actions' is non-nil,
(keymap-set tab-prefix-map "M" #'tab-move-to)
(keymap-set tab-prefix-map "G" #'tab-group)
(keymap-set tab-prefix-map "r" #'tab-rename)
-(keymap-set tab-prefix-map "r" #'tab-switch)
+(keymap-set tab-prefix-map "RET" #'tab-switch)
(keymap-set tab-prefix-map "b" #'switch-to-buffer-other-tab)
(keymap-set tab-prefix-map "f" #'find-file-other-tab)
(keymap-set tab-prefix-map "C-f" #'find-file-other-tab)
diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el
index ed48b568423..20ad6e1e46a 100644
--- a/lisp/tar-mode.el
+++ b/lisp/tar-mode.el
@@ -604,44 +604,42 @@ For instance, if mode is #o700, then it produces `rwx------'."
(goto-char (point-min))
(restore-buffer-modified-p modified))))
-(defvar tar-mode-map
- (let ((map (make-keymap)))
- (suppress-keymap map)
- (define-key map " " 'tar-next-line)
- (define-key map "C" 'tar-copy)
- (define-key map "d" 'tar-flag-deleted)
- (define-key map "\^D" 'tar-flag-deleted)
- (define-key map "e" 'tar-extract)
- (define-key map "f" 'tar-extract)
- (define-key map "\C-m" 'tar-extract)
- (define-key map [mouse-2] 'tar-mouse-extract)
- (define-key map "g" 'revert-buffer)
- (define-key map "n" 'tar-next-line)
- (define-key map "\^N" 'tar-next-line)
- (define-key map [down] 'tar-next-line)
- (define-key map "o" 'tar-extract-other-window)
- (define-key map "p" 'tar-previous-line)
- (define-key map "\^P" 'tar-previous-line)
- (define-key map [up] 'tar-previous-line)
- (define-key map "I" 'tar-new-entry)
- (define-key map "R" 'tar-rename-entry)
- (define-key map "u" 'tar-unflag)
- (define-key map "v" 'tar-view)
- (define-key map "w" 'woman-tar-extract-file)
- (define-key map "x" 'tar-expunge)
- (define-key map "\177" 'tar-unflag-backwards)
- (define-key map "E" 'tar-extract-other-window)
- (define-key map "M" 'tar-chmod-entry)
- (define-key map "G" 'tar-chgrp-entry)
- (define-key map "O" 'tar-chown-entry)
- ;; Let mouse-1 follow the link.
- (define-key map [follow-link] 'mouse-face)
-
- ;; Get rid of the Edit menu bar item to save space.
- (define-key map [menu-bar edit] 'undefined)
-
- map)
- "Local keymap for Tar mode listings.")
+(defvar-keymap tar-mode-map
+ :doc "Local keymap for Tar mode listings."
+ :full t :suppress t
+ "SPC" #'tar-next-line
+ "C" #'tar-copy
+ "d" #'tar-flag-deleted
+ "C-d" #'tar-flag-deleted
+ "e" #'tar-extract
+ "f" #'tar-extract
+ "RET" #'tar-extract
+ "g" #'revert-buffer
+ "n" #'tar-next-line
+ "C-n" #'tar-next-line
+ "<down>" #'tar-next-line
+ "o" #'tar-extract-other-window
+ "p" #'tar-previous-line
+ "C-p" #'tar-previous-line
+ "<up>" #'tar-previous-line
+ "I" #'tar-new-entry
+ "R" #'tar-rename-entry
+ "u" #'tar-unflag
+ "v" #'tar-view
+ "w" #'woman-tar-extract-file
+ "x" #'tar-expunge
+ "DEL" #'tar-unflag-backwards
+ "E" #'tar-extract-other-window
+ "M" #'tar-chmod-entry
+ "G" #'tar-chgrp-entry
+ "O" #'tar-chown-entry
+
+ ;; Let mouse-1 follow the link.
+ "<follow-link>" 'mouse-face
+ "<mouse-2>" #'tar-mouse-extract
+
+ ;; Get rid of the Edit menu bar item to save space.
+ "<menu-bar> <edit>" #'undefined)
(easy-menu-define tar-mode-immediate-menu tar-mode-map
"Immediate menu for Tar mode."
@@ -1331,6 +1329,8 @@ to make your changes permanent."
(error "This buffer has no superior tar file buffer"))
(if (not (and (boundp 'tar-superior-descriptor) tar-superior-descriptor))
(error "This buffer doesn't have an index into its superior tar file!"))
+ (unless (buffer-live-p tar-superior-buffer)
+ (error "The tar buffer no longer exists; can't save"))
(let ((subfile (current-buffer))
(coding buffer-file-coding-system)
(descriptor tar-superior-descriptor)
@@ -1377,7 +1377,7 @@ to make your changes permanent."
;; Maybe update the datestamp.
(when tar-update-datestamp
(tar-alter-one-field tar-time-offset
- (concat (tar-octal-time (current-time)) " "))))
+ (concat (tar-octal-time nil) " "))))
;; After doing the insertion, add any necessary final padding.
(tar-pad-to-blocksize))
(set-buffer-modified-p t) ; mark the tar file as modified
diff --git a/lisp/term.el b/lisp/term.el
index a28d8c5d761..11c2d2aaa16 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -78,7 +78,7 @@
;; directory/username/host tracking: the only drawback is that you will
;; have to modify your shell start-up script. It's worth it, believe me :).
;;
-;; When you rlogin/su/telnet and the account you access has a modified
+;; When you ssh/sudo/su and the account you access has a modified
;; startup script, you will be able to access the remote files as usual
;; with C-x C-f, if it's needed you will have to enter a password,
;; otherwise the file should get loaded straight away.
diff --git a/lisp/term/haiku-win.el b/lisp/term/haiku-win.el
index b36e3037ee8..a16169d477f 100644
--- a/lisp/term/haiku-win.el
+++ b/lisp/term/haiku-win.el
@@ -188,7 +188,7 @@ VALUE as a unibyte string, or nil if VALUE was not a string."
(error "Out of range octet: %d" octet))
(setq value
(logior value
- (lsh octet
+ (ash octet
(- (* (1- (length string)) 8)
offset))))
(setq offset (+ offset 8))))
@@ -409,8 +409,7 @@ take effect on menu items until the menu bar is updated again."
(when (car mouse-position)
(dnd-handle-movement (posn-at-x-y (cadr mouse-position)
(cddr mouse-position)
- (car mouse-position)))
- (redisplay))))
+ (car mouse-position))))))
(setq haiku-drag-track-function #'haiku-dnd-drag-handler)
@@ -460,7 +459,119 @@ take effect on menu items until the menu bar is updated again."
message allow-current-frame
follow-tooltip))))
-(add-variable-watcher 'use-system-tooltips #'haiku-use-system-tooltips-watcher)
+(add-variable-watcher 'use-system-tooltips
+ #'haiku-use-system-tooltips-watcher)
+
+(defvar haiku-dnd-wheel-count nil
+ "Cons used to determine how many times the wheel has been turned.
+The car is just that; cdr is the timestamp of the last wheel
+movement.")
+
+(defvar haiku-last-wheel-direction nil
+ "Cons of two elements describing the direction the wheel last turned.
+The car is whether or not the movement was horizontal.
+The cdr is whether or not the movement was upwards or leftwards.")
+
+(defun haiku-note-wheel-click (timestamp)
+ "Note that the mouse wheel was moved at TIMESTAMP during drag-and-drop.
+Return the number of clicks that were made in quick succession."
+ (if (not (integerp double-click-time))
+ 1
+ (let ((cell haiku-dnd-wheel-count))
+ (unless cell
+ (setq cell (cons 0 timestamp))
+ (setq haiku-dnd-wheel-count cell))
+ (when (< (cdr cell) (- timestamp double-click-time))
+ (setcar cell 0))
+ (setcar cell (1+ (car cell)))
+ (setcdr cell timestamp)
+ (car cell))))
+
+(defvar haiku-drag-wheel-function)
+
+(defun haiku-dnd-modifier-mask (mods)
+ "Return the internal modifier mask for the Emacs modifier state MODS.
+MODS is a single symbol, or a list of symbols such as `shift' or
+`control'."
+ (let ((mask 0))
+ (unless (consp mods)
+ (setq mods (list mods)))
+ (dolist (modifier mods)
+ (cond ((eq modifier 'shift)
+ (setq mask (logior mask ?\S-\0)))
+ ((eq modifier 'control)
+ (setq mask (logior mask ?\C-\0)))
+ ((eq modifier 'meta)
+ (setq mask (logior mask ?\M-\0)))
+ ((eq modifier 'hyper)
+ (setq mask (logior mask ?\H-\0)))
+ ((eq modifier 'super)
+ (setq mask (logior mask ?\s-\0)))
+ ((eq modifier 'alt)
+ (setq mask (logior mask ?\A-\0)))))
+ mask))
+
+(defun haiku-dnd-wheel-modifier-type (flags)
+ "Return the modifier type of an internal modifier mask.
+FLAGS is the internal modifier mask of a turn of the mouse wheel."
+ (let ((modifiers (logior ?\M-\0 ?\C-\0 ?\S-\0
+ ?\H-\0 ?\s-\0 ?\A-\0)))
+ (catch 'type
+ (dolist (modifier mouse-wheel-scroll-amount)
+ (when (and (consp modifier)
+ (eq (haiku-dnd-modifier-mask (car modifier))
+ (logand flags modifiers)))
+ (throw 'type (cdr modifier))))
+ nil)))
+
+(defun haiku-handle-drag-wheel (frame x y horizontal up modifiers)
+ "Handle wheel movement during drag-and-drop.
+FRAME is the frame on top of which the wheel moved.
+X and Y are the frame-relative coordinates of the wheel movement.
+HORIZONTAL is whether or not the wheel movement was horizontal.
+UP is whether or not the wheel moved up (or left).
+MODIFIERS is the internal modifier mask of the wheel movement."
+ (when (not (equal haiku-last-wheel-direction
+ (cons horizontal up)))
+ (setq haiku-last-wheel-direction
+ (cons horizontal up))
+ (when (consp haiku-dnd-wheel-count)
+ (setcar haiku-dnd-wheel-count 0)))
+ (let ((type (haiku-dnd-wheel-modifier-type modifiers))
+ (function (cond
+ ((and (not horizontal) (not up))
+ mwheel-scroll-up-function)
+ ((not horizontal)
+ mwheel-scroll-down-function)
+ ((not up) (if mouse-wheel-flip-direction
+ mwheel-scroll-right-function
+ mwheel-scroll-left-function))
+ (t (if mouse-wheel-flip-direction
+ mwheel-scroll-left-function
+ mwheel-scroll-right-function))))
+ (timestamp (time-convert nil 1000))
+ (amt 1))
+ (cond ((and (eq type 'hscroll)
+ (not horizontal))
+ (setq function (if (not up)
+ mwheel-scroll-left-function
+ mwheel-scroll-right-function)))
+ ((and (eq type 'global-text-scale))
+ (setq function 'global-text-scale-adjust
+ amt (if up 1 -1)))
+ ((and (eq type 'text-scale))
+ (setq function 'text-scale-adjust
+ amt (if up 1 -1))))
+ (when function
+ (let ((posn (posn-at-x-y x y frame)))
+ (when (windowp (posn-window posn))
+ (with-selected-window (posn-window posn)
+ (funcall function
+ (* amt
+ (or (and (not mouse-wheel-progressive-speed) 1)
+ (haiku-note-wheel-click (car timestamp)))))))))))
+
+(setq haiku-drag-wheel-function #'haiku-handle-drag-wheel)
;;;; Session management.
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
index 3a0bd65f29c..55fe11a097c 100644
--- a/lisp/term/x-win.el
+++ b/lisp/term/x-win.el
@@ -1568,8 +1568,7 @@ frames on all displays."
(defun x-dnd-movement (_frame position)
"Handle movement to POSITION during drag-and-drop."
- (dnd-handle-movement position)
- (redisplay))
+ (dnd-handle-movement position))
(defun x-device-class (name)
"Return the device class of NAME.
diff --git a/lisp/textmodes/bib-mode.el b/lisp/textmodes/bib-mode.el
index 6168fed6c8b..af49464d1ee 100644
--- a/lisp/textmodes/bib-mode.el
+++ b/lisp/textmodes/bib-mode.el
@@ -24,12 +24,10 @@
;;; Commentary:
-;; GNU Emacs code to help maintain databases compatible with (troff)
-;; refer and lookbib. The file bib-file should be set to your
-;; bibliography file. Keys are automagically inserted as you type,
-;; and appropriate keys are presented for various kinds of entries.
-
-;; FIXME: Fix the namespace use of this library.
+;; GNU Emacs code to help maintain databases compatible with (troff)
+;; refer and lookbib. The file `bib-file' should be set to your
+;; bibliography file. Keys are automagically inserted as you type,
+;; and appropriate keys are presented for various kinds of entries.
;;; Code:
@@ -40,23 +38,23 @@
:group 'text)
(defcustom bib-file "~/my-bibliography.bib"
- "Default name of file used by `addbib'."
+ "Default name of file used by `bib-add'."
:type 'file)
-(defcustom unread-bib-file "~/to-be-read.bib"
- "Default name of file used by `unread-bib' in Bib mode."
- :type 'file)
+(define-obsolete-variable-alias 'unread-bib-file 'bib-unread-file "29.1")
+(defcustom bib-unread-file "~/to-be-read.bib"
+ "Default name of file used by `bib-unread' in Bib mode."
+ :type 'file
+ :version "29.1")
-(defvar bib-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map text-mode-map)
- (define-key map "\C-M" #'return-key-bib)
- (define-key map "\C-c\C-u" #'unread-bib)
- (define-key map "\C-c\C-@" #'mark-bib)
- (define-key map "\e`" #'abbrev-mode)
- map))
+(defvar-keymap bib-mode-map
+ :parent text-mode-map
+ "RET" #'bib-return-key
+ "C-c C-u" #'bib-unread
+ "C-c C-@" #'bib-mark
+ "M-`" #'abbrev-mode)
-(defun addbib ()
+(defun bib-add ()
"Set up editor to add to troff bibliography file specified
by global variable `bib-file'. See description of `bib-mode'."
(interactive)
@@ -87,10 +85,10 @@ R eport number or `phd thesis' or `masters thesis' or `draft' or
W here can be found locally (login name, or ailib, etc.)
X comments (not used in indexing)
-\\[unread-bib] appends current entry to a different file (for example,
+\\[bib-unread] appends current entry to a different file (for example,
a file of papers to be read in the future), given by the value of the
-variable `unread-bib-file'.
-\\[mark-bib] marks current or previous entry.
+variable `bib-unread-file'.
+\\[bib-mark] marks current or previous entry.
Abbreviations are saved in `bib-mode-abbrev-table'.
Hook can be stored in `bib-mode-hook'.
Field keys given by variable `bib-assoc'.
@@ -142,7 +140,7 @@ with the cdr.")
(defconst bib-capitalized-fields "%[AETCBIJR]")
-(defun return-key-bib ()
+(defun bib-return-key ()
"Magic when user hits return, used by `bib-mode'."
(interactive)
(if (eolp)
@@ -172,7 +170,7 @@ with the cdr.")
(insert new-key))
(newline)))
-(defun mark-bib ()
+(defun bib-mark ()
"Set mark at beginning of current or previous bib entry, point at end."
(interactive)
(beginning-of-line nil)
@@ -185,14 +183,14 @@ with the cdr.")
(forward-line 1)
(beginning-of-line nil))
-(defun unread-bib ()
- "Append current or previous entry to file of unread papers
-named by variable `unread-bib-file'."
- (interactive)
- (mark-bib)
- (if (get-file-buffer unread-bib-file)
- (append-to-buffer (get-file-buffer unread-bib-file) (mark) (point))
- (append-to-file (mark) (point) unread-bib-file)))
+(defun bib-unread ()
+ "Append current or previous entry to file of unread papers
+named by variable `bib-unread-file'."
+ (interactive)
+ (bib-mark)
+ (if (get-file-buffer bib-unread-file)
+ (append-to-buffer (get-file-buffer bib-unread-file) (mark) (point))
+ (append-to-file (mark) (point) bib-unread-file)))
(defvar bib-capitalize-title-stop-words
@@ -226,14 +224,17 @@ named by variable `unread-bib-file'."
))
(set-syntax-table orig-syntax-table))))
-
(defun bib-capitalize-title (s)
- "Like `capitalize', but don't capitalize stop words, except the first."
- (with-current-buffer (get-buffer-create "$$$Scratch$$$")
- (erase-buffer)
- (insert s)
- (bib-capitalize-title-region (point-min) (point-max))
- (buffer-string)))
+ "Like `capitalize', but don't capitalize stop words, except the first."
+ (with-temp-buffer
+ (insert s)
+ (bib-capitalize-title-region (point-min) (point-max))
+ (buffer-string)))
+
+(define-obsolete-function-alias 'addbib #'bib-add "29.1")
+(define-obsolete-function-alias 'return-key-bib #'bib-return-key "29.1")
+(define-obsolete-function-alias 'mark-bib #'bib-mark "29.1")
+(define-obsolete-function-alias 'unread-bib #'bib-unread "29.1")
(provide 'bib-mode)
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index 333cfa51695..8135d40d261 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -2215,6 +2215,7 @@ Point must be at beginning of preamble. Do not move point."
(defsubst bibtex-string= (str1 str2)
"Return t if STR1 and STR2 are equal, ignoring case."
+ (declare (obsolete string-equal-ignore-case "29.1"))
(eq t (compare-strings str1 0 nil str2 0 nil t)))
(defun bibtex-delete-whitespace ()
@@ -2657,7 +2658,7 @@ Formats current entry according to variable `bibtex-entry-format'."
;; update page dashes
(if (and (memq 'page-dashes format)
- (bibtex-string= field-name "pages")
+ (string-equal-ignore-case field-name "pages")
(progn (goto-char beg-text)
(looking-at
"\\([\"{][0-9]+\\)[ \t\n]*--?[ \t\n]*\\([0-9]+[\"}]\\)")))
@@ -2710,7 +2711,7 @@ Formats current entry according to variable `bibtex-entry-format'."
;; use book title of crossref'd entry
(if (and (memq 'inherit-booktitle format)
empty-field
- (bibtex-string= field-name "booktitle")
+ (string-equal-ignore-case field-name "booktitle")
crossref-key)
(let ((title (save-excursion
(save-restriction
@@ -3503,7 +3504,7 @@ If NO-BUTTON is non-nil do not generate buttons."
(let ((lst bibtex-generate-url-list) url)
(while (and (not found) (setq url (car (pop lst))))
(goto-char start)
- (setq found (and (bibtex-string= name (car url))
+ (setq found (and (string-equal-ignore-case name (car url))
(re-search-forward (cdr url) end t))))))
(unless found (goto-char end)))
(if (and found (not no-button))
@@ -3954,7 +3955,7 @@ entry (for example, the year parts of the keys)."
(goto-char (1- (match-beginning 0)))
(bibtex-beginning-of-entry)
(if (and (looking-at bibtex-entry-head)
- (bibtex-string= type (bibtex-type-in-head))
+ (string-equal-ignore-case type (bibtex-type-in-head))
;; In case we found ourselves :-(
(not (equal key (setq tmp (bibtex-key-in-head)))))
(setq other-key tmp
@@ -3963,7 +3964,7 @@ entry (for example, the year parts of the keys)."
(bibtex-end-of-entry)
(bibtex-skip-to-valid-entry)
(if (and (looking-at bibtex-entry-head)
- (bibtex-string= type (bibtex-type-in-head))
+ (string-equal-ignore-case type (bibtex-type-in-head))
;; In case we found ourselves :-(
(not (equal key (setq tmp (bibtex-key-in-head))))
(or (not other-key)
@@ -4004,9 +4005,9 @@ interactive calls."
(interactive (list nil t))
(unless field (setq field (car (bibtex-find-text-internal nil nil comma))))
(if (string-search "@" field)
- (cond ((bibtex-string= field "@string")
+ (cond ((string-equal-ignore-case field "@string")
(message "String definition"))
- ((bibtex-string= field "@preamble")
+ ((string-equal-ignore-case field "@preamble")
(message "Preamble definition"))
(t (message "Entry key")))
(let* ((case-fold-search t)
@@ -4588,7 +4589,7 @@ Return t if test was successful, nil otherwise."
bounds field idx)
(while (setq bounds (bibtex-parse-field))
(let ((field-name (bibtex-name-in-field bounds)))
- (if (and (bibtex-string= field-name "month")
+ (if (and (string-equal-ignore-case field-name "month")
;; Check only abbreviated month fields.
(let ((month (bibtex-text-in-field-bounds bounds)))
(not (or (string-match "\\`[\"{].+[\"}]\\'" month)
@@ -4669,7 +4670,7 @@ Return t if test was successful, nil otherwise."
(while (re-search-forward bibtex-entry-head nil t)
(setq entry-type (bibtex-type-in-head)
key (bibtex-key-in-head))
- (if (or (and strings (bibtex-string= entry-type "string"))
+ (if (or (and strings (string-equal-ignore-case entry-type "string"))
(assoc-string entry-type bibtex-entry-alist t))
(if (member key key-list)
(push (format-message
@@ -5046,10 +5047,10 @@ At end of the cleaning process, the functions in
(user-error "Not inside a BibTeX entry")))
(entry-type (bibtex-type-in-head))
(key (bibtex-key-in-head)))
- (cond ((bibtex-string= entry-type "preamble")
+ (cond ((string-equal-ignore-case entry-type "preamble")
;; (bibtex-format-preamble)
(user-error "No clean up of @Preamble entries"))
- ((bibtex-string= entry-type "string")
+ ((string-equal-ignore-case entry-type "string")
(setq entry-type 'string))
;; (bibtex-format-string)
(t (bibtex-format-entry)))
@@ -5326,10 +5327,10 @@ entries from minibuffer."
(>= pnt (bibtex-start-of-text-in-field bounds))
(<= pnt (bibtex-end-of-text-in-field bounds)))
(setq name (bibtex-name-in-field bounds t)
- compl (cond ((bibtex-string= name "crossref")
+ compl (cond ((string-equal-ignore-case name "crossref")
;; point is in crossref field
'crossref-key)
- ((bibtex-string= name "month")
+ ((string-equal-ignore-case name "month")
;; point is in month field
bibtex-predefined-month-strings)
;; point is in other field
@@ -5488,7 +5489,7 @@ Return the URL or nil if none can be generated."
(while (and (not url) (setq scheme (pop lst)))
;; Verify the match of `bibtex-font-lock-url' by
;; comparing with TEXT.
- (when (and (bibtex-string= (caar scheme) name)
+ (when (and (string-equal-ignore-case (caar scheme) name)
(string-match (cdar scheme) text))
(setq url t scheme (cdr scheme)))))))
diff --git a/lisp/textmodes/dns-mode.el b/lisp/textmodes/dns-mode.el
index 42d547504c1..86da09c2168 100644
--- a/lisp/textmodes/dns-mode.el
+++ b/lisp/textmodes/dns-mode.el
@@ -1,6 +1,6 @@
;;; dns-mode.el --- a mode for viewing/editing Domain Name System master files -*- lexical-binding: t -*-
-;; Copyright (C) 2000-2001, 2004-2022 Free Software Foundation, Inc.
+;; Copyright (C) 2000-2022 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; Keywords: DNS master zone file SOA comm
@@ -22,11 +22,11 @@
;;; Commentary:
-;; Use M-x dns-mode RET to invoke in master files.
+;; Use `M-x dns-mode' to invoke in master files.
;;
-;; C-c C-s Increment SOA serial.
-;; Understands YYYYMMDDNN, Unix time, and serial number formats,
-;; and complains if it fail to find SOA serial.
+;; `C-c C-s' Increment SOA serial.
+;; Understands YYYYMMDDNN, Unix time, and serial number
+;; formats, and complains if it fail to find SOA serial.
;;; References:
@@ -37,12 +37,6 @@
;; Transport Layer Security (TLS) Protocol: TLSA"
;; RFC 6844, "DNS Certification Authority Authorization (CAA) Resource Record"
-;;; Release history:
-
-;; 2004-09-11 Posted on gnu.emacs.sources.
-;; 2004-09-13 Ported to XEmacs.
-;; 2004-09-14 Installed in Emacs CVS.
-
;;; Code:
(eval-when-compile (require 'cl-lib))
@@ -142,12 +136,10 @@ manually with \\[dns-mode-soa-increment-serial]."
;; Keymap.
-(defvar dns-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "\C-c\C-s" #'dns-mode-soa-increment-serial)
- (define-key map "\C-c\C-e" #'dns-mode-ipv6-to-nibbles)
- map)
- "Keymap for DNS master file mode.")
+(defvar-keymap dns-mode-map
+ :doc "Keymap for DNS master file mode."
+ "C-c C-s" #'dns-mode-soa-increment-serial
+ "C-c C-e" #'dns-mode-ipv6-to-nibbles)
;; Menu.
diff --git a/lisp/textmodes/emacs-authors-mode.el b/lisp/textmodes/emacs-authors-mode.el
new file mode 100644
index 00000000000..866822c103d
--- /dev/null
+++ b/lisp/textmodes/emacs-authors-mode.el
@@ -0,0 +1,145 @@
+;;; emacs-authors-mode.el --- font-locking for etc/AUTHORS -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021-2022 Free Software Foundation, Inc.
+
+;; Author: Stefan Kangas <stefankangas@gmail.com>
+;; Keywords: internal
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Major mode to display the etc/AUTHORS file from the Emacs
+;; distribution. Provides some basic font locking and not much else.
+
+;;; Code:
+
+(require 'subr-x) ; `emacs-etc--hide-local-variables'
+
+(defgroup emacs-authors-mode nil
+ "Display the \"etc/AUTHORS\" file from the Emacs distribution."
+ :version "29.1"
+ :group 'internal)
+
+(defface emacs-authors-default
+ '((t :inherit variable-pitch))
+ "Default face used to display the \"etc/AUTHORS\" file.
+See also `emacs-authors-mode'."
+ :version "29.1")
+
+(defface emacs-authors-author
+ '((((class color) (min-colors 88) (background light))
+ :foreground "midnight blue"
+ :weight bold :height 1.05
+ :inherit variable-pitch)
+ (((class color) (min-colors 88) (background dark))
+ :foreground "cyan"
+ :weight bold :height 1.05
+ :inherit variable-pitch)
+ (((supports :weight bold) (supports :height 1.05))
+ :weight bold :height 1.05
+ :inherit variable-pitch)
+ (((supports :weight bold))
+ :weight bold :inherit variable-pitch)
+ (t :inherit variable-pitch))
+ "Face used for the author in the \"etc/AUTHORS\" file.
+See also `emacs-authors-mode'."
+ :version "29.1")
+
+(defface emacs-authors-descriptor
+ '((((class color) (min-colors 88) (background light))
+ :foreground "sienna" :inherit variable-pitch)
+ (((class color) (min-colors 88) (background dark))
+ :foreground "peru" :inherit variable-pitch)
+ (t :inherit variable-pitch))
+ "Face used for the description text in the \"etc/AUTHORS\" file.
+See also `emacs-authors-mode'."
+ :version "29.1")
+
+(defface emacs-authors-other-files
+ '((t :inherit emacs-authors-descriptor))
+ "Face used for the \"other files\" text in the \"etc/AUTHORS\" file.
+See also `emacs-authors-mode'."
+ :version "29.1")
+
+(defconst emacs-authors--author-re
+ (rx bol (group (not (any blank "\n")) (+? (not (any ":" "\n")))) ":")
+ "Regexp matching an author in \"etc/AUTHORS\".")
+
+(defvar emacs-authors-mode-font-lock-keywords
+ `((,emacs-authors--author-re
+ 1 'emacs-authors-author)
+ (,(rx (or "wrote"
+ (seq (? "and ") (or "co-wrote" "changed"))))
+ 0 'emacs-authors-descriptor)
+ (,(rx "and " (+ digit) " other files")
+ 0 'emacs-authors-other-files)
+ (,(rx bol (not space) (+ not-newline) eol)
+ 0 'emacs-authors-default)))
+
+(defun emacs-authors-next-author (&optional arg)
+ "Move point to the next author in \"etc/AUTHORS\".
+With a prefix arg ARG, move point that many authors forward."
+ (interactive "p" emacs-authors-mode)
+ (if (< 0 arg)
+ (progn
+ (when (looking-at emacs-authors--author-re)
+ (forward-line 1))
+ (re-search-forward emacs-authors--author-re nil t arg))
+ (when (looking-at emacs-authors--author-re)
+ (forward-line -1))
+ (re-search-backward emacs-authors--author-re nil t (abs arg)))
+ (goto-char (line-beginning-position)))
+
+(defun emacs-authors-prev-author (&optional arg)
+ "Move point to the previous author in \"etc/AUTHORS\".
+With a prefix arg ARG, move point that many authors backward."
+ (interactive "p" emacs-authors-mode)
+ (emacs-authors-next-author (- arg)))
+
+(defvar emacs-authors-imenu-generic-expression
+ `((nil ,(rx bol (group (+ (not ":"))) ": "
+ (or "wrote" "co-wrote" "changed")
+ " ")
+ 1)))
+
+(define-obsolete-variable-alias 'etc-authors-mode-map 'emacs-authors-mode-map "29.1")
+(defvar-keymap emacs-authors-mode-map
+ :doc "Keymap for `emacs-authors-mode'."
+ "n" #'emacs-authors-next-author
+ "p" #'emacs-authors-prev-author)
+
+;;;###autoload
+(define-derived-mode emacs-authors-mode special-mode "Authors View"
+ "Major mode for viewing \"etc/AUTHORS\" from the Emacs distribution.
+Provides some basic font locking and not much else."
+ (setq-local font-lock-defaults
+ '(emacs-authors-mode-font-lock-keywords nil nil ((?_ . "w"))))
+ (setq font-lock-multiline nil)
+ (setq imenu-generic-expression emacs-authors-imenu-generic-expression)
+ (emacs-etc--hide-local-variables))
+
+(define-obsolete-face-alias 'etc-authors-default 'emacs-authors-default "29.1")
+(define-obsolete-face-alias 'etc-authors-author 'emacs-authors-author "29.1")
+(define-obsolete-face-alias 'etc-authors-descriptor 'emacs-authors-descriptor "29.1")
+(define-obsolete-face-alias 'etc-authors-other-files 'emacs-authors-other-files "29.1")
+(define-obsolete-function-alias 'etc-authors-next-author #'emacs-authors-next-author "29.1")
+(define-obsolete-function-alias 'etc-authors-prev-author #'emacs-authors-prev-author "29.1")
+;;;###autoload
+(define-obsolete-function-alias 'etc-authors-mode #'emacs-authors-mode "29.1")
+
+(provide 'emacs-authors-mode)
+;;; emacs-authors-mode.el ends here
diff --git a/lisp/textmodes/emacs-news-mode.el b/lisp/textmodes/emacs-news-mode.el
index af0aa2ddeab..022e17c9343 100644
--- a/lisp/textmodes/emacs-news-mode.el
+++ b/lisp/textmodes/emacs-news-mode.el
@@ -25,6 +25,7 @@
(eval-when-compile (require 'cl-lib))
(require 'outline)
+(require 'subr-x) ; `emacs-etc--hide-local-variables'
(defgroup emacs-news-mode nil
"Major mode for editing and viewing the Emacs NEWS file."
@@ -56,10 +57,15 @@
"C-c C-g" #'emacs-news-goto-section
"C-c C-j" #'emacs-news-find-heading
"C-c C-e" #'emacs-news-count-untagged-entries
+ "C-x C-q" #'emacs-news-view-mode
"<remap> <open-line>" #'emacs-news-open-line)
-(defvar-keymap emacs-news-view-mode-map
- :parent emacs-news-common-map)
+(defvar emacs-news-view-mode-map
+ ;; This is defined this way instead of inheriting because we're
+ ;; deriving the mode from `special-mode' and want the keys from there.
+ (let ((map (copy-keymap emacs-news-common-map)))
+ (keymap-set map "C-x C-q" #'emacs-news-mode)
+ map))
(defvar emacs-news-mode-font-lock-keywords
`(("^---$" 0 'emacs-news-does-not-need-documentation)
@@ -67,17 +73,21 @@
(defun emacs-news--mode-common ()
(setq-local font-lock-defaults '(emacs-news-mode-font-lock-keywords t))
- (setq-local outline-regexp "\\*+ "
+ (setq-local outline-regexp "\\(:? +\\)?\\(\\*+\\) "
outline-minor-mode-cycle t
- ;; We subtract one from the level, because we have a
- ;; space after the asterisks.
- outline-level (lambda () (1- (length (match-string 0))))
+ outline-level (lambda () (length (match-string 2)))
outline-minor-mode-highlight 'append)
- (outline-minor-mode))
+ (outline-minor-mode)
+ (emacs-etc--hide-local-variables))
;;;###autoload
(define-derived-mode emacs-news-mode text-mode "NEWS"
"Major mode for editing the Emacs NEWS file."
+ ;; Disable buttons.
+ (button-mode nil)
+ ;; And make the buffer writable. This is used when toggling
+ ;; emacs-news-mode.
+ (setq buffer-read-only nil)
(setq-local fill-paragraph-function #'emacs-news--fill-paragraph)
(emacs-news--mode-common))
diff --git a/lisp/textmodes/etc-authors-mode.el b/lisp/textmodes/etc-authors-mode.el
deleted file mode 100644
index 7eabdd4c2b8..00000000000
--- a/lisp/textmodes/etc-authors-mode.el
+++ /dev/null
@@ -1,133 +0,0 @@
-;;; etc-authors-mode.el --- font-locking for etc/AUTHORS -*- lexical-binding: t -*-
-
-;; Copyright (C) 2021-2022 Free Software Foundation, Inc.
-
-;; Author: Stefan Kangas <stefan@marxist.se>
-;; Keywords: internal
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Major mode to display the etc/AUTHORS file from the Emacs
-;; distribution. Provides some basic font locking and not much else.
-
-;;; Code:
-
-(defgroup etc-authors-mode nil
- "Display the \"etc/AUTHORS\" file from the Emacs distribution."
- :version "28.1"
- :group 'internal)
-
-(defface etc-authors-default '((t :inherit variable-pitch))
- "Default face used to display the \"etc/AUTHORS\" file.
-See also `etc-authors-mode'."
- :version "28.1")
-
-(defface etc-authors-author '((((class color) (min-colors 88) (background light))
- :foreground "midnight blue"
- :weight bold :height 1.05
- :inherit variable-pitch)
- (((class color) (min-colors 88) (background dark))
- :foreground "cyan"
- :weight bold :height 1.05
- :inherit variable-pitch)
- (((supports :weight bold) (supports :height 1.05))
- :weight bold :height 1.05
- :inherit variable-pitch)
- (((supports :weight bold))
- :weight bold :inherit variable-pitch)
- (t :inherit variable-pitch))
- "Face used for the author in the \"etc/AUTHORS\" file.
-See also `etc-authors-mode'."
- :version "28.1")
-
-(defface etc-authors-descriptor '((((class color) (min-colors 88) (background light))
- :foreground "sienna" :inherit variable-pitch)
- (((class color) (min-colors 88) (background dark))
- :foreground "peru" :inherit variable-pitch)
- (t :inherit variable-pitch))
- "Face used for the description text in the \"etc/AUTHORS\" file.
-See also `etc-authors-mode'."
- :version "28.1")
-
-(defface etc-authors-other-files '((t :inherit etc-authors-descriptor))
- "Face used for the \"other files\" text in the \"etc/AUTHORS\" file.
-See also `etc-authors-mode'."
- :version "28.1")
-
-(defconst etc-authors--author-re
- (rx bol (group (not (any blank "\n")) (+? (not (any ":" "\n")))) ":")
- "Regexp matching an author in \"etc/AUTHORS\".")
-
-(defvar etc-authors-mode-font-lock-keywords
- `((,etc-authors--author-re
- 1 'etc-authors-author)
- (,(rx (or "wrote"
- (seq (? "and ") (or "co-wrote" "changed"))))
- 0 'etc-authors-descriptor)
- (,(rx "and " (+ digit) " other files")
- 0 'etc-authors-other-files)
- (,(rx bol (not space) (+ not-newline) eol)
- 0 'etc-authors-default)))
-
-(defun etc-authors-mode--hide-local-variables ()
- "Hide local variables in \"etc/AUTHORS\". Used by `etc-authors-mode'."
- (narrow-to-region (point-min)
- (save-excursion
- (goto-char (point-min))
- ;; Obfuscate to avoid this being interpreted
- ;; as a local variable section itself.
- (if (re-search-forward "^Local\sVariables:$" nil t)
- (progn (forward-line -1) (point))
- (point-max)))))
-
-(defun etc-authors-next-author (&optional arg)
- "Move point to the next author in \"etc/AUTHORS\".
-With a prefix arg ARG, move point that many authors forward."
- (interactive "p" etc-authors-mode)
- (if (< 0 arg)
- (progn
- (when (looking-at etc-authors--author-re)
- (forward-line 1))
- (re-search-forward etc-authors--author-re nil t arg))
- (when (looking-at etc-authors--author-re)
- (forward-line -1))
- (re-search-backward etc-authors--author-re nil t (abs arg)))
- (goto-char (line-beginning-position)))
-
-(defun etc-authors-prev-author (&optional arg)
- "Move point to the previous author in \"etc/AUTHORS\".
-With a prefix arg ARG, move point that many authors backward."
- (interactive "p" etc-authors-mode)
- (etc-authors-next-author (- arg)))
-
-(defvar-keymap etc-authors-mode-map
- :doc "Keymap for `etc-authors-mode'."
- "n" #'etc-authors-next-author
- "p" #'etc-authors-prev-author)
-
-;;;###autoload
-(define-derived-mode etc-authors-mode special-mode "Authors View"
- "Major mode for viewing \"etc/AUTHORS\" from the Emacs distribution.
-Provides some basic font locking and not much else."
- (setq-local font-lock-defaults
- '(etc-authors-mode-font-lock-keywords nil nil ((?_ . "w"))))
- (setq font-lock-multiline nil)
- (etc-authors-mode--hide-local-variables))
-
-(provide 'etc-authors-mode)
-;;; etc-authors-mode.el ends here
diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el
index 2c5e30fecd8..2ee20ef1d45 100644
--- a/lisp/textmodes/flyspell.el
+++ b/lisp/textmodes/flyspell.el
@@ -854,6 +854,9 @@ Mostly we check word delimiters."
((get this-command 'flyspell-deplacement)
(not (eq flyspell-previous-command this-command)))
((get this-command 'flyspell-delayed)
+ ;; In case we're using `delete-selection-mode', make the
+ ;; region be updated immediately.
+ (deactivate-mark)
;; The current command is not delayed, that
;; is that we must check the word now.
(and (not unread-command-events)
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 8c8522a6e5e..f85d0aba9cf 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -4235,17 +4235,10 @@ Both should not be used to define a buffer-local dictionary."
;;; LOCAL VARIABLES AND BUFFER-LOCAL VALUE EXAMPLES.
-;; Local Variable options:
-;; mode: name(-mode)
-;; eval: expression
-;; local-variable: value
-
;; The following sets the buffer local dictionary to `american' English
;; and spell checks only comments.
;; Local Variables:
-;; mode: emacs-lisp
-;; comment-column: 40
;; ispell-check-comments: exclusive
;; ispell-local-dictionary: "american"
;; End:
diff --git a/lisp/textmodes/nroff-mode.el b/lisp/textmodes/nroff-mode.el
index 435423d31e5..4d1de18b2c8 100644
--- a/lisp/textmodes/nroff-mode.el
+++ b/lisp/textmodes/nroff-mode.el
@@ -1,7 +1,6 @@
;;; nroff-mode.el --- GNU Emacs major mode for editing nroff source -*- lexical-binding: t -*-
-;; Copyright (C) 1985-1986, 1994-1995, 1997, 2001-2022 Free Software
-;; Foundation, Inc.
+;; Copyright (C) 1985-2022 Free Software Foundation, Inc.
;; Maintainer: emacs-devel@gnu.org
;; Keywords: wp
@@ -45,16 +44,14 @@
"Non-nil means automatically closing requests when you insert an open."
:type 'boolean)
-(defvar nroff-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "\t" #'tab-to-tab-stop)
- (define-key map "\e?" #'nroff-count-text-lines)
- (define-key map "\n" #'nroff-electric-newline)
- (define-key map "\en" #'nroff-forward-text-line)
- (define-key map "\ep" #'nroff-backward-text-line)
- (define-key map "\C-c\C-c" #'nroff-view)
- map)
- "Major mode keymap for `nroff-mode'.")
+(defvar-keymap nroff-mode-map
+ :doc "Major mode keymap for `nroff-mode'."
+ "TAB" #'tab-to-tab-stop
+ "M-?" #'nroff-count-text-lines
+ "C-j" #'nroff-electric-newline
+ "M-n" #'nroff-forward-text-line
+ "M-p" #'nroff-backward-text-line
+ "C-c C-c" #'nroff-view)
(easy-menu-define nroff-mode-menu nroff-mode-map
"Menu for `nroff-mode'."
@@ -160,8 +157,6 @@ closing requests for requests that are used in matched pairs."
(skip-chars-forward ".H ")
(string-to-number (buffer-substring (point) (+ 1 (point))))))
-;; Compute how much to indent a comment in nroff/troff source.
-;; By mit-erl!gildea April 86
(defun nroff-comment-indent ()
"Compute indent for an nroff/troff comment.
Puts a full-stop before comments on a line by themselves."
diff --git a/lisp/textmodes/picture.el b/lisp/textmodes/picture.el
index 17d9483f68c..e8c1e6b14f2 100644
--- a/lisp/textmodes/picture.el
+++ b/lisp/textmodes/picture.el
@@ -641,7 +641,6 @@ Leaves the region surrounding the rectangle."
(define-key map [remap move-end-of-line] 'picture-end-of-line)
(define-key map [remap mouse-set-point] 'picture-mouse-set-point)
(define-key map "\C-c\C-d" 'picture-delete-char)
- (define-key map "\e\t" 'picture-toggle-tab-state)
(define-key map "\t" 'picture-tab)
(define-key map "\e\t" 'picture-tab-search)
(define-key map "\C-c\t" 'picture-set-tab-stops)
diff --git a/lisp/textmodes/refbib.el b/lisp/textmodes/refbib.el
index ba1deca47dc..203a0fdbb72 100644
--- a/lisp/textmodes/refbib.el
+++ b/lisp/textmodes/refbib.el
@@ -163,12 +163,11 @@ This is in addition to the `r2b-capitalize-title-stop-words'.")
(defun r2b-capitalize-title (s)
- "Like `capitalize', but don't capitalize stop words, except the first."
- (with-current-buffer (get-buffer-create "$$$Scratch$$$")
- (erase-buffer)
- (insert s)
- (r2b-capitalize-title-region (point-min) (point-max))
- (buffer-string)))
+ "Like `capitalize', but don't capitalize stop words, except the first."
+ (with-temp-buffer
+ (insert s)
+ (r2b-capitalize-title-region (point-min) (point-max))
+ (buffer-string)))
;*********************************************************
(defun r2b-reset ()
diff --git a/lisp/textmodes/reftex-cite.el b/lisp/textmodes/reftex-cite.el
index 26b14ebc79e..f3f95627af1 100644
--- a/lisp/textmodes/reftex-cite.el
+++ b/lisp/textmodes/reftex-cite.el
@@ -1116,10 +1116,10 @@ recommended for follow mode. It works OK for individual lookups."
(setq bibtype (reftex-bib-or-thebib))
(cond
((eq bibtype 'bib)
-; ((assq 'bib (symbol-value reftex-docstruct-symbol))
+ ;; ((assq 'bib (symbol-value reftex-docstruct-symbol))
(setq bibfile-list (reftex-get-bibfile-list)))
((eq bibtype 'thebib)
-; ((assq 'thebib (symbol-value reftex-docstruct-symbol))
+ ;; ((assq 'thebib (symbol-value reftex-docstruct-symbol))
(setq bibfile-list
(reftex-uniquify
(mapcar #'cdr
@@ -1142,8 +1142,35 @@ recommended for follow mode. It works OK for individual lookups."
;;; Global BibTeX file
(defun reftex-all-used-citation-keys ()
+ "Return a list of all citation keys used in document."
(reftex-access-scan-info)
- (let ((files (reftex-all-document-files)) file keys kk k)
+ ;; FIXME: multicites macros provided by biblatex
+ ;; are not covered in this function.
+ (let ((files (reftex-all-document-files))
+ (re (concat "\\\\"
+ "\\(?:"
+ ;; biblatex volcite macros take these args:
+ ;; \volcite[prenote]{volume}[pages]{key}
+ ;; so cater for the first 3 args:
+ (regexp-opt '("volcite" "Volcite"
+ "pvolcite" "Pvolcite"
+ "fvolcite" "ftvolcite"
+ "svolcite" "Svolcite"
+ "tvolcite" "Tvolcite"
+ "avolcite" "Avolcite"))
+ "\\(?:\\[[^]]*\\]\\)?"
+ "{[^}]*}"
+ "\\(?:\\[[^]]*\\]\\)?"
+ "\\|"
+ ;; Other cite macros usually go like:
+ ;; \cite[prenote][postnote]{key}
+ ;; so cater for the optional args:
+ "\\(?:bibentry\\|[a-zA-Z]*[Cc]ite[a-zA-Z*]*\\)"
+ "\\(?:\\[[^]]*\\]\\)\\{0,2\\}"
+ "\\)"
+ ;; Now match the key:
+ "{\\([^}]+\\)}"))
+ file keys kk k)
(save-current-buffer
(while (setq file (pop files))
(set-buffer (reftex-get-file-buffer-force file 'mark))
@@ -1151,14 +1178,17 @@ recommended for follow mode. It works OK for individual lookups."
(save-restriction
(widen)
(goto-char (point-min))
- (while (re-search-forward "\\(?:^\\|\\=\\)[^%\n\r]*?\\\\\\(bibentry\\|[a-zA-Z]*cite[a-zA-Z]*\\)\\(\\[[^]]*\\]\\)?{\\([^}]+\\)}" nil t)
- (setq kk (match-string-no-properties 3))
- (while (string-match "%.*\n?" kk)
- (setq kk (replace-match "" t t kk)))
- (setq kk (split-string kk "[, \t\r\n]+"))
- (while (setq k (pop kk))
- (or (member k keys)
- (setq keys (cons k keys)))))))))
+ (while (re-search-forward re nil t)
+ ;; Make sure we're not inside a comment:
+ (unless (save-match-data
+ (nth 4 (syntax-ppss)))
+ (setq kk (match-string-no-properties 1))
+ (while (string-match "%.*\n?" kk)
+ (setq kk (replace-match "" t t kk)))
+ (setq kk (split-string kk "[, \t\r\n]+"))
+ (while (setq k (pop kk))
+ (or (member k keys)
+ (setq keys (cons k keys))))))))))
(reftex-kill-temporary-buffers)
keys))
diff --git a/lisp/textmodes/reftex-index.el b/lisp/textmodes/reftex-index.el
index b517cc16634..075ad666b3d 100644
--- a/lisp/textmodes/reftex-index.el
+++ b/lisp/textmodes/reftex-index.el
@@ -275,10 +275,8 @@ will prompt for other arguments."
(define-key map [(mouse-2)] #'reftex-index-mouse-goto-line-and-hide)
(define-key map [follow-link] 'mouse-face)
- (substitute-key-definition
- #'next-line #'reftex-index-next map global-map)
- (substitute-key-definition
- #'previous-line #'reftex-index-previous map global-map)
+ (define-key map [remap next-line] #'reftex-index-next)
+ (define-key map [remap previous-line] #'reftex-index-previous)
(define-key map "n" #'reftex-index-next)
(define-key map "p" #'reftex-index-previous)
diff --git a/lisp/textmodes/reftex-ref.el b/lisp/textmodes/reftex-ref.el
index 3fe7a79a274..fead734be71 100644
--- a/lisp/textmodes/reftex-ref.el
+++ b/lisp/textmodes/reftex-ref.el
@@ -294,14 +294,12 @@ also applies `reftex-translate-to-ascii-function' to the string."
(defun reftex-latin1-to-ascii (string)
;; Translate the upper 128 chars in the Latin-1 charset to ASCII equivalents
- (let ((tab "@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@ icLxY|S\"ca<--R-o|23'uq..1o>423?AAAAAAACEEEEIIIIDNOOOOOXOUUUUYP3aaaaaaaceeeeiiiidnooooo:ouuuuypy")
- (emacsp (not (featurep 'xemacs))))
+ (let ((tab "@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@ icLxY|S\"ca<--R-o|23'uq..1o>423?AAAAAAACEEEEIIIIDNOOOOOXOUUUUYP3aaaaaaaceeeeiiiidnooooo:ouuuuypy"))
(mapconcat
(lambda (c)
(cond ((and (> c 127) (< c 256)) ; 8 bit Latin-1
(char-to-string (aref tab (- c 128))))
- ((and emacsp ; Not for XEmacs
- (> c 2175) (< c 2304)) ; Mule Latin-1
+ ((and (> c 2175) (< c 2304)) ; Mule Latin-1
(char-to-string (aref tab (- c 2176))))
(t (char-to-string c))))
string "")))
diff --git a/lisp/textmodes/reftex-sel.el b/lisp/textmodes/reftex-sel.el
index 5942801a8a9..80c01948e5a 100644
--- a/lisp/textmodes/reftex-sel.el
+++ b/lisp/textmodes/reftex-sel.el
@@ -33,14 +33,10 @@
(defvar reftex-select-shared-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map special-mode-map)
- (substitute-key-definition
- #'next-line #'reftex-select-next map global-map)
- (substitute-key-definition
- #'previous-line #'reftex-select-previous map global-map)
- (substitute-key-definition
- #'keyboard-quit #'reftex-select-keyboard-quit map global-map)
- (substitute-key-definition
- #'newline #'reftex-select-accept map global-map)
+ (define-key map [remap next-line] #'reftex-select-next)
+ (define-key map [remap previous-line] #'reftex-select-previous)
+ (define-key map [remap keyboard-quit] #'reftex-select-keyboard-quit)
+ (define-key map [remap newline] #'reftex-select-accept)
(define-key map " " #'reftex-select-callback)
(define-key map "n" #'reftex-select-next)
diff --git a/lisp/textmodes/reftex-toc.el b/lisp/textmodes/reftex-toc.el
index 5599eaee024..a7f3a9452a6 100644
--- a/lisp/textmodes/reftex-toc.el
+++ b/lisp/textmodes/reftex-toc.el
@@ -34,10 +34,8 @@
(define-key map [(mouse-2)] #'reftex-toc-mouse-goto-line-and-hide)
(define-key map [follow-link] 'mouse-face)
- (substitute-key-definition
- 'next-line 'reftex-toc-next map global-map)
- (substitute-key-definition
- 'previous-line 'reftex-toc-previous map global-map)
+ (define-key map [remap next-line] #'reftex-toc-next)
+ (define-key map [remap previous-line] #'reftex-toc-previous)
(define-key map "n" #'reftex-toc-next)
(define-key map "p" #'reftex-toc-previous)
diff --git a/lisp/textmodes/remember.el b/lisp/textmodes/remember.el
index f7ebe04bcf5..c7a9f20ea2c 100644
--- a/lisp/textmodes/remember.el
+++ b/lisp/textmodes/remember.el
@@ -129,8 +129,6 @@
;; To map the primary remember function to the keystroke F8, do the
;; following.
;;
-;; (autoload 'remember "remember" nil t)
-;;
;; (define-key global-map [f8] 'remember)
;;
;; * Feedback
@@ -558,7 +556,7 @@ If this is nil, then `diary-file' will be used instead."
map)
"Keymap used in `remember-mode'.")
-(define-derived-mode remember-mode indented-text-mode "Remember"
+(define-derived-mode remember-mode text-mode "Remember"
"Major mode for output from \\[remember].
This buffer is used to collect data that you want to remember.
\\<remember-mode-map>
diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el
index 8f9b603ef5f..7d691430ec6 100644
--- a/lisp/textmodes/sgml-mode.el
+++ b/lisp/textmodes/sgml-mode.el
@@ -1536,8 +1536,7 @@ not the case, the first tag returned is the one inside which we are."
;; [ Well, actually it depends, but we don't have the info about
;; when it doesn't and when it does. --Stef ]
(setq ignore nil)))
- ((eq t (compare-strings (sgml-tag-name tag-info) nil nil
- (car stack) nil nil t))
+ ((string-equal-ignore-case (sgml-tag-name tag-info) (car stack))
(setq stack (cdr stack)))
(t
;; The open and close tags don't match.
@@ -1549,9 +1548,8 @@ not the case, the first tag returned is the one inside which we are."
;; but it's a bad assumption when tags *are* closed but
;; not properly nested.
(while (and (cdr tmp)
- (not (eq t (compare-strings
- (sgml-tag-name tag-info) nil nil
- (cadr tmp) nil nil t))))
+ (not (string-equal-ignore-case
+ (sgml-tag-name tag-info) (cadr tmp))))
(setq tmp (cdr tmp)))
(if (cdr tmp) (setcdr tmp (cddr tmp)))))
(message "Unmatched tags <%s> and </%s>"
@@ -1701,9 +1699,8 @@ LCON is the lexical context, if any."
(there (point)))
;; Ignore previous unclosed start-tag in context.
(while (and context unclosed
- (eq t (compare-strings
- (sgml-tag-name (car context)) nil nil
- unclosed nil nil t)))
+ (string-equal-ignore-case
+ (sgml-tag-name (car context)) unclosed))
(setq context (cdr context)))
;; Indent to reflect nesting.
(cond
@@ -1916,7 +1913,7 @@ This takes effect when first loading the library.")
(valign '(("top") ("middle") ("bottom") ("baseline")))
(rel '(("next") ("previous") ("parent") ("subdocument") ("made")))
(href '("href" ("ftp:") ("file:") ("finger:") ("gopher:") ("http:")
- ("mailto:") ("news:") ("rlogin:") ("telnet:") ("tn3270:")
+ ("https:") ("mailto:") ("news:") ("rlogin:") ("telnet:") ("tn3270:")
("wais:") ("/cgi-bin/")))
(name '("name"))
(link `(,href
diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el
index d34133f8564..e6c0f8c28c0 100644
--- a/lisp/textmodes/tex-mode.el
+++ b/lisp/textmodes/tex-mode.el
@@ -2496,10 +2496,8 @@ Only applies the FSPEC to the args part of FORMAT."
(let (shell-dirtrack-verbose)
(tex-send-command tex-shell-cd-command dir)))
(with-current-buffer (process-buffer (tex-send-command cmd))
- (setq compilation-last-buffer (current-buffer))
- (compilation-forget-errors)
- ;; Don't parse previous compilations.
- (set-marker compilation-parsing-end (1- (point-max))))
+ (setq next-error-last-buffer (current-buffer))
+ (compilation-forget-errors))
(tex-display-shell)
(setq tex-last-buffer-texed (current-buffer)))
diff --git a/lisp/textmodes/texinfo.el b/lisp/textmodes/texinfo.el
index 1ac59ddc5fb..7a654f72ab8 100644
--- a/lisp/textmodes/texinfo.el
+++ b/lisp/textmodes/texinfo.el
@@ -235,9 +235,6 @@ Subexpression 1 is what goes into the corresponding `@end' statement.")
(define-key keymap "\C-c\C-t\C-r" #'texinfo-tex-region)
(define-key keymap "\C-c\C-t\C-b" #'texinfo-tex-buffer))
-;; Mode documentation displays commands in reverse order
-;; from how they are listed in the texinfo-mode-map.
-
(defvar texinfo-mode-map
(let ((map (make-sparse-keymap)))
diff --git a/lisp/textmodes/text-mode.el b/lisp/textmodes/text-mode.el
index 076f8dd98ff..9e8f3747c5f 100644
--- a/lisp/textmodes/text-mode.el
+++ b/lisp/textmodes/text-mode.el
@@ -67,13 +67,11 @@
st)
"Syntax table used while in `text-mode'.")
-(defvar text-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "\e\t" #'ispell-complete-word)
- map)
- "Keymap for `text-mode'.
-Many other modes, such as `mail-mode', `outline-mode' and `indented-text-mode',
-inherit all the commands defined in this map.")
+(defvar-keymap text-mode-map
+ :doc "Keymap for `text-mode'.
+Many other modes, such as `mail-mode' and `outline-mode', inherit
+all the commands defined in this map."
+ "C-M-i" #'ispell-complete-word)
(easy-menu-define text-mode-menu text-mode-map
"Menu for `text-mode'."
@@ -164,8 +162,6 @@ Turning on Paragraph-Indent minor mode runs the normal hook
(remove-function (local 'indent-line-function)
#'indent-to-left-margin)))
-(defalias 'indented-text-mode #'text-mode)
-
;; This can be made a no-op once all modes that use text-mode-hook
;; are "derived" from text-mode. (As of 2015/04, and probably well before,
;; the only one I can find that doesn't so derive is rmail-edit-mode.)
@@ -245,6 +241,8 @@ The argument NLINES says how many lines to center."
(setq nlines (1+ nlines))
(forward-line -1)))))
+(define-obsolete-function-alias 'indented-text-mode #'text-mode "29.1")
+
(provide 'text-mode)
;;; text-mode.el ends here
diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el
index a7c86fb24f0..462f87d3c1a 100644
--- a/lisp/thingatpt.el
+++ b/lisp/thingatpt.el
@@ -74,7 +74,7 @@ question.
\"things\" include `symbol', `list', `sexp', `defun', `filename',
`existing-filename', `url', `email', `uuid', `word', `sentence',
-`whitespace', `line', and `page'.")
+`whitespace', `line', `face' and `page'.")
;; Basic movement
@@ -166,7 +166,7 @@ positions of the thing found."
THING should be a symbol specifying a type of syntactic entity.
Possibilities include `symbol', `list', `sexp', `defun',
`filename', `existing-filename', `url', `email', `uuid', `word',
-`sentence', `whitespace', `line', `number', and `page'.
+`sentence', `whitespace', `line', `number', `face' and `page'.
When the optional argument NO-PROPERTIES is non-nil,
strip text properties from the return value.
@@ -361,6 +361,15 @@ E.g.:
(put 'existing-filename 'thing-at-point 'thing-at-point-file-at-point)
+;; Faces
+
+(defun thing-at-point-face-at-point (&optional _lax _bounds)
+ "Return the name of the face at point as a symbol."
+ (when-let ((face (thing-at-point 'symbol)))
+ (and (facep face) (intern face))))
+
+(put 'face 'thing-at-point 'thing-at-point-face-at-point)
+
;; URIs
(defvar thing-at-point-beginning-of-url-regexp nil
diff --git a/lisp/tool-bar.el b/lisp/tool-bar.el
index 82b458e0107..b1f7a70e33c 100644
--- a/lisp/tool-bar.el
+++ b/lisp/tool-bar.el
@@ -75,8 +75,8 @@ See `tool-bar-mode' for more information."
(tool-bar-mode (if (> (frame-parameter nil 'tool-bar-lines) 0) 0 1))
(tool-bar-mode arg)))
-(defvar tool-bar-map (make-sparse-keymap)
- "Keymap for the tool bar.
+(defvar-keymap tool-bar-map
+ :doc "Keymap for the tool bar.
To override the global tool bar, define this variable
buffer-locally and add the items you want to it with
diff --git a/lisp/transient.el b/lisp/transient.el
index 41b69b1abac..a4158589706 100644
--- a/lisp/transient.el
+++ b/lisp/transient.el
@@ -1,16 +1,18 @@
-;;; transient.el --- Transient commands -*- lexical-binding: t; -*-
+;;; transient.el --- Transient commands -*- lexical-binding:t -*-
;; Copyright (C) 2018-2022 Free Software Foundation, Inc.
;; Author: Jonas Bernoulli <jonas@bernoul.li>
;; URL: https://github.com/magit/transient
-;; Keywords: bindings
+;; Keywords: extensions
-;; Package-Requires: ((emacs "25.1"))
;; Package-Version: 0.3.7
+;; Package-Requires: ((emacs "26.1"))
;; SPDX-License-Identifier: GPL-3.0-or-later
+;; This file is part of GNU Emacs.
+
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published
;; by the Free Software Foundation, either version 3 of the License,
@@ -24,8 +26,6 @@
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
-;; This file is part of GNU Emacs.
-
;;; Commentary:
;; Taking inspiration from prefix keys and prefix arguments, Transient
@@ -58,14 +58,14 @@
(require 'format-spec)
(require 'seq)
-(eval-when-compile
- (require 'subr-x))
+(eval-when-compile (require 'subr-x))
-(declare-function info "info")
-(declare-function Man-find-section "man")
-(declare-function Man-next-section "man")
-(declare-function Man-getpage-in-background "man")
+(declare-function info "info" (&optional file-or-node buffer))
+(declare-function Man-find-section "man" (section))
+(declare-function Man-next-section "man" (n))
+(declare-function Man-getpage-in-background "man" (topic))
+(defvar display-line-numbers) ; since Emacs 26.1
(defvar Man-notify-method)
(define-obsolete-function-alias 'define-transient-command
@@ -77,6 +77,8 @@
(define-obsolete-function-alias 'define-infix-argument
#'transient-define-argument "Transient 0.3.0")
+(define-obsolete-variable-alias 'transient--source-buffer
+ 'transient--original-buffer "Transient 0.2.0")
(define-obsolete-variable-alias 'current-transient-prefix
'transient-current-prefix "Transient 0.3.0")
(define-obsolete-variable-alias 'current-transient-command
@@ -107,21 +109,20 @@
(defcustom transient-show-popup t
"Whether to show the current transient in a popup buffer.
-
+\\<transient-map>
- If t, then show the popup as soon as a transient prefix command
is invoked.
- If nil, then do not show the popup unless the user explicitly
- requests it, by pressing an incomplete prefix key sequence.
+ requests it, by pressing \\[transient-show] or a prefix key.
- If a number, then delay displaying the popup and instead show
a brief one-line summary. If zero or negative, then suppress
even showing that summary and display the pressed key only.
Show the popup when the user explicitly requests it by pressing
- an incomplete prefix key sequence. Unless zero, then also show
- the popup after that many seconds of inactivity (using the
- absolute value)."
+ \\[transient-show] or a prefix key. Unless zero, then also show the popup
+ after that many seconds of inactivity (using the absolute value)."
:package-version '(transient . "0.1.0")
:group 'transient
:type '(choice (const :tag "instantly" t)
@@ -129,20 +130,32 @@
(const :tag "on demand (no summary)" 0)
(number :tag "after delay" 1)))
-(defcustom transient-enable-popup-navigation nil
+(defcustom transient-enable-popup-navigation t
"Whether navigation commands are enabled in the transient popup.
While a transient is active the transient popup buffer is not the
current buffer, making it necessary to use dedicated commands to
-act on that buffer itself. If this non-nil, then the following
-features are available:
-
-- \"<up>\" moves the cursor to the previous suffix.
- \"<down>\" moves the cursor to the next suffix.
- \"RET\" invokes the suffix the cursor is on.
-- \"<mouse-1>\" invokes the clicked on suffix.
-- \"C-s\" and \"C-r\" start isearch in the popup buffer."
- :package-version '(transient . "0.2.0")
+act on that buffer itself. If this is non-nil, then the following
+bindings are available:
+
+\\<transient-popup-navigation-map>\
+- \\[transient-backward-button] moves the cursor to the previous suffix.
+- \\[transient-forward-button] moves the cursor to the next suffix.
+- \\[transient-push-button] invokes the suffix the cursor is on.
+\\<transient-button-map>\
+- \\`<mouse-1>' and \\`<mouse-2>' invoke the clicked on suffix.
+\\<transient-popup-navigation-map>\
+- \\[transient-isearch-backward]\
+ and \\[transient-isearch-forward] start isearch in the popup buffer.
+
+\\`<mouse-1>' and \\`<mouse-2>' are bound in `transient-push-button'.
+All other bindings are in `transient-popup-navigation-map'.
+
+By default \\`M-RET' is bound to `transient-push-button', instead of
+\\`RET', because if a transient allows the invocation of non-suffixes
+then it is likely that you would want \\`RET' to do what it would do
+if no transient were active."
+ :package-version '(transient . "0.4.0")
:group 'transient
:type 'boolean)
@@ -244,7 +257,7 @@ arguments. When this option is non-nil, then the key binding
for infix argument are highlighted when only a long argument
\(e.g. \"--verbose\") is specified but no shor-thand (e.g \"-v\").
In the rare case that a short-hand is specified but does not
-match the key binding, then it is highlighed differently.
+match the key binding, then it is highlighted differently.
The highlighting is done using `transient-mismatched-key'
and `transient-nonstandard-key'."
@@ -317,13 +330,32 @@ used."
:group 'transient
:type 'boolean)
+(defcustom transient-align-variable-pitch nil
+ "Whether to align columns pixel-wise in the popup buffer.
+
+If this is non-nil, then columns are aligned pixel-wise to
+support variable-pitch fonts. Keys are not aligned, so you
+should use a fixed-pitch font for the `transient-key' face.
+Other key faces inherit from that face unless a theme is
+used that breaks that relationship.
+
+This option is intended for users who use a variable-pitch
+font for the `default' face.
+
+Also see `transient-force-fixed-pitch'."
+ :package-version '(transient . "0.4.0")
+ :group 'transient
+ :type 'boolean)
+
(defcustom transient-force-fixed-pitch nil
"Whether to force use of monospaced font in the popup buffer.
Even if you use a proportional font for the `default' face,
you might still want to use a monospaced font in transient's
popup buffer. Setting this option to t causes `default' to
-be remapped to `fixed-pitch' in that buffer."
+be remapped to `fixed-pitch' in that buffer.
+
+Also see `transient-align-variable-pitch'."
:package-version '(transient . "0.2.0")
:group 'transient
:type 'boolean)
@@ -337,6 +369,12 @@ text and might otherwise have to scroll in two dimensions."
:group 'transient
:type 'boolean)
+(defcustom transient-hide-during-minibuffer-read nil
+ "Whether to hide the transient buffer while reading in the minibuffer."
+ :package-version '(transient . "0.4.0")
+ :group 'transient
+ :type 'boolean)
+
(defconst transient--default-child-level 1)
(defconst transient--default-prefix-level 4)
@@ -375,21 +413,21 @@ give you as many additional suffixes as you hoped.)"
(const :tag "7 - most suffixes" 7)))
(defcustom transient-levels-file
- (locate-user-emacs-file (convert-standard-filename "transient/levels.el"))
+ (locate-user-emacs-file "transient/levels.el")
"File used to save levels of transients and their suffixes."
:package-version '(transient . "0.1.0")
:group 'transient
:type 'file)
(defcustom transient-values-file
- (locate-user-emacs-file (convert-standard-filename "transient/values.el"))
+ (locate-user-emacs-file "transient/values.el")
"File used to save values of transients."
:package-version '(transient . "0.1.0")
:group 'transient
:type 'file)
(defcustom transient-history-file
- (locate-user-emacs-file (convert-standard-filename "transient/history.el"))
+ (locate-user-emacs-file "transient/history.el")
"File used to save history of transients and their infixes."
:package-version '(transient . "0.1.0")
:group 'transient
@@ -445,7 +483,7 @@ give you as many additional suffixes as you hoped.)"
"Face used for the infix for which the value is being read."
:group 'transient-faces)
-(defface transient-unreachable-key '((t :inherit shadow))
+(defface transient-unreachable-key '((t :inherit (transient-key shadow)))
"Face used for keys unreachable from the current prefix sequence."
:group 'transient-faces)
@@ -524,6 +562,15 @@ These faces are only used if `transient-semantic-coloring'
"Face used for teal prefixes."
:group 'transient-color-faces)
+(defface transient-purple
+ '((t :inherit transient-key :foreground "#a020f0"))
+ "Face used for purple prefixes.
+
+This is an addition to the colors supported by Hydra. It is
+used by suffixes that quit the current prefix but return to
+the previous prefix."
+ :group 'transient-color-faces)
+
;;; Persistence
(defun transient--read-file-contents (file)
@@ -784,6 +831,7 @@ elements themselves.")
;;; Define
+;;;###autoload
(defmacro transient-define-prefix (name arglist &rest args)
"Define NAME as a transient prefix command.
@@ -824,11 +872,11 @@ to the setup function:
(transient-setup \\='NAME nil nil :scope SCOPE)
\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... GROUP... [BODY...])"
- (declare (debug (&define name lambda-list
- [&optional lambda-doc]
- [&rest keywordp sexp]
- [&rest vectorp]
- [&optional ("interactive" interactive) def-body]))
+ (declare (debug ( &define name lambda-list
+ [&optional lambda-doc]
+ [&rest keywordp sexp]
+ [&rest vectorp]
+ [&optional ("interactive" interactive) def-body]))
(indent defun)
(doc-string 3))
(pcase-let ((`(,class ,slots ,suffixes ,docstr ,body)
@@ -865,11 +913,11 @@ ARGLIST. The infix arguments are usually accessed by using
`transient-args' inside `interactive'.
\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... BODY...)"
- (declare (debug (&define name lambda-list
- [&optional lambda-doc]
- [&rest keywordp sexp]
- ("interactive" interactive)
- def-body))
+ (declare (debug ( &define name lambda-list
+ [&optional lambda-doc]
+ [&rest keywordp sexp]
+ ("interactive" interactive)
+ def-body))
(indent defun)
(doc-string 3))
(pcase-let ((`(,class ,slots ,_ ,docstr ,body)
@@ -911,14 +959,14 @@ functions. Different infix commands behave differently because
the concrete methods are different for different infix command
classes. In rare case the above command function might not be
suitable, even if you define your own infix command class. In
-that case you have to use `transient-suffix-command' to define
+that case you have to use `transient-define-suffix' to define
the infix command and use t as the value of the `:transient'
keyword.
\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]...)"
- (declare (debug (&define name lambda-list
- [&optional lambda-doc]
- [&rest keywordp sexp]))
+ (declare (debug ( &define name lambda-list
+ [&optional lambda-doc]
+ [&rest keywordp sexp]))
(indent defun)
(doc-string 3))
(pcase-let ((`(,class ,slots ,_ ,docstr ,_)
@@ -926,6 +974,7 @@ keyword.
`(progn
(defalias ',name ,(transient--default-infix-command))
(put ',name 'interactive-only t)
+ (put ',name 'command-modes (list 'not-a-mode))
(put ',name 'function-documentation ,docstr)
(put ',name 'transient--suffix
(,(or class 'transient-switch) :command ',name ,@slots)))))
@@ -951,8 +1000,9 @@ example, sets a variable use `transient-define-infix' instead.
(push k keys)
(push v keys))))
(while (let ((arg (car args)))
- (or (vectorp arg)
- (and arg (symbolp arg))))
+ (if (vectorp arg)
+ (setcar args (eval (cdr (backquote-process arg))))
+ (and arg (symbolp arg))))
(push (pop args) suffixes))
(list (if (eq (car-safe class) 'quote)
(cadr class)
@@ -970,8 +1020,8 @@ example, sets a variable use `transient-define-infix' instead.
(vectorp (car value))))
(cl-mapcan (lambda (s) (transient--parse-child prefix s)) value)
(transient--parse-child prefix value))))
- (vector (when-let ((c (transient--parse-group prefix spec))) (list c)))
- (list (when-let ((c (transient--parse-suffix prefix spec))) (list c)))
+ (vector (and-let* ((c (transient--parse-group prefix spec))) (list c)))
+ (list (and-let* ((c (transient--parse-suffix prefix spec))) (list c)))
(string (list spec))))
(defun transient--parse-group (prefix spec)
@@ -1091,7 +1141,7 @@ example, sets a variable use `transient-define-infix' instead.
;;; Edit
-(defun transient--insert-suffix (prefix loc suffix action)
+(defun transient--insert-suffix (prefix loc suffix action &optional keep-other)
(let* ((suf (cl-etypecase suffix
(vector (transient--parse-group prefix suffix))
(list (transient--parse-suffix prefix suffix))
@@ -1109,25 +1159,18 @@ example, sets a variable use `transient-define-infix' instead.
suffix prefix loc
"suffixes and groups cannot be siblings"))
(t
- (when (and (listp suffix)
- (listp elt))
- ;; Both suffixes are key bindings; not heading strings.
- (let ((key (transient--spec-key suf)))
- (if (equal (transient--kbd key)
- (transient--kbd (transient--spec-key elt)))
- ;; We must keep `mem' until after we have inserted
- ;; behind it, which `transient-remove-suffix' does
- ;; not allow us to do.
- (let ((spred (transient--suffix-predicate suf))
- (epred (transient--suffix-predicate elt)))
- ;; If both suffixes have a predicate and they
- ;; are not identical, then there is a high
- ;; probability that we want to keep both.
- (when (or (not spred)
- (not epred)
- (equal spred epred))
- (setq action 'replace)))
- (transient-remove-suffix prefix key))))
+ (when-let* ((bindingp (listp suf))
+ (key (transient--spec-key suf))
+ (conflict (car (transient--layout-member key prefix)))
+ (conflictp
+ (and (not (and (eq action 'replace)
+ (eq conflict elt)))
+ (or (not keep-other)
+ (eq (plist-get (nth 2 suf) :command)
+ (plist-get (nth 2 conflict) :command)))
+ (equal (transient--suffix-predicate suf)
+ (transient--suffix-predicate conflict)))))
+ (transient-remove-suffix prefix key))
(cl-ecase action
(insert (setcdr mem (cons elt (cdr mem)))
(setcar mem suf))
@@ -1135,7 +1178,7 @@ example, sets a variable use `transient-define-infix' instead.
(replace (setcar mem suf)))))))
;;;###autoload
-(defun transient-insert-suffix (prefix loc suffix)
+(defun transient-insert-suffix (prefix loc suffix &optional keep-other)
"Insert a SUFFIX into PREFIX before LOC.
PREFIX is a prefix command, a symbol.
SUFFIX is a suffix command or a group specification (of
@@ -1143,12 +1186,14 @@ SUFFIX is a suffix command or a group specification (of
LOC is a command, a key vector, a key description (a string
as returned by `key-description'), or a coordination list
(whose last element may also be a command or key).
+Remove a conflicting binding unless optional KEEP-OTHER is
+ non-nil.
See info node `(transient)Modifying Existing Transients'."
(declare (indent defun))
- (transient--insert-suffix prefix loc suffix 'insert))
+ (transient--insert-suffix prefix loc suffix 'insert keep-other))
;;;###autoload
-(defun transient-append-suffix (prefix loc suffix)
+(defun transient-append-suffix (prefix loc suffix &optional keep-other)
"Insert a SUFFIX into PREFIX after LOC.
PREFIX is a prefix command, a symbol.
SUFFIX is a suffix command or a group specification (of
@@ -1156,9 +1201,11 @@ SUFFIX is a suffix command or a group specification (of
LOC is a command, a key vector, a key description (a string
as returned by `key-description'), or a coordination list
(whose last element may also be a command or key).
+Remove a conflicting binding unless optional KEEP-OTHER is
+ non-nil.
See info node `(transient)Modifying Existing Transients'."
(declare (indent defun))
- (transient--insert-suffix prefix loc suffix 'append))
+ (transient--insert-suffix prefix loc suffix 'append keep-other))
;;;###autoload
(defun transient-replace-suffix (prefix loc suffix)
@@ -1268,7 +1315,7 @@ See info node `(transient)Modifying Existing Transients'."
(plist-get plist :command)))))
(defun transient--command-key (cmd)
- (when-let ((obj (get cmd 'transient--suffix)))
+ (and-let* ((obj (get cmd 'transient--suffix)))
(cond ((slot-boundp obj 'key)
(oref obj key))
((slot-exists-p obj 'shortarg)
@@ -1289,7 +1336,7 @@ This is an object representing that transient, use
(defvar transient-current-command nil
"The transient from which this suffix command was invoked.
This is a symbol representing that transient, use
-`current-transient-object' to get the respective object.")
+`transient-current-prefix' to get the respective object.")
(defvar transient-current-suffixes nil
"The suffixes of the transient from which this suffix command was invoked.
@@ -1319,6 +1366,8 @@ variable instead.")
(defvar transient--stack nil)
+(defvar transient--minibuffer-depth 0)
+
(defvar transient--buffer-name " *transient*"
"Name of the transient buffer.")
@@ -1329,9 +1378,6 @@ variable instead.")
"The window that was selected before the transient was invoked.
Usually it remains selected while the transient is active.")
-(define-obsolete-variable-alias 'transient--source-buffer
- 'transient--original-buffer "Transient 0.2.0")
-
(defvar transient--original-buffer nil
"The buffer that was current before the transient was invoked.
Usually it remains current while the transient is active.")
@@ -1340,6 +1386,17 @@ Usually it remains current while the transient is active.")
(defvar transient--history nil)
+(defvar transient--abort-commands
+ '(abort-minibuffers ; (minibuffer-quit-recursive-edit)
+ abort-recursive-edit ; (throw 'exit t)
+ exit-recursive-edit ; (throw 'exit nil)
+ keyboard-escape-quit ; dwim
+ keyboard-quit ; (signal 'quit nil)
+ minibuffer-keyboard-quit ; (abort-minibuffers)
+ minibuffer-quit-recursive-edit ; (throw 'exit (lambda ()
+ ; (signal 'minibuffer-quit nil)))
+ top-level)) ; (throw 'top-level nil)
+
(defvar transient--scroll-commands
'(transient-scroll-up
transient-scroll-down
@@ -1391,11 +1448,12 @@ probably use this instead:
transient-current-prefix)
(cl-find-if (lambda (obj)
(eq (transient--suffix-command obj)
- (or command this-original-command)))
+ (or command this-command)))
(or transient--suffixes
transient-current-suffixes))
- (when-let ((obj (get (or command this-command) 'transient--suffix))
- (obj (clone obj)))
+ (when-let* ((obj (get (or command this-command) 'transient--suffix))
+ (obj (clone obj)))
+ ;; Cannot use and-let* because of debbugs#31840.
(transient-init-scope obj)
(transient-init-value obj)
obj)))
@@ -1499,13 +1557,15 @@ to `transient-predicate-map'. Also see `transient-base-map'.")
'transient--layout
(cl-mapcan
(lambda (s) (transient--parse-child 'transient-common-commands s))
- '([:hide (lambda ()
- (and (not (memq (car transient--redisplay-key)
- transient--common-command-prefixes))
- (not transient-show-common-commands)))
+ `([:hide ,(lambda ()
+ (and (not (memq (car (bound-and-true-p
+ transient--redisplay-key))
+ transient--common-command-prefixes))
+ (not transient-show-common-commands)))
["Value commands"
("C-x s " "Set" transient-set)
("C-x C-s" "Save" transient-save)
+ ("C-x C-k" "Reset" transient-reset)
("C-x p " "Previous value" transient-history-prev)
("C-x n " "Next value" transient-history-next)]
["Sticky commands"
@@ -1516,22 +1576,41 @@ to `transient-predicate-map'. Also see `transient-base-map'.")
("C-z" "Suspend transient stack" transient-suspend)]
["Customize"
("C-x t" transient-toggle-common
- :description (lambda ()
- (if transient-show-common-commands
- "Hide common commands"
- "Show common permanently")))
+ :description ,(lambda ()
+ (if transient-show-common-commands
+ "Hide common commands"
+ "Show common permanently")))
("C-x l" "Show/hide suffixes" transient-set-level)]])))
+(defvar transient-popup-navigation-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map (kbd "<down-mouse-1>") #'transient-noop)
+ (define-key map (kbd "<up>") #'transient-backward-button)
+ (define-key map (kbd "<down>") #'transient-forward-button)
+ (define-key map (kbd "C-r") #'transient-isearch-backward)
+ (define-key map (kbd "C-s") #'transient-isearch-forward)
+ (define-key map (kbd "M-RET") #'transient-push-button)
+ map)
+ "One of the keymaps used when popup navigation is enabled.
+See `transient-enable-popup-navigation'.")
+
+(defvar transient-button-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map (kbd "<mouse-1>") #'transient-push-button)
+ (define-key map (kbd "<mouse-2>") #'transient-push-button)
+ map)
+ "One of the keymaps used when popup navigation is enabled.
+See `transient-enable-popup-navigation'.")
+
(defvar transient-predicate-map
(let ((map (make-sparse-keymap)))
- (define-key map [handle-switch-frame] #'transient--do-suspend)
(define-key map [transient-suspend] #'transient--do-suspend)
(define-key map [transient-help] #'transient--do-stay)
(define-key map [transient-set-level] #'transient--do-stay)
(define-key map [transient-history-prev] #'transient--do-stay)
(define-key map [transient-history-next] #'transient--do-stay)
(define-key map [universal-argument] #'transient--do-stay)
- (define-key map [negative-argument] #'transient--do-stay)
+ (define-key map [negative-argument] #'transient--do-minus)
(define-key map [digit-argument] #'transient--do-stay)
(define-key map [transient-quit-all] #'transient--do-quit-all)
(define-key map [transient-quit-one] #'transient--do-quit-one)
@@ -1541,6 +1620,7 @@ to `transient-predicate-map'. Also see `transient-base-map'.")
(define-key map [transient-toggle-common] #'transient--do-stay)
(define-key map [transient-set] #'transient--do-call)
(define-key map [transient-save] #'transient--do-call)
+ (define-key map [transient-reset] #'transient--do-call)
(define-key map [describe-key-briefly] #'transient--do-stay)
(define-key map [describe-key] #'transient--do-stay)
(define-key map [transient-scroll-up] #'transient--do-stay)
@@ -1549,11 +1629,16 @@ to `transient-predicate-map'. Also see `transient-base-map'.")
(define-key map [scroll-bar-toolkit-scroll] #'transient--do-stay)
(define-key map [transient-noop] #'transient--do-noop)
(define-key map [transient-mouse-push-button] #'transient--do-move)
- (define-key map [transient-push-button] #'transient--do-move)
+ (define-key map [transient-push-button] #'transient--do-push-button)
(define-key map [transient-backward-button] #'transient--do-move)
(define-key map [transient-forward-button] #'transient--do-move)
(define-key map [transient-isearch-backward] #'transient--do-move)
(define-key map [transient-isearch-forward] #'transient--do-move)
+ ;; If a valid but incomplete prefix sequence is followed by
+ ;; an unbound key, then Emacs calls the `undefined' command
+ ;; but does not set `this-command', `this-original-command'
+ ;; or `real-this-command' accordingly. Instead they are nil.
+ (define-key map [nil] #'transient--do-warn)
map)
"Base keymap used to map common commands to their transient behavior.
@@ -1573,22 +1658,24 @@ For transient commands that are bound in individual transients,
the transient behavior is specified using the `:transient' slot
of the corresponding object.")
-(defvar transient-popup-navigation-map)
-
(defvar transient--transient-map nil)
(defvar transient--predicate-map nil)
(defvar transient--redisplay-map nil)
(defvar transient--redisplay-key nil)
-(defun transient--push-keymap (map)
- (transient--debug " push %s%s" map (if (symbol-value map) "" " VOID"))
- (with-demoted-errors "transient--push-keymap: %S"
- (internal-push-keymap (symbol-value map) 'overriding-terminal-local-map)))
+(defun transient--push-keymap (var)
+ (let ((map (symbol-value var)))
+ (transient--debug " push %s%s" var (if map "" " VOID"))
+ (when map
+ (with-demoted-errors "transient--push-keymap: %S"
+ (internal-push-keymap map 'overriding-terminal-local-map)))))
-(defun transient--pop-keymap (map)
- (transient--debug " pop %s%s" map (if (symbol-value map) "" " VOID"))
- (with-demoted-errors "transient--pop-keymap: %S"
- (internal-pop-keymap (symbol-value map) 'overriding-terminal-local-map)))
+(defun transient--pop-keymap (var)
+ (let ((map (symbol-value var)))
+ (transient--debug " pop %s%s" var (if map "" " VOID"))
+ (when map
+ (with-demoted-errors "transient--pop-keymap: %S"
+ (internal-pop-keymap map 'overriding-terminal-local-map)))))
(defun transient--make-transient-map ()
(let ((map (make-sparse-keymap)))
@@ -1613,17 +1700,27 @@ of the corresponding object.")
(string-trim key)
cmd conflict)))
(define-key map kbd cmd))))
+ (when-let ((b (lookup-key map "-"))) (define-key map [kp-subtract] b))
+ (when-let ((b (lookup-key map "="))) (define-key map [kp-equal] b))
+ (when-let ((b (lookup-key map "+"))) (define-key map [kp-add] b))
(when transient-enable-popup-navigation
- (setq map
- (make-composed-keymap (list map transient-popup-navigation-map))))
+ ;; `transient--make-redisplay-map' maps only over bindings that are
+ ;; directly in the base keymap, so that cannot be a composed keymap.
+ (set-keymap-parent
+ map (make-composed-keymap
+ (keymap-parent map)
+ transient-popup-navigation-map)))
map))
(defun transient--make-predicate-map ()
(let ((map (make-sparse-keymap)))
(set-keymap-parent map transient-predicate-map)
+ (when (memq (oref transient--prefix transient-non-suffix)
+ '(nil transient--do-warn transient--do-noop))
+ (define-key map [handle-switch-frame] #'transient--do-suspend))
(dolist (obj transient--suffixes)
(let* ((cmd (oref obj command))
- (sub-prefix (and (symbolp cmd) (get cmd 'transient--prefix)))
+ (sub-prefix (and (symbolp cmd) (get cmd 'transient--prefix) t))
(sym (transient--suffix-symbol cmd)))
(cond
((oref obj inapt)
@@ -1631,13 +1728,14 @@ of the corresponding object.")
((slot-boundp obj 'transient)
(define-key map (vector sym)
(let ((do (oref obj transient)))
- (pcase do
- (`t (cond (sub-prefix #'transient--do-replace)
- ((cl-typep obj 'transient-infix)
- #'transient--do-stay)
- (t #'transient--do-call)))
- (`nil 'transient--do-exit)
- (_ do)))))
+ (pcase (list do sub-prefix)
+ ('(t t) #'transient--do-recurse)
+ ('(t nil) (if (cl-typep obj 'transient-infix)
+ #'transient--do-stay
+ #'transient--do-call))
+ ('(nil t) #'transient--do-replace)
+ ('(nil nil) #'transient--do-exit)
+ (_ do)))))
((not (lookup-key transient-predicate-map (vector sym)))
(define-key map (vector sym)
(if sub-prefix
@@ -1673,7 +1771,10 @@ of the corresponding object.")
(define-key topmap (vconcat transient--redisplay-key (list key))
#'transient-update)))
(if transient--redisplay-key
- (lookup-key transient--transient-map (vconcat transient--redisplay-key))
+ (let ((key (vconcat transient--redisplay-key)))
+ (or (lookup-key transient--transient-map key)
+ (and-let* ((regular (lookup-key local-function-key-map key)))
+ (lookup-key transient--transient-map (vconcat regular)))))
transient--transient-map))
topmap))
@@ -1690,8 +1791,6 @@ be nil and PARAMS may be (but usually is not) used to set e.g. the
This function is also called internally in which case LAYOUT and
EDIT may be non-nil."
(transient--debug 'setup)
- (when (> (minibuffer-depth) 0)
- (user-error "Cannot invoke transient %s while minibuffer is active" name))
(transient--with-emergency-exit
(cond
((not name)
@@ -1719,6 +1818,7 @@ EDIT may be non-nil."
(setq transient--redisplay-map (transient--make-redisplay-map))
(setq transient--original-window (selected-window))
(setq transient--original-buffer (current-buffer))
+ (setq transient--minibuffer-depth (minibuffer-depth))
(transient--redisplay)
(transient--init-transient)
(transient--suspend-which-key-mode)))
@@ -1744,6 +1844,7 @@ value. Otherwise return CHILDREN as is."
:level (or (alist-get t (alist-get name transient-levels))
transient-default-level)
params))))
+ (transient--setup-recursion obj)
(transient-init-value obj)
obj))
@@ -1757,13 +1858,13 @@ value. Otherwise return CHILDREN as is."
(defun transient--flatten-suffixes (layout)
(cl-labels ((s (def)
- (cond
- ((stringp def) nil)
- ((listp def) (cl-mapcan #'s def))
- ((transient-group--eieio-childp def)
- (cl-mapcan #'s (oref def suffixes)))
- ((transient-suffix--eieio-childp def)
- (list def)))))
+ (cond
+ ((stringp def) nil)
+ ((listp def) (cl-mapcan #'s def))
+ ((transient-group--eieio-childp def)
+ (cl-mapcan #'s (oref def suffixes)))
+ ((transient-suffix--eieio-childp def)
+ (list def)))))
(cl-mapcan #'s layout)))
(defun transient--init-child (levels spec)
@@ -1774,14 +1875,14 @@ value. Otherwise return CHILDREN as is."
(defun transient--init-group (levels spec)
(pcase-let ((`(,level ,class ,args ,children) (append spec nil)))
- (when (transient--use-level-p level)
- (let ((obj (apply class :level level args)))
- (when (transient--use-suffix-p obj)
- (when-let ((suffixes
- (cl-mapcan (lambda (c) (transient--init-child levels c))
- (transient-setup-children obj children))))
- (oset obj suffixes suffixes)
- (list obj)))))))
+ (when-let* ((- (transient--use-level-p level))
+ (obj (apply class :level level args))
+ (- (transient--use-suffix-p obj))
+ (suffixes (cl-mapcan (lambda (c) (transient--init-child levels c))
+ (transient-setup-children obj children))))
+ ;; Cannot use and-let* because of debbugs#31840.
+ (oset obj suffixes suffixes)
+ (list obj))))
(defun transient--init-suffix (levels spec)
(pcase-let* ((`(,level ,class ,args) spec)
@@ -1877,7 +1978,7 @@ value. Otherwise return CHILDREN as is."
(defun transient--suffix-predicate (spec)
(let ((plist (nth 2 spec)))
(seq-some (lambda (prop)
- (when-let ((pred (plist-get plist prop)))
+ (and-let* ((pred (plist-get plist prop)))
(list prop pred)))
'( :if :if-not
:if-nil :if-non-nil
@@ -1894,11 +1995,8 @@ value. Otherwise return CHILDREN as is."
(transient--debug 'init-transient)
(transient--push-keymap 'transient--transient-map)
(transient--push-keymap 'transient--redisplay-map)
- (add-hook 'pre-command-hook #'transient--pre-command)
- (add-hook 'minibuffer-setup-hook #'transient--minibuffer-setup)
- (add-hook 'minibuffer-exit-hook #'transient--minibuffer-exit)
- (add-hook 'post-command-hook #'transient--post-command)
- (advice-add 'abort-recursive-edit :after #'transient--minibuffer-exit)
+ (add-hook 'pre-command-hook #'transient--pre-command)
+ (add-hook 'post-command-hook #'transient--post-command)
(when transient--exitp
;; This prefix command was invoked as the suffix of another.
;; Prevent `transient--post-command' from removing the hooks
@@ -1907,46 +2005,62 @@ value. Otherwise return CHILDREN as is."
(defun transient--pre-command ()
(transient--debug 'pre-command)
- (cond
- ((memq this-command '(transient-update transient-quit-seq))
- (transient--pop-keymap 'transient--redisplay-map))
- ((and transient--helpp
- (not (memq this-command '(transient-quit-one
- transient-quit-all))))
+ (transient--with-emergency-exit
+ ;; The use of `overriding-terminal-local-map' does not prevent the
+ ;; lookup of command remappings in the overridden maps, which can
+ ;; lead to a suffix being remapped to a non-suffix. We have to undo
+ ;; the remapping in that case. However, remapping a non-suffix to
+ ;; another should remain possible.
+ (when (and (transient--get-predicate-for this-original-command 'suffix)
+ (not (transient--get-predicate-for this-command 'suffix)))
+ (setq this-command this-original-command))
(cond
- ((transient-help)
- (transient--do-suspend)
- (setq this-command 'transient-suspend)
- (transient--pre-exit))
- ((not (transient--edebug-command-p))
- (setq this-command 'transient-undefined))))
- ((and transient--editp
- (transient-suffix-object)
- (not (memq this-command '(transient-quit-one
- transient-quit-all
- transient-help))))
- (setq this-command 'transient-set-level))
- (t
- (setq transient--exitp nil)
- (when (eq (if-let ((fn (transient--get-predicate-for
- this-original-command)))
- (let ((action (funcall fn)))
- (when (eq action transient--exit)
- (setq transient--exitp (or transient--exitp t)))
- action)
- (if (let ((keys (this-command-keys-vector)))
- (eq (aref keys (1- (length keys))) ?\C-g))
- (setq this-command 'transient-noop)
- (unless (transient--edebug-command-p)
- (setq this-command 'transient-undefined)))
- transient--stay)
- transient--exit)
- (transient--pre-exit)))))
-
-(defun transient--get-predicate-for (cmd)
- (or (lookup-key transient--predicate-map
- (vector (transient--suffix-symbol cmd)))
- (oref transient--prefix transient-non-suffix)))
+ ((memq this-command '(transient-update transient-quit-seq))
+ (transient--pop-keymap 'transient--redisplay-map))
+ ((and transient--helpp
+ (not (memq this-command '(transient-quit-one
+ transient-quit-all))))
+ (cond
+ ((transient-help)
+ (transient--do-suspend)
+ (setq this-command 'transient-suspend)
+ (transient--pre-exit))
+ ((not (transient--edebug-command-p))
+ (setq this-command 'transient-undefined))))
+ ((and transient--editp
+ (transient-suffix-object)
+ (not (memq this-command '(transient-quit-one
+ transient-quit-all
+ transient-help))))
+ (setq this-command 'transient-set-level))
+ (t
+ (setq transient--exitp nil)
+ (when (eq (transient--do-pre-command) transient--exit)
+ (transient--pre-exit))))))
+
+(defun transient--do-pre-command ()
+ (if-let ((fn (transient--get-predicate-for this-command)))
+ (let ((action (funcall fn)))
+ (when (eq action transient--exit)
+ (setq transient--exitp (or transient--exitp t)))
+ action)
+ (if (let ((keys (this-command-keys-vector)))
+ (eq (aref keys (1- (length keys))) ?\C-g))
+ (setq this-command 'transient-noop)
+ (unless (transient--edebug-command-p)
+ (setq this-command 'transient-undefined)))
+ transient--stay))
+
+(defun transient--get-predicate-for (cmd &optional suffix-only)
+ (or (ignore-errors
+ (lookup-key transient--predicate-map
+ (vector (transient--suffix-symbol cmd))))
+ (and (not suffix-only)
+ (let ((pred (oref transient--prefix transient-non-suffix)))
+ (pcase pred
+ ('t #'transient--do-stay)
+ ('nil #'transient--do-warn)
+ (_ pred))))))
(defun transient--pre-exit ()
(transient--debug 'pre-exit)
@@ -1954,7 +2068,6 @@ value. Otherwise return CHILDREN as is."
(transient--timer-cancel)
(transient--pop-keymap 'transient--transient-map)
(transient--pop-keymap 'transient--redisplay-map)
- (remove-hook 'pre-command-hook #'transient--pre-command)
(unless transient--showp
(let ((message-log-max nil))
(message "")))
@@ -1962,7 +2075,6 @@ value. Otherwise return CHILDREN as is."
(setq transient--predicate-map nil)
(setq transient--redisplay-map nil)
(setq transient--redisplay-key nil)
- (setq transient--showp nil)
(setq transient--helpp nil)
(setq transient--editp nil)
(setq transient--prefix nil)
@@ -1974,12 +2086,17 @@ value. Otherwise return CHILDREN as is."
(defun transient--delete-window ()
(when (window-live-p transient--window)
- (let ((buf (window-buffer transient--window)))
+ (let ((remain-in-minibuffer-window
+ (and (minibuffer-selected-window)
+ (selected-window)))
+ (buf (window-buffer transient--window)))
;; Only delete the window if it never showed another buffer.
(unless (eq (car (window-parameter transient--window 'quit-restore)) 'other)
(with-demoted-errors "Error while exiting transient: %S"
(delete-window transient--window)))
- (kill-buffer buf))))
+ (kill-buffer buf)
+ (when remain-in-minibuffer-window
+ (select-window remain-in-minibuffer-window)))))
(defun transient--export ()
(setq transient-current-prefix transient--prefix)
@@ -1987,80 +2104,155 @@ value. Otherwise return CHILDREN as is."
(setq transient-current-suffixes transient--suffixes)
(transient--history-push transient--prefix))
-(defun transient--minibuffer-setup ()
- (transient--debug 'minibuffer-setup)
- (unless (> (minibuffer-depth) 1)
- (unless transient--exitp
- (transient--pop-keymap 'transient--transient-map)
- (transient--pop-keymap 'transient--redisplay-map)
- (remove-hook 'pre-command-hook #'transient--pre-command))
- (remove-hook 'post-command-hook #'transient--post-command)))
-
-(defun transient--minibuffer-exit ()
- (transient--debug 'minibuffer-exit)
- (unless (> (minibuffer-depth) 1)
- (unless transient--exitp
- (transient--push-keymap 'transient--transient-map)
- (transient--push-keymap 'transient--redisplay-map)
- (add-hook 'pre-command-hook #'transient--pre-command))
- (add-hook 'post-command-hook #'transient--post-command)))
-
-(defun transient--suspend-override (&optional minibuffer-hooks)
+(defun transient--suspend-override (&optional nohide)
(transient--debug 'suspend-override)
+ (transient--timer-cancel)
+ (cond ((and (not nohide) transient-hide-during-minibuffer-read)
+ (transient--delete-window))
+ ((and transient--prefix transient--redisplay-key)
+ (setq transient--redisplay-key nil)
+ (when transient--showp
+ (transient--show))))
(transient--pop-keymap 'transient--transient-map)
(transient--pop-keymap 'transient--redisplay-map)
(remove-hook 'pre-command-hook #'transient--pre-command)
- (remove-hook 'post-command-hook #'transient--post-command)
- (when minibuffer-hooks
- (remove-hook 'minibuffer-setup-hook #'transient--minibuffer-setup)
- (remove-hook 'minibuffer-exit-hook #'transient--minibuffer-exit)
- (advice-remove 'abort-recursive-edit #'transient--minibuffer-exit)))
+ (remove-hook 'post-command-hook #'transient--post-command))
-(defun transient--resume-override (&optional minibuffer-hooks)
+(defun transient--resume-override ()
(transient--debug 'resume-override)
+ (when (and transient--showp transient-hide-during-minibuffer-read)
+ (transient--show))
(transient--push-keymap 'transient--transient-map)
(transient--push-keymap 'transient--redisplay-map)
(add-hook 'pre-command-hook #'transient--pre-command)
- (add-hook 'post-command-hook #'transient--post-command)
- (when minibuffer-hooks
- (add-hook 'minibuffer-setup-hook #'transient--minibuffer-setup)
- (add-hook 'minibuffer-exit-hook #'transient--minibuffer-exit)
- (advice-add 'abort-recursive-edit :after #'transient--minibuffer-exit)))
+ (add-hook 'post-command-hook #'transient--post-command))
+
+(defmacro transient--with-suspended-override (&rest body)
+ (let ((depth (make-symbol "depth"))
+ (setup (make-symbol "setup"))
+ (exit (make-symbol "exit")))
+ `(if (and transient--transient-map
+ (memq transient--transient-map
+ overriding-terminal-local-map))
+ (let ((,depth (1+ (minibuffer-depth))) ,setup ,exit)
+ (setq ,setup
+ (lambda () "@transient--with-suspended-override"
+ (transient--debug 'minibuffer-setup)
+ (remove-hook 'minibuffer-setup-hook ,setup)
+ (transient--suspend-override)))
+ (setq ,exit
+ (lambda () "@transient--with-suspended-override"
+ (transient--debug 'minibuffer-exit)
+ (when (= (minibuffer-depth) ,depth)
+ (transient--resume-override))))
+ (unwind-protect
+ (progn
+ (add-hook 'minibuffer-setup-hook ,setup)
+ (add-hook 'minibuffer-exit-hook ,exit)
+ ,@body)
+ (remove-hook 'minibuffer-setup-hook ,setup)
+ (remove-hook 'minibuffer-exit-hook ,exit)))
+ ,@body)))
+
+(defun transient--post-command-hook ()
+ (run-hooks 'transient--post-command-hook))
+
+(add-hook 'post-command-hook #'transient--post-command-hook)
+
+(defun transient--delay-post-command (&optional abort-only)
+ (transient--debug 'delay-post-command)
+ (let ((depth (minibuffer-depth))
+ (command this-command)
+ (delayed (if transient--exitp
+ (apply-partially #'transient--post-exit this-command)
+ #'transient--resume-override))
+ post-command abort-minibuffer)
+ (unless abort-only
+ (setq post-command
+ (lambda () "@transient--delay-post-command"
+ (let ((act (and (not (eq (this-command-keys-vector) []))
+ (or (eq this-command command)
+ ;; `execute-extended-command' was
+ ;; used to call another command
+ ;; that also uses the minibuffer.
+ (equal
+ (string-to-multibyte (this-command-keys))
+ (format "\M-x%s\r" this-command))))))
+ (transient--debug 'post-command-hook "act: %s" act)
+ (when act
+ (remove-hook 'transient--post-command-hook post-command)
+ (remove-hook 'minibuffer-exit-hook abort-minibuffer)
+ (funcall delayed)))))
+ (add-hook 'transient--post-command-hook post-command))
+ (setq abort-minibuffer
+ (lambda () "@transient--delay-post-command"
+ (let ((act (and (or (memq this-command transient--abort-commands)
+ (equal (this-command-keys) ""))
+ (= (minibuffer-depth) depth))))
+ (transient--debug
+ 'abort-minibuffer
+ "mini: %s|%s, act %s" (minibuffer-depth) depth act)
+ (when act
+ (remove-hook 'transient--post-command-hook post-command)
+ (remove-hook 'minibuffer-exit-hook abort-minibuffer)
+ (funcall delayed)))))
+ (add-hook 'minibuffer-exit-hook abort-minibuffer)))
(defun transient--post-command ()
(transient--debug 'post-command)
- (unless this-command
- (transient--debug "-- force pre-exit from post-command")
- (message "Quit transient!")
- (transient--pre-exit)
- (setq transient--exitp t))
- (if transient--exitp
- (progn
- (unless (and (eq transient--exitp 'replace)
- (or transient--prefix
- ;; The current command could act as a prefix,
- ;; but decided not to call `transient-setup'.
- (prog1 nil (transient--stack-zap))))
- (remove-hook 'minibuffer-setup-hook #'transient--minibuffer-setup)
- (remove-hook 'minibuffer-exit-hook #'transient--minibuffer-exit)
- (advice-remove 'abort-recursive-edit #'transient--minibuffer-exit)
- (remove-hook 'post-command-hook #'transient--post-command))
- (setq transient-current-prefix nil)
- (setq transient-current-command nil)
- (setq transient-current-suffixes nil)
- (let ((resume (and transient--stack
- (not (memq transient--exitp '(replace suspend))))))
- (setq transient--exitp nil)
- (setq transient--helpp nil)
- (setq transient--editp nil)
- (run-hooks 'transient-exit-hook)
- (when resume
- (transient--stack-pop))))
- (transient--pop-keymap 'transient--redisplay-map)
- (setq transient--redisplay-map (transient--make-redisplay-map))
- (transient--push-keymap 'transient--redisplay-map)
- (unless (eq this-command (oref transient--prefix command))
- (transient--redisplay))))
+ (transient--with-emergency-exit
+ (cond
+ ((and (eq (this-command-keys-vector) [])
+ (= (minibuffer-depth)
+ (1+ transient--minibuffer-depth)))
+ (transient--suspend-override)
+ (transient--delay-post-command (eq transient--exitp 'replace)))
+ (transient--exitp
+ (transient--post-exit))
+ ((eq this-command (oref transient--prefix command)))
+ (t
+ (let ((old transient--redisplay-map)
+ (new (transient--make-redisplay-map)))
+ (unless (equal old new)
+ (transient--pop-keymap 'transient--redisplay-map)
+ (setq transient--redisplay-map new)
+ (transient--push-keymap 'transient--redisplay-map)))
+ (transient--redisplay)))))
+
+(defun transient--post-exit (&optional command)
+ (transient--debug 'post-exit)
+ (unless (and (eq transient--exitp 'replace)
+ (or transient--prefix
+ ;; The current command could act as a prefix,
+ ;; but decided not to call `transient-setup',
+ ;; or it is prevented from doing so because it
+ ;; uses the minibuffer and the user aborted
+ ;; that.
+ (prog1 nil
+ (if (let ((obj (transient-suffix-object command)))
+ (and (slot-boundp obj 'transient)
+ (oref obj transient)))
+ ;; This sub-prefix is a transient suffix;
+ ;; go back to outer prefix, by calling
+ ;; `transient--stack-pop' further down.
+ (setq transient--exitp nil)
+ (transient--stack-zap)))))
+ (remove-hook 'pre-command-hook #'transient--pre-command)
+ (remove-hook 'post-command-hook #'transient--post-command))
+ (setq transient-current-prefix nil)
+ (setq transient-current-command nil)
+ (setq transient-current-suffixes nil)
+ (let ((resume (and transient--stack
+ (not (memq transient--exitp '(replace suspend))))))
+ (unless (or resume (eq transient--exitp 'replace))
+ (setq transient--showp nil))
+ (setq transient--exitp nil)
+ (setq transient--helpp nil)
+ (setq transient--editp nil)
+ (setq transient--minibuffer-depth 0)
+ (run-hooks 'transient-exit-hook)
+ (when resume
+ (transient--stack-pop))))
(defun transient--stack-push ()
(transient--debug 'stack-push)
@@ -2082,7 +2274,14 @@ value. Otherwise return CHILDREN as is."
(defun transient--redisplay ()
(if (or (eq transient-show-popup t)
transient--showp)
- (unless (memq this-command transient--scroll-commands)
+ (unless
+ (or (memq this-command transient--scroll-commands)
+ (and (or (memq this-command '(mouse-drag-region
+ mouse-set-region))
+ (equal (key-description (this-command-keys-vector))
+ "<mouse-movement>"))
+ (and (eq (current-buffer)
+ (get-buffer transient--buffer-name)))))
(transient--show))
(when (and (numberp transient-show-popup)
(not (zerop transient-show-popup))
@@ -2106,14 +2305,22 @@ value. Otherwise return CHILDREN as is."
(defun transient--debug (arg &rest args)
(when transient--debug
- (if (symbolp arg)
- (message "-- %-16s (cmd: %s, event: %S, exit: %s)"
- arg
- (or (transient--suffix-symbol this-command)
- (list this-command this-original-command last-command))
- (key-description (this-command-keys-vector))
- transient--exitp)
- (apply #'message arg args))))
+ (let ((inhibit-message (not (eq transient--debug 'message))))
+ (if (symbolp arg)
+ (message "-- %-18s (cmd: %s, event: %S, exit: %s%s)"
+ arg
+ (or (ignore-errors (transient--suffix-symbol this-command))
+ (if (byte-code-function-p this-command)
+ "#[...]"
+ this-command))
+ (key-description (this-command-keys-vector))
+ transient--exitp
+ (cond ((stringp (car args))
+ (concat ", " (apply #'format args)))
+ (args
+ (concat ", " (apply (car args) (cdr args))))
+ (t "")))
+ (apply #'message arg args)))))
(defun transient--emergency-exit ()
"Exit the current transient command after an error occurred.
@@ -2124,7 +2331,7 @@ nil) then do nothing."
(setq transient--stack nil)
(setq transient--exitp t)
(transient--pre-exit)
- (transient--post-command)))
+ (transient--post-exit)))
;;; Pre-Commands
@@ -2152,12 +2359,49 @@ nil) then do nothing."
(transient--export)
transient--stay)
+(defun transient--do-return ()
+ "Call the command after exporting variables and return to parent prefix.
+If there is no parent prefix, then behave like `transient--do-exit'."
+ (if (not transient--stack)
+ (transient--do-exit)
+ (transient--export)
+ transient--exit))
+
(defun transient--do-exit ()
"Call the command after exporting variables and exit the transient."
(transient--export)
(transient--stack-zap)
transient--exit)
+(defun transient--do-push-button ()
+ "Call the command represented by the activated button.
+Use that command's pre-command to determine transient behavior."
+ (if (and (mouse-event-p last-command-event)
+ (not (eq (posn-window (event-start last-command-event))
+ transient--window)))
+ transient--stay
+ (setq this-command
+ (with-selected-window transient--window
+ (get-text-property (if (mouse-event-p last-command-event)
+ (posn-point (event-start last-command-event))
+ (point))
+ 'command)))
+ (transient--do-pre-command)))
+
+(defun transient--do-recurse ()
+ "Call the transient prefix command, preparing for return to active transient.
+If there is no parent prefix, then just call the command."
+ (transient--do-replace))
+
+(defun transient--setup-recursion (prefix-obj)
+ (when transient--stack
+ (let ((command (oref prefix-obj command)))
+ (when-let ((suffix-obj (transient-suffix-object command)))
+ (when (and (slot-boundp suffix-obj 'transient)
+ (memq (oref suffix-obj transient)
+ (list t #'transient--do-recurse)))
+ (oset prefix-obj transient-suffix 'transient--do-return))))))
+
(defun transient--do-replace ()
"Call the transient prefix command, replacing the active transient."
(transient--export)
@@ -2195,17 +2439,28 @@ to `transient--do-warn'."
(setq this-command 'transient-popup-navigation-help))
transient--stay)
+(defun transient--do-minus ()
+ "Call `negative-argument' or pivot to `transient-update'.
+If `negative-argument' is invoked using \"-\" then preserve the
+prefix argument and pivot to `transient-update'."
+ (when (equal (this-command-keys) "-")
+ (setq this-command 'transient-update))
+ transient--stay)
+
(put 'transient--do-stay 'transient-color 'transient-red)
(put 'transient--do-noop 'transient-color 'transient-red)
(put 'transient--do-warn 'transient-color 'transient-red)
(put 'transient--do-warn-inapt 'transient-color 'transient-red)
(put 'transient--do-call 'transient-color 'transient-red)
+(put 'transient--do-return 'transient-color 'transient-purple)
(put 'transient--do-exit 'transient-color 'transient-blue)
+(put 'transient--do-recurse 'transient-color 'transient-red)
(put 'transient--do-replace 'transient-color 'transient-blue)
(put 'transient--do-suspend 'transient-color 'transient-blue)
(put 'transient--do-quit-one 'transient-color 'transient-blue)
(put 'transient--do-quit-all 'transient-color 'transient-blue)
(put 'transient--do-move 'transient-color 'transient-red)
+(put 'transient--do-minus 'transient-color 'transient-red)
;;; Commands
@@ -2231,6 +2486,8 @@ to `transient--do-warn'."
'face 'font-lock-warning-face)
(propertize "C-g" 'face 'transient-key)
(propertize "?" 'face 'transient-key)
+ ;; `this-command' is `transient--undefined' or similar at this
+ ;; point. Show the command the user actually tried to invoke.
(propertize (symbol-name (transient--suffix-symbol
this-original-command))
'face 'font-lock-warning-face))
@@ -2271,7 +2528,9 @@ transient is active."
(defun transient-update ()
"Redraw the transient's state in the popup buffer."
- (interactive))
+ (interactive)
+ (when (equal this-original-command 'negative-argument)
+ (setq prefix-arg current-prefix-arg)))
(defun transient-show ()
"Show the transient's state in the popup buffer."
@@ -2336,7 +2595,8 @@ transient is active."
(oset (transient-suffix-object command) level level))
(setf (alist-get sym alist) level)
(setf (alist-get prefix transient-levels) alist))
- (transient-save-levels))
+ (transient-save-levels)
+ (transient--show))
(t
(transient-undefined))))
@@ -2350,6 +2610,11 @@ transient is active."
(interactive)
(transient-save-value (or transient--prefix transient-current-prefix)))
+(defun transient-reset ()
+ "Clear the set and saved values of the active transient."
+ (interactive)
+ (transient-reset-value (or transient--prefix transient-current-prefix)))
+
(defun transient-history-next ()
"Switch to the next value used for the active transient."
(interactive)
@@ -2391,6 +2656,10 @@ around `scroll-down-command' (which see)."
(with-selected-window transient--window
(scroll-down-command arg)))
+(defun transient-push-button ()
+ "Invoke the suffix command represented by this button."
+ (interactive))
+
(defun transient-resume ()
"Resume a previously suspended stack of transients."
(interactive)
@@ -2460,12 +2729,7 @@ Otherwise call the primary method according to object's class."
(oset obj value
(if-let ((saved (assq (oref obj command) transient-values)))
(cdr saved)
- (if-let ((default (and (slot-boundp obj 'default-value)
- (oref obj default-value))))
- (if (functionp default)
- (funcall default)
- default)
- nil)))))
+ (transient-default-value obj)))))
(cl-defmethod transient-init-value ((obj transient-argument))
(oset obj value
@@ -2473,6 +2737,7 @@ Otherwise call the primary method according to object's class."
(argument (and (slot-boundp obj 'argument)
(oref obj argument)))
(multi-value (oref obj multi-value))
+ (case-fold-search nil)
(regexp (if (slot-exists-p obj 'argument-regexp)
(oref obj argument-regexp)
(format "\\`%s\\(.*\\)" (oref obj argument)))))
@@ -2491,6 +2756,20 @@ Otherwise call the primary method according to object's class."
(car (member (oref obj argument)
(oref transient--prefix value)))))
+;;;; Default
+
+(cl-defgeneric transient-default-value (_)
+ "Return the default value."
+ nil)
+
+(cl-defmethod transient-default-value ((obj transient-prefix))
+ (if-let ((default (and (slot-boundp obj 'default-value)
+ (oref obj default-value))))
+ (if (functionp default)
+ (funcall default)
+ default)
+ nil))
+
;;;; Read
(cl-defgeneric transient-infix-read (obj)
@@ -2511,13 +2790,24 @@ on the previous value.")
(cl-defmethod transient-infix-read :around ((obj transient-infix))
"Highlight the infix in the popup buffer.
-Also arrange for the transient to be exited in case of an error
-because otherwise Emacs would get stuck in an inconsistent state,
-which might make it necessary to kill it from the outside."
+This also wraps the call to `cl-call-next-method' with two
+macros.
+
+`transient--with-suspended-override' is necessary to allow
+reading user input using the minibuffer.
+
+`transient--with-emergency-exit' arranges for the transient to
+be exited in case of an error because otherwise Emacs would get
+stuck in an inconsistent state, which might make it necessary to
+kill it from the outside.
+
+If you replace this method, then you must make sure to always use
+the latter macro and most likely also the former."
(let ((transient--active-infix obj))
(transient--show))
(transient--with-emergency-exit
- (cl-call-next-method obj)))
+ (transient--with-suspended-override
+ (cl-call-next-method obj))))
(cl-defmethod transient-infix-read ((obj transient-infix))
"Read a value while taking care of history.
@@ -2541,7 +2831,7 @@ it\", in which case it is pointless to preserve history.)"
(not always-read)
transient--prefix)
(oset obj value nil)
- (let* ((overriding-terminal-local-map nil)
+ (let* ((enable-recursive-minibuffers t)
(reader (oref obj reader))
(prompt (transient-prompt obj))
(value (if multi-value (mapconcat #'identity value ",") value))
@@ -2677,11 +2967,11 @@ prompt."
(if (stringp prompt)
prompt
"(BUG: no prompt): "))
- (or (when-let ((arg (and (slot-boundp obj 'argument) (oref obj argument))))
+ (or (and-let* ((arg (and (slot-boundp obj 'argument) (oref obj argument))))
(if (and (stringp arg) (string-suffix-p "=" arg))
arg
(concat arg ": ")))
- (when-let ((var (and (slot-boundp obj 'variable) (oref obj variable))))
+ (and-let* ((var (and (slot-boundp obj 'variable) (oref obj variable))))
(and (stringp var)
(concat var ": ")))
"(BUG: no prompt): ")))
@@ -2719,12 +3009,18 @@ prompt."
(transient-infix-set obj nil)))))
(cl-call-next-method obj value))))
+(cl-defgeneric transient-set-value (obj)
+ "Set the value of the transient prefix OBJ.")
+
(cl-defmethod transient-set-value ((obj transient-prefix))
(oset (oref obj prototype) value (transient-get-value))
(transient--history-push obj))
;;;; Save
+(cl-defgeneric transient-save-value (obj)
+ "Save the value of the transient prefix OBJ.")
+
(cl-defmethod transient-save-value ((obj transient-prefix))
(let ((value (transient-get-value)))
(oset (oref obj prototype) value value)
@@ -2732,6 +3028,20 @@ prompt."
(transient-save-values))
(transient--history-push obj))
+;;;; Reset
+
+(cl-defgeneric transient-reset-value (obj)
+ "Clear the set and saved values of the transient prefix OBJ.")
+
+(cl-defmethod transient-reset-value ((obj transient-prefix))
+ (let ((value (transient-default-value obj)))
+ (oset obj value value)
+ (oset (oref obj prototype) value value)
+ (setf (alist-get (oref obj command) transient-values nil 'remove) nil)
+ (transient-save-values))
+ (transient--history-push obj)
+ (mapc #'transient-init-value transient--suffixes))
+
;;;; Get
(defun transient-args (prefix)
@@ -2759,7 +3069,7 @@ the set, saved or default value for PREFIX."
transient-current-suffixes)))
(defun transient--get-wrapped-value (obj)
- (when-let ((value (transient-infix-value obj)))
+ (and-let* ((value (transient-infix-value obj)))
(cl-ecase (and (slot-exists-p obj 'multi-value)
(oref obj multi-value))
((nil) (list value))
@@ -2797,7 +3107,7 @@ does nothing." nil)
(cl-defmethod transient-infix-value ((obj transient-option))
"Return ARGUMENT and VALUE as a unit or nil if the latter is nil."
- (when-let ((value (oref obj value)))
+ (and-let* ((value (oref obj value)))
(let ((arg (oref obj argument)))
(cl-ecase (oref obj multi-value)
((nil) (concat arg value))
@@ -2820,9 +3130,10 @@ contribute to the value of the transient."
For a switch return a boolean. For an option return the value as
a string, using the empty string for the empty value, or nil if
the option does not appear in ARGS."
- (if (string-match-p "=\\'" arg)
+ (if (string-suffix-p "=" arg)
(save-match-data
- (when-let ((match (let ((re (format "\\`%s\\(?:=\\(.+\\)\\)?\\'"
+ (and-let* ((match (let ((case-fold-search nil)
+ (re (format "\\`%s\\(?:=\\(.+\\)\\)?\\'"
(substring arg 0 -1))))
(cl-find-if (lambda (a)
(and (stringp a)
@@ -2905,6 +3216,7 @@ have a history of their own.")
(setq window-size-fixed t)
(when (bound-and-true-p tab-line-format)
(setq tab-line-format nil))
+ (setq header-line-format nil)
(setq mode-line-format (if (eq transient-mode-line-format 'line)
nil
transient-mode-line-format))
@@ -2938,9 +3250,9 @@ have a history of their own.")
(goto-char (point-min))
(when transient-enable-popup-navigation
(transient--goto-button focus))
- (magit--fit-window-to-buffer transient--window)))))
+ (transient--fit-window-to-buffer transient--window)))))
-(defun magit--fit-window-to-buffer (window)
+(defun transient--fit-window-to-buffer (window)
(let ((window-resize-pixelwise t)
(window-size-fixed nil))
(if (eq (car (window-parameter window 'quit-restore)) 'other)
@@ -2962,13 +3274,18 @@ have a history of their own.")
(when groups
(insert ?\n)))))
+(defvar transient--max-group-level 1)
+
(cl-defgeneric transient--insert-group (group)
"Format GROUP and its elements and insert the result.")
-(cl-defmethod transient--insert-group :before ((group transient-group))
+(cl-defmethod transient--insert-group :around ((group transient-group))
"Insert GROUP's description, if any."
(when-let ((desc (transient-format-description group)))
- (insert desc ?\n)))
+ (insert desc ?\n))
+ (let ((transient--max-group-level
+ (max (oref group level) transient--max-group-level)))
+ (cl-call-next-method group)))
(cl-defmethod transient--insert-group ((group transient-row))
(transient--maybe-pad-keys group)
@@ -2993,9 +3310,10 @@ have a history of their own.")
(let ((rows (mapcar #'transient-format (oref column suffixes))))
(when-let ((desc (transient-format-description column)))
(push desc rows))
- rows))
+ (flatten-tree rows)))
(oref group suffixes)))
- (vp (oref transient--prefix variable-pitch))
+ (vp (or (oref transient--prefix variable-pitch)
+ transient-align-variable-pitch))
(rs (apply #'max (mapcar #'length columns)))
(cs (length columns))
(cw (mapcar (lambda (col)
@@ -3095,7 +3413,7 @@ Optional support for popup buttons is also implemented here."
(add-face-text-property 0 (length str) 'transient-inapt-suffix nil str))
(if transient-enable-popup-navigation
(make-text-button str nil
- 'type 'transient-button
+ 'type 'transient
'command (transient--suffix-command obj))
str)))
@@ -3128,27 +3446,33 @@ Optional support for popup buttons is also implemented here."
(let ((len (length transient--redisplay-key))
(seq (cl-coerce (edmacro-parse-keys key t) 'list)))
(cond
- ((equal (seq-take seq len) transient--redisplay-key)
+ ((member (seq-take seq len)
+ (list transient--redisplay-key
+ (thread-last transient--redisplay-key
+ (cl-substitute ?- 'kp-subtract)
+ (cl-substitute ?= 'kp-equal)
+ (cl-substitute ?+ 'kp-add))))
(let ((pre (key-description (vconcat (seq-take seq len))))
(suf (key-description (vconcat (seq-drop seq len)))))
- (setq pre (replace-regexp-in-string "RET" "C-m" pre t))
- (setq pre (replace-regexp-in-string "TAB" "C-i" pre t))
- (setq suf (replace-regexp-in-string "RET" "C-m" suf t))
- (setq suf (replace-regexp-in-string "TAB" "C-i" suf t))
+ (setq pre (string-replace "RET" "C-m" pre))
+ (setq pre (string-replace "TAB" "C-i" pre))
+ (setq suf (string-replace "RET" "C-m" suf))
+ (setq suf (string-replace "TAB" "C-i" suf))
;; We use e.g. "-k" instead of the more correct "- k",
;; because the former is prettier. If we did that in
;; the definition, then we want to drop the space that
;; is reinserted above. False-positives are possible
;; for silly bindings like "-C-c C-c".
- (unless (string-match-p " " key)
- (setq pre (replace-regexp-in-string " " "" pre))
- (setq suf (replace-regexp-in-string " " "" suf)))
- (concat (propertize pre 'face 'default)
+ (unless (string-search " " key)
+ (setq pre (string-replace " " "" pre))
+ (setq suf (string-replace " " "" suf)))
+ (concat (propertize pre 'face 'transient-unreachable-key)
(and (string-prefix-p (concat pre " ") key) " ")
(transient--colorize-key suf cmd)
(save-excursion
- (when (string-match " +\\'" key)
- (match-string 0 key))))))
+ (and (string-match " +\\'" key)
+ (propertize (match-string 0 key)
+ 'face 'fixed-pitch))))))
((transient--lookup-key transient-sticky-map (kbd key))
(transient--colorize-key key cmd))
(t
@@ -3179,7 +3503,7 @@ Optional support for popup buttons is also implemented here."
"The `description' slot may be a function, in which case that is
called inside the correct buffer (see `transient-insert-group')
and its value is returned to the caller."
- (when-let ((desc (oref obj description)))
+ (and-let* ((desc (oref obj description)))
(if (functionp desc)
(with-current-buffer transient--original-buffer
(funcall desc))
@@ -3189,7 +3513,7 @@ and its value is returned to the caller."
"Format the description by calling the next method. If the result
doesn't use the `face' property at all, then apply the face
`transient-heading' to the complete string."
- (when-let ((desc (cl-call-next-method obj)))
+ (and-let* ((desc (cl-call-next-method obj)))
(if (text-property-not-all 0 (length desc) 'face nil desc)
desc
(propertize desc 'face 'transient-heading))))
@@ -3207,7 +3531,8 @@ If the OBJ's `key' is currently unreachable, then apply the face
(cond ((transient--key-unreachable-p obj)
(propertize desc 'face 'transient-unreachable))
((and transient-highlight-higher-levels
- (> (oref obj level) transient--default-prefix-level))
+ (> (max (oref obj level) transient--max-group-level)
+ transient--default-prefix-level))
(add-face-text-property
0 (length desc) 'transient-higher-level nil desc)
desc)
@@ -3343,9 +3668,24 @@ manpage, then try to jump to the correct location."
(transient--describe-function cmd))
(defun transient--describe-function (fn)
- (describe-function fn)
+ (describe-function (if (symbolp fn) fn 'transient--anonymous-infix-argument))
(select-window (get-buffer-window (help-buffer))))
+(defun transient--anonymous-infix-argument ()
+ "Cannot show any documentation for this anonymous infix command.
+
+The infix command in question was defined anonymously, i.e.,
+it was define when the prefix command that it belongs to was
+defined, which means that it gets no docstring and also that
+no symbol is bound to it.
+
+When you request help for an infix command, then we usually
+show the respective man-page and jump to the location where
+the respective argument is being described.
+
+Because the containing prefix command does not specify any
+man-page, we cannot do that in this case. Sorry about that.")
+
(defun transient--show-manual (manual)
(info manual))
@@ -3453,8 +3793,14 @@ resumes the suspended transient.")
(define-minor-mode transient-resume-mode
"Auxiliary minor-mode used to resume a transient after viewing help.")
-;;; Compatibility
-;;;; Popup Navigation
+(defun transient-toggle-debug ()
+ "Toggle debugging statements for transient commands."
+ (interactive)
+ (setq transient--debug (not transient--debug))
+ (message "Debugging transient %s"
+ (if transient--debug "enabled" "disabled")))
+
+;;; Popup Navigation
(defun transient-popup-navigation-help ()
"Inform the user how to enable popup navigation commands."
@@ -3462,39 +3808,9 @@ resumes the suspended transient.")
(message "This command is only available if `%s' is non-nil"
'transient-enable-popup-navigation))
-(define-button-type 'transient-button
+(define-button-type 'transient
'face nil
- 'action (lambda (button)
- (let ((command (button-get button 'command)))
- ;; Yes, I know that this is wrong(tm).
- ;; Unfortunately it is also necessary.
- (setq this-original-command command)
- (transient--pre-command)
- (call-interactively command))))
-
-(defvar transient-popup-navigation-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "<down-mouse-1>") #'transient-noop)
- (define-key map (kbd "<mouse-1>") #'transient-mouse-push-button)
- (define-key map (kbd "RET") #'transient-push-button)
- (define-key map (kbd "<up>") #'transient-backward-button)
- (define-key map (kbd "C-p") #'transient-backward-button)
- (define-key map (kbd "<down>") #'transient-forward-button)
- (define-key map (kbd "C-n") #'transient-forward-button)
- (define-key map (kbd "C-r") #'transient-isearch-backward)
- (define-key map (kbd "C-s") #'transient-isearch-forward)
- map))
-
-(defun transient-mouse-push-button (&optional pos)
- "Invoke the suffix the user clicks on."
- (interactive (list last-command-event))
- (push-button pos))
-
-(defun transient-push-button ()
- "Invoke the selected suffix command."
- (interactive)
- (with-selected-window transient--window
- (push-button)))
+ 'keymap transient-button-map)
(defun transient-backward-button (n)
"Move to the previous button in the transient popup buffer.
@@ -3529,6 +3845,7 @@ See `forward-button' for information about N."
beg (next-single-property-change
beg 'face nil (line-end-position))))))
+;;; Compatibility
;;;; Popup Isearch
(defvar transient--isearch-mode-map
@@ -3577,7 +3894,7 @@ search instead."
(defun transient--isearch-setup ()
(select-window transient--window)
- (transient--suspend-override))
+ (transient--suspend-override t))
(defun transient--isearch-exit ()
(select-window transient--original-window)
@@ -3606,11 +3923,12 @@ search instead."
'transient-red
'transient-blue))))
(pcase (list suffix nonsuf)
- (`(transient-red disallow) 'transient-amaranth)
- (`(transient-blue disallow) 'transient-teal)
- (`(transient-red transient-red) 'transient-pink)
- (`(transient-red transient-blue) 'transient-red)
- (`(transient-blue transient-blue) 'transient-blue))))
+ (`(transient-purple ,_) 'transient-purple)
+ ('(transient-red disallow) 'transient-amaranth)
+ ('(transient-blue disallow) 'transient-teal)
+ ('(transient-red transient-red) 'transient-pink)
+ ('(transient-red transient-blue) 'transient-red)
+ ('(transient-blue transient-blue) 'transient-blue))))
;;;; Edebug
@@ -3620,7 +3938,7 @@ search instead."
(funcall fn arg-mode)
(transient--suspend-override t)
(funcall fn arg-mode)
- (transient--resume-override t)))
+ (transient--resume-override)))
(advice-add 'edebug--recursive-edit :around #'transient--edebug--recursive-edit)
@@ -3638,6 +3956,18 @@ search instead."
;;;; Miscellaneous
+(cl-pushnew (list nil (concat "^\\s-*("
+ (eval-when-compile
+ (regexp-opt
+ '("transient-define-prefix"
+ "transient-define-suffix"
+ "transient-define-infix"
+ "transient-define-argument")
+ t))
+ "\\s-+\\(" lisp-mode-symbol-regexp "\\)")
+ 2)
+ lisp-imenu-generic-expression :test #'equal)
+
(declare-function which-key-mode "which-key" (&optional arg))
(defun transient--suspend-which-key-mode ()
@@ -3740,7 +4070,7 @@ we stop there."
(oset obj value value)))
(cl-defmethod transient-format-description ((obj transient-lisp-variable))
- (or (oref obj description)
+ (or (cl-call-next-method obj)
(symbol-name (oref obj variable))))
(cl-defmethod transient-format-value ((obj transient-lisp-variable))
diff --git a/lisp/type-break.el b/lisp/type-break.el
index dca5a43b893..bb6382cfe9e 100644
--- a/lisp/type-break.el
+++ b/lisp/type-break.el
@@ -46,11 +46,6 @@
;; in the mode line instead, do M-x type-break-mode-line-message-mode
;; or set the variable of the same name to t.
-;; This program can truly cons up a storm because of all the calls to
-;; `current-time' (which always returns fresh conses). I'm dismayed by
-;; this, but I think the health of my hands is far more important than a
-;; few pages of virtual memory.
-
;; This package was inspired by Roland McGrath's hanoi-break.el.
;; Several people contributed feedback and ideas, including
;; Roland McGrath <roland@gnu.org>
@@ -263,7 +258,7 @@ It will be either \"seconds\" or \"keystrokes\".")
(defvar type-break-keystroke-count 0)
(defvar type-break-time-last-break nil)
(defvar type-break-time-next-break nil)
-(defvar type-break-time-last-command (current-time))
+(defvar type-break-time-last-command (time-convert nil 'integer))
(defvar type-break-current-time-warning-interval nil)
(defvar type-break-current-keystroke-warning-interval nil)
(defvar type-break-time-warning-count 0)
@@ -362,7 +357,7 @@ problems."
(setq type-break-time-last-break
(or (type-break-get-previous-time)
- (current-time)))
+ (time-convert nil 'integer)))
;; Schedule according to break time from session file.
(type-break-schedule
@@ -381,7 +376,7 @@ problems."
(setq type-break-interval-start type-break-time-last-break)
(- type-break-interval diff))
;; Schedule from now.
- (setq type-break-interval-start (current-time))
+ (setq type-break-interval-start (time-convert nil 'integer))
(type-break-file-time type-break-interval-start)
type-break-interval))
type-break-interval-start
@@ -456,7 +451,7 @@ the variable of the same name."
;; file saving is left to auto-save
))))))
-(defun timep (time)
+(defun type-break-timep (time)
"If TIME is a Lisp time value then return TIME, else return nil."
(condition-case nil
(and (float-time time) time)
@@ -480,7 +475,7 @@ the variable of the same name."
Return nil if the file is missing or if the time is not a Lisp time value."
(let ((file (type-break-choose-file)))
(if file
- (timep ;; returns expected format, else nil
+ (type-break-timep ;; returns expected format, else nil
(with-current-buffer (find-file-noselect file 'nowarn)
(condition-case nil
(save-excursion
@@ -525,7 +520,7 @@ as per the function `type-break-schedule'."
;; remove any query scheduled during interactive invocation
(remove-hook 'type-break-post-command-hook 'type-break-do-query)
(let ((continue t)
- (start-time (current-time)))
+ (start-time (time-convert nil 'integer)))
(setq type-break-time-last-break start-time)
(while continue
(save-window-excursion
@@ -676,9 +671,9 @@ keystroke threshold has been exceeded."
(progn
(type-break-keystroke-reset)
(type-break-mode-line-countdown-or-break nil)
- (setq type-break-time-last-break (current-time))
+ (setq type-break-time-last-break (time-convert nil 'integer))
(type-break-schedule)))
- (setq type-break-time-last-command (current-time))))
+ (setq type-break-time-last-command (time-convert nil 'integer))))
(and type-break-keystroke-threshold
(let ((keys (this-command-keys)))
@@ -943,14 +938,13 @@ FRAC should be the inverse of the fractional value; for example, a value of
;;; misc functions
-;; Compute the difference, in seconds, between a and b, two structures
-;; similar to those returned by `current-time'.
+;; Compute the difference, in seconds, between a and b, two time values.
(defun type-break-time-difference (a b)
(round (float-time (time-subtract b a))))
;; Return a time value that is the sum of the time-value arguments.
(defun type-break-time-sum (&rest tmlist)
- (let ((sum '(0 0)))
+ (let ((sum 0))
(dolist (tem tmlist)
(setq sum (time-add sum tem)))
sum))
@@ -967,7 +961,7 @@ FRAC should be the inverse of the fractional value; for example, a value of
(t (format "%d seconds" secs)))))
(defun type-break-keystroke-reset ()
- (setq type-break-interval-start (current-time)) ; not a keystroke
+ (setq type-break-interval-start (time-convert nil 'integer))
(setq type-break-keystroke-count 0)
(setq type-break-keystroke-warning-count 0)
(setq type-break-current-keystroke-warning-interval
@@ -1149,6 +1143,8 @@ With optional non-nil ALL, force redisplay of all mode-lines."
(and (get-buffer buffer-name)
(kill-buffer buffer-name))))))
+(define-obsolete-function-alias 'timep 'type-break-timep "29.1")
+
(provide 'type-break)
diff --git a/lisp/uniquify.el b/lisp/uniquify.el
index 0b7db9b54fb..74655e299a8 100644
--- a/lisp/uniquify.el
+++ b/lisp/uniquify.el
@@ -109,8 +109,8 @@ BASE and EXTRA-STRINGS where BASE is a string and EXTRA-STRINGS
is a list of strings. For example the current implementation for
post-forward-angle-brackets could be:
-(defun my-post-forward-angle-brackets (base extra-string)
- (concat base \"<\" (mapconcat #'identity extra-string \"/\") \">\"))
+ (defun my-post-forward-angle-brackets (base extra-string)
+ (concat base \"<\" (mapconcat #\\='identity extra-string \"/\") \">\"))
The \"mumble\" part may be stripped as well, depending on the
setting of `uniquify-strip-common-suffix'. For more options that
diff --git a/lisp/url/url-file.el b/lisp/url/url-file.el
index 3863ac99144..a72b2e67a6a 100644
--- a/lisp/url/url-file.el
+++ b/lisp/url/url-file.el
@@ -26,7 +26,6 @@
(require 'mailcap)
(require 'url-vars)
(require 'url-parse)
-(require 'url-dired)
(declare-function mm-disable-multibyte "mm-util" ())
(defvar url-allow-non-local-files nil
@@ -42,10 +41,10 @@ src=\"/ssh:host...\"> element, which can be disturbing.")
(defun url-file-find-possibly-compressed-file (fname &rest _)
"Find the exact file referenced by `fname'.
This tries the common compression extensions, because things like
-ange-ftp and efs are not quite smart enough to realize when a server
-can do automatic decompression for them, and won't find `foo' if
-`foo.gz' exists, even though the FTP server would happily serve it up
-to them."
+ange-ftp is not quite smart enough to realize when a server can
+do automatic decompression for them, and won't find `foo' if
+`foo.gz' exists, even though the FTP server would happily serve
+it up to them."
(let ((scratch nil)
(compressed-extensions '("" ".gz" ".z" ".Z" ".bz2" ".xz"))
(found nil))
@@ -174,7 +173,7 @@ to them."
(if (file-directory-p filename)
;; A directory is done the same whether we are local or remote
- (url-find-file-dired filename)
+ (find-file filename)
(with-current-buffer
(setq buffer (generate-new-buffer " *url-file*"))
(require 'mm-util)
diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el
index 3d7d8779795..94ef156108c 100644
--- a/lisp/url/url-http.el
+++ b/lisp/url/url-http.el
@@ -471,9 +471,7 @@ Return the number of characters removed."
t ;; Instruct caller to signal an error. Bug#50511
;; Find strongest supported auth.
(dolist (this-auth auths)
- (setq this-auth (url-eat-trailing-space
- (url-strip-leading-spaces
- this-auth)))
+ (setq this-auth (string-trim this-auth))
(let* ((this-type
(downcase (if (string-match "[ \t]" this-auth)
(substring this-auth 0 (match-beginning 0))
@@ -1048,19 +1046,15 @@ More sophisticated percentage downloaded, etc.
Also does minimal parsing of HTTP headers and will actually cause
the callback to be triggered."
(if url-http-content-type
- (url-display-percentage
+ (url-display-message
"Reading [%s]... %s of %s (%d%%)"
- (url-percentage (- nd url-http-end-of-headers)
- url-http-content-length)
url-http-content-type
(funcall byte-count-to-string-function (- nd url-http-end-of-headers))
(funcall byte-count-to-string-function url-http-content-length)
(url-percentage (- nd url-http-end-of-headers)
url-http-content-length))
- (url-display-percentage
+ (url-display-message
"Reading... %s of %s (%d%%)"
- (url-percentage (- nd url-http-end-of-headers)
- url-http-content-length)
(funcall byte-count-to-string-function (- nd url-http-end-of-headers))
(funcall byte-count-to-string-function url-http-content-length)
(url-percentage (- nd url-http-end-of-headers)
@@ -1069,7 +1063,6 @@ the callback to be triggered."
(if (> (- nd url-http-end-of-headers) url-http-content-length)
(progn
;; Found the end of the document! Wheee!
- (url-display-percentage nil nil)
(url-lazy-message "Reading... done.")
(if (url-http-parse-headers)
(url-http-activate-callback)))))
@@ -1099,13 +1092,6 @@ the end of the document."
;; one after-change-function call.
(while read-next-chunk
(setq no-initial-crlf (= 0 url-http-chunked-counter))
- (if url-http-content-type
- (url-display-percentage nil
- "Reading [%s]... chunk #%d"
- url-http-content-type url-http-chunked-counter)
- (url-display-percentage nil
- "Reading... chunk #%d"
- url-http-chunked-counter))
(url-http-debug "Reading chunk %d (%d %d %d)"
url-http-chunked-counter st nd length)
(setq regexp (if no-initial-crlf
@@ -1163,7 +1149,6 @@ the end of the document."
;; Found the end of the document! Wheee!
(url-http-debug "Saw end of stream chunk!")
(setq read-next-chunk nil)
- (url-display-percentage nil nil)
;; Every chunk, even the last 0-length one, is
;; terminated by CRLF. Skip it.
(if (not (looking-at "\r?\n"))
diff --git a/lisp/url/url-privacy.el b/lisp/url/url-privacy.el
index f897248fe4c..36ccbe2adc1 100644
--- a/lisp/url/url-privacy.el
+++ b/lisp/url/url-privacy.el
@@ -41,9 +41,16 @@
nil)
;; First, we handle the inseparable OS/Windowing system
;; combinations
- ((eq system-type 'windows-nt) "Windows-NT; 32bit")
+ ((memq system-type '(windows-nt cygwin))
+ (concat "MS-Windows; "
+ (if (string-match-p "\\`x86_64" system-configuration)
+ "64bit"
+ "32bit")
+ "; "
+ (cond ((eq window-system 'w32) "w32")
+ ((eq window-system 'x) "X11")
+ (t "TTY"))))
((eq system-type 'ms-dos) "MS-DOS; 32bit")
- ((memq (or window-system 'tty) '(win32 w32)) "Windows; 32bit")
(t
(pcase (or window-system 'tty)
('x "X11")
diff --git a/lisp/url/url-util.el b/lisp/url/url-util.el
index fc84d451760..147a643c9fd 100644
--- a/lisp/url/url-util.el
+++ b/lisp/url/url-util.el
@@ -27,8 +27,6 @@
(require 'url-parse)
(require 'url-vars)
-(autoload 'timezone-parse-date "timezone")
-(autoload 'timezone-make-date-arpa-standard "timezone")
(autoload 'mail-header-extract "mailheader")
(defvar url-parse-args-syntax-table
@@ -180,39 +178,28 @@ Will not do anything if `url-show-status' is nil."
(format-time-string "%a, %d %b %Y %T GMT" specified-time t)))
;;;###autoload
-(defun url-eat-trailing-space (x)
- "Remove spaces/tabs at the end of a string."
- (let ((y (1- (length x)))
- (skip-chars (list ? ?\t ?\n)))
- (while (and (>= y 0) (memq (aref x y) skip-chars))
- (setq y (1- y)))
- (substring x 0 (1+ y))))
+(define-obsolete-function-alias 'url-eat-trailing-space
+ #'string-trim-right "29.1")
;;;###autoload
-(defun url-strip-leading-spaces (x)
- "Remove spaces at the front of a string."
- (let ((y (1- (length x)))
- (z 0)
- (skip-chars (list ? ?\t ?\n)))
- (while (and (<= z y) (memq (aref x z) skip-chars))
- (setq z (1+ z)))
- (substring x z nil)))
-
+(define-obsolete-function-alias 'url-strip-leading-spaces
+ #'string-trim-left "29.1")
(define-obsolete-function-alias 'url-pretty-length
'file-size-human-readable "24.4")
;;;###autoload
-(defun url-display-percentage (fmt perc &rest args)
+(defun url-display-message (fmt &rest args)
+ "Like `message', but do nothing if `url-show-status' is nil."
(when (and url-show-status
- (or (null url-current-object)
- (not (url-silent url-current-object))))
- (if (null fmt)
- (if (fboundp 'clear-progress-display)
- (clear-progress-display))
- (if (and (fboundp 'progress-display) perc)
- (apply 'progress-display fmt perc args)
- (apply 'message fmt args)))))
+ (not (and url-current-object (url-silent url-current-object)))
+ fmt)
+ (apply #'message fmt args)))
+
+;;;###autoload
+(defun url-display-percentage (fmt _perc &rest args)
+ (declare (obsolete url-display-message "29.1"))
+ (url-display-message fmt args))
;;;###autoload
(defun url-percentage (x y)
diff --git a/lisp/url/url-vars.el b/lisp/url/url-vars.el
index de42599e0d4..859a5c75ed3 100644
--- a/lisp/url/url-vars.el
+++ b/lisp/url/url-vars.el
@@ -205,7 +205,8 @@ from the ACCESS_proxy environment variables."
(defvar url-mime-separator-chars (append "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
- "0123456789'()+_,-./=?")
+ "0123456789'()+_,-./=?"
+ nil)
"Characters allowable in a MIME multipart separator.")
(defcustom url-bad-port-list
diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el
index e02d84f1f56..d710578ffff 100644
--- a/lisp/vc/add-log.el
+++ b/lisp/vc/add-log.el
@@ -568,14 +568,12 @@ Compatibility function for \\[next-error] invocations."
;; Select window displaying source file.
(select-window change-log-find-window)))))
-(defvar change-log-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map [?\C-c ?\C-p] #'add-log-edit-prev-comment)
- (define-key map [?\C-c ?\C-n] #'add-log-edit-next-comment)
- (define-key map [?\C-c ?\C-f] #'change-log-find-file)
- (define-key map [?\C-c ?\C-c] #'change-log-goto-source)
- map)
- "Keymap for Change Log major mode.")
+(defvar-keymap change-log-mode-map
+ :doc "Keymap for Change Log major mode."
+ "C-c C-p" #'add-log-edit-prev-comment
+ "C-c C-n" #'add-log-edit-next-comment
+ "C-c C-f" #'change-log-find-file
+ "C-c C-c" #'change-log-goto-source)
(easy-menu-define change-log-mode-menu change-log-mode-map
"Menu for Change Log major mode."
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index 30ba4153a9e..e4a1996c1bb 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -27,8 +27,8 @@
;; to the corresponding source file.
;; Inspired by Pavel Machek's patch-mode.el (<pavel@@atrey.karlin.mff.cuni.cz>)
-;; Some efforts were spent to have it somewhat compatible with XEmacs's
-;; diff-mode as well as with compilation-minor-mode
+;; Some efforts were spent to have it somewhat compatible with
+;; `compilation-minor-mode'.
;; Bugs:
@@ -147,6 +147,12 @@ and hunk-based syntax highlighting otherwise as a fallback."
(const :tag "Highlight syntax" t)
(const :tag "Allow hunk-based fallback" hunk-also)))
+(defcustom diff-whitespace-style '(face trailing)
+ "Specify `whitespace-style' variable for `diff-mode' buffers."
+ :require 'whitespace
+ :type (get 'whitespace-style 'custom-type)
+ :version "29.1")
+
(defvar diff-vc-backend nil
"The VC backend that created the current Diff buffer, if any.")
@@ -1476,9 +1482,6 @@ See `after-change-functions' for the meaning of BEG, END and LEN."
;; Added when diff--font-lock-prettify is non-nil!
(cl-pushnew 'display font-lock-extra-managed-props)))
-(defvar whitespace-style)
-(defvar whitespace-trailing-regexp)
-
(defvar-local diff-mode-read-only nil
"Non-nil when read-only diff buffer uses short keys.")
@@ -1487,6 +1490,9 @@ See `after-change-functions' for the meaning of BEG, END and LEN."
(nconc minor-mode-map-alist
(list (cons 'diff-mode-read-only diff-mode-shared-map))))
+(defvar whitespace-style)
+(defvar whitespace-trailing-regexp)
+
;;;###autoload
(define-derived-mode diff-mode fundamental-mode "Diff"
"Major mode for viewing/editing context diffs.
@@ -1572,7 +1578,7 @@ a diff with \\[diff-reverse-direction].
This sets `whitespace-style' and `whitespace-trailing-regexp' so
that Whitespace mode shows trailing whitespace problems on the
modified lines of the diff."
- (setq-local whitespace-style '(face trailing))
+ (setq-local whitespace-style diff-whitespace-style)
(let ((style (save-excursion
(goto-char (point-min))
;; FIXME: For buffers filled from async processes, this search
diff --git a/lisp/vc/ediff-help.el b/lisp/vc/ediff-help.el
index 4e412041691..e2d93d2b31b 100644
--- a/lisp/vc/ediff-help.el
+++ b/lisp/vc/ediff-help.el
@@ -24,10 +24,6 @@
;;; Code:
-;; Compiler pacifier start
-(defvar ediff-multiframe)
-;; end pacifier
-
(require 'ediff-init)
(defvar ediff-multiframe)
@@ -152,7 +148,7 @@ the value of this variable and the variables `ediff-help-message-*' in
;; the keymap that defines clicks over the quick help regions
-(defvar ediff-help-region-map (make-sparse-keymap))
+(defvar-keymap ediff-help-region-map)
(define-key ediff-help-region-map [mouse-2] #'ediff-help-for-quick-help)
diff --git a/lisp/vc/ediff-hook.el b/lisp/vc/ediff-hook.el
index cee376de302..d1eff0151a8 100644
--- a/lisp/vc/ediff-hook.el
+++ b/lisp/vc/ediff-hook.el
@@ -35,27 +35,19 @@
;; (define-key menu-bar-tools-menu [ediff]
;; '("Compare" . menu-bar-ediff-menu))
-;; Compiler pacifier
-(defvar ediff-menu)
-(defvar ediff-merge-menu)
-(defvar epatch-menu)
-(defvar ediff-misc-menu)
-;; end pacifier
-
;; allow menus to be set up without ediff-wind.el being loaded
-;; Emacs
;; initialize menu bar keymaps
(defvar menu-bar-ediff-misc-menu
(make-sparse-keymap "Ediff Miscellanea"))
(fset 'menu-bar-ediff-misc-menu
menu-bar-ediff-misc-menu)
-(defvar menu-bar-epatch-menu (make-sparse-keymap "Apply Patch"))
+(defvar-keymap menu-bar-epatch-menu :name "Apply Patch")
(fset 'menu-bar-epatch-menu menu-bar-epatch-menu)
-(defvar menu-bar-ediff-merge-menu (make-sparse-keymap "Merge"))
+(defvar-keymap menu-bar-ediff-merge-menu :name "Merge")
(fset 'menu-bar-ediff-merge-menu
menu-bar-ediff-merge-menu)
-(defvar menu-bar-ediff-menu (make-sparse-keymap "Compare"))
+(defvar-keymap menu-bar-ediff-menu :name "Compare")
(fset 'menu-bar-ediff-menu menu-bar-ediff-menu)
;; define ediff compare menu
diff --git a/lisp/vc/ediff-init.el b/lisp/vc/ediff-init.el
index 273bad5d353..a3e77200ddf 100644
--- a/lisp/vc/ediff-init.el
+++ b/lisp/vc/ediff-init.el
@@ -27,35 +27,26 @@
(require 'cl-lib)
(require 'ediff-util)
-;; Start compiler pacifier
(defvar ediff-metajob-name)
(defvar ediff-meta-buffer)
(defvar ediff-grab-mouse)
(defvar ediff-mouse-pixel-position)
(defvar ediff-mouse-pixel-threshold)
-(defvar ediff-whitespace)
(defvar ediff-multiframe)
(defvar ediff-use-toolbar-p)
-(defvar mswindowsx-bitmap-file-path)
-;; end pacifier
(defvar ediff-force-faces nil
"If t, Ediff will think that it is running on a display that supports faces.
This is provided as a temporary relief for users of face-capable displays
that Ediff doesn't know about.")
-;; Are we running as a window application or on a TTY?
(defsubst ediff-device-type ()
- (declare (obsolete nil "27.1"))
+ (declare (obsolete window-system "27.1"))
window-system)
-(defun ediff-window-display-p ()
- (and window-system
- (not (memq window-system '(tty pc stream)))))
-
;; test if supports faces
(defun ediff-has-face-support-p ()
- (cond ((ediff-window-display-p))
+ (cond ((display-graphic-p))
(ediff-force-faces)
((display-color-p))
(t (memq window-system '(pc)))))
@@ -64,11 +55,6 @@ that Ediff doesn't know about.")
(defun ediff-has-toolbar-support-p ()
nil)
-
-(defun ediff-has-gutter-support-p ()
- (declare (obsolete nil "27.1"))
- nil)
-
(defun ediff-use-toolbar-p ()
(and (ediff-has-toolbar-support-p) ;Can it do it ?
(boundp 'ediff-use-toolbar-p)
@@ -259,7 +245,7 @@ It needs to be killed when we quit the session.")
(defsubst ediff-multiframe-setup-p ()
- (and (ediff-window-display-p) ediff-multiframe))
+ (and (display-graphic-p) ediff-multiframe))
(defmacro ediff-narrow-control-frame-p ()
'(and (ediff-multiframe-setup-p)
@@ -722,18 +708,6 @@ Ediff needs to find fine differences."
:type 'symbol
:group 'ediff)
-
-(define-obsolete-function-alias 'ediff-read-event #'read-event "27.1")
-
-(define-obsolete-function-alias 'ediff-overlayp #'overlayp "27.1")
-
-(define-obsolete-function-alias 'ediff-make-overlay #'make-overlay "27.1")
-
-(define-obsolete-function-alias 'ediff-delete-overlay #'delete-overlay "27.1")
-
-(define-obsolete-function-alias 'ediff-color-display-p #'display-color-p "27.1")
-
-
;; A var local to each control panel buffer. Indicates highlighting style
;; in effect for this buffer: `face', `ascii',
;; `off' -- turned off (on a dumb terminal only).
@@ -789,7 +763,7 @@ Ediff needs to find fine differences."
(defun ediff-set-face-pixmap (face pixmap)
"Set stipple pixmap of FACE to PIXMAP on a monochrome display."
- (if (and (ediff-window-display-p) (not (display-color-p)))
+ (if (and (display-graphic-p) (not (display-color-p)))
(condition-case nil
(set-face-background-pixmap face pixmap)
(error
@@ -972,8 +946,6 @@ this variable represents.")
(cond ((not (ediff-has-face-support-p)) nil)
((and (boundp 'x-bitmap-file-path)
(locate-library "stipple" t x-bitmap-file-path)) "stipple")
- ((and (boundp 'mswindowsx-bitmap-file-path)
- (locate-library "stipple" t mswindowsx-bitmap-file-path)) "stipple")
(t "Stipple")))
(defface ediff-even-diff-A
@@ -1273,9 +1245,6 @@ This default should work without changes."
"Temporary file used for refining difference regions in buffer C.")
-(defun ediff-file-remote-p (file-name)
- (file-remote-p file-name))
-
;; File for which we can get attributes, such as size or date
(defun ediff-listable-file (file-name)
(let ((handler (find-file-name-handler file-name 'file-local-copy)))
@@ -1283,6 +1252,7 @@ This default should work without changes."
(defsubst ediff-frame-unsplittable-p (frame)
+ (declare (obsolete nil "29.1"))
(cdr (assq 'unsplittable (frame-parameters frame))))
(defsubst ediff-get-next-window (wind prev-wind)
@@ -1357,52 +1327,40 @@ This default should work without changes."
(ediff-clear-fine-differences-in-one-buffer n 'C)))
-(defsubst ediff-mouse-event-p (event)
- (string-match "mouse" (format "%S" (event-basic-type event))))
-
-
(defsubst ediff-key-press-event-p (event)
(or (char-or-string-p event) (symbolp event)))
(defun ediff-event-point (event)
- (cond ((ediff-mouse-event-p event)
+ (cond ((mouse-event-p event)
(posn-point (event-start event)))
((ediff-key-press-event-p event)
(point))
(t (error "Error"))))
(defun ediff-event-buffer (event)
- (cond ((ediff-mouse-event-p event)
+ (cond ((mouse-event-p event)
(window-buffer (posn-window (event-start event))))
((ediff-key-press-event-p event)
(current-buffer))
(t (error "Error"))))
-(define-obsolete-function-alias 'ediff-event-key #'identity "27.1")
-
(defun ediff-last-command-char ()
- (declare (obsolete nil "27.1"))
+ (declare (obsolete last-command-event "27.1"))
last-command-event)
(defsubst ediff-frame-iconified-p (frame)
- (and (ediff-window-display-p)
+ (and (display-graphic-p)
(frame-live-p frame)
(eq (frame-visible-p frame) 'icon)))
(defsubst ediff-window-visible-p (wind)
- ;; under TTY, window-live-p also means window is visible
(and (window-live-p wind)
- (or (not (ediff-window-display-p))
- (frame-visible-p (window-frame wind)))))
-
-
-(define-obsolete-function-alias 'ediff-frame-char-width
- #'frame-char-width "27.1")
+ (frame-visible-p (window-frame wind))))
(defun ediff-reset-mouse (&optional frame do-not-grab-mouse)
(or frame (setq frame (selected-frame)))
- (if (ediff-window-display-p)
+ (if (display-graphic-p)
(let ((frame-or-wind frame))
(or do-not-grab-mouse
;; don't set mouse if the user said to never do this
@@ -1419,29 +1377,28 @@ This default should work without changes."
)))
(defsubst ediff-spy-after-mouse ()
- (setq ediff-mouse-pixel-position (mouse-pixel-position)))
+ (declare (obsolete nil "29.1"))
+ (with-suppressed-warnings ((obsolete ediff-mouse-pixel-position))
+ (setq ediff-mouse-pixel-position (mouse-pixel-position))))
-;; It is not easy to find out when the user grabs the mouse, since emacs and
-;; xemacs behave differently when mouse is not in any frame. Also, this is
-;; sensitive to when the user grabbed mouse. Not used for now.
(defun ediff-user-grabbed-mouse ()
- (if ediff-mouse-pixel-position
- (cond ((not (eq (car ediff-mouse-pixel-position)
- (car (mouse-pixel-position)))))
- ((and (car (cdr ediff-mouse-pixel-position))
- (car (cdr (mouse-pixel-position)))
- (cdr (cdr ediff-mouse-pixel-position))
- (cdr (cdr (mouse-pixel-position))))
- (not (and (< (abs (- (car (cdr ediff-mouse-pixel-position))
- (car (cdr (mouse-pixel-position)))))
- ediff-mouse-pixel-threshold)
- (< (abs (- (cdr (cdr ediff-mouse-pixel-position))
- (cdr (cdr (mouse-pixel-position)))))
- ediff-mouse-pixel-threshold))))
- (t nil))))
-
-(define-obsolete-function-alias 'ediff-frame-char-height
- #'frame-char-height "27.1")
+ (declare (obsolete nil "29.1"))
+ (with-suppressed-warnings ((obsolete ediff-mouse-pixel-position))
+ (if ediff-mouse-pixel-position
+ (cond ((not (eq (car ediff-mouse-pixel-position)
+ (car (mouse-pixel-position)))))
+ ((and (car (cdr ediff-mouse-pixel-position))
+ (car (cdr (mouse-pixel-position)))
+ (cdr (cdr ediff-mouse-pixel-position))
+ (cdr (cdr (mouse-pixel-position))))
+ (not (and (< (abs (- (car (cdr ediff-mouse-pixel-position))
+ (car (cdr (mouse-pixel-position)))))
+ ediff-mouse-pixel-threshold)
+ (< (abs (- (cdr (cdr ediff-mouse-pixel-position))
+ (cdr (cdr (mouse-pixel-position)))))
+ ediff-mouse-pixel-threshold))))
+ (t nil)))))
+
;; Some overlay functions
@@ -1456,12 +1413,6 @@ This default should work without changes."
(defsubst ediff-empty-overlay-p (overl)
(= (ediff-overlay-start overl) (ediff-overlay-end overl)))
-(define-obsolete-function-alias 'ediff-overlay-buffer
- #'overlay-buffer "27.1")
-
-(define-obsolete-function-alias 'ediff-overlay-get #'overlay-get "27.1")
-
-
(defun ediff-move-overlay (overlay beg end &optional buffer)
"If OVERLAY's buffer exists, call `move-overlay'."
(let ((buf (and overlay (overlay-buffer overlay))))
@@ -1500,7 +1451,7 @@ This default should work without changes."
(ediff-abbreviate-file-name (file-name-directory dir))))
(defsubst ediff-nonempty-string-p (string)
- (and (stringp string) (not (string= string ""))))
+ (and (stringp string) (string-empty-p string)))
(defun ediff-abbrev-jobname (jobname)
(cond ((eq jobname 'ediff-directories)
@@ -1561,16 +1512,23 @@ This default should work without changes."
(ediff-file-attributes filename 5))
-;;; Obsolete
-
-(defun ediff-convert-standard-filename (fname)
- (declare (obsolete convert-standard-filename "28.1"))
- (convert-standard-filename fname))
-
-(define-obsolete-function-alias 'ediff-with-syntax-table
- #'with-syntax-table "27.1")
-
+(define-obsolete-function-alias 'ediff-has-gutter-support-p #'ignore "27.1")
+(define-obsolete-function-alias 'ediff-event-key #'identity "27.1")
+(define-obsolete-function-alias 'ediff-frame-char-width #'frame-char-width "27.1")
+(define-obsolete-function-alias 'ediff-frame-char-height #'frame-char-height "27.1")
+(define-obsolete-function-alias 'ediff-overlay-buffer #'overlay-buffer "27.1")
+(define-obsolete-function-alias 'ediff-overlay-get #'overlay-get "27.1")
+(define-obsolete-function-alias 'ediff-read-event #'read-event "27.1")
+(define-obsolete-function-alias 'ediff-overlayp #'overlayp "27.1")
+(define-obsolete-function-alias 'ediff-make-overlay #'make-overlay "27.1")
+(define-obsolete-function-alias 'ediff-delete-overlay #'delete-overlay "27.1")
+(define-obsolete-function-alias 'ediff-color-display-p #'display-color-p "27.1")
+(define-obsolete-function-alias 'ediff-with-syntax-table #'with-syntax-table "27.1")
+(define-obsolete-function-alias 'ediff-convert-standard-filename #'convert-standard-filename "28.1")
(define-obsolete-function-alias 'ediff-hide-face #'ignore "28.1")
+(define-obsolete-function-alias 'ediff-file-remote-p #'file-remote-p "29.1")
+(define-obsolete-function-alias 'ediff-window-display-p #'display-graphic-p "29.1")
+(define-obsolete-function-alias 'ediff-mouse-event-p #'mouse-event-p "29.1")
(provide 'ediff-init)
;;; ediff-init.el ends here
diff --git a/lisp/vc/ediff-mult.el b/lisp/vc/ediff-mult.el
index b7c349fc1cd..52e356d8e9b 100644
--- a/lisp/vc/ediff-mult.el
+++ b/lisp/vc/ediff-mult.el
@@ -144,20 +144,18 @@ Useful commands (type ? to hide them and free up screen):
(ediff-defvar-local ediff-meta-buffer-map nil
"The keymap for the meta buffer.")
-(defvar ediff-dir-diffs-buffer-map
- (let ((map (make-sparse-keymap)))
- (suppress-keymap map)
- (define-key map "q" #'ediff-bury-dir-diffs-buffer)
- (define-key map " " #'next-line)
- (define-key map "n" #'next-line)
- (define-key map "\C-?" #'previous-line)
- (define-key map "p" #'previous-line)
- (define-key map "C" #'ediff-dir-diff-copy-file)
- (define-key map [mouse-2] #'ediff-dir-diff-copy-file)
- (define-key map [delete] #'previous-line)
- (define-key map [backspace] #'previous-line)
- map)
- "Keymap for buffer showing differences between directories.")
+(defvar-keymap ediff-dir-diffs-buffer-map
+ :doc "Keymap for buffer showing differences between directories."
+ :suppress t
+ "q" #'ediff-bury-dir-diffs-buffer
+ "SPC" #'next-line
+ "n" #'next-line
+ "DEL" #'previous-line
+ "p" #'previous-line
+ "C" #'ediff-dir-diff-copy-file
+ "<mouse-2>" #'ediff-dir-diff-copy-file
+ "<delete>" #'previous-line
+ "<backspace>" #'previous-line)
;; Variable specifying the action to take when the use invokes ediff in the
;; meta buffer. This is usually ediff-registry-action or ediff-filegroup-action
@@ -1861,7 +1859,6 @@ all marked sessions must be active."
;; handle an individual session with a live control buffer
((ediff-buffer-live-p session-buf)
(ediff-with-current-buffer session-buf
- (setq ediff-mouse-pixel-position (mouse-pixel-position))
(ediff-recenter 'no-rehighlight)))
((ediff-problematic-session-p info)
@@ -2005,7 +2002,6 @@ all marked sessions must be active."
(ediff-show-meta-buffer ctl-buf t)
;; it's a session buffer -- invoke go back to session
(ediff-with-current-buffer ctl-buf
- (setq ediff-mouse-pixel-position (mouse-pixel-position))
(ediff-recenter 'no-rehighlight)))
(beep)
(message "You've selected a stale session --- try again")
@@ -2056,14 +2052,14 @@ all marked sessions must be active."
((and
(setq wind
(ediff-get-visible-buffer-window ediff-registry-buffer))
- (ediff-window-display-p))
+ (display-graphic-p))
(select-window wind)
(other-window 1)
(set-window-buffer (selected-window) meta-buf))
(t (ediff-skip-unsuitable-frames 'ok-unsplittable)
(set-window-buffer (selected-window) meta-buf)))
))
- (if (and (ediff-window-display-p)
+ (if (and (display-graphic-p)
(window-live-p
(setq wind (ediff-get-visible-buffer-window meta-buf))))
(progn
@@ -2117,14 +2113,14 @@ all marked sessions must be active."
(select-window ediff-window-B))
((and (setq wind
(ediff-get-visible-buffer-window ediff-meta-buffer))
- (ediff-window-display-p))
+ (display-graphic-p))
(select-window wind)
(other-window 1)
(set-window-buffer (selected-window) ediff-registry-buffer))
(t (ediff-skip-unsuitable-frames 'ok-unsplittable)
(set-window-buffer (selected-window) ediff-registry-buffer)))
))
- (if (ediff-window-display-p)
+ (if (display-graphic-p)
(progn
(setq frame
(window-frame
diff --git a/lisp/vc/ediff-ptch.el b/lisp/vc/ediff-ptch.el
index 17654f80ec7..4d471e21b4c 100644
--- a/lisp/vc/ediff-ptch.el
+++ b/lisp/vc/ediff-ptch.el
@@ -24,10 +24,8 @@
;;; Code:
-
(require 'diff-mode) ; For `diff-file-junk-re'.
-
(defgroup ediff-ptch nil
"Ediff patch support."
:tag "Patch"
@@ -798,7 +796,7 @@ you can still examine the changes via M-x ediff-files"
;; the orig file.
(setq target-filename
(concat
- (if (ediff-file-remote-p (file-truename source-filename))
+ (if (file-remote-p (file-truename source-filename))
magic-file-name
source-filename)
"_patched"))
diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el
index 040a9a63c5a..0d96a195ade 100644
--- a/lisp/vc/ediff-util.el
+++ b/lisp/vc/ediff-util.el
@@ -24,24 +24,11 @@
;;; Code:
-
(provide 'ediff-util) ;FIXME: Break cyclic dependencies and move to the end!
-;; Compiler pacifier
(defvar ediff-use-toolbar-p)
-(defvar ediff-toolbar-height)
-(defvar ediff-toolbar)
-(defvar ediff-toolbar-3way)
-(defvar bottom-toolbar)
-(defvar bottom-toolbar-visible-p)
-(defvar bottom-toolbar-height)
-(defvar mark-active)
-
(defvar ediff-after-quit-hook-internal nil)
-;; end pacifier
-
-
(require 'ediff-init)
(require 'ediff-help)
(require 'ediff-mult)
@@ -296,10 +283,6 @@ to invocation.")
(if (string-match "buffer" (symbol-name ediff-job-name))
(setq ediff-keep-variants t))
- (if (ediff-window-display-p)
- (add-hook 'pre-command-hook 'ediff-spy-after-mouse nil 'local))
- (setq ediff-mouse-pixel-position (mouse-pixel-position))
-
;; adjust for merge jobs
(if ediff-merge-job
(let ((buf
@@ -739,7 +722,7 @@ buffers."
;; set visibility range appropriate to this invocation of Ediff.
(ediff-visible-region)
;; raise
- (if (and (ediff-window-display-p)
+ (if (and (display-graphic-p)
(symbolp this-command)
(symbolp last-command)
;; Either one of the display-changing commands
@@ -764,7 +747,7 @@ buffers."
(raise-frame (window-frame ediff-window-B)))
(if (window-live-p ediff-window-C)
(raise-frame (window-frame ediff-window-C)))))
- (if (and (ediff-window-display-p)
+ (if (and (display-graphic-p)
(frame-live-p ediff-control-frame)
(not ediff-use-long-help-message)
(not (ediff-frame-iconified-p ediff-control-frame)))
@@ -1256,7 +1239,7 @@ of the current buffer."
This is especially useful when comparing buffers side-by-side."
(interactive)
(ediff-barf-if-not-control-buffer)
- (or (ediff-window-display-p)
+ (or (display-graphic-p)
(user-error "Emacs is not running as a window application"))
(ediff-recenter 'no-rehighlight) ; make sure buffs are displayed in windows
(let ((ctl-buf ediff-control-buffer))
@@ -1283,7 +1266,7 @@ To change the default, set the variable `ediff-window-setup-function',
which see."
(interactive)
(let (window-setup-func)
- (or (ediff-window-display-p)
+ (or (display-graphic-p)
(user-error "Emacs is not running as a window application"))
(cond ((eq ediff-window-setup-function #'ediff-setup-windows-multiframe)
@@ -1327,7 +1310,7 @@ To change the default, set the variable `ediff-use-toolbar-p', which see."
;; FIXME: Make it work in Emacs!
(if (featurep 'ediff-tbar)
(progn
- (or (ediff-window-display-p)
+ (or (display-graphic-p)
(user-error "Emacs is not running as a window application"))
;; do this only after killing the toolbar
(setq ediff-use-toolbar-p (not ediff-use-toolbar-p))
@@ -1341,10 +1324,6 @@ To change the default, set the variable `ediff-use-toolbar-p', which see."
(if (ediff-in-control-buffer-p)
(ediff-recenter 'no-rehighlight)))))
-
-(define-obsolete-function-alias 'ediff-kill-bottom-toolbar #'ignore "27.1")
-(define-obsolete-function-alias 'ediff-make-bottom-toolbar #'ignore "27.1")
-
;; Merging
(defun ediff-toggle-show-clashes-only ()
@@ -2442,7 +2421,7 @@ reverse the meaning of this variable."
(after-quit-hook-internal (remq t ediff-after-quit-hook-internal))
(session-number ediff-meta-session-number)
;; suitable working frame
- (warp-frame (if (and (ediff-window-display-p) (eq ediff-grab-mouse t))
+ (warp-frame (if (and (display-graphic-p) (eq ediff-grab-mouse t))
(cond ((window-live-p ediff-window-A)
(window-frame ediff-window-A))
((window-live-p ediff-window-B)
@@ -2516,7 +2495,7 @@ reverse the meaning of this variable."
(setq warp-frame ; if mouse is over a reasonable frame, use it
(cond ((ediff-good-frame-under-mouse))
(t warp-frame)))
- (if (and (ediff-window-display-p) (frame-live-p warp-frame) ediff-grab-mouse)
+ (if (and (display-graphic-p) (frame-live-p warp-frame) ediff-grab-mouse)
(set-mouse-position warp-frame 2 1))
(mapc #'funcall after-quit-hook-internal)
@@ -2573,7 +2552,7 @@ reverse the meaning of this variable."
(ediff-kill-buffer-carefully ediff-patch-diagnostics))
;; delete control frame or window
- (cond ((and (ediff-window-display-p) (frame-live-p ctl-frame))
+ (cond ((and (display-graphic-p) (frame-live-p ctl-frame))
(delete-frame ctl-frame))
((window-live-p ctl-wind)
(delete-window ctl-wind)))
@@ -2748,7 +2727,7 @@ only if this merge job is part of a group, i.e., was invoked from within
(buf-fine-diff ediff-fine-diff-buffer))
;; hide the control panel
- (if (and (ediff-window-display-p) (frame-live-p ediff-control-frame))
+ (if (and (display-graphic-p) (frame-live-p ediff-control-frame))
(iconify-frame ediff-control-frame)
(bury-buffer))
(if buf-err (bury-buffer buf-err))
@@ -3086,10 +3065,6 @@ Hit \\[ediff-recenter] to reset the windows afterward."
)
-;; for compatibility
-(define-obsolete-function-alias 'ediff-minibuffer-with-setup-hook
- #'minibuffer-with-setup-hook "28.1")
-
;; This is adapted from a similar function in `emerge.el'.
;; PROMPT should not have a trailing ': ', so that it can be modified
;; according to context.
@@ -3197,13 +3172,7 @@ Hit \\[ediff-recenter] to reset the windows afterward."
(progn
(if (or (file-exists-p file) (not keep-proposed-name))
(setq file (make-temp-name proposed-name)))
- ;; the with-temp-buffer thing is a workaround for an XEmacs
- ;; bug: write-region complains that we are trying to visit a
- ;; file in an indirect buffer, failing to notice that the
- ;; VISIT flag is unset and that we are actually writing from a
- ;; string and not from any buffer.
- (with-temp-buffer
- (write-region "" nil file nil 'silent nil 'excl))
+ (write-region "" nil file nil 'silent nil 'excl)
nil)
(file-already-exists t))
;; the file was somehow created by someone else between
@@ -3212,16 +3181,6 @@ Hit \\[ediff-recenter] to reset the windows afterward."
file))
-;; Quote metacharacters (using \) when executing diff in Unix.
-;;(defun ediff-protect-metachars (str)
-;; (let ((limit 0))
-;; (while (string-match ediff-metachars str limit)
-;; (setq str (concat (substring str 0 (match-beginning 0))
-;; "\\"
-;; (substring str (match-beginning 0))))
-;; (setq limit (1+ (match-end 0)))))
-;; str)
-
;; Make sure the current buffer (for a file) has the same contents as the
;; file on disk, and attempt to remedy the situation if not.
;; Signal an error if we can't make them the same, or the user doesn't want
@@ -3282,8 +3241,9 @@ Hit \\[ediff-recenter] to reset the windows afterward."
(defun ediff-filename-magic-p (file)
+ (declare (obsolete nil "29.1"))
(or (ediff-file-compressed-p file)
- (ediff-file-remote-p file)))
+ (file-remote-p file)))
(defun ediff-save-buffer (arg)
@@ -3330,7 +3290,8 @@ Without an argument, it saves customized diff argument, if available
(select-window wind)
(delete-other-windows)
(or (mark) (push-mark))
- (ediff-activate-mark)
+ (setq mark-active 'ediff-util)
+ (setq-local transient-mark-mode t)
(split-window-vertically)
(ediff-select-lowest-window)
(setq other-wind (selected-window))
@@ -3404,11 +3365,11 @@ Without an argument, it saves customized diff argument, if available
file-A file-B)
(unless (and buf-A-file-name
(file-exists-p buf-A-file-name)
- (not (ediff-file-remote-p buf-A-file-name)))
+ (not (file-remote-p buf-A-file-name)))
(setq file-A (ediff-make-temp-file ediff-buffer-A)))
(unless (and buf-B-file-name
(file-exists-p buf-B-file-name)
- (not (ediff-file-remote-p buf-B-file-name)))
+ (not (file-remote-p buf-B-file-name)))
(setq file-B (ediff-make-temp-file ediff-buffer-B)))
(or (ediff-buffer-live-p ediff-custom-diff-buffer)
(setq ediff-custom-diff-buffer
@@ -3909,11 +3870,9 @@ Ediff Control Panel to restore highlighting."
"Submit bug report on Ediff."
(interactive)
(ediff-barf-if-not-control-buffer)
- (defvar ediff-device-type)
(defvar ediff-buffer-name)
(let ((reporter-prompt-for-summary-p t)
(ctl-buf ediff-control-buffer)
- (ediff-device-type window-system)
varlist salutation ediff-buffer-name)
(setq varlist '(ediff-diff-program ediff-diff-options
ediff-diff3-program ediff-diff3-options
@@ -3932,8 +3891,7 @@ Ediff Control Panel to restore highlighting."
ediff-job-name
ediff-word-mode
ediff-buffer-name
- ediff-device-type
- ))
+ window-system))
(setq salutation "
Congratulations! You may have unearthed a bug in Ediff!
@@ -4011,24 +3969,19 @@ Mail anyway? (y or n) ")
(defun ediff-choose-syntax-table ()
(setq ediff-syntax-table
(ediff-with-current-buffer ediff-buffer-A
- (if (not (memq major-mode
- '(fundamental-mode text-mode indented-text-mode)))
- (syntax-table))))
+ (unless (memq major-mode '(fundamental-mode text-mode))
+ (syntax-table))))
(if (not ediff-syntax-table)
(setq ediff-syntax-table
(ediff-with-current-buffer ediff-buffer-B
(syntax-table))))
)
-
-(define-obsolete-function-alias 'ediff-deactivate-mark #'deactivate-mark "27.1")
-
(defun ediff-activate-mark ()
+ (declare (obsolete nil "29.1"))
(setq mark-active 'ediff-util)
(setq-local transient-mark-mode t))
-(define-obsolete-function-alias 'ediff-nuke-selective-display #'ignore "27.1")
-
;; The next two are modified versions from emerge.el.
;; VARS must be a list of symbols
;; ediff-save-variables returns an association list: ((var . val) ...)
@@ -4094,11 +4047,11 @@ Mail anyway? (y or n) ")
;;; Debug
-(ediff-defvar-local ediff-command-begin-time '(0 0 0))
+(ediff-defvar-local ediff-command-begin-time 0)
;; calculate time used by command
(defun ediff-calc-command-time ()
- (or (equal ediff-command-begin-time '(0 0 0))
+ (or (equal ediff-command-begin-time 0)
(message "Elapsed time: %g second(s)"
(float-time (time-since ediff-command-begin-time)))))
@@ -4112,10 +4065,10 @@ Mail anyway? (y or n) ")
(let ((pre-hook 'pre-command-hook)
(post-hook 'post-command-hook))
- (if (not (equal ediff-command-begin-time '(0 0 0)))
+ (if (not (equal ediff-command-begin-time 0))
(progn (remove-hook pre-hook 'ediff-save-time)
(remove-hook post-hook 'ediff-calc-command-time)
- (setq ediff-command-begin-time '(0 0 0))
+ (setq ediff-command-begin-time 0)
(message "Ediff profiling disabled"))
(add-hook pre-hook 'ediff-save-time t 'local)
(add-hook post-hook 'ediff-calc-command-time nil 'local)
@@ -4180,7 +4133,12 @@ Mail anyway? (y or n) ")
(key-description desc)
(format "M-x %s" func-def))))
+(define-obsolete-function-alias 'ediff-kill-bottom-toolbar #'ignore "27.1")
+(define-obsolete-function-alias 'ediff-make-bottom-toolbar #'ignore "27.1")
+(define-obsolete-function-alias 'ediff-deactivate-mark #'deactivate-mark "27.1")
+(define-obsolete-function-alias 'ediff-nuke-selective-display #'ignore "27.1")
(define-obsolete-function-alias 'ediff-add-to-history #'add-to-history "27.1")
+(define-obsolete-function-alias 'ediff-minibuffer-with-setup-hook #'minibuffer-with-setup-hook "28.1")
(define-obsolete-function-alias 'ediff-copy-list #'copy-sequence "28.1")
(define-obsolete-function-alias 'ediff-union #'seq-union "28.1")
(define-obsolete-function-alias 'ediff-intersection #'seq-intersection "28.1")
diff --git a/lisp/vc/ediff-wind.el b/lisp/vc/ediff-wind.el
index 6db3667545e..d45e13ea725 100644
--- a/lisp/vc/ediff-wind.el
+++ b/lisp/vc/ediff-wind.el
@@ -1,6 +1,6 @@
;;; ediff-wind.el --- window manipulation utilities -*- lexical-binding:t -*-
-;; Copyright (C) 1994-1997, 2000-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1994-2022 Free Software Foundation, Inc.
;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
;; Package: ediff
@@ -24,23 +24,11 @@
;;; Code:
-
-;; Compiler pacifier
(defvar icon-title-format)
-(defvar top-toolbar-height)
-(defvar bottom-toolbar-height)
-(defvar left-toolbar-height)
-(defvar right-toolbar-height)
-(defvar left-toolbar-width)
-(defvar right-toolbar-width)
-(defvar default-menubar)
-(defvar top-gutter)
-(defvar frame-icon-title-format)
(defvar ediff-diff-status)
(require 'ediff-init)
(require 'ediff-help)
-;; end pacifier
(defgroup ediff-window nil
"Ediff window manipulation."
@@ -52,7 +40,7 @@
;; Determine which window setup function to use based on current window system.
(defun ediff-choose-window-setup-function-automatically ()
(declare (obsolete ediff-setup-windows-default "24.3"))
- (if (ediff-window-display-p)
+ (if (display-graphic-p)
#'ediff-setup-windows-multiframe
#'ediff-setup-windows-plain))
@@ -179,6 +167,7 @@ Used internally---not a user option.")
(ediff-defvar-local ediff-mouse-pixel-position nil
"Position of the mouse.
Used to decide whether to warp the mouse into control frame.")
+(make-obsolete-variable 'ediff-mouse-pixel-position "it is unused." "29.1")
;; not used for now
(defvar ediff-mouse-pixel-threshold 30
@@ -260,8 +249,8 @@ keyboard input to go into icons."
(let (event)
(message
"Select windows by clicking. Please click on Window %d " wind-number)
- (while (not (ediff-mouse-event-p (setq event
- (read--potential-mouse-event))))
+ (while (not (mouse-event-p (setq event
+ (read--potential-mouse-event))))
(if (sit-for 1) ; if sequence of events, wait till the final word
(beep 1))
(message "Please click on Window %d " wind-number))
@@ -303,7 +292,7 @@ keyboard input to go into icons."
(other-window 1))
;; in case user did a no-no on a tty
- (or (ediff-window-display-p)
+ (or (display-graphic-p)
(setq ediff-window-setup-function #'ediff-setup-windows-plain))
(or (ediff-keep-window-config control-buffer)
@@ -843,9 +832,9 @@ keyboard input to go into icons."
(defun ediff-skip-unsuitable-frames (&optional ok-unsplittable)
"Skip unsplittable frames and frames that have dedicated windows.
Create a new splittable frame if none is found."
- (if (ediff-window-display-p)
+ (if (display-graphic-p)
(let ((wind-frame (window-frame))
- seen-windows)
+ seen-windows)
(while (and (not (memq (selected-window) seen-windows))
(or
(ediff-frame-has-dedicated-windows wind-frame)
@@ -854,8 +843,8 @@ Create a new splittable frame if none is found."
(< (frame-height wind-frame)
(* 3 window-min-height))
(if ok-unsplittable
- nil
- (ediff-frame-unsplittable-p wind-frame))))
+ nil
+ (cdr (assq 'unsplittable (frame-parameters wind-frame))))))
;; remember history
(setq seen-windows (cons (selected-window) seen-windows))
;; try new window
@@ -901,7 +890,6 @@ Create a new splittable frame if none is found."
fheight fwidth adjusted-parameters)
(with-current-buffer ctl-buffer
- ;;(setq user-grabbed-mouse (ediff-user-grabbed-mouse))
(run-hooks 'ediff-before-setup-control-frame-hook))
(setq old-ctl-frame (with-current-buffer ctl-buffer ediff-control-frame))
@@ -993,7 +981,7 @@ Create a new splittable frame if none is found."
;; synchronize so the cursor will move to control frame
;; per RMS suggestion
- (if (ediff-window-display-p)
+ (if (display-graphic-p)
(let ((count 7))
(sit-for .1)
(while (and (not (frame-visible-p ctl-frame)) (> count 0))
@@ -1012,7 +1000,7 @@ Create a new splittable frame if none is found."
(defun ediff-destroy-control-frame (ctl-buffer)
(ediff-with-current-buffer ctl-buffer
- (if (and (ediff-window-display-p) (frame-live-p ediff-control-frame))
+ (if (and (display-graphic-p) (frame-live-p ediff-control-frame))
(let ((ctl-frame ediff-control-frame))
(setq ediff-control-frame nil)
(delete-frame ctl-frame))))
@@ -1145,7 +1133,7 @@ It assumes that it is called from within the control buffer."
;; Force mode-line redisplay
(force-mode-line-update)
- (if (and (ediff-window-display-p) (frame-live-p ediff-control-frame))
+ (if (and (display-graphic-p) (frame-live-p ediff-control-frame))
(ediff-refresh-control-frame))
(ediff-with-current-buffer ediff-buffer-A
diff --git a/lisp/vc/ediff.el b/lisp/vc/ediff.el
index 840ab8cf51c..94e3fc6d7fe 100644
--- a/lisp/vc/ediff.el
+++ b/lisp/vc/ediff.el
@@ -89,12 +89,11 @@
;; underlining. However, if the region is already underlined by some other
;; overlays, there is no simple way to temporarily remove that residual
;; underlining. This problem occurs when a buffer is highlighted with
-;; hilit19.el or font-lock.el packages. If this residual highlighting gets
-;; in the way, you can do the following. Both font-lock.el and hilit19.el
-;; provide commands for unhighlighting buffers. You can either place these
-;; commands in `ediff-prepare-buffer-hook' (which will unhighlight every
-;; buffer used by Ediff) or you can execute them interactively, at any time
-;; and on any buffer.
+;; font-lock.el packages. If this residual highlighting gets in the way, you
+;; can do the following. font-lock.el provides commands for unhighlighting
+;; buffers. You can either place these commands in `ediff-prepare-buffer-hook'
+;; (which will unhighlight every buffer used by Ediff) or you can execute
+;; them interactively, at any time and in any buffer.
;;; Acknowledgments:
@@ -107,8 +106,6 @@
;;; Code:
(require 'ediff-util)
-;; end pacifier
-
(require 'ediff-init)
(require 'ediff-mult) ; required because of the registry stuff
@@ -283,7 +280,8 @@ deleted.
Returns the buffer into which the file is visited.
Also sets `ediff--magic-file-name' to indicate where the file's content
has been saved (if not in `buffer-file-name')."
- (let* ((file-magic (ediff-filename-magic-p file))
+ (let* ((file-magic (or (ediff-file-compressed-p file)
+ (file-remote-p file)))
(temp-file-name-prefix (file-name-nondirectory file)))
(cond ((not (file-readable-p file))
(user-error "File `%s' does not exist or is not readable" file))
diff --git a/lisp/vc/emerge.el b/lisp/vc/emerge.el
index 422ed5c0a4d..de09be80e7c 100644
--- a/lisp/vc/emerge.el
+++ b/lisp/vc/emerge.el
@@ -2942,6 +2942,7 @@ If some prefix of KEY has a non-prefix definition, it is redefined."
;; Define a key if it (or a prefix) is not already defined in the map.
(defun emerge-define-key-if-possible (keymap key definition)
+ (declare (obsolete keymap-set "29.1"))
;; look up the present definition of the key
(let ((present (lookup-key keymap key)))
(if (integerp present)
@@ -2959,6 +2960,7 @@ If some prefix of KEY has a non-prefix definition, it is redefined."
If the name won't fit on one line, the minibuffer is expanded to hold it,
and the command waits for a keystroke from the user. If the keystroke is
SPC, it is ignored; if it is anything else, it is processed as a command."
+ (declare (obsolete nil "29.1"))
(interactive)
(let ((name (buffer-file-name)))
(or name
diff --git a/lisp/vc/pcvs-util.el b/lisp/vc/pcvs-util.el
index 702033dd88a..89f8d26880b 100644
--- a/lisp/vc/pcvs-util.el
+++ b/lisp/vc/pcvs-util.el
@@ -38,6 +38,7 @@
(apply #'append (mapcar (lambda (x) (if (listp x) x (list x))) xs)))
(defun cvs-first (l &optional n)
+ ;; FIXME: Replace this with `seq-take'?
(if (null n) (car l)
(when l
(let* ((nl (list (pop l)))
@@ -53,10 +54,9 @@
The function returns a `cons' cell where the `car' contains
elements of L for which P is true while the `cdr' contains
the other elements. The ordering among elements is maintained."
- (let (car cdr)
- (dolist (x l)
- (if (funcall p x) (push x car) (push x cdr)))
- (cons (nreverse car) (nreverse cdr))))
+ (let ((res (seq-group-by p l)))
+ (cons (cdr (assq t res))
+ (cdr (assq nil res)))))
;;;
;;; frame, window, buffer handling
diff --git a/lisp/vc/vc-annotate.el b/lisp/vc/vc-annotate.el
index 1f19c4cfe26..a15cf417de3 100644
--- a/lisp/vc/vc-annotate.el
+++ b/lisp/vc/vc-annotate.el
@@ -162,22 +162,20 @@ List of factors, used to expand/compress the time scale. See `vc-annotate'."
:type '(repeat number)
:group 'vc)
-(defvar vc-annotate-mode-map
- (let ((m (make-sparse-keymap)))
- (define-key m "a" #'vc-annotate-revision-previous-to-line)
- (define-key m "d" #'vc-annotate-show-diff-revision-at-line)
- (define-key m "=" #'vc-annotate-show-diff-revision-at-line)
- (define-key m "D" #'vc-annotate-show-changeset-diff-revision-at-line)
- (define-key m "f" #'vc-annotate-find-revision-at-line)
- (define-key m "j" #'vc-annotate-revision-at-line)
- (define-key m "l" #'vc-annotate-show-log-revision-at-line)
- (define-key m "n" #'vc-annotate-next-revision)
- (define-key m "p" #'vc-annotate-prev-revision)
- (define-key m "w" #'vc-annotate-working-revision)
- (define-key m "v" #'vc-annotate-toggle-annotation-visibility)
- (define-key m "\C-m" #'vc-annotate-goto-line)
- m)
- "Local keymap used for VC-Annotate mode.")
+(defvar-keymap vc-annotate-mode-map
+ :doc "Local keymap used for VC-Annotate mode."
+ "a" #'vc-annotate-revision-previous-to-line
+ "d" #'vc-annotate-show-diff-revision-at-line
+ "=" #'vc-annotate-show-diff-revision-at-line
+ "D" #'vc-annotate-show-changeset-diff-revision-at-line
+ "f" #'vc-annotate-find-revision-at-line
+ "j" #'vc-annotate-revision-at-line
+ "l" #'vc-annotate-show-log-revision-at-line
+ "n" #'vc-annotate-next-revision
+ "p" #'vc-annotate-prev-revision
+ "w" #'vc-annotate-working-revision
+ "v" #'vc-annotate-toggle-annotation-visibility
+ "RET" #'vc-annotate-goto-line)
;;; Annotate functionality
diff --git a/lisp/vc/vc-bzr.el b/lisp/vc/vc-bzr.el
index 072bd72b441..f6b17d4ce09 100644
--- a/lisp/vc/vc-bzr.el
+++ b/lisp/vc/vc-bzr.el
@@ -1008,19 +1008,17 @@ stream. Standard error output is discarded."
;; frob the results accordingly.
(file-relative-name dir (vc-bzr-root dir)))))
-(defvar vc-bzr-shelve-map
- (let ((map (make-sparse-keymap)))
- ;; Turn off vc-dir marking
- (define-key map [mouse-2] #'ignore)
-
- (define-key map [down-mouse-3] #'vc-bzr-shelve-menu)
- (define-key map "\C-k" #'vc-bzr-shelve-delete-at-point)
- (define-key map "=" #'vc-bzr-shelve-show-at-point)
- (define-key map "\C-m" #'vc-bzr-shelve-show-at-point)
- (define-key map "A" #'vc-bzr-shelve-apply-and-keep-at-point)
- (define-key map "P" #'vc-bzr-shelve-apply-at-point)
- (define-key map "S" #'vc-bzr-shelve-snapshot)
- map))
+(defvar-keymap vc-bzr-shelve-map
+ ;; Turn off vc-dir marking
+ "<mouse-2>" #'ignore
+
+ "<down-mouse-3>" #'vc-bzr-shelve-menu
+ "C-k" #'vc-bzr-shelve-delete-at-point
+ "=" #'vc-bzr-shelve-show-at-point
+ "RET" #'vc-bzr-shelve-show-at-point
+ "A" #'vc-bzr-shelve-apply-and-keep-at-point
+ "P" #'vc-bzr-shelve-apply-at-point
+ "S" #'vc-bzr-shelve-snapshot)
(defvar vc-bzr-shelve-menu-map
(let ((map (make-sparse-keymap "Bzr Shelve")))
diff --git a/lisp/vc/vc-cvs.el b/lisp/vc/vc-cvs.el
index 1f81ff2e0fe..52cc42791fa 100644
--- a/lisp/vc/vc-cvs.el
+++ b/lisp/vc/vc-cvs.el
@@ -250,7 +250,7 @@ See also variable `vc-cvs-sticky-date-format-string'."
(let ((checkout-time (vc-file-getprop file 'vc-checkout-time))
(lastmod (file-attribute-modification-time (file-attributes file))))
(cond
- ((equal checkout-time lastmod) 'up-to-date)
+ ((time-equal-p checkout-time lastmod) 'up-to-date)
((string= (vc-working-revision file) "0") 'added)
((null checkout-time) 'unregistered)
(t 'edited))))
diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el
index 9335da10065..068a66b25b8 100644
--- a/lisp/vc/vc-dir.el
+++ b/lisp/vc/vc-dir.el
@@ -1467,17 +1467,13 @@ These are the commands available for use in the file status buffer:
(propertize "Please add backend specific headers here. It's easy!"
'face 'vc-dir-status-warning)))
-(defvar vc-dir-status-mouse-map
- (let ((map (make-sparse-keymap)))
- (define-key map [mouse-2] #'vc-dir-toggle-mark)
- map)
- "Local keymap for toggling mark.")
+(defvar-keymap vc-dir-status-mouse-map
+ :doc "Local keymap for toggling mark."
+ "<mouse-2>" #'vc-dir-toggle-mark)
-(defvar vc-dir-filename-mouse-map
- (let ((map (make-sparse-keymap)))
- (define-key map [mouse-2] #'vc-dir-find-file-other-window)
- map)
- "Local keymap for visiting a file.")
+(defvar-keymap vc-dir-filename-mouse-map
+ :doc "Local keymap for visiting a file."
+ "<mouse-2>" #'vc-dir-find-file-other-window)
(defun vc-default-dir-printer (_backend fileentry)
"Pretty print FILEENTRY."
diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el
index 5c664d58f1a..e2a490092b5 100644
--- a/lisp/vc/vc-dispatcher.el
+++ b/lisp/vc/vc-dispatcher.el
@@ -636,23 +636,23 @@ NOT-URGENT means it is ok to continue if the user says not to save."
(and (local-variable-p 'vc-log-fileset)
(not (equal vc-log-fileset fileset))))
`((log-edit-listfun
- . (lambda ()
- ;; FIXME: When fileset includes directories, and
- ;; there are relevant ChangeLog files inside their
- ;; children, we don't find them. Either handle it
- ;; in `log-edit-insert-changelog-entries' by
- ;; walking down the file trees, or somehow pass
- ;; `fileset-only-files' from `vc-next-action'
- ;; through to this function.
- (let ((root (vc-root-dir)))
- ;; Returns paths relative to the root, so that
- ;; `log-edit-changelog-insert-entries'
- ;; substitutes them in correctly later, even when
- ;; `vc-checkin' was called from a file buffer, or
- ;; a non-root VC-Dir buffer.
- (mapcar
- (lambda (file) (file-relative-name file root))
- ',fileset))))
+ . ,(lambda ()
+ ;; FIXME: When fileset includes directories, and
+ ;; there are relevant ChangeLog files inside their
+ ;; children, we don't find them. Either handle it
+ ;; in `log-edit-insert-changelog-entries' by
+ ;; walking down the file trees, or somehow pass
+ ;; `fileset-only-files' from `vc-next-action'
+ ;; through to this function.
+ (let ((root (vc-root-dir)))
+ ;; Returns paths relative to the root, so that
+ ;; `log-edit-changelog-insert-entries'
+ ;; substitutes them in correctly later, even when
+ ;; `vc-checkin' was called from a file buffer, or
+ ;; a non-root VC-Dir buffer.
+ (mapcar
+ (lambda (file) (file-relative-name file root))
+ fileset))))
(log-edit-diff-function . vc-diff)
(log-edit-vc-backend . ,backend)
(vc-log-fileset . ,fileset))
@@ -761,8 +761,7 @@ the buffer contents as a comment."
;; (while (and (not member) fileset)
;; (let ((elem (pop fileset)))
;; (if (if (file-directory-p elem)
-;; (eq t (compare-strings buffer-file-name nil (length elem)
-;; elem nil nil))
+;; (string-prefix-p elem buffer-file-name)
;; (eq (current-buffer) (get-file-buffer elem)))
;; (setq member t))))
;; member))
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index 8937454d111..46a486a46c3 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -664,32 +664,26 @@ or an empty string if none."
:files files
:update-function update-function)))
-(defvar vc-git-stash-shared-map
- (let ((map (make-sparse-keymap)))
- (define-key map "S" #'vc-git-stash-snapshot)
- (define-key map "C" #'vc-git-stash)
- map))
-
-(defvar vc-git-stash-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map vc-git-stash-shared-map)
- ;; Turn off vc-dir marking
- (define-key map [mouse-2] #'ignore)
-
- (define-key map [down-mouse-3] #'vc-git-stash-menu)
- (define-key map "\C-k" #'vc-git-stash-delete-at-point)
- (define-key map "=" #'vc-git-stash-show-at-point)
- (define-key map "\C-m" #'vc-git-stash-show-at-point)
- (define-key map "A" #'vc-git-stash-apply-at-point)
- (define-key map "P" #'vc-git-stash-pop-at-point)
- map))
-
-(defvar vc-git-stash-button-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map vc-git-stash-shared-map)
- (define-key map [mouse-2] #'push-button)
- (define-key map "\C-m" #'push-button)
- map))
+(defvar-keymap vc-git-stash-shared-map
+ "S" #'vc-git-stash-snapshot
+ "C" #'vc-git-stash)
+
+(defvar-keymap vc-git-stash-map
+ :parent vc-git-stash-shared-map
+ ;; Turn off vc-dir marking
+ "<mouse-2>" #'ignore
+
+ "<down-mouse-3>" #'vc-git-stash-menu
+ "C-k" #'vc-git-stash-delete-at-point
+ "=" #'vc-git-stash-show-at-point
+ "RET" #'vc-git-stash-show-at-point
+ "A" #'vc-git-stash-apply-at-point
+ "P" #'vc-git-stash-pop-at-point)
+
+(defvar-keymap vc-git-stash-button-map
+ :parent vc-git-stash-shared-map
+ "<mouse-2>" #'push-button
+ "RET" #'push-button)
(defconst vc-git-stash-shared-help
"\\<vc-git-stash-shared-map>\\[vc-git-stash]: Create named stash\n\\[vc-git-stash-snapshot]: Snapshot stash")
@@ -910,12 +904,11 @@ If toggling on, also insert its message into the buffer."
standard-output 1 nil
"log" "--max-count=1" "--pretty=format:%B" "HEAD")))))
-(defvar vc-git-log-edit-mode-map
- (let ((map (make-sparse-keymap "Git-Log-Edit")))
- (define-key map "\C-c\C-s" #'vc-git-log-edit-toggle-signoff)
- (define-key map "\C-c\C-n" #'vc-git-log-edit-toggle-no-verify)
- (define-key map "\C-c\C-e" #'vc-git-log-edit-toggle-amend)
- map))
+(defvar-keymap vc-git-log-edit-mode-map
+ :name "Git-Log-Edit"
+ "C-c C-s" #'vc-git-log-edit-toggle-signoff
+ "C-c C-n" #'vc-git-log-edit-toggle-no-verify
+ "C-c C-e" #'vc-git-log-edit-toggle-amend)
(define-derived-mode vc-git-log-edit-mode log-edit-mode "Log-Edit/git"
"Major mode for editing Git log messages.
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el
index 026f125396e..61976288e35 100644
--- a/lisp/vc/vc-hg.el
+++ b/lisp/vc/vc-hg.el
@@ -966,7 +966,7 @@ REPO must be the directory name of an hg repository."
(attr (file-attributes (nth 0 fs)))
(current-mtime (file-attribute-modification-time attr))
(current-size (file-attribute-size attr)))
- (unless (and (equal saved-mtime current-mtime)
+ (unless (and (time-equal-p saved-mtime current-mtime)
(equal saved-size current-size))
(setf valid nil))))
valid))
@@ -1037,7 +1037,7 @@ Avoids the need to repeatedly scan dirstate on repeated calls to
)
(if (and cache
(equal dirstate (pop cache))
- (equal mtime (pop cache))
+ (time-equal-p mtime (pop cache))
(equal size (pop cache))
(equal ascii-fname (pop cache)))
(pop cache)
@@ -1177,10 +1177,9 @@ If toggling on, also insert its message into the buffer."
standard-output 1 nil
"log" "--limit=1" "--template" "{desc}")))))
-(defvar vc-hg-log-edit-mode-map
- (let ((map (make-sparse-keymap "Hg-Log-Edit")))
- (define-key map "\C-c\C-e" #'vc-hg-log-edit-toggle-amend)
- map))
+(defvar-keymap vc-hg-log-edit-mode-map
+ :name "Hg-Log-Edit"
+ "C-c C-e" #'vc-hg-log-edit-toggle-amend)
(define-derived-mode vc-hg-log-edit-mode log-edit-mode "Log-Edit/hg"
"Major mode for editing Hg log messages.
@@ -1262,9 +1261,7 @@ REV is the revision to check out into WORKFILE."
;;; Hg specific functionality.
-(defvar vc-hg-extra-menu-map
- (let ((map (make-sparse-keymap)))
- map))
+(defvar-keymap vc-hg-extra-menu-map)
(defun vc-hg-extra-menu () vc-hg-extra-menu-map)
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
index 80508570f32..1f0eeb7e18a 100644
--- a/lisp/vc/vc-hooks.el
+++ b/lisp/vc/vc-hooks.el
@@ -631,9 +631,10 @@ Before doing that, check if there are any old backups and get rid of them."
(cond
((null backend))
((eq (vc-checkout-model backend (list file)) 'implicit)
- ;; If the file was saved in the same second in which it was
+ ;; If the file was saved at the same time that it was
;; checked out, clear the checkout-time to avoid confusion.
- (if (equal (vc-file-getprop file 'vc-checkout-time)
+ (if (time-equal-p
+ (vc-file-getprop file 'vc-checkout-time)
(file-attribute-modification-time (file-attributes file)))
(vc-file-setprop file 'vc-checkout-time nil))
(if (vc-state-refresh file backend)
@@ -854,38 +855,37 @@ In the latter case, VC mode is deactivated for this buffer."
;; Autoloading works fine, but it prevents shortcuts from appearing
;; in the menu because they don't exist yet when the menu is built.
;; (autoload 'vc-prefix-map "vc" nil nil 'keymap)
-(defvar vc-prefix-map
- (let ((map (make-sparse-keymap)))
- (define-key map "a" #'vc-update-change-log)
- (with-suppressed-warnings ((obsolete vc-switch-backend))
- (define-key map "b" #'vc-switch-backend))
- (define-key map "d" #'vc-dir)
- (define-key map "g" #'vc-annotate)
- (define-key map "G" #'vc-ignore)
- (define-key map "h" #'vc-region-history)
- (define-key map "i" #'vc-register)
- (define-key map "l" #'vc-print-log)
- (define-key map "L" #'vc-print-root-log)
- (define-key map "I" #'vc-log-incoming)
- (define-key map "O" #'vc-log-outgoing)
- (define-key map "ML" #'vc-log-mergebase)
- (define-key map "MD" #'vc-diff-mergebase)
- (define-key map "m" #'vc-merge)
- (define-key map "r" #'vc-retrieve-tag)
- (define-key map "s" #'vc-create-tag)
- (define-key map "u" #'vc-revert)
- (define-key map "v" #'vc-next-action)
- (define-key map "+" #'vc-update)
- ;; I'd prefer some kind of symmetry with vc-update:
- (define-key map "P" #'vc-push)
- (define-key map "=" #'vc-diff)
- (define-key map "D" #'vc-root-diff)
- (define-key map "~" #'vc-revision-other-window)
- (define-key map "x" #'vc-delete-file)
- map))
+(defvar-keymap vc-prefix-map
+ "a" #'vc-update-change-log
+ "d" #'vc-dir
+ "g" #'vc-annotate
+ "G" #'vc-ignore
+ "h" #'vc-region-history
+ "i" #'vc-register
+ "l" #'vc-print-log
+ "L" #'vc-print-root-log
+ "I" #'vc-log-incoming
+ "O" #'vc-log-outgoing
+ "M L" #'vc-log-mergebase
+ "M D" #'vc-diff-mergebase
+ "m" #'vc-merge
+ "r" #'vc-retrieve-tag
+ "s" #'vc-create-tag
+ "u" #'vc-revert
+ "v" #'vc-next-action
+ "+" #'vc-update
+ ;; I'd prefer some kind of symmetry with vc-update:
+ "P" #'vc-push
+ "=" #'vc-diff
+ "D" #'vc-root-diff
+ "~" #'vc-revision-other-window
+ "x" #'vc-delete-file)
(fset 'vc-prefix-map vc-prefix-map)
(define-key ctl-x-map "v" 'vc-prefix-map)
+(with-suppressed-warnings ((obsolete vc-switch-backend))
+ (keymap-set vc-prefix-map "b" #'vc-switch-backend))
+
(defvar vc-menu-map
(let ((map (make-sparse-keymap "Version Control")))
;;(define-key map [show-files]
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index d3e53858c16..b05adfb2d54 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -419,7 +419,7 @@
;; AND you'd like the current time considered to be anything besides
;; (vc-annotate-convert-time (current-time)) -- i.e. the current
;; time with hours, minutes, and seconds included. Probably safe to
-;; ignore. Return the current-time, in units of fractional days.
+;; ignore. Return the current time, in units of fractional days.
;;
;; - annotate-extract-revision-at-line ()
;;
diff --git a/lisp/wdired.el b/lisp/wdired.el
index a5858ed190e..106d57174d5 100644
--- a/lisp/wdired.el
+++ b/lisp/wdired.el
@@ -902,7 +902,6 @@ Like original function but it skips read-only words."
"x" #'wdired-set-bit
"-" #'wdired-set-bit
"S" #'wdired-set-bit
- "s" #'wdired-set-bit
"T" #'wdired-set-bit
"t" #'wdired-set-bit
"s" #'wdired-set-bit
diff --git a/lisp/whitespace.el b/lisp/whitespace.el
index 240f99effc2..41b0a34f9ea 100644
--- a/lisp/whitespace.el
+++ b/lisp/whitespace.el
@@ -2403,9 +2403,11 @@ to `indent-tabs-mode' and `tab-width'."
;; Remember whether a buffer has a local display table.
(unless whitespace-display-table-was-local
(setq whitespace-display-table-was-local t)
- (unless (or whitespace-mode global-whitespace-mode)
- (setq whitespace-display-table
- (copy-sequence buffer-display-table)))
+ ;; Save the old table so we can restore it when
+ ;; `whitespace-mode' is switched off again.
+ (when (or whitespace-mode global-whitespace-mode)
+ (setq whitespace-display-table
+ (copy-sequence buffer-display-table)))
;; Assure `buffer-display-table' is unique
;; when two or more windows are visible.
(setq buffer-display-table
diff --git a/lisp/wid-browse.el b/lisp/wid-browse.el
index e71e8cd4935..7fc476e5dfd 100644
--- a/lisp/wid-browse.el
+++ b/lisp/wid-browse.el
@@ -1,6 +1,6 @@
;;; wid-browse.el --- functions for browsing widgets -*- lexical-binding: t -*-
-;; Copyright (C) 1997, 2001-2022 Free Software Foundation, Inc.
+;; Copyright (C) 1997-2022 Free Software Foundation, Inc.
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: extensions
@@ -118,13 +118,6 @@ The following commands are available:
(switch-to-buffer (get-buffer-create "*Browse Widget*")))
(widget-browse-mode)
- ;; Quick way to get out.
-;; (widget-create 'push-button
-;; :action (lambda (widget &optional event)
-;; (bury-buffer))
-;; "Quit")
-;; (widget-insert "\n")
-
;; Top text indicating whether it is a class or object browser.
(if (listp widget)
(widget-insert "Widget object browser.\n\nClass: ")
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index 53626182470..ec2eb146e90 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -3043,12 +3043,10 @@ The following properties have special meanings for this widget:
:on "Hide"
:off-glyph "right"
:off "Show"
- :value-create 'widget-visibility-value-create
+ :value-create 'widget-toggle-value-create
:action 'widget-toggle-action
:match (lambda (_widget _value) t))
-(defalias 'widget-visibility-value-create 'widget-toggle-value-create)
-
;;; The `documentation-link' Widget.
;;
;; This is a helper widget for `documentation-string'.
@@ -4143,9 +4141,9 @@ is inline."
(setq help-echo (funcall help-echo widget)))
(if help-echo (message "%s" (eval help-echo)))))
-;;; Obsolete.
-
(define-obsolete-function-alias 'widget-sublist #'seq-subseq "28.1")
+(define-obsolete-function-alias 'widget-visibility-value-create
+ #'widget-toggle-value-create "29.1")
(provide 'wid-edit)
diff --git a/lisp/windmove.el b/lisp/windmove.el
index 369c32c8919..00e76df0a01 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -1,13 +1,13 @@
;;; windmove.el --- directional window-selection routines -*- lexical-binding:t -*-
-;;
+
;; Copyright (C) 1998-2022 Free Software Foundation, Inc.
-;;
-;; Author: Hovav Shacham (hovav@cs.stanford.edu)
+
+;; Author: Hovav Shacham <hovav@cs.stanford.edu>
;; Created: 17 October 1998
;; Keywords: window, movement, convenience
-;;
+
;; This file is part of GNU Emacs.
-;;
+
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
@@ -20,8 +20,6 @@
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-;;
-;; --------------------------------------------------------------------
;;; Commentary:
;;
@@ -445,8 +443,8 @@ unless `windmove-create-window' is non-nil and a new window is created."
;; I don't think these bindings will work on non-X terminals; you
;; probably want to use different bindings in that case.
-(defvar windmove-mode-map (make-sparse-keymap)
- "Map used by `windmove-install-defaults'.")
+(defvar-keymap windmove-mode-map
+ :doc "Map used by `windmove-install-defaults'.")
;;;###autoload
(define-minor-mode windmove-mode
diff --git a/lisp/woman.el b/lisp/woman.el
index c74faa8af48..7f494a3b686 100644
--- a/lisp/woman.el
+++ b/lisp/woman.el
@@ -84,9 +84,7 @@
;; for temporary files outside the standard UN*X manual directory
;; structure.
-;; Or (3): Put the next two sexpr's in your .emacs:
-;; (autoload 'woman-dired-find-file "woman"
-;; "In dired, run the WoMan man-page browser on this file." t)
+;; Or (3): Put this in your init file:
;; (add-hook 'dired-mode-hook
;; (lambda ()
;; (define-key dired-mode-map "W" 'woman-dired-find-file)))
@@ -783,7 +781,7 @@ Built automatically from the customizable user options
(defvar woman-uncompressed-file-regexp) ; for the compiler
(defvar woman-file-compression-regexp) ; for the compiler
-(defun set-woman-file-regexp (symbol value)
+(defun woman-set-file-regexp (symbol value)
"Bind SYMBOL to VALUE and set `woman-file-regexp' as per user customizations.
Used as :set cookie by Customize when customizing the user options
`woman-uncompressed-file-regexp' and `woman-file-compression-regexp'."
@@ -808,7 +806,7 @@ in the ncurses package include `toe.1m', `form.3x', etc.
Note: an optional compression regexp will be appended, so this regexp
MUST NOT end with any kind of string terminator such as $ or \\\\='."
:type 'regexp
- :set #'set-woman-file-regexp
+ :set #'woman-set-file-regexp
:group 'woman-interface)
(defcustom woman-file-compression-regexp
@@ -824,7 +822,7 @@ Should begin with \\. and end with \\\\=' and MUST NOT be optional."
;; not loaded by default!
:version "24.1" ; added xz
:type 'regexp
- :set #'set-woman-file-regexp
+ :set #'woman-set-file-regexp
:group 'woman-interface)
(defcustom woman-use-own-frame nil
@@ -904,7 +902,7 @@ Troff emulation is experimental and largely untested.
(defcustom woman-fontify
(or (display-color-p)
(display-graphic-p)
- (x-display-color-p))
+ (display-color-p))
"If non-nil then WoMan assumes that face support is available.
It defaults to a non-nil value if the display supports either colors
or different fonts."
@@ -4582,11 +4580,11 @@ logging the message."
(put 'woman-bookmark-jump 'bookmark-handler-type "WoMan")
-;; Obsolete.
-
(defvar woman-version "0.551 (beta)" "WoMan version information.")
(make-obsolete-variable 'woman-version 'emacs-version "28.1")
+(define-obsolete-function-alias 'set-woman-file-regexp 'woman-set-file-regexp "29.1")
+
(provide 'woman)
;;; woman.el ends here
diff --git a/lisp/x-dnd.el b/lisp/x-dnd.el
index 92899e7a0c6..2bda67fe3f3 100644
--- a/lisp/x-dnd.el
+++ b/lisp/x-dnd.el
@@ -194,7 +194,8 @@ any protocol specific data.")
(defun x-dnd-init-frame (&optional frame)
"Setup drag and drop for FRAME (i.e. create appropriate properties)."
- (when (eq 'x (window-system frame))
+ (when (and (eq 'x (window-system frame))
+ (not (frame-parameter frame 'tooltip)))
(let ((x-fast-protocol-requests (not x-dnd-debug-errors)))
(x-register-dnd-atom "DndProtocol" frame)
(x-register-dnd-atom "_MOTIF_DRAG_AND_DROP_MESSAGE" frame)
@@ -588,6 +589,7 @@ message (format 32) that caused EVENT to be generated."
(declare-function x-change-window-property "xfns.c"
(prop value &optional frame type format outer-P window-id))
+(declare-function x-translate-coordinates "xfns.c")
(defun x-dnd-init-xdnd-for-frame (frame)
"Set the XdndAware property for FRAME to indicate that we do XDND."
@@ -595,39 +597,93 @@ message (format 32) that caused EVENT to be generated."
'(5) ;; The version of XDND we support.
frame "ATOM" 32 t))
-(defun x-dnd-get-drop-width-height (frame w accept)
- "Return the width/height to be sent in a XdndStatus message.
-FRAME is the frame and W is the window where the drop happened.
-If ACCEPT is nil return 0 (empty rectangle),
-otherwise if W is a window, return its width/height,
-otherwise return the frame width/height."
- (if accept
- (if (windowp w) ;; w is not a window if dropping on the menu bar,
- ;; scroll bar or tool bar.
- (let ((edges (window-inside-pixel-edges w)))
- (cons
- (- (nth 2 edges) (nth 0 edges)) ;; right - left
- (- (nth 3 edges) (nth 1 edges)))) ;; bottom - top
- (cons (frame-pixel-width frame)
- (frame-pixel-height frame)))
- 0))
-
-(defun x-dnd-get-drop-x-y (frame w)
- "Return the x/y coordinates to be sent in a XdndStatus message.
-Coordinates are required to be absolute.
-FRAME is the frame and W is the window where the drop happened.
-If W is a window, return its absolute coordinates,
-otherwise return the frame coordinates."
- (let* ((frame-left (or (car-safe (cdr-safe (frame-parameter frame 'left)))
- (frame-parameter frame 'left)))
- (frame-top (or (car-safe (cdr-safe (frame-parameter frame 'top)))
- (frame-parameter frame 'top))))
- (if (windowp w)
- (let ((edges (window-inside-pixel-edges w)))
- (cons
- (+ frame-left (nth 0 edges))
- (+ frame-top (nth 1 edges))))
- (cons frame-left frame-top))))
+(defun x-dnd-after-move-frame (frame)
+ "Handle FRAME moving to a different position.
+Clear any cached root window position."
+ (set-frame-parameter frame 'dnd-root-window-position
+ nil))
+
+(add-hook 'move-frame-functions #'x-dnd-after-move-frame)
+
+(defun x-dnd-compute-root-window-position (frame)
+ "Return the position of FRAME's edit widget relative to the root window.
+The value is a cons of (X . Y), describing the position of
+FRAME's edit widget (inner window) relative to the root window of
+its screen."
+ (or (frame-parameter frame 'dnd-root-window-position)
+ (let* ((result (x-translate-coordinates frame))
+ (param (cons (car result) (cadr result))))
+ (unless result
+ (error "Frame isn't on the same screen as its root window"))
+ (prog1 param
+ (set-frame-parameter frame 'dnd-root-window-position param)))))
+
+(defun x-dnd-get-window-rectangle (window)
+ "Return the bounds of WINDOW as a rectangle.
+The coordinates in the rectangle are relative to its frame's root
+window. Return the bounds as a list of (X Y WIDTH HEIGHT)."
+ (let* ((frame (window-frame window))
+ (frame-pos (x-dnd-compute-root-window-position frame))
+ (edges (window-inside-pixel-edges window)))
+ (list (+ (car frame-pos) (nth 0 edges))
+ (+ (cdr frame-pos) (nth 1 edges))
+ (- (nth 2 edges) (nth 0 edges))
+ (- (nth 3 edges) (nth 1 edges)))))
+
+(defun x-dnd-intersect-rectangles (r1 r2)
+ "Return the intersection of R1 and R2, both rectangles."
+ (let ((left (if (< (car r1) (car r2)) r1 r2))
+ (right (if (> (car r2) (car r1)) r2 r1))
+ (upper (if (< (cadr r1) (cadr r2)) r1 r2))
+ (lower (if (> (cadr r2) (cadr r1)) r2 r1))
+ (result (list 0 0 0 0)))
+ (when (<= (car right) (+ (car left) (nth 2 left)))
+ (setcar result (car right))
+ (setcar (nthcdr 2 result)
+ (- (min (+ (car left) (nth 2 left))
+ (+ (car right) (nth 2 right)))
+ (car result)))
+ (when (<= (cadr lower) (+ (cadr upper) (nth 3 upper)))
+ (setcar (cdr result) (cadr lower))
+ (setcar (nthcdr 3 result)
+ (- (min (+ (cadr lower) (nth 3 lower))
+ (+ (cadr upper) (nth 3 upper)))
+ (cadr result)))))
+ result))
+
+(defun x-dnd-get-object-rectangle (window posn)
+ "Return the rectangle of the object (character or image) under POSN.
+WINDOW is the window POSN represents. The rectangle is returned
+with coordinates relative to the root window."
+ (if (posn-point posn)
+ (with-selected-window window
+ (if-let* ((new-posn (posn-at-point (posn-point posn)))
+ (posn-x-y (posn-x-y new-posn))
+ (object-width-height (posn-object-width-height new-posn))
+ (edges (window-inside-pixel-edges window))
+ (frame-pos (x-dnd-compute-root-window-position
+ (window-frame window))))
+ (list (+ (car frame-pos) (car posn-x-y)
+ (car edges))
+ (+ (cdr frame-pos) (cdr posn-x-y)
+ (cadr edges))
+ (car object-width-height)
+ (cdr object-width-height))
+ '(0 0 0 0)))
+ '(0 0 0 0)))
+
+(defun x-dnd-get-drop-rectangle (window posn)
+ "Return the drag-and-drop rectangle at POSN on WINDOW."
+ (if (or dnd-scroll-margin
+ (not (windowp window)))
+ '(0 0 0 0)
+ (let ((window-rectangle (x-dnd-get-window-rectangle window))
+ object-rectangle)
+ (when dnd-indicate-insertion-point
+ (setq object-rectangle (x-dnd-get-object-rectangle window posn)
+ window-rectangle (x-dnd-intersect-rectangles object-rectangle
+ window-rectangle)))
+ window-rectangle)))
(declare-function x-get-atom-name "xselect.c" (value &optional frame))
(declare-function x-send-client-message "xselect.c"
@@ -641,11 +697,133 @@ otherwise return the frame coordinates."
"Return the nmore-than3 bit from the 32 bit FLAGS in an XDndEnter message."
(logand flags 1))
+(declare-function x-get-modifier-masks "xfns.c")
+
+(defun x-dnd-modifier-mask (mods)
+ "Return the X modifier mask for the Emacs modifier state MODS.
+MODS is a single symbol, or a list of symbols such as `shift' or
+`control'."
+ (let ((virtual-modifiers (x-get-modifier-masks))
+ (mask 0))
+ (unless (consp mods)
+ (setq mods (list mods)))
+ (dolist (modifier mods)
+ (cond ((eq modifier 'shift)
+ (setq mask (logior mask 1))) ; ShiftMask
+ ((eq modifier 'control)
+ (setq mask (logior mask 4))) ; ControlMask
+ ((eq modifier 'meta)
+ (setq mask (logior mask (nth 4 virtual-modifiers))))
+ ((eq modifier 'hyper)
+ (setq mask (car virtual-modifiers)))
+ ((eq modifier 'super)
+ (setq mask (cadr virtual-modifiers)))
+ ((eq modifier 'alt)
+ (setq mask (nth 2 virtual-modifiers)))))
+ mask))
+
+(defun x-dnd-get-modifiers ()
+ "Obtain an X modifier mask containing all modifiers.
+Value is an X modifier mask containing all modifiers that can
+modify an Emacs keyboard or mouse event."
+ (let ((mods (x-get-modifier-masks))
+ (mask 5)) ; ShiftMask | ControlMask
+ (dolist (mod mods)
+ (setq mask (logior mask mod)))
+ mask))
+
+(defun x-dnd-wheel-modifier-type (flags)
+ "Return the modifier type of an X modifier mask.
+FLAGS is the X modifier mask of a turn of the mouse wheel."
+ (let ((modifiers (x-dnd-get-modifiers)))
+ (catch 'type
+ (dolist (modifier mouse-wheel-scroll-amount)
+ (when (and (consp modifier)
+ (eq (x-dnd-modifier-mask (car modifier))
+ (logand flags modifiers)))
+ (throw 'type (cdr modifier))))
+ nil)))
+
+(defvar x-dnd-click-count nil
+ "Alist of button numbers to click counters during drag-and-drop.
+The cdr of each association's cdr is the timestamp of the last
+button press event for the given button, and the car is the
+number of clicks in quick succession currently received.")
+
+(defun x-dnd-note-click (button timestamp)
+ "Note that button BUTTON was pressed at TIMESTAMP during drag-and-drop.
+Return the number of clicks that were made in quick succession."
+ (if (not (integerp double-click-time))
+ 1
+ (let ((cell (cdr (assq button x-dnd-click-count))))
+ (unless cell
+ (setq cell (cons 0 timestamp))
+ (push (cons button cell)
+ x-dnd-click-count))
+ (when (< (cdr cell) (- timestamp double-click-time))
+ (setcar cell 0))
+ (setcar cell (1+ (car cell)))
+ (setcdr cell timestamp)
+ (car cell))))
+
+(defun x-dnd-mwheel-scroll (button count modifiers)
+ "Call the appropriate wheel scrolling function for BUTTON.
+Use MODIFIERS, an X modifier mask, to determine if any
+alternative operation (such as scrolling horizontally) should be
+taken. COUNT is the number of times in quick succession BUTTON
+has been pressed."
+ (let* ((type (x-dnd-wheel-modifier-type modifiers))
+ (hscroll (eq type 'hscroll))
+ (amt (or (and (not mouse-wheel-progressive-speed) 1)
+ (* 1 count))))
+ (unless (and (not mouse-wheel-tilt-scroll)
+ (or (eq button 6) (eq button 7)))
+ (let ((function (cond ((eq type 'text-scale)
+ #'text-scale-adjust)
+ ((eq type 'global-text-scale)
+ #'global-text-scale-adjust)
+ ((eq button 4)
+ (if hscroll
+ mwheel-scroll-right-function
+ mwheel-scroll-down-function))
+ ((eq button 5)
+ (if hscroll
+ mwheel-scroll-left-function
+ mwheel-scroll-up-function))
+ ((eq button 6)
+ (if mouse-wheel-flip-direction
+ mwheel-scroll-right-function
+ mwheel-scroll-left-function))
+ ((eq button 7)
+ (if mouse-wheel-flip-direction
+ mwheel-scroll-left-function
+ mwheel-scroll-right-function)))))
+ ;; Button5 should decrease the text scale, not increase it.
+ (when (and (memq type '(text-scale global-text-scale))
+ (eq button 5))
+ (setq amt (- amt)))
+ (when function
+ (condition-case nil
+ ;; Don't overwrite any echo-area message that might
+ ;; already be shown, since this can be called from
+ ;; `x-begin-drag'.
+ (let ((inhibit-message t))
+ (funcall function amt))
+ ;; Do not error at buffer limits. Show a message instead.
+ ;; This is especially important here because signalling an
+ ;; error will mess up the drag-and-drop operation.
+ (beginning-of-buffer
+ (message (error-message-string '(beginning-of-buffer))))
+ (end-of-buffer
+ (message (error-message-string '(end-of-buffer))))))))))
+
(defun x-dnd-handle-xdnd (event frame window message _format data)
"Receive one XDND event (client message) and send the appropriate reply.
EVENT is the client message. FRAME is where the mouse is now.
WINDOW is the window within FRAME where the mouse is now.
-FORMAT is 32 (not used). MESSAGE is the data part of an XClientMessageEvent."
+DATA is the vector containing the data of the client message as a
+vector of cardinals.
+MESSAGE is the type of the ClientMessage that was sent."
(cond ((equal "XdndEnter" message)
(let* ((flags (aref data 1))
(version (x-dnd-version-from-flags flags))
@@ -664,55 +842,75 @@ FORMAT is 32 (not used). MESSAGE is the data part of an XClientMessageEvent."
version))))
((equal "XdndPosition" message)
- (let* ((state (x-dnd-get-state-for-frame window))
- (version (aref state 6))
- (action (if (< version 2) 'copy ; `copy' is the default action.
- (x-get-atom-name (aref data 4))))
- (dnd-source (aref data 0))
- (action-type (x-dnd-maybe-call-test-function
- window
- (cdr (assoc action x-dnd-xdnd-to-action)) t))
- (reply-action (car (rassoc
- ;; Mozilla and some other programs
- ;; support XDS, but only if we
- ;; reply with `copy'. We can
- ;; recognize these broken programs
- ;; by checking to see if
- ;; `XdndActionDirectSave' was
- ;; originally specified.
- (if (and (eq (car action-type)
- 'direct-save)
- (not (eq action 'direct-save)))
- 'copy
- (car action-type))
- x-dnd-xdnd-to-action)))
- (accept ;; 1 = accept, 0 = reject
- (if (and reply-action action-type
- ;; Only allow drops on the text area of a
- ;; window.
- (not (posn-area (event-start event))))
- 1 0))
- (list-to-send
- (list (string-to-number
- (frame-parameter frame 'outer-window-id))
- ;; 1 = accept, 0 = reject. 2 = "want position
- ;; updates even for movement inside the given
- ;; widget bounds".
- (+ (if dnd-indicate-insertion-point 2 0) accept)
- (x-dnd-get-drop-x-y frame window)
- (x-dnd-get-drop-width-height
- frame window (eq accept 1))
- ;; The no-toolkit Emacs build can actually
- ;; receive drops from programs that speak
- ;; versions of XDND earlier than 3 (such as
- ;; GNUstep), since the toplevel window is the
- ;; innermost window.
- (if (>= version 2)
- (or reply-action 0)
- 0))))
- (x-send-client-message
- frame dnd-source frame "XdndStatus" 32 list-to-send)
- (dnd-handle-movement (event-start event))))
+ ;; If (flags >> 10) & 1, then Emacs should scroll according
+ ;; to the button passed in bits 8 and 9, and the state passed
+ ;; in bits 0 to 7.
+ (let ((state (x-dnd-get-state-for-frame window)))
+ (when (windowp (posn-window (event-start event)))
+ (let ((flags (aref data 1))
+ (version (aref state 6)))
+ (when (not (zerop (logand (ash flags -10) 1)))
+ (let* ((button (+ 4 (logand (ash flags -8) #x3)))
+ (count (or (and (>= version 1)
+ (x-dnd-note-click button
+ (aref data 3)))
+ 1))
+ (state (logand flags #xff)))
+ (with-selected-window (posn-window (event-start event))
+ (x-dnd-mwheel-scroll button count state)
+ (let ((old-x-y (posn-x-y (event-start event))))
+ (setcar (cdr event)
+ (posn-at-x-y (max (car old-x-y) 0)
+ (max (cdr old-x-y) 0)))))))))
+ (let* ((version (aref state 6))
+ (action (if (< version 2) 'copy ; `copy' is the default action.
+ (x-get-atom-name (aref data 4))))
+ (dnd-source (aref data 0))
+ (action-type (x-dnd-maybe-call-test-function
+ window
+ (cdr (assoc action x-dnd-xdnd-to-action)) t))
+ (reply-action (car (rassoc
+ ;; Mozilla and some other programs
+ ;; support XDS, but only if we
+ ;; reply with `copy'. We can
+ ;; recognize these broken programs
+ ;; by checking to see if
+ ;; `XdndActionDirectSave' was
+ ;; originally specified.
+ (if (and (eq (car action-type)
+ 'direct-save)
+ (not (eq action 'direct-save)))
+ 'copy
+ (car action-type))
+ x-dnd-xdnd-to-action)))
+ (accept ;; 1 = accept, 0 = reject
+ (if (and reply-action action-type
+ ;; Only allow drops on the text area of a
+ ;; window.
+ (not (posn-area (event-start event))))
+ 1 0))
+ (rect (x-dnd-get-drop-rectangle window
+ (event-start event)))
+ (list-to-send
+ (list (string-to-number
+ (frame-parameter frame 'outer-window-id))
+ ;; 1 = accept, 0 = reject. 2 = "want position
+ ;; updates even for movement inside the given
+ ;; widget bounds".
+ accept
+ (cons (car rect) (cadr rect))
+ (cons (nth 2 rect) (nth 3 rect))
+ ;; The no-toolkit Emacs build can actually
+ ;; receive drops from programs that speak
+ ;; versions of XDND earlier than 3 (such as
+ ;; GNUstep), since the toplevel window is the
+ ;; innermost window.
+ (if (>= version 2)
+ (or reply-action 0)
+ 0))))
+ (x-send-client-message
+ frame dnd-source frame "XdndStatus" 32 list-to-send)
+ (dnd-handle-movement (event-start event)))))
((equal "XdndLeave" message)
(x-dnd-forget-drop window))
@@ -912,7 +1110,7 @@ Return a vector of atoms containing the selection targets."
(defun x-dnd-handle-motif (event frame window _message-atom _format data)
(let* ((message-type (cdr (assoc (logand (aref data 0) #x3f)
x-dnd-motif-message-types)))
- (initiator-p (eq (lsh (aref data 0) -7) 0))
+ (initiator-p (eq (ash (aref data 0) -7) 0))
(source-byteorder (aref data 1))
(my-byteorder (byteorder))
(source-flags (x-dnd-get-motif-value data 2 2 source-byteorder))
@@ -1243,6 +1441,11 @@ ACTION is the action given to `x-begin-drag'."
(defvar x-dnd-disable-motif-protocol)
(defvar x-dnd-use-unsupported-drop)
+(defvar x-dnd-xds-testing nil
+ "Whether or not XDS is being tested from ERT.
+When non-nil, throw errors from the `XdndDirectSave0' converters
+instead of returning \"E\".")
+
(defun x-dnd-handle-direct-save (_selection _type _value)
"Handle a selection request for `XdndDirectSave'."
(setq x-dnd-xds-performed t)
@@ -1257,18 +1460,27 @@ ACTION is the action given to `x-begin-drag'."
(dnd-get-local-file-name local-file-uri))))
(if (not local-name)
'(STRING . "F")
- (condition-case nil
- (progn
+ ;; We want errors to be signalled immediately during ERT
+ ;; testing, instead of being silently handled. (bug#56712)
+ (if x-dnd-xds-testing
+ (prog1 '(STRING . "S")
(copy-file x-dnd-xds-current-file
local-name t)
(when (equal x-dnd-xds-current-file
dnd-last-dragged-remote-file)
(dnd-remove-last-dragged-remote-file)))
- (:success '(STRING . "S"))
- (error '(STRING . "E"))))))
+ (condition-case nil
+ (progn
+ (copy-file x-dnd-xds-current-file
+ local-name t)
+ (when (equal x-dnd-xds-current-file
+ dnd-last-dragged-remote-file)
+ (dnd-remove-last-dragged-remote-file)))
+ (:success '(STRING . "S"))
+ (error '(STRING . "E")))))))
(defun x-dnd-handle-octet-stream (_selection _type _value)
- "Handle a selecton request for `application/octet-stream'.
+ "Handle a selection request for `application/octet-stream'.
Return the contents of the XDS file."
(cons 'application/octet-stream
(ignore-errors
@@ -1474,6 +1686,24 @@ VERSION is the version of the XDND protocol understood by SOURCE."
0
"XdndDirectSave0")))))))
+;; Internal wheel movement.
+
+(defvar x-dnd-wheel-function)
+
+(defun x-dnd-note-wheel-movement (position button state time)
+ "Note wheel movement at POSITION.
+POSITION is a mouse position list describing the position of the
+wheel movement.
+BUTTON is the wheel button that was pressed.
+STATE is the X modifier state at the time of the wheel movement.
+TIME is the X server time at which the wheel moved."
+ (when (posn-window position)
+ (with-selected-window (posn-window position)
+ (let ((count (x-dnd-note-click button time)))
+ (x-dnd-mwheel-scroll button count state)))))
+
+(setq x-dnd-wheel-function #'x-dnd-note-wheel-movement)
+
(provide 'x-dnd)
;;; x-dnd.el ends here
diff --git a/lisp/xwidget.el b/lisp/xwidget.el
index 0821760d995..41a1190c646 100644
--- a/lisp/xwidget.el
+++ b/lisp/xwidget.el
@@ -1,11 +1,11 @@
;;; xwidget.el --- api functions for xwidgets -*- lexical-binding: t -*-
-;;
+
;; Copyright (C) 2011-2022 Free Software Foundation, Inc.
-;;
-;; Author: Joakim Verona (joakim@verona.se)
-;;
+
+;; Author: Joakim Verona <joakim@verona.se>
+
;; This file is part of GNU Emacs.
-;;
+
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
@@ -18,8 +18,6 @@
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-;;
-;; --------------------------------------------------------------------
;;; Commentary:
;;
@@ -965,7 +963,7 @@ You can retrieve the value with `xwidget-get'."
(set-xwidget-plist xwidget
(plist-put (xwidget-plist xwidget) propname value)))
-(defvar xwidget-webkit-edit-mode-map (make-keymap))
+(defvar-keymap xwidget-webkit-edit-mode-map :full t)
(define-key xwidget-webkit-edit-mode-map [backspace] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [tab] 'xwidget-webkit-pass-command-event)
@@ -1111,8 +1109,9 @@ With argument, add COUNT copies of CHAR."
(interactive)
(xwidget-webkit-isearch-mode 0))
-(defvar xwidget-webkit-isearch-mode-map (make-keymap)
- "The keymap used inside xwidget-webkit-isearch-mode.")
+(defvar-keymap xwidget-webkit-isearch-mode-map
+ :doc "The keymap used inside `xwidget-webkit-isearch-mode'."
+ :full t)
(set-char-table-range (nth 1 xwidget-webkit-isearch-mode-map)
(cons 0 (max-char))
diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c
index 68f49e646da..deea50c8107 100644
--- a/lwlib/xlwmenu.c
+++ b/lwlib/xlwmenu.c
@@ -121,6 +121,10 @@ xlwMenuResources[] =
offset(menu.disabled_foreground), XtRString, (XtPointer)NULL},
{XtNbuttonForeground, XtCButtonForeground, XtRPixel, sizeof(Pixel),
offset(menu.button_foreground), XtRString, "XtDefaultForeground"},
+ {XtNhighlightForeground, XtCHighlightForeground, XtRPixel, sizeof(Pixel),
+ offset(menu.highlight_foreground), XtRImmediate, (XtPointer) -1},
+ {XtNhighlightBackground, XtCHighlightBackground, XtRPixel, sizeof(Pixel),
+ offset(menu.highlight_background), XtRImmediate, (XtPointer)-1},
{XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension),
offset(menu.margin), XtRImmediate, (XtPointer)1},
{XtNhorizontalSpacing, XtCMargin, XtRDimension, sizeof(Dimension),
@@ -570,8 +574,7 @@ draw_arrow (XlwMenuWidget mw,
int down_p)
{
Display *dpy = XtDisplay (mw);
- GC top_gc = mw->menu.shadow_top_gc;
- GC bottom_gc = mw->menu.shadow_bottom_gc;
+ GC top_gc, bottom_gc;
int thickness = mw->menu.shadow_thickness;
int height = width;
XPoint pt[10];
@@ -584,10 +587,13 @@ draw_arrow (XlwMenuWidget mw,
if (down_p)
{
- GC temp;
- temp = top_gc;
- top_gc = bottom_gc;
- bottom_gc = temp;
+ top_gc = mw->menu.highlight_shadow_bottom_gc;
+ bottom_gc = mw->menu.highlight_shadow_top_gc;
+ }
+ else
+ {
+ top_gc = mw->menu.shadow_top_gc;
+ bottom_gc = mw->menu.shadow_bottom_gc;
}
pt[0].x = x;
@@ -621,24 +627,34 @@ draw_arrow (XlwMenuWidget mw,
XFillPolygon (dpy, window, bottom_gc, pt, 4, Convex, CoordModeOrigin);
}
-
-
+/* Generic draw shadow rectangle function. It is used to draw shadows
+ on menus, menu items and also toggle buttons. When ERASE_P is
+ true, it clears shadows. DOWN_P is true when a menu item is pushed
+ or a button toggled. TOP_GC and BOTTOM_GC are the graphic contexts
+ used to draw the top and bottom shadow respectively. */
static void
-draw_shadow_rectangle (XlwMenuWidget mw,
- Window window,
- int x,
- int y,
- int width,
- int height,
- int erase_p,
- int down_p)
+draw_shadow_rectangle (XlwMenuWidget mw, Window window, int x, int y,
+ int width, int height, int erase_p, int down_p,
+ GC top_gc, GC bottom_gc)
{
Display *dpy = XtDisplay (mw);
- GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc;
- GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc;
int thickness = !x && !y ? mw->menu.border_thickness : mw->menu.shadow_thickness;
XPoint points [4];
+ /* Choose correct GC with a standard default if NULL. */
+ if (erase_p)
+ {
+ top_gc = mw->menu.background_gc;
+ bottom_gc = mw->menu.background_gc;
+ }
+ else
+ {
+ if (top_gc == NULL)
+ top_gc = mw->menu.shadow_top_gc;
+ if (bottom_gc == NULL)
+ bottom_gc = mw->menu.shadow_bottom_gc;
+ }
+
if (!erase_p && width == height && width == toggle_button_width (mw))
{
points [0].x = x;
@@ -662,6 +678,7 @@ draw_shadow_rectangle (XlwMenuWidget mw,
bottom_gc = temp;
}
+ /* Do draw (or erase) shadows */
points [0].x = x;
points [0].y = y;
points [1].x = x + width;
@@ -702,21 +719,28 @@ draw_shadow_rectangle (XlwMenuWidget mw,
static void
-draw_shadow_rhombus (XlwMenuWidget mw,
- Window window,
- int x,
- int y,
- int width,
- int height,
- int erase_p,
- int down_p)
+draw_shadow_rhombus (XlwMenuWidget mw, Window window, int x, int y,
+ int width, int height, int erase_p, int down_p,
+ GC top_gc, GC bottom_gc)
{
Display *dpy = XtDisplay (mw);
- GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc;
- GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc;
int thickness = mw->menu.shadow_thickness;
XPoint points [4];
+ /* Choose correct GC with a standard default if NULL */
+ if (erase_p)
+ {
+ top_gc = mw->menu.background_gc;
+ bottom_gc = mw->menu.background_gc;
+ }
+ else
+ {
+ if (top_gc == NULL)
+ top_gc = mw->menu.shadow_top_gc;
+ if (bottom_gc == NULL)
+ top_gc = mw->menu.shadow_bottom_gc;
+ }
+
if (!erase_p && width == height && width == radio_button_width (mw))
{
points [0].x = x;
@@ -784,15 +808,29 @@ draw_shadow_rhombus (XlwMenuWidget mw,
toggle button is selected. */
static void
-draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p)
+draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p,
+ int highlighted_p)
{
int width, height;
+ GC top_gc, bottom_gc;
+
+ if (highlighted_p)
+ {
+ top_gc = mw->menu.highlight_shadow_top_gc;
+ bottom_gc = mw->menu.highlight_shadow_bottom_gc;
+ }
+ else
+ {
+ top_gc = mw->menu.shadow_top_gc;
+ bottom_gc = mw->menu.shadow_bottom_gc;
+ }
width = toggle_button_width (mw);
height = width;
x += mw->menu.horizontal_spacing;
y += (MENU_FONT_ASCENT (mw) - height) / 2;
- draw_shadow_rectangle (mw, window, x, y, width, height, False, selected_p);
+ draw_shadow_rectangle (mw, window, x, y, width, height, False,
+ selected_p, top_gc, bottom_gc);
}
@@ -801,15 +839,29 @@ draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p)
toggle button is selected. */
static void
-draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p)
+draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p,
+ int highlighted_p)
{
int width, height;
+ GC top_gc, bottom_gc;
+
+ if (highlighted_p)
+ {
+ top_gc = mw->menu.highlight_shadow_top_gc;
+ bottom_gc = mw->menu.highlight_shadow_bottom_gc;
+ }
+ else
+ {
+ top_gc = mw->menu.shadow_top_gc;
+ bottom_gc = mw->menu.shadow_bottom_gc;
+ }
width = radio_button_width (mw);
height = width;
x += mw->menu.horizontal_spacing;
y += (MENU_FONT_ASCENT (mw) - height) / 2;
- draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p);
+ draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p,
+ top_gc, bottom_gc);
}
@@ -968,6 +1020,31 @@ separator_height (enum menu_separator separator)
}
}
+/* Draw the highlighted background and shadows. */
+
+static void
+draw_highlight (XlwMenuWidget mw, Window window, int x, int y, int width,
+ int height)
+{
+ Display *dpy = XtDisplay (mw);
+ XPoint points [4];
+
+ points [0].x = x;
+ points [0].y = y;
+ points [1].x = x + width;
+ points [1].y = y;
+ points [2].x = x + width;
+ points [2].y = y + height;
+ points [3].x = x;
+ points [3].y = y + height;
+ XFillPolygon (dpy, window,
+ mw->menu.highlight_background_gc,
+ points, 4, Convex, CoordModeOrigin);
+
+ draw_shadow_rectangle(mw, window, x, y, width, height, False, False,
+ mw->menu.highlight_shadow_top_gc,
+ mw->menu.highlight_shadow_bottom_gc);
+}
/* Display the menu item and increment where.x and where.y to show how large
the menu item was. */
@@ -983,7 +1060,6 @@ display_menu_item (XlwMenuWidget mw,
{
GC deco_gc;
GC text_gc;
- int font_height = MENU_FONT_HEIGHT (mw);
int font_ascent = MENU_FONT_ASCENT (mw);
int shadow = mw->menu.shadow_thickness;
int margin = mw->menu.margin;
@@ -1032,24 +1108,34 @@ display_menu_item (XlwMenuWidget mw,
/* pick the foreground and background GC. */
if (val->enabled)
- text_gc = mw->menu.foreground_gc;
+ if (highlighted_p)
+ text_gc = mw->menu.highlight_foreground_gc;
+ else
+ text_gc = mw->menu.foreground_gc;
else
text_gc = mw->menu.disabled_gc;
deco_gc = mw->menu.foreground_gc;
#if defined USE_CAIRO || defined HAVE_XFT
- xftfg = val->enabled ? &mw->menu.xft_fg : &mw->menu.xft_disabled_fg;
+ if (val->enabled)
+ if (highlighted_p)
+ xftfg = &mw->menu.xft_highlight_fg;
+ else
+ xftfg = &mw->menu.xft_fg;
+ else
+ xftfg = &mw->menu.xft_disabled_fg;
#endif
if (separator_p)
- {
- draw_separator (mw, ws->pixmap, x, y, width, separator);
- }
+ draw_separator (mw, ws->pixmap, x, y, width, separator);
else
{
int x_offset = x + h_spacing + shadow;
char* display_string = resource_widget_value (mw, val);
- draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, True,
- False);
+ /* Clears shadows and maybe highlight */
+ draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height,
+ True, False, NULL, NULL);
+ if (highlighted_p)
+ draw_highlight (mw, ws->pixmap, x, y, width, height);
/* Deal with centering a menu title. */
if (!horizontal_p && !val->contents && !val->call_data)
@@ -1095,10 +1181,10 @@ display_menu_item (XlwMenuWidget mw,
{
if (val->button_type == BUTTON_TYPE_TOGGLE)
draw_toggle (mw, ws->pixmap, x, y + v_spacing + shadow,
- val->selected);
+ val->selected, highlighted_p);
else if (val->button_type == BUTTON_TYPE_RADIO)
draw_radio (mw, ws->pixmap, x, y + v_spacing + shadow,
- val->selected);
+ val->selected, highlighted_p);
if (val->contents)
{
@@ -1145,25 +1231,18 @@ display_menu_item (XlwMenuWidget mw,
}
else
{
- XDrawRectangle (XtDisplay (mw), ws->pixmap,
- mw->menu.background_gc,
- x + shadow, y + shadow,
- label_width + h_spacing - 1,
- font_height + 2 * v_spacing - 1);
- draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height,
- True, False);
+ /* If not highlighted, clears shadows for horizontal
+ menu item */
+ if (!highlighted_p)
+ draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height,
+ True, False, NULL, NULL);
}
#ifdef USE_CAIRO
if (ws->xft_draw)
cairo_surface_flush (cairo_get_target (ws->xft_draw));
#endif
-
- if (highlighted_p)
- draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, False,
- False);
}
}
-
where->x += width;
where->y += height;
}
@@ -1257,7 +1336,7 @@ display_menu (XlwMenuWidget mw,
if (!just_compute_p)
{
draw_shadow_rectangle (mw, ws->pixmap, 0, 0, ws->width, ws->height,
- False, False);
+ False, False, NULL, NULL);
XCopyArea (XtDisplay (mw), ws->pixmap, ws->window,
mw->menu.foreground_gc, 0, 0, ws->width, ws->height, 0, 0);
}
@@ -1643,7 +1722,7 @@ map_event_to_widget_value (XlwMenuWidget mw,
return False;
}
- /* Procedures */
+
static void
make_drawing_gcs (XlwMenuWidget mw)
{
@@ -1714,6 +1793,20 @@ make_drawing_gcs (XlwMenuWidget mw)
xgcv.foreground = mw->core.background_pixel;
xgcv.background = mw->menu.foreground;
mw->menu.background_gc = XtGetGC ((Widget)mw, mask, &xgcv);
+
+ xgcv.foreground = ((mw->menu.highlight_foreground == -1)
+ ? mw->menu.foreground
+ : mw->menu.highlight_foreground);
+ xgcv.background = ((mw->menu.highlight_background == -1)
+ ? mw->core.background_pixel
+ : mw->menu.highlight_background);
+ mw->menu.highlight_foreground_gc = XtGetGC ((Widget)mw, mask, &xgcv);
+
+ xgcv.foreground = ((mw->menu.highlight_background == -1)
+ ? mw->core.background_pixel
+ : mw->menu.highlight_background);
+ xgcv.background = mw->menu.foreground;
+ mw->menu.highlight_background_gc = XtGetGC ((Widget)mw, mask, &xgcv);
}
static void
@@ -1724,12 +1817,16 @@ release_drawing_gcs (XlwMenuWidget mw)
XtReleaseGC ((Widget) mw, mw->menu.disabled_gc);
XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc);
XtReleaseGC ((Widget) mw, mw->menu.background_gc);
+ XtReleaseGC ((Widget) mw, mw->menu.highlight_foreground_gc);
+ XtReleaseGC ((Widget) mw, mw->menu.highlight_background_gc);
/* let's get some segvs if we try to use these... */
mw->menu.foreground_gc = (GC) -1;
mw->menu.button_gc = (GC) -1;
mw->menu.disabled_gc = (GC) -1;
mw->menu.inactive_button_gc = (GC) -1;
mw->menu.background_gc = (GC) -1;
+ mw->menu.highlight_foreground_gc = (GC) -1;
+ mw->menu.highlight_background_gc = (GC) -1;
}
#ifndef emacs
@@ -1738,29 +1835,29 @@ release_drawing_gcs (XlwMenuWidget mw)
#endif
static void
-make_shadow_gcs (XlwMenuWidget mw)
+compute_shadow_colors (XlwMenuWidget mw, Pixel *top_color, Pixel *bottom_color,
+ Boolean *free_top_p, Boolean *free_bottom_p,
+ Pixmap *top_pixmap, Pixmap *bottom_pixmap,
+ Pixel fore_color, Pixel back_color)
{
- XGCValues xgcv;
- unsigned long pm = 0;
Display *dpy = XtDisplay ((Widget) mw);
Screen *screen = XtScreen ((Widget) mw);
Colormap cmap = mw->core.colormap;
XColor topc, botc;
int top_frobbed = 0, bottom_frobbed = 0;
- mw->menu.free_top_shadow_color_p = 0;
- mw->menu.free_bottom_shadow_color_p = 0;
+ *free_top_p = False;
+ *free_bottom_p = False;
- if (mw->menu.top_shadow_color == -1)
- mw->menu.top_shadow_color = mw->core.background_pixel;
+ if (*top_color == -1)
+ *top_color = back_color;
- if (mw->menu.bottom_shadow_color == -1)
- mw->menu.bottom_shadow_color = mw->menu.foreground;
+ if (*bottom_color == -1)
+ *bottom_color = fore_color;
- if (mw->menu.top_shadow_color == mw->core.background_pixel ||
- mw->menu.top_shadow_color == mw->menu.foreground)
+ if (*top_color == back_color || *top_color == fore_color)
{
- topc.pixel = mw->core.background_pixel;
+ topc.pixel = back_color;
#ifdef emacs
if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap,
&topc.pixel,
@@ -1774,15 +1871,14 @@ make_shadow_gcs (XlwMenuWidget mw)
if (XAllocColor (dpy, cmap, &topc))
#endif
{
- mw->menu.top_shadow_color = topc.pixel;
- mw->menu.free_top_shadow_color_p = 1;
+ *top_color = topc.pixel;
+ *free_top_p = True;
top_frobbed = 1;
}
}
- if (mw->menu.bottom_shadow_color == mw->menu.foreground ||
- mw->menu.bottom_shadow_color == mw->core.background_pixel)
+ if (*bottom_color == fore_color || *bottom_color == back_color)
{
- botc.pixel = mw->core.background_pixel;
+ botc.pixel = back_color;
#ifdef emacs
if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap,
&botc.pixel,
@@ -1795,8 +1891,8 @@ make_shadow_gcs (XlwMenuWidget mw)
if (XAllocColor (dpy, cmap, &botc))
#endif
{
- mw->menu.bottom_shadow_color = botc.pixel;
- mw->menu.free_bottom_shadow_color_p = 1;
+ *bottom_color = botc.pixel;
+ *free_bottom_p = True;
bottom_frobbed = 1;
}
}
@@ -1805,84 +1901,125 @@ make_shadow_gcs (XlwMenuWidget mw)
{
if (topc.pixel == botc.pixel)
{
- if (botc.pixel == mw->menu.foreground)
+ if (botc.pixel == fore_color)
{
- if (mw->menu.free_top_shadow_color_p)
+ if (*free_top_p)
{
- x_free_dpy_colors (dpy, screen, cmap,
- &mw->menu.top_shadow_color, 1);
- mw->menu.free_top_shadow_color_p = 0;
+ x_free_dpy_colors (dpy, screen, cmap, top_color, 1);
+ *free_top_p = False;
}
- mw->menu.top_shadow_color = mw->core.background_pixel;
+ *top_color = back_color;
}
else
{
- if (mw->menu.free_bottom_shadow_color_p)
+ if (*free_bottom_p)
{
- x_free_dpy_colors (dpy, screen, cmap,
- &mw->menu.bottom_shadow_color, 1);
- mw->menu.free_bottom_shadow_color_p = 0;
+ x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1);
+ *free_bottom_p = False;
}
- mw->menu.bottom_shadow_color = mw->menu.foreground;
+ *bottom_color = fore_color;
}
}
}
- if (!mw->menu.top_shadow_pixmap
- && mw->menu.top_shadow_color == mw->core.background_pixel)
+ if (!*top_pixmap && *top_color == back_color)
{
- mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap;
- if (mw->menu.free_top_shadow_color_p)
+ *top_pixmap = mw->menu.gray_pixmap;
+ if (*free_top_p)
{
- x_free_dpy_colors (dpy, screen, cmap, &mw->menu.top_shadow_color, 1);
- mw->menu.free_top_shadow_color_p = 0;
+ x_free_dpy_colors (dpy, screen, cmap, top_color, 1);
+ *free_top_p = False;
}
- mw->menu.top_shadow_color = mw->menu.foreground;
+ *top_color = fore_color;
}
- if (!mw->menu.bottom_shadow_pixmap
- && mw->menu.bottom_shadow_color == mw->core.background_pixel)
+ if (!*bottom_pixmap && *bottom_color == back_color)
{
- mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap;
- if (mw->menu.free_bottom_shadow_color_p)
+ *bottom_pixmap = mw->menu.gray_pixmap;
+ if (*free_bottom_p)
{
- x_free_dpy_colors (dpy, screen, cmap,
- &mw->menu.bottom_shadow_color, 1);
- mw->menu.free_bottom_shadow_color_p = 0;
+ x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1);
+ *free_bottom_p = False;
}
- mw->menu.bottom_shadow_color = mw->menu.foreground;
+ *bottom_color = fore_color;
}
+}
+
+static void
+make_shadow_gcs (XlwMenuWidget mw)
+{
+ XGCValues xgcv;
+ unsigned long pm = 0;
+ Pixel highlight_fg;
+
+ highlight_fg = mw->menu.highlight_foreground;
+
+ if (highlight_fg == -1)
+ highlight_fg = mw->menu.foreground;
+
+ /* Normal shadows */
+ compute_shadow_colors (mw, &(mw->menu.top_shadow_color),
+ &(mw->menu.bottom_shadow_color),
+ &(mw->menu.free_top_shadow_color_p),
+ &(mw->menu.free_bottom_shadow_color_p),
+ &(mw->menu.top_shadow_pixmap),
+ &(mw->menu.bottom_shadow_pixmap),
+ mw->menu.foreground, mw->core.background_pixel);
+
+ /* Highlight shadows */
+ compute_shadow_colors (mw, &(mw->menu.top_highlight_shadow_color),
+ &(mw->menu.bottom_highlight_shadow_color),
+ &(mw->menu.free_top_highlight_shadow_color_p),
+ &(mw->menu.free_bottom_highlight_shadow_color_p),
+ &(mw->menu.top_highlight_shadow_pixmap),
+ &(mw->menu.bottom_highlight_shadow_pixmap),
+ highlight_fg, mw->menu.highlight_background);
xgcv.fill_style = FillStippled;
xgcv.foreground = mw->menu.top_shadow_color;
xgcv.stipple = mw->menu.top_shadow_pixmap;
- pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0);
- mw->menu.shadow_top_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv);
+ pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0);
+ mw->menu.shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv);
xgcv.foreground = mw->menu.bottom_shadow_color;
xgcv.stipple = mw->menu.bottom_shadow_pixmap;
- pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0);
- mw->menu.shadow_bottom_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv);
+ pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0);
+ mw->menu.shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv);
+
+ xgcv.foreground = mw->menu.top_highlight_shadow_color;
+ xgcv.stipple = mw->menu.top_highlight_shadow_pixmap;
+ pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0);
+ mw->menu.highlight_shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv);
+
+ xgcv.foreground = mw->menu.bottom_highlight_shadow_color;
+ xgcv.stipple = mw->menu.bottom_highlight_shadow_pixmap;
+ pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0);
+ mw->menu.highlight_shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv);
}
-
static void
release_shadow_gcs (XlwMenuWidget mw)
{
Display *dpy = XtDisplay ((Widget) mw);
Screen *screen = XtScreen ((Widget) mw);
Colormap cmap = mw->core.colormap;
- Pixel px[2];
+ Pixel px[4];
int i = 0;
if (mw->menu.free_top_shadow_color_p)
px[i++] = mw->menu.top_shadow_color;
if (mw->menu.free_bottom_shadow_color_p)
px[i++] = mw->menu.bottom_shadow_color;
+ if (mw->menu.free_top_highlight_shadow_color_p)
+ px[i++] = mw->menu.top_highlight_shadow_color;
+ if (mw->menu.free_bottom_highlight_shadow_color_p)
+ px[i++] = mw->menu.bottom_highlight_shadow_color;
if (i > 0)
x_free_dpy_colors (dpy, screen, cmap, px, i);
XtReleaseGC ((Widget) mw, mw->menu.shadow_top_gc);
XtReleaseGC ((Widget) mw, mw->menu.shadow_bottom_gc);
+ XtReleaseGC ((Widget) mw, mw->menu.highlight_shadow_top_gc);
+ XtReleaseGC ((Widget) mw, mw->menu.highlight_shadow_bottom_gc);
}
#if defined USE_CAIRO || defined HAVE_XFT
@@ -1923,6 +2060,46 @@ openXftFont (XlwMenuWidget mw)
return mw->menu.xft_font != 0;
}
+
+static void
+update_xft_colors (Widget w)
+{
+ XlwMenuWidget mw;
+ XColor colors[4];
+
+ mw = (XlwMenuWidget) w;
+
+ colors[0].pixel = mw->menu.xft_fg.pixel
+ = mw->menu.foreground;
+ colors[1].pixel = mw->menu.xft_bg.pixel
+ = mw->core.background_pixel;
+ colors[2].pixel = mw->menu.xft_disabled_fg.pixel
+ = mw->menu.disabled_foreground;
+ colors[3].pixel = mw->menu.xft_highlight_fg.pixel
+ = (mw->menu.highlight_foreground != -1
+ ? mw->menu.highlight_foreground
+ : mw->menu.foreground);
+
+ XQueryColors (XtDisplay (mw), mw->core.colormap,
+ colors, 4);
+
+ mw->menu.xft_fg.color.alpha = 0xFFFF;
+ mw->menu.xft_fg.color.red = colors[0].red;
+ mw->menu.xft_fg.color.green = colors[0].green;
+ mw->menu.xft_fg.color.blue = colors[0].blue;
+ mw->menu.xft_bg.color.alpha = 0xFFFF;
+ mw->menu.xft_bg.color.red = colors[1].red;
+ mw->menu.xft_bg.color.green = colors[1].green;
+ mw->menu.xft_bg.color.blue = colors[1].blue;
+ mw->menu.xft_disabled_fg.color.alpha = 0xFFFF;
+ mw->menu.xft_disabled_fg.color.red = colors[2].red;
+ mw->menu.xft_disabled_fg.color.green = colors[2].green;
+ mw->menu.xft_disabled_fg.color.blue = colors[2].blue;
+ mw->menu.xft_highlight_fg.color.alpha = 0xFFFF;
+ mw->menu.xft_highlight_fg.color.red = colors[3].red;
+ mw->menu.xft_highlight_fg.color.green = colors[3].green;
+ mw->menu.xft_highlight_fg.color.blue = colors[3].blue;
+}
#endif
static void
@@ -1964,6 +2141,11 @@ XlwMenuInitialize (Widget request, Widget w, ArgList args, Cardinal *num_args)
mw->menu.font_extents = XExtentsOfFontSet (mw->menu.fontSet);
#endif
+ mw->menu.top_highlight_shadow_color = -1;
+ mw->menu.bottom_highlight_shadow_color = -1;
+ mw->menu.top_highlight_shadow_pixmap = None;
+ mw->menu.bottom_highlight_shadow_pixmap = None;
+
make_drawing_gcs (mw);
make_shadow_gcs (mw);
@@ -2037,26 +2219,7 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes)
#if defined USE_CAIRO || defined HAVE_XFT
if (mw->menu.xft_font)
- {
- XColor colors[3];
- colors[0].pixel = mw->menu.xft_fg.pixel = mw->menu.foreground;
- colors[1].pixel = mw->menu.xft_bg.pixel = mw->core.background_pixel;
- colors[2].pixel = mw->menu.xft_disabled_fg.pixel
- = mw->menu.disabled_foreground;
- XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 3);
- mw->menu.xft_fg.color.alpha = 0xFFFF;
- mw->menu.xft_fg.color.red = colors[0].red;
- mw->menu.xft_fg.color.green = colors[0].green;
- mw->menu.xft_fg.color.blue = colors[0].blue;
- mw->menu.xft_bg.color.alpha = 0xFFFF;
- mw->menu.xft_bg.color.red = colors[1].red;
- mw->menu.xft_bg.color.green = colors[1].green;
- mw->menu.xft_bg.color.blue = colors[1].blue;
- mw->menu.xft_disabled_fg.color.alpha = 0xFFFF;
- mw->menu.xft_disabled_fg.color.red = colors[2].red;
- mw->menu.xft_disabled_fg.color.green = colors[2].green;
- mw->menu.xft_disabled_fg.color.blue = colors[2].blue;
- }
+ update_xft_colors (w);
#endif
}
@@ -2224,6 +2387,12 @@ XlwMenuSetValues (Widget current, Widget request, Widget new,
XClearArea (XtDisplay (oldmw), oldmw->menu.windows[i].window,
0, 0, 0, 0, True);
}
+
+ /* Colors changed. Update the Xft colors as well. */
+#if defined USE_CAIRO || defined HAVE_XFT
+ if (oldmw->menu.xft_font)
+ update_xft_colors (new);
+#endif
}
#if defined USE_CAIRO || defined HAVE_XFT
diff --git a/lwlib/xlwmenu.h b/lwlib/xlwmenu.h
index 7f4bf35939a..4e36bde3fb9 100644
--- a/lwlib/xlwmenu.h
+++ b/lwlib/xlwmenu.h
@@ -58,6 +58,10 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#define XtCAllowResize "AllowResize"
#define XtNborderThickness "borderThickness"
#define XtCBorderThickness "BorderThickness"
+#define XtNhighlightForeground "highlightForeground"
+#define XtCHighlightForeground "HighlightForeground"
+#define XtNhighlightBackground "highlightBackground"
+#define XtCHighlightBackground "HighlightBackground"
/* Motif-compatible resource names */
#define XmNshadowThickness "shadowThickness"
diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h
index 455ecdbce01..c314eb3e910 100644
--- a/lwlib/xlwmenuP.h
+++ b/lwlib/xlwmenuP.h
@@ -63,13 +63,15 @@ typedef struct _XlwMenu_part
#if defined USE_CAIRO || defined HAVE_XFT
int default_face;
XftFont* xft_font;
- XftColor xft_fg, xft_bg, xft_disabled_fg;
+ XftColor xft_fg, xft_bg, xft_disabled_fg, xft_highlight_fg;
#endif
String fontName;
XFontStruct* font;
Pixel foreground;
Pixel disabled_foreground;
Pixel button_foreground;
+ Pixel highlight_foreground;
+ Pixel highlight_background;
Dimension margin;
Dimension horizontal_spacing;
Dimension vertical_spacing;
@@ -80,6 +82,10 @@ typedef struct _XlwMenu_part
Pixel bottom_shadow_color;
Pixmap top_shadow_pixmap;
Pixmap bottom_shadow_pixmap;
+ Pixel top_highlight_shadow_color;
+ Pixel bottom_highlight_shadow_color;
+ Pixmap top_highlight_shadow_pixmap;
+ Pixmap bottom_highlight_shadow_pixmap;
Cursor cursor_shape;
XtCallbackList open;
XtCallbackList select, highlight;
@@ -88,8 +94,10 @@ typedef struct _XlwMenu_part
int horizontal;
/* True means top_shadow_color and/or bottom_shadow_color must be freed. */
- bool_bf free_top_shadow_color_p : 1;
- bool_bf free_bottom_shadow_color_p : 1;
+ Boolean free_top_shadow_color_p;
+ Boolean free_bottom_shadow_color_p;
+ Boolean free_top_highlight_shadow_color_p;
+ Boolean free_bottom_highlight_shadow_color_p;
/* State of the XlwMenu */
int top_depth;
@@ -112,9 +120,13 @@ typedef struct _XlwMenu_part
GC button_gc;
GC background_gc;
GC disabled_gc;
+ GC highlight_foreground_gc;
+ GC highlight_background_gc;
GC inactive_button_gc;
GC shadow_top_gc;
GC shadow_bottom_gc;
+ GC highlight_shadow_top_gc;
+ GC highlight_shadow_bottom_gc;
Cursor cursor;
Boolean popped_up;
Pixmap gray_pixmap;
diff --git a/nextstep/Makefile.in b/nextstep/Makefile.in
index 9c7059f2c0b..82bf13bc929 100644
--- a/nextstep/Makefile.in
+++ b/nextstep/Makefile.in
@@ -26,6 +26,7 @@ srcdir = @srcdir@
abs_builddir = @abs_builddir@
abs_top_builddir = @abs_top_builddir@
EXEEXT = @EXEEXT@
+DUMPING = @DUMPING@
# abs_top_srcdir may contain ".."
top_srcdir_abs = $(shell cd @top_srcdir@; pwd -P)
@@ -45,7 +46,11 @@ ns_check_file = @ns_appdir@/@ns_check_file@
.PHONY: all
-all: ${ns_appdir} ${ns_appbindir}/Emacs ${ns_applibexecdir}/Emacs.pdmp
+ifeq ($(DUMPING),pdumper)
+ns_pdmp_target = ${ns_applibexecdir}/Emacs.pdmp
+endif
+
+all: ${ns_appdir} ${ns_appbindir}/Emacs ${ns_pdmp_target}
${ns_check_file}: ${ns_appdir}
diff --git a/src/Makefile.in b/src/Makefile.in
index 7d15b7afd51..1f941874ea8 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -635,30 +635,23 @@ Emacs.pdmp: $(pdmp)
endif
ifeq ($(DUMPING),pdumper)
-$(pdmp): emacs$(EXEEXT)
+$(pdmp): emacs$(EXEEXT) $(lispsource)/loaddefs.el $(lispsource)/loaddefs.elc
LC_ALL=C $(RUN_TEMACS) -batch $(BUILD_DETAILS) -l loadup --temacs=pdump \
--bin-dest $(BIN_DESTDIR) --eln-dest $(ELN_DESTDIR)
cp -f $@ $(bootstrap_pdmp)
endif
-## We run make-docfile twice because the command line may get too long
-## on some systems. Unfortunately, no-one has any idea
-## exactly how long the maximum safe command line length is on all the
-## various systems that Emacs supports.
-##
## $(SOME_MACHINE_OBJECTS) comes before $(obj) because some files may
## or may not be included in $(obj), but they are always included in
## $(SOME_MACHINE_OBJECTS). Since a file is processed when it is mentioned
## for the first time, this prevents any variation between configurations
## in the contents of the DOC file.
##
-$(etc)/DOC: $(libsrc)/make-docfile$(EXEEXT) $(doc_obj) $(lispsource)/loaddefs.el
+$(etc)/DOC: $(libsrc)/make-docfile$(EXEEXT) $(doc_obj)
$(AM_V_GEN)$(MKDIR_P) $(etc)
$(AM_V_at)rm -f $(etc)/DOC
$(AM_V_at)$(libsrc)/make-docfile -d $(srcdir) \
$(SOME_MACHINE_OBJECTS) $(doc_obj) > $(etc)/DOC
- $(AM_V_at)$(libsrc)/make-docfile -a $(etc)/DOC -d $(lispsource) \
- loaddefs.el
$(libsrc)/make-docfile$(EXEEXT) $(libsrc)/make-fingerprint$(EXEEXT): \
$(lib)/libgnu.a
@@ -797,11 +790,12 @@ ctagsfiles3 = $(wildcard ${srcdir}/*.cc)
## In out-of-tree builds, TAGS are generated in the build dir, like
## other non-bootstrap build products (see Bug#31744).
-## This does not need to depend on ../lisp and ../lwlib TAGS files,
+## This does not need to depend on ../lisp, ../lwlib and ../lib TAGS files,
## because etags "--include" only includes a pointer to the file,
## rather than the file contents.
TAGS: ${ETAGS} $(ctagsfiles1) $(ctagsfiles2)
$(AM_V_GEN)${ETAGS} --include=../lisp/TAGS --include=$(lwlibdir)/TAGS \
+ --include=$(lib)/TAGS \
--regex='{c}/[ ]*DEFVAR_[A-Z_ (]+"\([^"]+\)"/\1/' \
--regex='{c}/[ ]*DEFVAR_[A-Z_ (]+"[^"]+",[ ]\([A-Za-z0-9_]+\)/\1/' \
$(ctagsfiles1) \
@@ -810,12 +804,12 @@ TAGS: ${ETAGS} $(ctagsfiles1) $(ctagsfiles2)
$(ctagsfiles2) \
$(ctagsfiles3)
-## Arrange to make tags tables for ../lisp and ../lwlib,
+## Arrange to make tags tables for ../lisp, ../lwlib and ../lib,
## which the above TAGS file for the C files includes by reference.
-../lisp/TAGS $(lwlibdir)/TAGS: FORCE
+../lisp/TAGS $(lwlibdir)/TAGS $(lib)/TAGS: FORCE
$(MAKE) -C $(dir $@) $(notdir $@) ETAGS="$(ETAGS)"
-tags: TAGS ../lisp/TAGS $(lwlibdir)/TAGS
+tags: TAGS ../lisp/TAGS $(lwlibdir)/TAGS $(lib)/TAGS
.PHONY: tags
@@ -852,7 +846,6 @@ ifeq ($(HAVE_NATIVE_COMP):$(NATIVE_DISABLED),yes:)
## List of *.eln files we need to produce in addition to the preloaded
## ones in $(lisp).
elnlisp := \
- emacs-lisp/autoload.eln \
emacs-lisp/byte-opt.eln \
emacs-lisp/bytecomp.eln \
emacs-lisp/cconv.eln \
@@ -888,13 +881,7 @@ elnlisp := $(addprefix ${lispsource}/,${elnlisp}) $(lisp:.elc=.eln)
fi
endif
-## VCSWITNESS points to the file that holds info about the current checkout.
-## We use it as a heuristic to decide when to rebuild loaddefs.el.
-## If empty it is ignored; the parent makefile can set it to some other value.
-VCSWITNESS =
-
-$(lispsource)/loaddefs.el: $(VCSWITNESS) | \
- bootstrap-emacs$(EXEEXT) $(bootstrap_pdmp)
+$(lispsource)/loaddefs.el: | bootstrap-emacs$(EXEEXT) $(bootstrap_pdmp)
$(MAKE) -C ../lisp autoloads EMACS="$(bootstrap_exe)"
## Dump an Emacs executable named bootstrap-emacs containing the
diff --git a/src/buffer.c b/src/buffer.c
index e5fa09a9789..4fd5b2be3e9 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -985,6 +985,7 @@ reset_buffer (register struct buffer *b)
/* It is more conservative to start out "changed" than "unchanged". */
b->clip_changed = 0;
b->prevent_redisplay_optimizations_p = 1;
+ b->long_line_optimizations_p = 0;
bset_backed_up (b, Qnil);
bset_local_minor_modes (b, Qnil);
BUF_AUTOSAVE_MODIFF (b) = 0;
@@ -1159,7 +1160,8 @@ is first appended to NAME, to speed up finding a non-existent buffer. */)
genbase = name;
else
{
- char number[sizeof "-999999"];
+ enum { bug_52711 = true }; /* https://bugs.gnu.org/57211 */
+ char number[bug_52711 ? INT_BUFSIZE_BOUND (int) + 1 : sizeof "-999999"];
EMACS_INT r = get_random ();
eassume (0 <= r);
int i = r % 1000000;
@@ -1501,7 +1503,7 @@ state of the current buffer. Use with care. */)
decrease SAVE_MODIFF and auto_save_modified or increase
MODIFF. */
if (SAVE_MODIFF >= MODIFF)
- SAVE_MODIFF = modiff_incr (&MODIFF);
+ SAVE_MODIFF = modiff_incr (&MODIFF, 1);
if (EQ (flag, Qautosaved))
BUF_AUTOSAVE_MODIFF (b) = MODIFF;
}
@@ -1561,6 +1563,7 @@ This does not change the name of the visited file (if any). */)
(register Lisp_Object newname, Lisp_Object unique)
{
register Lisp_Object tem, buf;
+ Lisp_Object requestedname = newname;
CHECK_STRING (newname);
@@ -1577,7 +1580,8 @@ This does not change the name of the visited file (if any). */)
if (NILP (unique) && XBUFFER (tem) == current_buffer)
return BVAR (current_buffer, name);
if (!NILP (unique))
- newname = Fgenerate_new_buffer_name (newname, BVAR (current_buffer, name));
+ newname = Fgenerate_new_buffer_name (newname,
+ BVAR (current_buffer, name));
else
error ("Buffer name `%s' is in use", SDATA (newname));
}
@@ -1597,7 +1601,7 @@ This does not change the name of the visited file (if any). */)
run_buffer_list_update_hook (current_buffer);
call2 (intern ("uniquify--rename-buffer-advice"),
- BVAR (current_buffer, name), unique);
+ requestedname, unique);
/* Refetch since that last call may have done GC. */
return BVAR (current_buffer, name);
@@ -2446,6 +2450,7 @@ results, see Info node `(elisp)Swapping Text'. */)
swapfield (bidi_paragraph_cache, struct region_cache *);
current_buffer->prevent_redisplay_optimizations_p = 1;
other_buffer->prevent_redisplay_optimizations_p = 1;
+ swapfield (long_line_optimizations_p, bool_bf);
swapfield (overlays_before, struct Lisp_Overlay *);
swapfield (overlays_after, struct Lisp_Overlay *);
swapfield (overlay_center, ptrdiff_t);
@@ -2465,12 +2470,12 @@ results, see Info node `(elisp)Swapping Text'. */)
bset_point_before_scroll (current_buffer, Qnil);
bset_point_before_scroll (other_buffer, Qnil);
- modiff_incr (&current_buffer->text->modiff);
- modiff_incr (&other_buffer->text->modiff);
- modiff_incr (&current_buffer->text->chars_modiff);
- modiff_incr (&other_buffer->text->chars_modiff);
- modiff_incr (&current_buffer->text->overlay_modiff);
- modiff_incr (&other_buffer->text->overlay_modiff);
+ modiff_incr (&current_buffer->text->modiff, 1);
+ modiff_incr (&other_buffer->text->modiff, 1);
+ modiff_incr (&current_buffer->text->chars_modiff, 1);
+ modiff_incr (&other_buffer->text->chars_modiff, 1);
+ modiff_incr (&current_buffer->text->overlay_modiff, 1);
+ modiff_incr (&other_buffer->text->overlay_modiff, 1);
current_buffer->text->beg_unchanged = current_buffer->text->gpt;
current_buffer->text->end_unchanged = current_buffer->text->gpt;
other_buffer->text->beg_unchanged = other_buffer->text->gpt;
@@ -4009,7 +4014,7 @@ modify_overlay (struct buffer *buf, ptrdiff_t start, ptrdiff_t end)
bset_redisplay (buf);
- modiff_incr (&BUF_OVERLAY_MODIFF (buf));
+ modiff_incr (&BUF_OVERLAY_MODIFF (buf), 1);
}
/* Remove OVERLAY from LIST. */
@@ -5610,7 +5615,7 @@ used. */);
DEFVAR_PER_BUFFER ("mode-line-format", &BVAR (current_buffer, mode_line_format),
Qnil,
- doc: /* Template for displaying mode line for current buffer.
+ doc: /* Template for displaying mode line for a window's buffer.
The value may be nil, a string, a symbol or a list.
@@ -5623,6 +5628,9 @@ For any symbol other than t or nil, the symbol's value is processed as
`risky-local-variable' property, all properties in any strings, as
well as all :eval and :propertize forms in the value, are ignored.
+When the value is processed, the window's buffer is temporarily the
+current buffer.
+
A list whose car is a string or list is processed by processing each
of the list elements recursively, as separate mode line constructs,
and concatenating the results.
@@ -6424,6 +6432,37 @@ Since `clone-indirect-buffer' calls `make-indirect-buffer', this hook
will run for `clone-indirect-buffer' calls as well. */);
Vclone_indirect_buffer_hook = Qnil;
+ DEFVAR_LISP ("long-line-threshold", Vlong_line_threshold,
+ doc: /* Line length above which to use redisplay shortcuts.
+
+The value should be a positive integer or nil.
+If the value is an integer, shortcuts in the display code intended
+to speed up redisplay for long lines will automatically be enabled
+in buffers which contain one or more lines whose length is above
+this threshold.
+If nil, these display shortcuts will always remain disabled.
+
+There is no reason to change that value except for debugging purposes. */);
+ XSETFASTINT (Vlong_line_threshold, 10000);
+
+ DEFVAR_INT ("large-hscroll-threshold", large_hscroll_threshold,
+ doc: /* Horizontal scroll of truncated lines above which to use redisplay shortcuts.
+
+The value should be a positive integer.
+
+Shortcuts in the display code intended to speed up redisplay for long
+and truncated lines will automatically be enabled when a line's
+horizontal scroll amount is or about to become larger than the value
+of this variable.
+
+This variable has effect only in buffers which contain one or more
+lines whose length is above `long-line-threshold', which see.
+To disable redisplay shortcuts for long truncated line, set this
+variable to `most-positive-fixnum'.
+
+There is no reason to change that value except for debugging purposes. */);
+ large_hscroll_threshold = 10000;
+
defsubr (&Sbuffer_live_p);
defsubr (&Sbuffer_list);
defsubr (&Sget_buffer);
diff --git a/src/buffer.h b/src/buffer.h
index 135eaf72d30..47b4bdf749b 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -237,9 +237,10 @@ struct buffer_text
ptrdiff_t z_byte; /* Byte pos of end of buffer. */
ptrdiff_t gap_size; /* Size of buffer's gap. */
modiff_count modiff; /* This counts buffer-modification events
- for this buffer. It is incremented for
- each such event, and never otherwise
- changed. */
+ for this buffer. It is increased
+ logarithmically to the extent of the
+ modification for each such event,
+ and never otherwise changed. */
modiff_count chars_modiff; /* This is modified with character change
events for this buffer. It is set to
modiff for each such event, and never
@@ -681,6 +682,10 @@ struct buffer
defined, as well as by with-temp-buffer, for example. */
bool_bf inhibit_buffer_hooks : 1;
+ /* Non-zero when the buffer contains long lines and specific
+ display optimizations must be used. */
+ bool_bf long_line_optimizations_p : 1;
+
/* List of overlays that end at or before the current center,
in order of end-position. */
struct Lisp_Overlay *overlays_before;
diff --git a/src/callint.c b/src/callint.c
index ffa3b231eb5..8ef0e5240a5 100644
--- a/src/callint.c
+++ b/src/callint.c
@@ -161,73 +161,33 @@ check_mark (bool for_region)
xsignal0 (Qmark_inactive);
}
-/* If the list of args INPUT was produced with an explicit call to
- `list', look for elements that were computed with
- (region-beginning) or (region-end), and put those expressions into
- VALUES instead of the present values.
+/* If FUNCTION has an `interactive-args' spec, replace relevant
+ elements in VALUES with those forms instead.
This function doesn't return a value because it modifies elements
of VALUES to do its job. */
static void
-fix_command (Lisp_Object input, Lisp_Object function, Lisp_Object values)
+fix_command (Lisp_Object function, Lisp_Object values)
{
- /* FIXME: Instead of this ugly hack, we should provide a way for an
- interactive spec to return an expression/function that will re-build the
- args without user intervention. */
- if (CONSP (input))
+ /* Quick exit if there's no values to alter. */
+ if (!CONSP (values) || !SYMBOLP (function))
+ return;
+
+ Lisp_Object reps = Fget (function, Qinteractive_args);
+
+ if (CONSP (reps))
{
- Lisp_Object car;
+ int i = 0;
+ Lisp_Object vals = values;
- car = XCAR (input);
- /* Skip through certain special forms. */
- while (EQ (car, Qlet) || EQ (car, Qletx)
- || EQ (car, Qsave_excursion)
- || EQ (car, Qprogn))
+ while (!NILP (vals))
{
- while (CONSP (XCDR (input)))
- input = XCDR (input);
- input = XCAR (input);
- if (!CONSP (input))
- break;
- car = XCAR (input);
- }
- if (EQ (car, Qlist))
- {
- Lisp_Object intail, valtail;
- for (intail = Fcdr (input), valtail = values;
- CONSP (valtail);
- intail = Fcdr (intail), valtail = XCDR (valtail))
- {
- Lisp_Object elt;
- elt = Fcar (intail);
- if (CONSP (elt))
- {
- Lisp_Object presflag, carelt;
- carelt = XCAR (elt);
- /* If it is (if X Y), look at Y. */
- if (EQ (carelt, Qif)
- && NILP (Fnthcdr (make_fixnum (3), elt)))
- elt = Fnth (make_fixnum (2), elt);
- /* If it is (when ... Y), look at Y. */
- else if (EQ (carelt, Qwhen))
- {
- while (CONSP (XCDR (elt)))
- elt = XCDR (elt);
- elt = Fcar (elt);
- }
-
- /* If the function call we're looking at
- is a special preserved one, copy the
- whole expression for this argument. */
- if (CONSP (elt))
- {
- presflag = Fmemq (Fcar (elt), preserved_fns);
- if (!NILP (presflag))
- Fsetcar (valtail, Fcar (intail));
- }
- }
- }
+ Lisp_Object rep = Fassq (make_fixnum (i), reps);
+ if (!NILP (rep))
+ Fsetcar (vals, XCDR (rep));
+ vals = XCDR (vals);
+ ++i;
}
}
@@ -235,31 +195,28 @@ fix_command (Lisp_Object input, Lisp_Object function, Lisp_Object values)
optional, remove them from the list. This makes navigating the
history less confusing, since it doesn't contain a lot of
parameters that aren't used. */
- if (CONSP (values))
+ Lisp_Object arity = Ffunc_arity (function);
+ /* We don't want to do this simplification if we have an &rest
+ function, because (cl-defun foo (a &optional (b 'zot)) ..)
+ etc. */
+ if (FIXNUMP (XCAR (arity)) && FIXNUMP (XCDR (arity)))
{
- Lisp_Object arity = Ffunc_arity (function);
- /* We don't want to do this simplification if we have an &rest
- function, because (cl-defun foo (a &optional (b 'zot)) ..)
- etc. */
- if (FIXNUMP (XCAR (arity)) && FIXNUMP (XCDR (arity)))
+ Lisp_Object final = Qnil;
+ ptrdiff_t final_i = 0, i = 0;
+ for (Lisp_Object tail = values;
+ CONSP (tail);
+ tail = XCDR (tail), ++i)
{
- Lisp_Object final = Qnil;
- ptrdiff_t final_i = 0, i = 0;
- for (Lisp_Object tail = values;
- CONSP (tail);
- tail = XCDR (tail), ++i)
+ if (!NILP (XCAR (tail)))
{
- if (!NILP (XCAR (tail)))
- {
- final = tail;
- final_i = i;
- }
+ final = tail;
+ final_i = i;
}
-
- /* Chop the trailing optional values. */
- if (final_i > 0 && final_i >= XFIXNUM (XCAR (arity)) - 1)
- XSETCDR (final, Qnil);
}
+
+ /* Chop the trailing optional values. */
+ if (final_i > 0 && final_i >= XFIXNUM (XCAR (arity)) - 1)
+ XSETCDR (final, Qnil);
}
}
@@ -360,7 +317,6 @@ invoke it (via an `interactive' spec that contains, for instance, an
{
Lisp_Object funval = Findirect_function (function, Qt);
uintmax_t events = num_input_events;
- Lisp_Object input = specs;
/* Compute the arg values using the user's expression. */
specs = Feval (specs,
CONSP (funval) && EQ (Qclosure, XCAR (funval))
@@ -371,7 +327,7 @@ invoke it (via an `interactive' spec that contains, for instance, an
Make a copy of the list of values, for the command history,
and turn them into things we can eval. */
Lisp_Object values = quotify_args (Fcopy_sequence (specs));
- fix_command (input, function, values);
+ fix_command (function, values);
call4 (intern ("add-to-history"), intern ("command-history"),
Fcons (function, values), Qnil, Qt);
}
@@ -950,4 +906,6 @@ use `event-start', `event-end', and `event-click-count'. */);
defsubr (&Scall_interactively);
defsubr (&Sfuncall_interactively);
defsubr (&Sprefix_numeric_value);
+
+ DEFSYM (Qinteractive_args, "interactive-args");
}
diff --git a/src/callproc.c b/src/callproc.c
index dd162f36a6c..e8e4c48b5be 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -650,7 +650,7 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int filefd,
child_errno
= emacs_spawn (&pid, filefd, fd_output, fd_error, new_argv, env,
- SSDATA (current_dir), NULL, &oldset);
+ SSDATA (current_dir), NULL, false, false, &oldset);
eassert ((child_errno == 0) == (0 < pid));
if (pid > 0)
@@ -1412,14 +1412,15 @@ emacs_posix_spawn_init_attributes (posix_spawnattr_t *attributes,
int
emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err,
char **argv, char **envp, const char *cwd,
- const char *pty, const sigset_t *oldset)
+ const char *pty_name, bool pty_in, bool pty_out,
+ const sigset_t *oldset)
{
#if USABLE_POSIX_SPAWN
/* Prefer the simpler `posix_spawn' if available. `posix_spawn'
doesn't yet support setting up pseudoterminals, so we fall back
to `vfork' if we're supposed to use a pseudoterminal. */
- bool use_posix_spawn = pty == NULL;
+ bool use_posix_spawn = pty_name == NULL;
posix_spawn_file_actions_t actions;
posix_spawnattr_t attributes;
@@ -1473,7 +1474,9 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err,
/* vfork, and prevent local vars from being clobbered by the vfork. */
pid_t *volatile newpid_volatile = newpid;
const char *volatile cwd_volatile = cwd;
- const char *volatile pty_volatile = pty;
+ const char *volatile ptyname_volatile = pty_name;
+ bool volatile ptyin_volatile = pty_in;
+ bool volatile ptyout_volatile = pty_out;
char **volatile argv_volatile = argv;
int volatile stdin_volatile = std_in;
int volatile stdout_volatile = std_out;
@@ -1485,7 +1488,7 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err,
/* Darwin doesn't let us run setsid after a vfork, so use fork when
necessary. Below, we reset SIGCHLD handling after a vfork, as
apparently macOS can mistakenly deliver SIGCHLD to the child. */
- if (pty != NULL)
+ if (pty_in || pty_out)
pid = fork ();
else
pid = VFORK ();
@@ -1495,7 +1498,9 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err,
newpid = newpid_volatile;
cwd = cwd_volatile;
- pty = pty_volatile;
+ pty_name = ptyname_volatile;
+ pty_in = ptyin_volatile;
+ pty_out = ptyout_volatile;
argv = argv_volatile;
std_in = stdin_volatile;
std_out = stdout_volatile;
@@ -1506,13 +1511,12 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err,
if (pid == 0)
#endif /* not WINDOWSNT */
{
- bool pty_flag = pty != NULL;
/* Make the pty be the controlling terminal of the process. */
#ifdef HAVE_PTYS
dissociate_controlling_tty ();
/* Make the pty's terminal the controlling terminal. */
- if (pty_flag && std_in >= 0)
+ if (pty_in && std_in >= 0)
{
#ifdef TIOCSCTTY
/* We ignore the return value
@@ -1521,7 +1525,7 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err,
#endif
}
#if defined (LDISC1)
- if (pty_flag && std_in >= 0)
+ if (pty_in && std_in >= 0)
{
struct termios t;
tcgetattr (std_in, &t);
@@ -1531,7 +1535,7 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err,
}
#else
#if defined (NTTYDISC) && defined (TIOCSETD)
- if (pty_flag && std_in >= 0)
+ if (pty_in && std_in >= 0)
{
/* Use new line discipline. */
int ldisc = NTTYDISC;
@@ -1548,18 +1552,21 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err,
both TIOCSCTTY is defined. */
/* Now close the pty (if we had it open) and reopen it.
This makes the pty the controlling terminal of the subprocess. */
- if (pty_flag)
+ if (pty_name)
{
/* I wonder if emacs_close (emacs_open (pty, ...))
would work? */
- if (std_in >= 0)
+ if (pty_in && std_in >= 0)
emacs_close (std_in);
- std_out = std_in = emacs_open_noquit (pty, O_RDWR, 0);
-
+ int ptyfd = emacs_open_noquit (pty_name, O_RDWR, 0);
+ if (pty_in)
+ std_in = ptyfd;
+ if (pty_out)
+ std_out = ptyfd;
if (std_in < 0)
{
- emacs_perror (pty);
+ emacs_perror (pty_name);
_exit (EXIT_CANCELED);
}
@@ -1599,7 +1606,7 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err,
/* Stop blocking SIGCHLD in the child. */
unblock_child_signal (oldset);
- if (pty_flag)
+ if (pty_out)
child_setup_tty (std_out);
#endif
diff --git a/src/coding.c b/src/coding.c
index 3fb4f148b1c..0ae8eb3282b 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -8283,7 +8283,7 @@ encode_coding_object (struct coding_system *coding,
ptrdiff_t chars = to - from;
ptrdiff_t bytes = to_byte - from_byte;
Lisp_Object attrs;
- ptrdiff_t saved_pt = -1, saved_pt_byte;
+ ptrdiff_t saved_pt = -1, saved_pt_byte UNINIT;
bool need_marker_adjustment = 0;
bool kill_src_buffer = 0;
Lisp_Object old_deactivate_mark;
diff --git a/src/comp.c b/src/comp.c
index 81d27299fa4..21d2ee5300b 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -2626,6 +2626,7 @@ emit_maybe_gc_or_quit (Lisp_Object insn)
/* This is in charge of serializing an object and export a function to
retrieve it at load time. */
+#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Waddress"
static void
emit_static_object (const char *name, Lisp_Object obj)
@@ -4681,6 +4682,7 @@ DEFUN ("comp--release-ctxt", Fcomp__release_ctxt, Scomp__release_ctxt,
return Qt;
}
+#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Waddress"
DEFUN ("comp-native-driver-options-effective-p",
Fcomp_native_driver_options_effective_p,
@@ -4697,6 +4699,7 @@ DEFUN ("comp-native-driver-options-effective-p",
}
#pragma GCC diagnostic pop
+#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Waddress"
DEFUN ("comp-native-compiler-options-effective-p",
Fcomp_native_compiler_options_effective_p,
@@ -4943,6 +4946,7 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
return filename;
}
+#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Waddress"
DEFUN ("comp-libgccjit-version", Fcomp_libgccjit_version,
Scomp_libgccjit_version, 0, 0, 0,
diff --git a/src/composite.c b/src/composite.c
index 1596e996d6c..22422cca090 100644
--- a/src/composite.c
+++ b/src/composite.c
@@ -24,6 +24,8 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include <config.h>
+#include <stdlib.h> /* for qsort */
+
#include "lisp.h"
#include "character.h"
#include "composite.h"
@@ -1021,7 +1023,11 @@ composition_compute_stop_pos (struct composition_it *cmp_it, ptrdiff_t charpos,
/* But we don't know where to stop the searching. */
endpos = NILP (string) ? BEGV - 1 : -1;
/* Usually we don't reach ENDPOS because we stop searching
- at an uncomposable character (NL, LRE, etc). */
+ at an uncomposable character (NL, LRE, etc). In buffers
+ with long lines, however, NL might be far away, so
+ pretend that the buffer is smaller. */
+ if (current_buffer->long_line_optimizations_p)
+ endpos = get_closer_narrowed_begv (cmp_it->parent_it->w, charpos);
}
}
cmp_it->id = -1;
@@ -1592,10 +1598,18 @@ find_automatic_composition (ptrdiff_t pos, ptrdiff_t limit, ptrdiff_t backlim,
if (backlim < 0)
{
/* This assumes a newline can never be composed. */
- head = find_newline (pos, -1, 0, -1, -1, NULL, NULL, false) + 1;
+ head = find_newline (pos, -1, 0, -1, -1, NULL, NULL, false);
}
else
head = backlim;
+ if (current_buffer->long_line_optimizations_p)
+ {
+ /* In buffers with very long lines, this function becomes very
+ slow. Pretend that the buffer is narrowed to make it fast. */
+ ptrdiff_t begv = get_closer_narrowed_begv (w, window_point (w));
+ if (pos > begv)
+ head = begv;
+ }
tail = ZV;
stop = GPT;
cur.pos_byte = CHAR_TO_BYTE (cur.pos);
@@ -2042,6 +2056,54 @@ See `find-composition' for more details. */)
return Fcons (make_fixnum (start), Fcons (make_fixnum (end), tail));
}
+static int
+compare_composition_rules (const void *r1, const void *r2)
+{
+ Lisp_Object vec1 = *(Lisp_Object *)r1, vec2 = *(Lisp_Object *)r2;
+
+ return XFIXNAT (AREF (vec2, 1)) - XFIXNAT (AREF (vec1, 1));
+}
+
+DEFUN ("composition-sort-rules", Fcomposition_sort_rules,
+ Scomposition_sort_rules, 1, 1, 0,
+ doc: /* Sort composition RULES by their LOOKBACK parameter.
+
+If RULES include just one rule, return RULES.
+Otherwise, return a new list of rules where all the rules are
+arranged in decreasing order of the LOOKBACK parameter of the
+rules (the second element of the rule's vector). This is required
+when combining composition rules from different sources, because
+of the way buffer text is examined for matching one of the rules. */)
+ (Lisp_Object rules)
+{
+ ptrdiff_t nrules;
+ USE_SAFE_ALLOCA;
+
+ CHECK_LIST (rules);
+ nrules = list_length (rules);
+ if (nrules > 1)
+ {
+ ptrdiff_t i;
+ Lisp_Object *sortvec;
+
+ SAFE_NALLOCA (sortvec, 1, nrules);
+ for (i = 0; i < nrules; i++)
+ {
+ Lisp_Object elt = XCAR (rules);
+ if (VECTORP (elt) && ASIZE (elt) == 3 && FIXNATP (AREF (elt, 1)))
+ sortvec[i] = elt;
+ else
+ error ("Invalid composition rule in RULES argument");
+ rules = XCDR (rules);
+ }
+ qsort (sortvec, nrules, sizeof (Lisp_Object), compare_composition_rules);
+ rules = Flist (nrules, sortvec);
+ SAFE_FREE ();
+ }
+
+ return rules;
+}
+
void
syms_of_composite (void)
@@ -2173,4 +2235,5 @@ This list is auto-generated, you should not need to modify it. */);
defsubr (&Sfind_composition_internal);
defsubr (&Scomposition_get_gstring);
defsubr (&Sclear_composition_cache);
+ defsubr (&Scomposition_sort_rules);
}
diff --git a/src/data.c b/src/data.c
index 568349ba839..b19e10582e5 100644
--- a/src/data.c
+++ b/src/data.c
@@ -3517,9 +3517,16 @@ representation. */)
}
DEFUN ("ash", Fash, Sash, 2, 2, 0,
- doc: /* Return VALUE with its bits shifted left by COUNT.
-If COUNT is negative, shifting is actually to the right.
-In this case, the sign bit is duplicated. */)
+ doc: /* Return integer VALUE with its bits shifted left by COUNT bit positions.
+If COUNT is negative, shift VALUE to the right instead.
+VALUE and COUNT must be integers.
+Mathematically, the return value is VALUE multiplied by 2 to the
+power of COUNT, rounded down. If the result is non-zero, its sign
+is the same as that of VALUE.
+In terms of bits, when COUNT is positive, the function moves
+the bits of VALUE to the left, adding zero bits on the right; when
+COUNT is negative, it moves the bits of VALUE to the right,
+discarding bits. */)
(Lisp_Object value, Lisp_Object count)
{
CHECK_INTEGER (value);
diff --git a/src/dispextern.h b/src/dispextern.h
index 916dba53198..12ba927261f 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -2287,6 +2287,8 @@ struct composition_it
reverse order, and thus the grapheme clusters must be rendered
from the last to the first. */
bool reversed_p;
+ /* Parent iterator. */
+ struct it *parent_it;
/** The following members contain information about the current
grapheme cluster. */
@@ -2332,6 +2334,14 @@ struct it
with which display_string was called. */
ptrdiff_t end_charpos;
+ /* Alternate begin position of the buffer that may be used to
+ optimize display (see the SET_WITH_NARROWED_BEGV macro). */
+ ptrdiff_t narrowed_begv;
+
+ /* Alternate end position of the buffer that may be used to
+ optimize display. */
+ ptrdiff_t narrowed_zv;
+
/* C string to iterate over. Non-null means get characters from
this string, otherwise characters are read from current_buffer
or it->string. */
@@ -2342,9 +2352,6 @@ struct it
used for overlay strings and strings from display properties. */
ptrdiff_t string_nchars;
- /* Position at which redisplay end trigger functions should be run. */
- ptrdiff_t redisplay_end_trigger_charpos;
-
/* True means multibyte characters are enabled. */
bool_bf multibyte_p : 1;
@@ -3396,6 +3403,9 @@ void mark_window_display_accurate (Lisp_Object, bool);
void redisplay_preserve_echo_area (int);
void init_iterator (struct it *, struct window *, ptrdiff_t,
ptrdiff_t, struct glyph_row *, enum face_id);
+ptrdiff_t get_narrowed_begv (struct window *, ptrdiff_t);
+ptrdiff_t get_narrowed_zv (struct window *, ptrdiff_t);
+ptrdiff_t get_closer_narrowed_begv (struct window *, ptrdiff_t);
void init_iterator_to_row_start (struct it *, struct window *,
struct glyph_row *);
void start_display (struct it *, struct window *, struct text_pos);
diff --git a/src/editfns.c b/src/editfns.c
index 4587b1132b1..07f5c0bbef7 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -2658,9 +2658,17 @@ DEFUN ("delete-and-extract-region", Fdelete_and_extract_region,
DEFUN ("widen", Fwiden, Swiden, 0, 0, "",
doc: /* Remove restrictions (narrowing) from current buffer.
-This allows the buffer's full text to be seen and edited. */)
+This allows the buffer's full text to be seen and edited.
+
+Note that, when the current buffer contains one or more lines whose
+length is above `long-line-threshold', Emacs may decide to leave, for
+performance reasons, the accessible portion of the buffer unchanged
+after this function is called from low-level hooks, such as
+`jit-lock-functions' or `post-command-hook'. */)
(void)
{
+ if (! NILP (Vrestrictions_locked))
+ return Qnil;
if (BEG != BEGV || Z != ZV)
current_buffer->clip_changed = 1;
BEGV = BEG;
@@ -2671,17 +2679,23 @@ This allows the buffer's full text to be seen and edited. */)
return Qnil;
}
-DEFUN ("narrow-to-region", Fnarrow_to_region, Snarrow_to_region, 2, 2, "r",
- doc: /* Restrict editing in this buffer to the current region.
-The rest of the text becomes temporarily invisible and untouchable
-but is not deleted; if you save the buffer in a file, the invisible
-text is included in the file. \\[widen] makes all visible again.
-See also `save-restriction'.
+static void
+unwind_locked_begv (Lisp_Object point_min)
+{
+ SET_BUF_BEGV (current_buffer, XFIXNUM (point_min));
+}
-When calling from Lisp, pass two arguments START and END:
-positions (integers or markers) bounding the text that should
-remain visible. */)
- (Lisp_Object start, Lisp_Object end)
+static void
+unwind_locked_zv (Lisp_Object point_max)
+{
+ SET_BUF_ZV (current_buffer, XFIXNUM (point_max));
+}
+
+/* Internal function for Fnarrow_to_region, meant to be used with a
+ third argument 'true', in which case it should be followed by "specbind
+ (Qrestrictions_locked, Qt)". */
+Lisp_Object
+narrow_to_region_internal (Lisp_Object start, Lisp_Object end, bool lock)
{
EMACS_INT s = fix_position (start), e = fix_position (end);
@@ -2690,14 +2704,36 @@ remain visible. */)
EMACS_INT tem = s; s = e; e = tem;
}
- if (!(BEG <= s && s <= e && e <= Z))
- args_out_of_range (start, end);
+ if (lock)
+ {
+ if (!(BEGV <= s && s <= e && e <= ZV))
+ args_out_of_range (start, end);
- if (BEGV != s || ZV != e)
- current_buffer->clip_changed = 1;
+ if (BEGV != s || ZV != e)
+ current_buffer->clip_changed = 1;
+
+ record_unwind_protect (restore_point_unwind, Fpoint_marker ());
+ record_unwind_protect (unwind_locked_begv, Fpoint_min ());
+ record_unwind_protect (unwind_locked_zv, Fpoint_max ());
+
+ SET_BUF_BEGV (current_buffer, s);
+ SET_BUF_ZV (current_buffer, e);
+ }
+ else
+ {
+ if (! NILP (Vrestrictions_locked))
+ return Qnil;
+
+ if (!(BEG <= s && s <= e && e <= Z))
+ args_out_of_range (start, end);
+
+ if (BEGV != s || ZV != e)
+ current_buffer->clip_changed = 1;
+
+ SET_BUF_BEGV (current_buffer, s);
+ SET_BUF_ZV (current_buffer, e);
+ }
- SET_BUF_BEGV (current_buffer, s);
- SET_BUF_ZV (current_buffer, e);
if (PT < s)
SET_PT (s);
if (e < PT)
@@ -2707,6 +2743,27 @@ remain visible. */)
return Qnil;
}
+DEFUN ("narrow-to-region", Fnarrow_to_region, Snarrow_to_region, 2, 2, "r",
+ doc: /* Restrict editing in this buffer to the current region.
+The rest of the text becomes temporarily invisible and untouchable
+but is not deleted; if you save the buffer in a file, the invisible
+text is included in the file. \\[widen] makes all visible again.
+See also `save-restriction'.
+
+When calling from Lisp, pass two arguments START and END:
+positions (integers or markers) bounding the text that should
+remain visible.
+
+Note that, when the current buffer contains one or more lines whose
+length is above `long-line-threshold', Emacs may decide to leave, for
+performance reasons, the accessible portion of the buffer unchanged
+after this function is called from low-level hooks, such as
+`jit-lock-functions' or `post-command-hook'. */)
+ (Lisp_Object start, Lisp_Object end)
+{
+ return narrow_to_region_internal (start, end, false);
+}
+
Lisp_Object
save_restriction_save (void)
{
@@ -4517,6 +4574,15 @@ This variable is experimental; email 32252@debbugs.gnu.org if you need
it to be non-nil. */);
binary_as_unsigned = false;
+ DEFSYM (Qrestrictions_locked, "restrictions-locked");
+ DEFVAR_LISP ("restrictions-locked", Vrestrictions_locked,
+ doc: /* If non-nil, restrictions are currently locked.
+
+This happens when `narrow-to-region', which see, is called from Lisp
+with an optional argument LOCK non-nil. */);
+ Vrestrictions_locked = Qnil;
+ Funintern (Qrestrictions_locked, Qnil);
+
defsubr (&Spropertize);
defsubr (&Schar_equal);
defsubr (&Sgoto_char);
diff --git a/src/eval.c b/src/eval.c
index 141d2546f08..56b42966623 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -57,6 +57,12 @@ Lisp_Object Vrun_hooks;
/* FIXME: We should probably get rid of this! */
Lisp_Object Vsignaling_function;
+/* The handler structure which will catch errors in Lisp hooks called
+ from redisplay. We do not use it for this; we compare it with the
+ handler which is about to be used in signal_or_quit, and if it
+ matches, cause a backtrace to be generated. */
+static struct handler *redisplay_deep_handler;
+
/* These would ordinarily be static, but they need to be visible to GDB. */
bool backtrace_p (union specbinding *) EXTERNALLY_VISIBLE;
Lisp_Object *backtrace_args (union specbinding *) EXTERNALLY_VISIBLE;
@@ -246,6 +252,7 @@ init_eval (void)
lisp_eval_depth = 0;
/* This is less than the initial value of num_nonmacro_input_events. */
when_entered_debugger = -1;
+ redisplay_deep_handler = NULL;
}
/* Ensure that *M is at least A + B if possible, or is its maximum
@@ -333,7 +340,8 @@ call_debugger (Lisp_Object arg)
/* Interrupting redisplay and resuming it later is not safe under
all circumstances. So, when the debugger returns, abort the
interrupted redisplay by going back to the top-level. */
- if (debug_while_redisplaying)
+ if (debug_while_redisplaying
+ && !EQ (Vdebugger, Qdebug_early))
Ftop_level ();
return unbind_to (count, val);
@@ -593,16 +601,19 @@ The return value is BASE-VARIABLE. */)
if (SYMBOL_CONSTANT_P (new_alias))
/* Making it an alias effectively changes its value. */
- error ("Cannot make a constant an alias");
+ error ("Cannot make a constant an alias: %s",
+ SDATA (SYMBOL_NAME (new_alias)));
sym = XSYMBOL (new_alias);
switch (sym->u.s.redirect)
{
case SYMBOL_FORWARDED:
- error ("Cannot make an internal variable an alias");
+ error ("Cannot make a built-in variable an alias: %s",
+ SDATA (SYMBOL_NAME (new_alias)));
case SYMBOL_LOCALIZED:
- error ("Don't know how to make a localized variable an alias");
+ error ("Don't know how to make a buffer-local variable an alias: %s",
+ SDATA (SYMBOL_NAME (new_alias)));
case SYMBOL_PLAINVAL:
case SYMBOL_VARALIAS:
break;
@@ -633,7 +644,8 @@ The return value is BASE-VARIABLE. */)
for (p = specpdl_ptr; p > specpdl; )
if ((--p)->kind >= SPECPDL_LET
&& (EQ (new_alias, specpdl_symbol (p))))
- error ("Don't know how to make a let-bound variable an alias");
+ error ("Don't know how to make a let-bound variable an alias: %s",
+ SDATA (SYMBOL_NAME (new_alias)));
}
if (sym->u.s.trapped_write == SYMBOL_TRAPPED_WRITE)
@@ -1552,12 +1564,16 @@ internal_condition_case_n (Lisp_Object (*bfun) (ptrdiff_t, Lisp_Object *),
ptrdiff_t nargs,
Lisp_Object *args))
{
+ struct handler *old_deep = redisplay_deep_handler;
struct handler *c = push_handler (handlers, CONDITION_CASE);
+ if (redisplaying_p)
+ redisplay_deep_handler = c;
if (sys_setjmp (c->jmp))
{
Lisp_Object val = handlerlist->val;
clobbered_eassert (handlerlist == c);
handlerlist = handlerlist->next;
+ redisplay_deep_handler = old_deep;
return hfun (val, nargs, args);
}
else
@@ -1565,6 +1581,7 @@ internal_condition_case_n (Lisp_Object (*bfun) (ptrdiff_t, Lisp_Object *),
Lisp_Object val = bfun (nargs, args);
eassert (handlerlist == c);
handlerlist = c->next;
+ redisplay_deep_handler = old_deep;
return val;
}
}
@@ -1697,6 +1714,11 @@ quit (void)
return signal_or_quit (Qquit, Qnil, true);
}
+/* Has an error in redisplay giving rise to a backtrace occurred as
+ yet in the current command? This gets reset in the command
+ loop. */
+bool backtrace_yet = false;
+
/* Signal an error, or quit. ERROR_SYMBOL and DATA are as with Fsignal.
If KEYBOARD_QUIT, this is a quit; ERROR_SYMBOL should be
Qquit and DATA should be Qnil, and this function may return.
@@ -1812,6 +1834,40 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit)
unbind_to (count, Qnil);
}
+ /* If an error is signalled during a Lisp hook in redisplay, write a
+ backtrace into the buffer *Redisplay-trace*. */
+ if (!debugger_called && !NILP (error_symbol)
+ && backtrace_on_redisplay_error
+ && (NILP (clause) || h == redisplay_deep_handler)
+ && NILP (Vinhibit_debugger)
+ && !NILP (Ffboundp (Qdebug_early)))
+ {
+ max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100);
+ specpdl_ref count = SPECPDL_INDEX ();
+ ptrdiff_t counti = specpdl_ref_to_count (count);
+ AUTO_STRING (redisplay_trace, "*Redisplay_trace*");
+ Lisp_Object redisplay_trace_buffer;
+ AUTO_STRING (gap, "\n\n\n\n"); /* Separates things in *Redisplay-trace* */
+ Lisp_Object delayed_warning;
+ max_ensure_room (&max_specpdl_size, counti, 200);
+ redisplay_trace_buffer = Fget_buffer_create (redisplay_trace, Qnil);
+ current_buffer = XBUFFER (redisplay_trace_buffer);
+ if (!backtrace_yet) /* Are we on the first backtrace of the command? */
+ Ferase_buffer ();
+ else
+ Finsert (1, &gap);
+ backtrace_yet = true;
+ specbind (Qstandard_output, redisplay_trace_buffer);
+ specbind (Qdebugger, Qdebug_early);
+ call_debugger (list2 (Qerror, Fcons (error_symbol, data)));
+ unbind_to (count, Qnil);
+ delayed_warning = make_string
+ ("Error in a redisplay Lisp hook. See buffer *Redisplay_trace*", 61);
+
+ Vdelayed_warnings_list = Fcons (list2 (Qerror, delayed_warning),
+ Vdelayed_warnings_list);
+ }
+
if (!NILP (clause))
{
Lisp_Object unwind_data
@@ -4274,6 +4330,11 @@ Does not apply if quit is handled by a `condition-case'. */);
DEFVAR_BOOL ("debug-on-next-call", debug_on_next_call,
doc: /* Non-nil means enter debugger before next `eval', `apply' or `funcall'. */);
+ DEFVAR_BOOL ("backtrace-on-redisplay-error", backtrace_on_redisplay_error,
+ doc: /* Non-nil means create a backtrace if a lisp error occurs in redisplay.
+The backtrace is written to buffer *Redisplay-trace*. */);
+ backtrace_on_redisplay_error = false;
+
DEFVAR_BOOL ("debugger-may-continue", debugger_may_continue,
doc: /* Non-nil means debugger may continue execution.
This is nil when the debugger is called under circumstances where it
diff --git a/src/fns.c b/src/fns.c
index 1f57e675b12..7e78bba3a04 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -1557,6 +1557,62 @@ substring_both (Lisp_Object string, ptrdiff_t from, ptrdiff_t from_byte,
return res;
}
+DEFUN ("take", Ftake, Stake, 2, 2, 0,
+ doc: /* Return the first N elements of LIST.
+If N is zero or negative, return nil.
+If N is greater or equal to the length of LIST, return LIST (or a copy). */)
+ (Lisp_Object n, Lisp_Object list)
+{
+ CHECK_FIXNUM (n);
+ EMACS_INT m = XFIXNUM (n);
+ if (m <= 0)
+ return Qnil;
+ CHECK_LIST (list);
+ if (NILP (list))
+ return Qnil;
+ Lisp_Object ret = Fcons (XCAR (list), Qnil);
+ Lisp_Object prev = ret;
+ m--;
+ list = XCDR (list);
+ while (m > 0 && CONSP (list))
+ {
+ Lisp_Object p = Fcons (XCAR (list), Qnil);
+ XSETCDR (prev, p);
+ prev = p;
+ m--;
+ list = XCDR (list);
+ }
+ if (m > 0 && !NILP (list))
+ wrong_type_argument (Qlistp, list);
+ return ret;
+}
+
+DEFUN ("ntake", Fntake, Sntake, 2, 2, 0,
+ doc: /* Modify LIST to keep only the first N elements.
+If N is zero or negative, return nil.
+If N is greater or equal to the length of LIST, return LIST unmodified.
+Otherwise, return LIST after truncating it. */)
+ (Lisp_Object n, Lisp_Object list)
+{
+ CHECK_FIXNUM (n);
+ EMACS_INT m = XFIXNUM (n);
+ if (m <= 0)
+ return Qnil;
+ CHECK_LIST (list);
+ Lisp_Object tail = list;
+ --m;
+ while (m > 0 && CONSP (tail))
+ {
+ tail = XCDR (tail);
+ m--;
+ }
+ if (CONSP (tail))
+ XSETCDR (tail, Qnil);
+ else if (!NILP (tail))
+ wrong_type_argument (Qlistp, list);
+ return list;
+}
+
DEFUN ("nthcdr", Fnthcdr, Snthcdr, 2, 2, 0,
doc: /* Take cdr N times on LIST, return the result. */)
(Lisp_Object n, Lisp_Object list)
@@ -6082,6 +6138,8 @@ The same variable also affects the function `read-answer'. */);
defsubr (&Scopy_alist);
defsubr (&Ssubstring);
defsubr (&Ssubstring_no_properties);
+ defsubr (&Stake);
+ defsubr (&Sntake);
defsubr (&Snthcdr);
defsubr (&Snth);
defsubr (&Selt);
diff --git a/src/frame.c b/src/frame.c
index a39e1c4944f..25d71e0769f 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -3916,9 +3916,10 @@ static const struct frame_parm_table frame_parms[] =
{"z-group", SYMBOL_INDEX (Qz_group)},
{"override-redirect", SYMBOL_INDEX (Qoverride_redirect)},
{"no-special-glyphs", SYMBOL_INDEX (Qno_special_glyphs)},
- {"alpha-background", SYMBOL_INDEX (Qalpha_background)},
+ {"alpha-background", SYMBOL_INDEX (Qalpha_background)},
+ {"use-frame-synchronization", SYMBOL_INDEX (Quse_frame_synchronization)},
#ifdef HAVE_X_WINDOWS
- {"shaded", SYMBOL_INDEX (Qshaded)},
+ {"shaded", SYMBOL_INDEX (Qshaded)},
#endif
#ifdef NS_IMPL_COCOA
{"ns-appearance", SYMBOL_INDEX (Qns_appearance)},
@@ -6195,6 +6196,7 @@ syms_of_frame (void)
DEFSYM (Qtop_only, "top-only");
DEFSYM (Qiconify_top_level, "iconify-top-level");
DEFSYM (Qmake_invisible, "make-invisible");
+ DEFSYM (Quse_frame_synchronization, "use-frame-synchronization");
{
int i;
diff --git a/src/fringe.c b/src/fringe.c
index bf0b5fde761..5d7c8dca998 100644
--- a/src/fringe.c
+++ b/src/fringe.c
@@ -209,6 +209,20 @@ static unsigned short left_curly_arrow_bits[] = {
static unsigned short right_curly_arrow_bits[] = {
0x3c, 0x3e, 0x03, 0x27, 0x3f, 0x3e, 0x3c, 0x3e};
+/* Large circle bitmap. */
+/*
+ ........
+ ..xxxx..
+ .xxxxxx.
+ xxxxxxxx
+ xxxxxxxx
+ .xxxxxx.
+ ..xxxx..
+ ........
+*/
+static unsigned short large_circle_bits[] = {
+ 0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c};
+
/* Reverse Overlay arrow bitmap. A triangular arrow. */
/*
......xx
@@ -454,6 +468,7 @@ static struct fringe_bitmap standard_bitmaps[] =
{ FRBITS (down_arrow_bits), 8, 0, ALIGN_BITMAP_BOTTOM, 0 },
{ FRBITS (left_curly_arrow_bits), 8, 0, ALIGN_BITMAP_CENTER, 0 },
{ FRBITS (right_curly_arrow_bits), 8, 0, ALIGN_BITMAP_CENTER, 0 },
+ { FRBITS (large_circle_bits), 8, 0, ALIGN_BITMAP_CENTER, 0 },
{ FRBITS (left_triangle_bits), 8, 0, ALIGN_BITMAP_CENTER, 0 },
{ FRBITS (right_triangle_bits), 8, 0, ALIGN_BITMAP_CENTER, 0 },
{ FRBITS (top_left_angle_bits), 8, 0, ALIGN_BITMAP_TOP, 0 },
diff --git a/src/ftcrfont.c b/src/ftcrfont.c
index 6bb41110d5c..e089f9dea85 100644
--- a/src/ftcrfont.c
+++ b/src/ftcrfont.c
@@ -567,7 +567,7 @@ ftcrfont_draw (struct glyph_string *s,
unblock_input ();
return 0;
}
- BView_cr_dump_clipping (FRAME_HAIKU_VIEW (f), cr);
+ BView_cr_dump_clipping (FRAME_HAIKU_DRAWABLE (f), cr);
#endif
if (with_background)
@@ -677,7 +677,11 @@ ftcrhbfont_begin_hb_font (struct font *font, double *position_unit)
ftcrfont_info->ft_size = ft_face->size;
hb_font_t *hb_font = fthbfont_begin_hb_font (font, position_unit);
- if (ftcrfont_info->bitmap_position_unit)
+ /* HarfBuzz 5 correctly scales bitmap-only fonts without position
+ unit adjustment.
+ (https://github.com/harfbuzz/harfbuzz/issues/489) */
+ if (!hb_version_atleast (5, 0, 0)
+ && ftcrfont_info->bitmap_position_unit)
*position_unit = ftcrfont_info->bitmap_position_unit;
return hb_font;
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 1f7f372a9b4..983928442a1 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -189,10 +189,6 @@ static BMessage volatile *popup_track_message;
number. */
static int32 volatile alert_popup_value;
-/* The current window ID. This is increased every time a frame is
- created. */
-static int current_window_id;
-
/* The view that has the passive grab. */
static void *grab_view;
@@ -698,7 +694,6 @@ public:
was_shown_p (false),
menu_bar_active_p (false),
override_redirect_p (false),
- window_id (current_window_id),
menus_begun (NULL),
z_group (Z_GROUP_NONE),
tooltip_p (false),
@@ -941,12 +936,11 @@ public:
if (msg->WasDropped ())
{
BPoint whereto;
- int32 windowid;
+ int64 threadid;
struct haiku_drag_and_drop_event rq;
- if (msg->FindInt32 ("emacs:window_id", &windowid) == B_OK
- && !msg->IsSourceRemote ()
- && windowid == this->window_id)
+ if (msg->FindInt64 ("emacs:thread_id", &threadid) == B_OK
+ && threadid == find_thread (NULL))
return;
whereto = msg->DropPoint ();
@@ -1502,7 +1496,6 @@ public:
class EmacsView : public BView
{
public:
- uint32_t previous_buttons;
int looper_locked_count;
BRegion sb_region;
BRegion invalid_region;
@@ -1518,10 +1511,12 @@ public:
#endif
BMessage *wait_for_release_message;
+ int64 grabbed_buttons;
+ BScreen screen;
+ bool use_frame_synchronization;
EmacsView () : BView (BRect (0, 0, 0, 0), "Emacs",
B_FOLLOW_NONE, B_WILL_DRAW),
- previous_buttons (0),
looper_locked_count (0),
offscreen_draw_view (NULL),
offscreen_draw_bitmap_1 (NULL),
@@ -1530,7 +1525,9 @@ public:
cr_surface (NULL),
cr_context (NULL),
#endif
- wait_for_release_message (NULL)
+ wait_for_release_message (NULL),
+ grabbed_buttons (0),
+ use_frame_synchronization (false)
{
}
@@ -1553,6 +1550,16 @@ public:
}
void
+ SetFrameSynchronization (bool sync)
+ {
+ if (LockLooper ())
+ {
+ use_frame_synchronization = sync;
+ UnlockLooper ();
+ }
+ }
+
+ void
MessageReceived (BMessage *msg)
{
uint32 buttons;
@@ -1728,14 +1735,14 @@ public:
void
FlipBuffers (void)
{
+ EmacsWindow *w;
if (!LockLooper ())
gui_abort ("Failed to lock looper during buffer flip");
if (!offscreen_draw_view)
gui_abort ("Failed to lock offscreen view during buffer flip");
offscreen_draw_view->Sync ();
-
- EmacsWindow *w = (EmacsWindow *) Window ();
+ w = (EmacsWindow *) Window ();
w->shown_flag = 0;
if (copy_bitmap &&
@@ -1756,6 +1763,11 @@ public:
if (copy_bitmap->InitCheck () != B_OK)
gui_abort ("Failed to init copy bitmap during buffer flip");
+ /* Wait for VBLANK. If responding to the invalidation or buffer
+ flipping takes longer than the blanking period, we lose. */
+ if (use_frame_synchronization)
+ screen.WaitForRetrace ();
+
Invalidate (&invalid_region);
invalid_region.MakeEmpty ();
UnlockLooper ();
@@ -1794,7 +1806,7 @@ public:
MouseMoved (BPoint point, uint32 transit, const BMessage *drag_msg)
{
struct haiku_mouse_motion_event rq;
- int32 windowid;
+ int64 threadid;
EmacsWindow *window;
window = (EmacsWindow *) Window ();
@@ -1810,9 +1822,9 @@ public:
rq.time = system_time ();
if (drag_msg && (drag_msg->IsSourceRemote ()
- || drag_msg->FindInt32 ("emacs:window_id",
- &windowid) != B_OK
- || windowid != window->window_id))
+ || drag_msg->FindInt64 ("emacs:thread_id",
+ &threadid) != B_OK
+ || threadid != find_thread (NULL)))
rq.dnd_message = true;
else
rq.dnd_message = false;
@@ -1832,42 +1844,51 @@ public:
}
void
- BasicMouseDown (BPoint point, BView *scroll_bar)
+ BasicMouseDown (BPoint point, BView *scroll_bar, BMessage *message)
{
struct haiku_button_event rq;
- uint32 mods, buttons;
+ int64 when;
+ int32 mods, buttons, button;
- this->GetMouse (&point, &buttons, false);
+ if (message->FindInt64 ("when", &when) != B_OK
+ || message->FindInt32 ("modifiers", &mods) != B_OK
+ || message->FindInt32 ("buttons", &buttons) != B_OK)
+ return;
- if (!grab_view_locker.Lock ())
- gui_abort ("Couldn't lock grab view locker");
- if (buttons)
- grab_view = this;
- grab_view_locker.Unlock ();
+ /* Find which button was pressed by comparing the previous button
+ mask to the current one. This assumes that B_MOUSE_DOWN will
+ be sent for each button press. */
+ button = buttons & ~grabbed_buttons;
+ grabbed_buttons = buttons;
+
+ if (!scroll_bar)
+ {
+ if (!grab_view_locker.Lock ())
+ gui_abort ("Couldn't lock grab view locker");
+ grab_view = this;
+ grab_view_locker.Unlock ();
+ }
rq.window = this->Window ();
rq.scroll_bar = scroll_bar;
- if (!(previous_buttons & B_PRIMARY_MOUSE_BUTTON)
- && (buttons & B_PRIMARY_MOUSE_BUTTON))
+ if (button == B_PRIMARY_MOUSE_BUTTON)
rq.btn_no = 0;
- else if (!(previous_buttons & B_SECONDARY_MOUSE_BUTTON)
- && (buttons & B_SECONDARY_MOUSE_BUTTON))
+ else if (button == B_SECONDARY_MOUSE_BUTTON)
rq.btn_no = 2;
- else if (!(previous_buttons & B_TERTIARY_MOUSE_BUTTON)
- && (buttons & B_TERTIARY_MOUSE_BUTTON))
+ else if (button == B_TERTIARY_MOUSE_BUTTON)
rq.btn_no = 1;
else
+ /* We don't know which button was pressed. This usually happens
+ when a B_MOUSE_UP is sent to a view that didn't receive a
+ corresponding B_MOUSE_DOWN event, so simply ignore the
+ message. */
return;
- previous_buttons = buttons;
-
rq.x = point.x;
rq.y = point.y;
-
- mods = modifiers ();
-
rq.modifiers = 0;
+
if (mods & B_SHIFT_KEY)
rq.modifiers |= HAIKU_MODIFIER_SHIFT;
@@ -1884,62 +1905,76 @@ public:
SetMouseEventMask (B_POINTER_EVENTS, (B_LOCK_WINDOW_FOCUS
| B_NO_POINTER_HISTORY));
- rq.time = system_time ();
+ rq.time = when;
haiku_write (BUTTON_DOWN, &rq);
}
void
MouseDown (BPoint point)
{
- BasicMouseDown (point, NULL);
+ BMessage *msg;
+ BLooper *looper;
+
+ looper = Looper ();
+ msg = (looper
+ ? looper->CurrentMessage ()
+ : NULL);
+
+ if (msg)
+ BasicMouseDown (point, NULL, msg);
}
void
- BasicMouseUp (BPoint point, BView *scroll_bar)
+ BasicMouseUp (BPoint point, BView *scroll_bar, BMessage *message)
{
struct haiku_button_event rq;
- uint32 buttons, mods;
+ int64 when;
+ int32 mods, button, buttons;
- this->GetMouse (&point, &buttons, false);
+ if (message->FindInt64 ("when", &when) != B_OK
+ || message->FindInt32 ("modifiers", &mods) != B_OK
+ || message->FindInt32 ("buttons", &buttons) != B_OK)
+ return;
- if (!grab_view_locker.Lock ())
- gui_abort ("Couldn't lock grab view locker");
- if (!buttons)
- grab_view = NULL;
- grab_view_locker.Unlock ();
+ if (!scroll_bar)
+ {
+ if (!grab_view_locker.Lock ())
+ gui_abort ("Couldn't lock grab view locker");
+ if (!buttons)
+ grab_view = NULL;
+ grab_view_locker.Unlock ();
+ }
- if (!buttons && wait_for_release_message)
+ button = (grabbed_buttons & ~buttons);
+ grabbed_buttons = buttons;
+
+ if (wait_for_release_message)
{
- wait_for_release_message->SendReply (wait_for_release_message);
- delete wait_for_release_message;
- wait_for_release_message = NULL;
+ if (!grabbed_buttons)
+ {
+ wait_for_release_message->SendReply (wait_for_release_message);
+ delete wait_for_release_message;
+ wait_for_release_message = NULL;
+ }
- previous_buttons = buttons;
return;
}
rq.window = this->Window ();
rq.scroll_bar = scroll_bar;
- if ((previous_buttons & B_PRIMARY_MOUSE_BUTTON)
- && !(buttons & B_PRIMARY_MOUSE_BUTTON))
+ if (button == B_PRIMARY_MOUSE_BUTTON)
rq.btn_no = 0;
- else if ((previous_buttons & B_SECONDARY_MOUSE_BUTTON)
- && !(buttons & B_SECONDARY_MOUSE_BUTTON))
+ else if (button == B_SECONDARY_MOUSE_BUTTON)
rq.btn_no = 2;
- else if ((previous_buttons & B_TERTIARY_MOUSE_BUTTON)
- && !(buttons & B_TERTIARY_MOUSE_BUTTON))
+ else if (button == B_TERTIARY_MOUSE_BUTTON)
rq.btn_no = 1;
else
return;
- previous_buttons = buttons;
-
rq.x = point.x;
rq.y = point.y;
- mods = modifiers ();
-
rq.modifiers = 0;
if (mods & B_SHIFT_KEY)
rq.modifiers |= HAIKU_MODIFIER_SHIFT;
@@ -1953,14 +1988,23 @@ public:
if (mods & B_OPTION_KEY)
rq.modifiers |= HAIKU_MODIFIER_SUPER;
- rq.time = system_time ();
+ rq.time = when;
haiku_write (BUTTON_UP, &rq);
}
void
MouseUp (BPoint point)
{
- BasicMouseUp (point, NULL);
+ BMessage *msg;
+ BLooper *looper;
+
+ looper = Looper ();
+ msg = (looper
+ ? looper->CurrentMessage ()
+ : NULL);
+
+ if (msg)
+ BasicMouseUp (point, NULL, msg);
}
};
@@ -1973,8 +2017,9 @@ public:
float old_value;
scroll_bar_info info;
- /* True if button events should be passed to the parent. */
- bool handle_button;
+ /* How many button events were passed to the parent without
+ release. */
+ int handle_button_count;
bool in_overscroll;
bool can_overscroll;
bool maybe_overscroll;
@@ -1990,7 +2035,7 @@ public:
: BScrollBar (BRect (x, y, x1, y1), NULL, NULL, 0, 0, horizontal_p ?
B_HORIZONTAL : B_VERTICAL),
dragging (0),
- handle_button (false),
+ handle_button_count (0),
in_overscroll (false),
can_overscroll (false),
maybe_overscroll (false),
@@ -2214,10 +2259,10 @@ public:
&& mods & B_CONTROL_KEY)
{
/* Allow C-mouse-3 to split the window on a scroll bar. */
- handle_button = true;
+ handle_button_count += 1;
SetMouseEventMask (B_POINTER_EVENTS, (B_SUSPEND_VIEW_FOCUS
| B_LOCK_WINDOW_FOCUS));
- parent->BasicMouseDown (ConvertToParent (pt), this);
+ parent->BasicMouseDown (ConvertToParent (pt), this, message);
return;
}
@@ -2280,14 +2325,23 @@ public:
MouseUp (BPoint pt)
{
struct haiku_scroll_bar_drag_event rq;
+ BMessage *msg;
+ BLooper *looper;
in_overscroll = false;
maybe_overscroll = false;
- if (handle_button)
+ if (handle_button_count)
{
- handle_button = false;
- parent->BasicMouseUp (ConvertToParent (pt), this);
+ handle_button_count--;
+ looper = Looper ();
+ msg = (looper
+ ? looper->CurrentMessage ()
+ : NULL);
+
+ if (msg)
+ parent->BasicMouseUp (ConvertToParent (pt),
+ this, msg);
return;
}
@@ -5046,13 +5100,17 @@ be_drag_message (void *view, void *message, bool allow_same_view,
BMessage cancel_message (CANCEL_DROP);
struct object_wait_info infos[2];
ssize_t stat;
+ thread_id window_thread;
block_input_function ();
- if (!allow_same_view &&
- (msg->ReplaceInt32 ("emacs:window_id", window->window_id)
- == B_NAME_NOT_FOUND))
- msg->AddInt32 ("emacs:window_id", window->window_id);
+ if (!allow_same_view)
+ window_thread = window->Looper ()->Thread ();
+
+ if (!allow_same_view
+ && (msg->ReplaceInt64 ("emacs:thread_id", window_thread)
+ == B_NAME_NOT_FOUND))
+ msg->AddInt64 ("emacs:thread_id", window_thread);
if (!vw->LockLooper ())
gui_abort ("Failed to lock view looper for drag");
@@ -5420,3 +5478,26 @@ be_get_explicit_workarea (int *x, int *y, int *width, int *height)
return true;
}
+
+/* Clear the grab view. This has to be called manually from some
+ places, since we don't get B_MOUSE_UP messages after a popup menu
+ is run. */
+
+void
+be_clear_grab_view (void)
+{
+ if (grab_view_locker.Lock ())
+ {
+ grab_view = NULL;
+ grab_view_locker.Unlock ();
+ }
+}
+
+void
+be_set_use_frame_synchronization (void *view, bool sync)
+{
+ EmacsView *vw;
+
+ vw = (EmacsView *) view;
+ vw->SetFrameSynchronization (sync);
+}
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 5577d2f151f..ca1808556a4 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -727,6 +727,8 @@ extern void be_set_window_fullscreen_mode (void *, enum haiku_fullscreen_mode);
extern void be_lock_window (void *);
extern void be_unlock_window (void *);
extern bool be_get_explicit_workarea (int *, int *, int *, int *);
+extern void be_clear_grab_view (void);
+extern void be_set_use_frame_synchronization (void *, bool);
#ifdef __cplusplus
}
diff --git a/src/haikufns.c b/src/haikufns.c
index e0a65b499f4..aaa4e866228 100644
--- a/src/haikufns.c
+++ b/src/haikufns.c
@@ -949,6 +949,10 @@ haiku_create_frame (Lisp_Object parms)
|| !FRAME_LIVE_P (XFRAME (KVAR (kb, Vdefault_minibuffer_frame)))))
kset_default_minibuffer_frame (kb, frame);
+ /* Set whether or not frame synchronization is enabled. */
+ gui_default_parameter (f, parms, Quse_frame_synchronization, Qt,
+ NULL, NULL, RES_TYPE_BOOLEAN);
+
gui_default_parameter (f, parms, Qz_group, Qnil,
NULL, NULL, RES_TYPE_SYMBOL);
@@ -1501,9 +1505,9 @@ haiku_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval
if (FRAME_HAIKU_VIEW (f))
{
- BView_draw_lock (FRAME_HAIKU_VIEW (f), false, 0, 0, 0, 0);
- BView_SetViewColor (FRAME_HAIKU_VIEW (f), background);
- BView_draw_unlock (FRAME_HAIKU_VIEW (f));
+ BView_draw_lock (FRAME_HAIKU_DRAWABLE (f), false, 0, 0, 0, 0);
+ BView_SetViewColor (FRAME_HAIKU_DRAWABLE (f), background);
+ BView_draw_unlock (FRAME_HAIKU_DRAWABLE (f));
FRAME_OUTPUT_DATA (f)->cursor_fg = background;
update_face_from_frame_parameter (f, Qbackground_color, arg);
@@ -2115,6 +2119,13 @@ haiku_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
update_face_from_frame_parameter (f, Qmouse_color, arg);
}
+static void
+haiku_set_use_frame_synchronization (struct frame *f, Lisp_Object arg,
+ Lisp_Object oldval)
+{
+ be_set_use_frame_synchronization (FRAME_HAIKU_VIEW (f), !NILP (arg));
+}
+
DEFUN ("haiku-set-mouse-absolute-pixel-position",
@@ -2330,6 +2341,10 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
int old_windows_or_buffers_changed = windows_or_buffers_changed;
specpdl_ref count = SPECPDL_INDEX ();
Lisp_Object window, size, tip_buf;
+ bool displayed;
+#ifdef ENABLE_CHECKING
+ struct glyph_row *row, *end;
+#endif
AUTO_STRING (tip, " *tip*");
specbind (Qinhibit_redisplay, Qt);
@@ -2401,7 +2416,6 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
if (!NILP (tip_frame) && FRAME_LIVE_P (XFRAME (tip_frame)))
{
if (FRAME_VISIBLE_P (XFRAME (tip_frame))
- && EQ (frame, tip_last_frame)
&& !NILP (Fequal_including_properties (tip_last_string, string))
&& !NILP (Fequal (tip_last_parms, parms)))
{
@@ -2558,7 +2572,26 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
clear_glyph_matrix (w->desired_matrix);
clear_glyph_matrix (w->current_matrix);
SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
- try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+ displayed = try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+
+ if (!displayed && NILP (Vx_max_tooltip_size))
+ {
+#ifdef ENABLE_CHECKING
+ row = w->desired_matrix->rows;
+ end = w->desired_matrix->rows + w->desired_matrix->nrows;
+
+ while (row < end)
+ {
+ if (!row->displays_text_p
+ || row->ends_at_zv_p)
+ break;
+ ++row;
+ }
+
+ eassert (row < end && row->ends_at_zv_p);
+#endif
+ }
+
/* Calculate size of tooltip window. */
size = Fwindow_text_pixel_size (window, Qnil, Qnil, Qnil,
make_fixnum (w->pixel_height), Qnil,
@@ -3106,6 +3139,7 @@ frame_parm_handler haiku_frame_parm_handlers[] =
haiku_set_override_redirect,
gui_set_no_special_glyphs,
gui_set_alpha_background,
+ haiku_set_use_frame_synchronization,
};
void
@@ -3179,7 +3213,7 @@ syms_of_haikufns (void)
DEFVAR_LISP ("x-max-tooltip-size", Vx_max_tooltip_size,
doc: /* SKIP: real doc in xfns.c. */);
- Vx_max_tooltip_size = Fcons (make_fixnum (80), make_fixnum (40));
+ Vx_max_tooltip_size = Qnil;
DEFVAR_LISP ("x-cursor-fore-pixel", Vx_cursor_fore_pixel,
doc: /* SKIP: real doc in xfns.c. */);
diff --git a/src/haikumenu.c b/src/haikumenu.c
index 929ed952105..69bb56c124e 100644
--- a/src/haikumenu.c
+++ b/src/haikumenu.c
@@ -432,6 +432,11 @@ haiku_menu_show (struct frame *f, int x, int y, int menuflags,
FRAME_DISPLAY_INFO (f)->grabbed = 0;
+ /* Clear the grab view manually. There is a race condition here if
+ the window thread receives a button press between here and the
+ end of BMenu_run. */
+ be_clear_grab_view ();
+
if (menu_item_selection)
{
prefix = entry = Qnil;
diff --git a/src/haikuselect.c b/src/haikuselect.c
index dc0a7edf430..7eb93a2754d 100644
--- a/src/haikuselect.c
+++ b/src/haikuselect.c
@@ -37,6 +37,10 @@ struct frame *haiku_dnd_frame;
/* Whether or not to move the tip frame during drag-and-drop. */
bool haiku_dnd_follow_tooltip;
+/* Whether or not the current DND frame is able to receive drops from
+ the current drag-and-drop operation. */
+bool haiku_dnd_allow_same_frame;
+
static void haiku_lisp_to_message (Lisp_Object, void *);
static enum haiku_clipboard
@@ -830,6 +834,8 @@ currently being displayed to move along with the mouse pointer. */)
haiku_dnd_frame = f;
haiku_dnd_follow_tooltip = !NILP (follow_tooltip);
+ haiku_dnd_allow_same_frame = !NILP (allow_same_frame);
+
be_message = be_create_simple_message ();
record_unwind_protect_ptr (haiku_unwind_drag_message, be_message);
@@ -1030,6 +1036,37 @@ haiku_note_drag_motion (void)
internal_catch_all (haiku_note_drag_motion_1, NULL,
haiku_note_drag_motion_2);
+
+ /* Redisplay this way to preserve the echo area. Otherwise, the
+ contents will abruptly disappear when the mouse moves over a
+ frame. */
+ redisplay_preserve_echo_area (34);
+}
+
+void
+haiku_note_drag_wheel (struct input_event *ie)
+{
+ bool horizontal, up;
+
+ up = false;
+ horizontal = false;
+
+ if (ie->modifiers & up_modifier)
+ up = true;
+
+ if (ie->kind == HORIZ_WHEEL_EVENT)
+ horizontal = true;
+
+ ie->kind = NO_EVENT;
+
+ if (!NILP (Vhaiku_drag_wheel_function)
+ && (haiku_dnd_allow_same_frame
+ || XFRAME (ie->frame_or_window) != haiku_dnd_frame))
+ safe_call (7, Vhaiku_drag_wheel_function, ie->frame_or_window,
+ ie->x, ie->y, horizontal ? Qt : Qnil, up ? Qt : Qnil,
+ make_int (ie->modifiers));
+
+ redisplay_preserve_echo_area (35);
}
void
@@ -1095,13 +1132,13 @@ void
syms_of_haikuselect (void)
{
DEFVAR_BOOL ("haiku-signal-invalid-refs", haiku_signal_invalid_refs,
- doc: /* If nil, silently ignore invalid file names in system messages.
+ doc: /* If nil, silently ignore invalid file names in system messages.
Otherwise, an error will be signalled if adding a file reference to a
system message failed. */);
haiku_signal_invalid_refs = true;
DEFVAR_LISP ("haiku-drag-track-function", Vhaiku_drag_track_function,
- doc: /* If non-nil, a function to call upon mouse movement while dragging a message.
+ doc: /* If non-nil, a function to call upon mouse movement while dragging a message.
The function is called without any arguments. `mouse-position' can be
used to retrieve the current position of the mouse. */);
Vhaiku_drag_track_function = Qnil;
@@ -1111,6 +1148,16 @@ used to retrieve the current position of the mouse. */);
These are only called if a connection to the Haiku display was opened. */);
Vhaiku_lost_selection_functions = Qnil;
+ DEFVAR_LISP ("haiku-drag-wheel-function", Vhaiku_drag_wheel_function,
+ doc: /* Function called upon wheel movement while dragging a message.
+If non-nil, it is called with 6 arguments when the mouse wheel moves
+while a drag-and-drop operation is in progress: the frame where the
+mouse moved, the frame-relative X and Y positions where the mouse
+moved, whether or not the wheel movement was horizontal, whether or
+not the wheel moved up (or left, if the movement was horizontal), and
+keyboard modifiers currently held down. */);
+ Vhaiku_drag_wheel_function = Qnil;
+
DEFSYM (QSECONDARY, "SECONDARY");
DEFSYM (QCLIPBOARD, "CLIPBOARD");
DEFSYM (QSTRING, "STRING");
diff --git a/src/haikuterm.c b/src/haikuterm.c
index bcb3af0e2c3..c2d4e34ba25 100644
--- a/src/haikuterm.c
+++ b/src/haikuterm.c
@@ -163,15 +163,15 @@ haiku_clip_to_string (struct glyph_string *s)
/* If n[FOO].width is 0, it means to not draw at all, so set the
clipping to some impossible value. */
if (r[0].width <= 0)
- BView_ClipToRect (FRAME_HAIKU_VIEW (s->f),
+ BView_ClipToRect (FRAME_HAIKU_DRAWABLE (s->f),
FRAME_PIXEL_WIDTH (s->f),
FRAME_PIXEL_HEIGHT (s->f),
10, 10);
else
{
- BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), r[0].x,
+ BView_ClipToRect (FRAME_HAIKU_DRAWABLE (s->f), r[0].x,
r[0].y, r[0].width, r[0].height);
- BView_invalidate_region (FRAME_HAIKU_VIEW (s->f), r[0].x,
+ BView_invalidate_region (FRAME_HAIKU_DRAWABLE (s->f), r[0].x,
r[0].y, r[0].width, r[0].height);
}
}
@@ -181,15 +181,15 @@ haiku_clip_to_string (struct glyph_string *s)
/* If n[FOO].width is 0, it means to not draw at all, so set the
clipping to some impossible value. */
if (r[1].width <= 0)
- BView_ClipToRect (FRAME_HAIKU_VIEW (s->f),
+ BView_ClipToRect (FRAME_HAIKU_DRAWABLE (s->f),
FRAME_PIXEL_WIDTH (s->f),
FRAME_PIXEL_HEIGHT (s->f),
10, 10);
else
{
- BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), r[1].x, r[1].y,
+ BView_ClipToRect (FRAME_HAIKU_DRAWABLE (s->f), r[1].x, r[1].y,
r[1].width, r[1].height);
- BView_invalidate_region (FRAME_HAIKU_VIEW (s->f), r[1].x,
+ BView_invalidate_region (FRAME_HAIKU_DRAWABLE (s->f), r[1].x,
r[1].y, r[1].width, r[1].height);
}
}
@@ -198,9 +198,9 @@ haiku_clip_to_string (struct glyph_string *s)
static void
haiku_clip_to_string_exactly (struct glyph_string *s, struct glyph_string *dst)
{
- BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), s->x, s->y,
+ BView_ClipToRect (FRAME_HAIKU_DRAWABLE (s->f), s->x, s->y,
s->width, s->height);
- BView_invalidate_region (FRAME_HAIKU_VIEW (s->f), s->x,
+ BView_invalidate_region (FRAME_HAIKU_DRAWABLE (s->f), s->x,
s->y, s->width, s->height);
}
@@ -246,7 +246,7 @@ static void
haiku_clear_frame_area (struct frame *f, int x, int y,
int width, int height)
{
- void *vw = FRAME_HAIKU_VIEW (f);
+ void *vw = FRAME_HAIKU_DRAWABLE (f);
block_input ();
BView_draw_lock (vw, true, x, y, width, height);
BView_StartClip (vw);
@@ -261,7 +261,7 @@ haiku_clear_frame_area (struct frame *f, int x, int y,
static void
haiku_clear_frame (struct frame *f)
{
- void *view = FRAME_HAIKU_VIEW (f);
+ void *view = FRAME_HAIKU_DRAWABLE (f);
mark_window_cursors_off (XWINDOW (FRAME_ROOT_WINDOW (f)));
@@ -596,7 +596,7 @@ haiku_draw_box_rect (struct glyph_string *s, int left_x, int top_y,
int right_x, int bottom_y, int hwidth, int vwidth,
bool left_p, bool right_p, struct haiku_rect *clip_rect)
{
- void *view = FRAME_HAIKU_VIEW (s->f);
+ void *view = FRAME_HAIKU_DRAWABLE (s->f);
struct face *face = s->face;
BView_SetHighColor (view, face->box_color);
@@ -660,7 +660,7 @@ haiku_draw_relief_rect (struct glyph_string *s, int left_x, int top_y,
uint32_t color_white, color_black;
void *view;
- view = FRAME_HAIKU_VIEW (s->f);
+ view = FRAME_HAIKU_DRAWABLE (s->f);
haiku_calculate_relief_colors (s, &color_white, &color_black);
BView_SetHighColor (view, raised_p ? color_white : color_black);
@@ -769,7 +769,7 @@ haiku_draw_underwave (struct glyph_string *s, int width, int x)
dy = wave_height - 1;
y = s->ybase - wave_height + 3;
xmax = x + width;
- view = FRAME_HAIKU_VIEW (s->f);
+ view = FRAME_HAIKU_DRAWABLE (s->f);
BView_StartClip (view);
haiku_clip_to_string (s);
@@ -811,7 +811,7 @@ haiku_draw_text_decoration (struct glyph_string *s, struct face *face,
if (s->hl == DRAW_CURSOR)
haiku_merge_cursor_foreground (s, &cursor_color, NULL);
- void *view = FRAME_HAIKU_VIEW (s->f);
+ void *view = FRAME_HAIKU_DRAWABLE (s->f);
if (face->underline)
{
@@ -1013,7 +1013,7 @@ static void
haiku_draw_plain_background (struct glyph_string *s, struct face *face,
int x, int y, int width, int height)
{
- void *view = FRAME_HAIKU_VIEW (s->f);
+ void *view = FRAME_HAIKU_DRAWABLE (s->f);
unsigned long cursor_color;
if (s->hl == DRAW_CURSOR)
@@ -1075,7 +1075,7 @@ haiku_draw_stipple_background (struct glyph_string *s, struct face *face,
unsigned long foreground, background;
void *view;
- view = FRAME_HAIKU_VIEW (s->f);
+ view = FRAME_HAIKU_DRAWABLE (s->f);
rec = haiku_get_bitmap_rec (s->f, s->face->stipple);
if (explicit_colors_p)
@@ -1173,7 +1173,7 @@ haiku_draw_glyph_string_foreground (struct glyph_string *s)
else
x = s->x;
- void *view = FRAME_HAIKU_VIEW (s->f);
+ void *view = FRAME_HAIKU_DRAWABLE (s->f);
if (s->font_not_found_p)
{
@@ -1289,9 +1289,9 @@ haiku_draw_glyphless_glyph_string_foreground (struct glyph_string *s)
else
color = s->face->foreground;
- BView_SetHighColor (FRAME_HAIKU_VIEW (s->f), color);
- BView_SetPenSize (FRAME_HAIKU_VIEW (s->f), 1);
- BView_StrokeRectangle (FRAME_HAIKU_VIEW (s->f),
+ BView_SetHighColor (FRAME_HAIKU_DRAWABLE (s->f), color);
+ BView_SetPenSize (FRAME_HAIKU_DRAWABLE (s->f), 1);
+ BView_StrokeRectangle (FRAME_HAIKU_DRAWABLE (s->f),
x, s->ybase - glyph->ascent,
glyph->pixel_width,
glyph->ascent + glyph->descent);
@@ -1335,7 +1335,7 @@ haiku_draw_stretch_glyph_string (struct glyph_string *s)
if (s->row->reversed_p)
x -= width;
- void *view = FRAME_HAIKU_VIEW (s->f);
+ void *view = FRAME_HAIKU_DRAWABLE (s->f);
unsigned long cursor_color;
haiku_merge_cursor_foreground (s, NULL, &cursor_color);
@@ -1401,14 +1401,14 @@ haiku_draw_stretch_glyph_string (struct glyph_string *s)
static void
haiku_start_clip (struct glyph_string *s)
{
- void *view = FRAME_HAIKU_VIEW (s->f);
+ void *view = FRAME_HAIKU_DRAWABLE (s->f);
BView_StartClip (view);
}
static void
haiku_end_clip (struct glyph_string *s)
{
- void *view = FRAME_HAIKU_VIEW (s->f);
+ void *view = FRAME_HAIKU_DRAWABLE (s->f);
BView_EndClip (view);
}
@@ -1428,7 +1428,7 @@ haiku_clip_to_row (struct window *w, struct glyph_row *row,
width = window_width;
height = row->visible_height;
- BView_ClipToRect (FRAME_HAIKU_VIEW (f), x, y, width, height);
+ BView_ClipToRect (FRAME_HAIKU_DRAWABLE (f), x, y, width, height);
}
static void
@@ -1448,7 +1448,7 @@ haiku_draw_composite_glyph_string_foreground (struct glyph_string *s)
{
int i, j, x;
struct font *font = s->font;
- void *view = FRAME_HAIKU_VIEW (s->f);
+ void *view = FRAME_HAIKU_DRAWABLE (s->f);
struct face *face = s->face;
/* If first glyph of S has a left box line, start drawing the text
@@ -1670,7 +1670,7 @@ haiku_draw_image_glyph_string (struct glyph_string *s)
if (s->slice.y == 0)
y += box_line_vwidth;
- view = FRAME_HAIKU_VIEW (s->f);
+ view = FRAME_HAIKU_DRAWABLE (s->f);
bitmap = s->img->pixmap;
s->stippled_p = face->stipple != 0;
@@ -1803,7 +1803,7 @@ haiku_draw_image_glyph_string (struct glyph_string *s)
static void
haiku_draw_glyph_string (struct glyph_string *s)
{
- void *view = FRAME_HAIKU_VIEW (s->f);;
+ void *view = FRAME_HAIKU_DRAWABLE (s->f);;
struct face *face = s->face;
block_input ();
@@ -2001,7 +2001,7 @@ haiku_after_update_window_line (struct window *w,
block_input ();
if (face)
{
- void *view = FRAME_HAIKU_VIEW (f);
+ void *view = FRAME_HAIKU_DRAWABLE (f);
BView_draw_lock (view, false, 0, 0, 0, 0);
BView_StartClip (view);
BView_SetHighColor (view, (face->background_defaulted_p
@@ -2010,7 +2010,7 @@ haiku_after_update_window_line (struct window *w,
BView_FillRectangle (view, 0, y, width, height);
BView_FillRectangle (view, FRAME_PIXEL_WIDTH (f) - width,
y, width, height);
- BView_invalidate_region (FRAME_HAIKU_VIEW (f),
+ BView_invalidate_region (FRAME_HAIKU_DRAWABLE (f),
0, y, width, height);
BView_invalidate_region (view, FRAME_PIXEL_WIDTH (f) - width,
y, width, height);
@@ -2075,7 +2075,7 @@ haiku_draw_hollow_cursor (struct window *w, struct glyph_row *row)
void *view;
f = XFRAME (WINDOW_FRAME (w));
- view = FRAME_HAIKU_VIEW (f);
+ view = FRAME_HAIKU_DRAWABLE (f);
/* Get the glyph the cursor is on. If we can't tell because
the current matrix is invalid or such, give up. */
@@ -2148,7 +2148,7 @@ haiku_draw_bar_cursor (struct window *w, struct glyph_row *row,
}
else
{
- view = FRAME_HAIKU_VIEW (f);
+ view = FRAME_HAIKU_DRAWABLE (f);
face = FACE_FROM_ID (f, cursor_glyph->face_id);
/* If the glyph's background equals the color we normally draw
@@ -2334,7 +2334,7 @@ haiku_draw_vertical_window_border (struct window *w,
struct face *face;
face = FACE_FROM_ID_OR_NULL (f, VERTICAL_BORDER_FACE_ID);
- void *view = FRAME_HAIKU_VIEW (f);
+ void *view = FRAME_HAIKU_DRAWABLE (f);
BView_draw_lock (view, true, x, y_0, 1, y_1);
BView_StartClip (view);
if (face)
@@ -2384,7 +2384,7 @@ haiku_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
unsigned long color_last = (face_last
? face_last->foreground
: FRAME_FOREGROUND_PIXEL (f));
- void *view = FRAME_HAIKU_VIEW (f);
+ void *view = FRAME_HAIKU_DRAWABLE (f);
BView_draw_lock (view, true, x0, y0, x1 - x0 + 1, y1 - y0 + 1);
BView_StartClip (view);
@@ -2554,7 +2554,7 @@ haiku_scroll_bar_create (struct window *w, int left, int top,
void *view;
f = XFRAME (WINDOW_FRAME (w));
- view = FRAME_HAIKU_VIEW (f);
+ view = FRAME_HAIKU_DRAWABLE (f);
block_input ();
bar = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, prev, PVEC_OTHER);
@@ -2604,7 +2604,7 @@ haiku_set_horizontal_scroll_bar (struct window *w, int portion, int whole, int p
width = window_width;
top = WINDOW_SCROLL_BAR_AREA_Y (w);
height = WINDOW_CONFIG_SCROLL_BAR_HEIGHT (w);
- view = FRAME_HAIKU_VIEW (WINDOW_XFRAME (w));
+ view = FRAME_HAIKU_DRAWABLE (WINDOW_XFRAME (w));
block_input ();
@@ -2663,7 +2663,7 @@ haiku_set_vertical_scroll_bar (struct window *w, int portion, int whole, int pos
left = WINDOW_SCROLL_BAR_AREA_X (w);
width = WINDOW_SCROLL_BAR_AREA_WIDTH (w);
- view = FRAME_HAIKU_VIEW (WINDOW_XFRAME (w));
+ view = FRAME_HAIKU_DRAWABLE (WINDOW_XFRAME (w));
block_input ();
if (NILP (w->vertical_scroll_bar))
@@ -2712,7 +2712,7 @@ haiku_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
uint32 col;
f = XFRAME (WINDOW_FRAME (w));
- view = FRAME_HAIKU_VIEW (f);
+ view = FRAME_HAIKU_DRAWABLE (f);
face = p->face;
block_input ();
@@ -2828,7 +2828,7 @@ static void
haiku_scroll_run (struct window *w, struct run *run)
{
struct frame *f = XFRAME (w->frame);
- void *view = FRAME_HAIKU_VIEW (f);
+ void *view = FRAME_HAIKU_DRAWABLE (f);
int x, y, width, height, from_y, to_y, bottom_y;
window_box (w, ANY_AREA, &x, &y, &width, &height);
@@ -3211,9 +3211,9 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
continue;
}
- BView_draw_lock (FRAME_HAIKU_VIEW (f), false, 0, 0, 0, 0);
- BView_resize_to (FRAME_HAIKU_VIEW (f), width, height);
- BView_draw_unlock (FRAME_HAIKU_VIEW (f));
+ BView_draw_lock (FRAME_HAIKU_DRAWABLE (f), false, 0, 0, 0, 0);
+ BView_resize_to (FRAME_HAIKU_DRAWABLE (f), width, height);
+ BView_draw_unlock (FRAME_HAIKU_DRAWABLE (f));
if (width != FRAME_PIXEL_WIDTH (f)
|| height != FRAME_PIXEL_HEIGHT (f)
@@ -3365,6 +3365,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
if (b->just_exited_p)
{
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
+
if (f == hlinfo->mouse_face_mouse_frame)
{
/* If we move outside the frame, then we're
@@ -3375,6 +3376,9 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
haiku_flush_dirty_back_buffer_on (f);
}
+ if (f == x_display_list->last_mouse_glyph_frame)
+ x_display_list->last_mouse_glyph_frame = NULL;
+
if (f->auto_lower && !popup_activated_p
/* Don't do this if the mouse entered a scroll bar. */
&& !BView_inside_scroll_bar (FRAME_HAIKU_VIEW (f),
@@ -3867,6 +3871,9 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
: down_modifier);
py = 0.0f;
px = 0.0f;
+
+ if (be_drag_and_drop_in_progress ())
+ haiku_note_drag_wheel (&inev);
}
break;
@@ -4119,7 +4126,7 @@ haiku_flash (struct frame *f)
int flash_left = FRAME_INTERNAL_BORDER_WIDTH (f);
int flash_right = FRAME_PIXEL_WIDTH (f) - FRAME_INTERNAL_BORDER_WIDTH (f);
int width = flash_right - flash_left;
- void *view = FRAME_HAIKU_VIEW (f);
+ void *view = FRAME_HAIKU_DRAWABLE (f);
object_wait_info info;
bigtime_t wakeup;
@@ -4447,7 +4454,7 @@ haiku_clear_under_internal_border (struct frame *f)
? lookup_basic_face (NULL, f, INTERNAL_BORDER_FACE_ID)
: INTERNAL_BORDER_FACE_ID));
struct face *face = FACE_FROM_ID_OR_NULL (f, face_id);
- void *view = FRAME_HAIKU_VIEW (f);
+ void *view = FRAME_HAIKU_DRAWABLE (f);
block_input ();
BView_draw_lock (view, true, 0, 0, FRAME_PIXEL_WIDTH (f),
@@ -4489,7 +4496,7 @@ haiku_scroll_bar_remove (struct scroll_bar *bar)
struct frame *f;
f = WINDOW_XFRAME (XWINDOW (bar->window));
- view = FRAME_HAIKU_VIEW (f);
+ view = FRAME_HAIKU_DRAWABLE (f);
block_input ();
BView_forget_scroll_bar (view, bar->left, bar->top,
diff --git a/src/haikuterm.h b/src/haikuterm.h
index 46a2218e492..b603c0a482f 100644
--- a/src/haikuterm.h
+++ b/src/haikuterm.h
@@ -275,7 +275,8 @@ struct scroll_bar
#define MAKE_FRAME_DIRTY(f) (FRAME_DIRTY_P (f) = 1)
#define FRAME_OUTPUT_DATA(f) ((f)->output_data.haiku)
#define FRAME_HAIKU_WINDOW(f) (FRAME_OUTPUT_DATA (f)->window)
-#define FRAME_HAIKU_VIEW(f) ((MAKE_FRAME_DIRTY (f)), FRAME_OUTPUT_DATA (f)->view)
+#define FRAME_HAIKU_VIEW(f) (FRAME_OUTPUT_DATA (f)->view)
+#define FRAME_HAIKU_DRAWABLE(f) ((MAKE_FRAME_DIRTY (f)), FRAME_HAIKU_VIEW (f))
#define FRAME_HAIKU_MENU_BAR(f) (FRAME_OUTPUT_DATA (f)->menubar)
#define FRAME_DISPLAY_INFO(f) (FRAME_OUTPUT_DATA (f)->display_info)
#define FRAME_FONT(f) (FRAME_OUTPUT_DATA (f)->font)
@@ -287,7 +288,7 @@ struct scroll_bar
#ifdef USE_BE_CAIRO
#define FRAME_CR_CONTEXT(f) \
(FRAME_HAIKU_VIEW (f) \
- ? EmacsView_cairo_context (FRAME_HAIKU_VIEW (f)) \
+ ? EmacsView_cairo_context (FRAME_HAIKU_DRAWABLE (f)) \
: NULL)
#endif
@@ -333,6 +334,7 @@ extern Lisp_Object haiku_popup_dialog (struct frame *, Lisp_Object, Lisp_Object)
extern void haiku_activate_menubar (struct frame *);
extern void haiku_wait_for_event (struct frame *, int);
extern void haiku_note_drag_motion (void);
+extern void haiku_note_drag_wheel (struct input_event *);
extern void initialize_frame_menubar (struct frame *);
diff --git a/src/indent.c b/src/indent.c
index d4ef075f001..cb368024d97 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -306,6 +306,8 @@ and point (e.g., control characters will have a width of 2 or 4, tabs
will have a variable width).
Ignores finite width of frame, which means that this function may return
values greater than (frame-width).
+In a buffer with very long lines, the value will be an approximation,
+because calculating the exact number is very expensive.
Whether the line is visible (if `selective-display' is t) has no effect;
however, ^M is treated as end of line when `selective-display' is t.
Text that has an invisible property is considered as having width 0, unless
@@ -313,6 +315,7 @@ Text that has an invisible property is considered as having width 0, unless
(void)
{
Lisp_Object temp;
+
XSETFASTINT (temp, current_column ());
return temp;
}
@@ -341,6 +344,14 @@ current_column (void)
&& MODIFF == last_known_column_modified)
return last_known_column;
+ ptrdiff_t line_beg = find_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, -1,
+ NULL, NULL, 1);
+
+ /* Avoid becoming abysmally slow for very long lines. */
+ if (current_buffer->long_line_optimizations_p
+ && !NILP (Vlong_line_threshold)
+ && PT - line_beg > XFIXNUM (Vlong_line_threshold))
+ return PT - line_beg; /* this is an approximation! */
/* If the buffer has overlays, text properties,
or multibyte characters, use a more general algorithm. */
if (buffer_intervals (current_buffer)
@@ -556,13 +567,53 @@ scan_for_column (ptrdiff_t *endpos, EMACS_INT *goalcol,
ptrdiff_t scan, scan_byte, next_boundary, prev_pos, prev_bpos;
scan = find_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, -1, NULL, &scan_byte, 1);
- next_boundary = scan;
- prev_pos = scan;
- prev_bpos = scan_byte;
window = Fget_buffer_window (Fcurrent_buffer (), Qnil);
w = ! NILP (window) ? XWINDOW (window) : NULL;
+ if (current_buffer->long_line_optimizations_p)
+ {
+ bool lines_truncated = false;
+
+ if (!NILP (BVAR (current_buffer, truncate_lines)))
+ lines_truncated = true;
+ else if (w && FIXNUMP (Vtruncate_partial_width_windows))
+ lines_truncated =
+ w->total_cols < XFIXNAT (Vtruncate_partial_width_windows);
+ else if (w && !NILP (Vtruncate_partial_width_windows))
+ lines_truncated =
+ w->total_cols < FRAME_COLS (XFRAME (WINDOW_FRAME (w)));
+ /* Special optimization for buffers with long and truncated
+ lines: assumes that each character is a single column. */
+ if (lines_truncated)
+ {
+ ptrdiff_t bolpos = scan;
+ /* The newline which ends this line or ZV. */
+ ptrdiff_t eolpos =
+ find_newline (PT, PT_BYTE, ZV, ZV_BYTE, 1, NULL, NULL, 1);
+
+ scan = bolpos + goal;
+ if (scan > end)
+ scan = end;
+ if (scan > eolpos)
+ scan = (eolpos == ZV ? ZV : eolpos - 1);
+ col = scan - bolpos;
+ if (col > large_hscroll_threshold)
+ {
+ prev_col = col - 1;
+ prev_pos = scan - 1;
+ prev_bpos = CHAR_TO_BYTE (scan);
+ goto endloop;
+ }
+ /* Restore the values we've overwritten above. */
+ scan = bolpos;
+ col = 0;
+ }
+ }
+ next_boundary = scan;
+ prev_pos = scan;
+ prev_bpos = scan_byte;
+
memset (&cmp_it, 0, sizeof cmp_it);
cmp_it.id = -1;
composition_compute_stop_pos (&cmp_it, scan, scan_byte, end, Qnil);
@@ -877,8 +928,10 @@ The return value is the column where the insertion ends. */)
DEFUN ("current-indentation", Fcurrent_indentation, Scurrent_indentation,
0, 0, 0,
doc: /* Return the indentation of the current line.
-This is the horizontal position of the character
-following any initial whitespace. */)
+This is the horizontal position of the character following any initial
+whitespace.
+Text that has an invisible property is considered as having width 0, unless
+`buffer-invisibility-spec' specifies that it is replaced by an ellipsis. */)
(void)
{
ptrdiff_t posbyte;
@@ -996,6 +1049,9 @@ as displayed of the previous characters in the line.
This function ignores line-continuation;
there is no upper limit on the column number a character can have
and horizontal scrolling has no effect.
+Text that has an invisible property is considered as having width 0,
+unless `buffer-invisibility-spec' specifies that it is replaced by
+an ellipsis.
If specified column is within a character, point goes after that character.
If it's past end of line, point goes to end of line.
@@ -2335,7 +2391,15 @@ whether or not it is currently displayed in some window. */)
last line that it occupies. */
if (it_start < ZV)
{
- while (IT_CHARPOS (it) <= it_start)
+ if ((it.bidi_it.scan_dir > 0)
+ ? IT_CHARPOS (it) < it_start
+ : IT_CHARPOS (it) > it_start)
+ {
+ it.vpos = 0;
+ it.current_y = 0;
+ move_it_by_lines (&it, 1);
+ }
+ while (IT_CHARPOS (it) == it_start)
{
it.vpos = 0;
it.current_y = 0;
diff --git a/src/insdel.c b/src/insdel.c
index 6f180ac5800..38d5fbda002 100644
--- a/src/insdel.c
+++ b/src/insdel.c
@@ -909,7 +909,7 @@ insert_1_both (const char *string,
the insertion. This, together with recording the insertion,
will add up to the right stuff in the undo list. */
record_insert (PT, nchars);
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, nchars);
CHARS_MODIFF = MODIFF;
memcpy (GPT_ADDR, string, nbytes);
@@ -1037,7 +1037,7 @@ insert_from_string_1 (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte,
#endif
record_insert (PT, nchars);
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, nchars);
CHARS_MODIFF = MODIFF;
GAP_SIZE -= outgoing_nbytes;
@@ -1122,7 +1122,8 @@ insert_from_gap (ptrdiff_t nchars, ptrdiff_t nbytes, bool text_at_gap_tail)
of this dance. */
invalidate_buffer_caches (current_buffer, GPT, GPT);
record_insert (GPT, nchars);
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, nchars);
+ CHARS_MODIFF = MODIFF;
insert_from_gap_1 (nchars, nbytes, text_at_gap_tail);
@@ -1250,7 +1251,7 @@ insert_from_buffer_1 (struct buffer *buf,
#endif
record_insert (PT, nchars);
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, nchars);
CHARS_MODIFF = MODIFF;
GAP_SIZE -= outgoing_nbytes;
@@ -1351,7 +1352,7 @@ adjust_after_replace (ptrdiff_t from, ptrdiff_t from_byte,
if (len == 0)
evaporate_overlays (from);
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, nchars_del + len);
CHARS_MODIFF = MODIFF;
}
@@ -1546,7 +1547,7 @@ replace_range (ptrdiff_t from, ptrdiff_t to, Lisp_Object new,
check_markers ();
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, nchars_del + inschars);
CHARS_MODIFF = MODIFF;
if (adjust_match_data)
@@ -1680,7 +1681,7 @@ replace_range_2 (ptrdiff_t from, ptrdiff_t from_byte,
check_markers ();
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, nchars_del + inschars);
CHARS_MODIFF = MODIFF;
}
@@ -1855,7 +1856,7 @@ del_range_2 (ptrdiff_t from, ptrdiff_t from_byte,
at the end of the text before the gap. */
adjust_markers_for_delete (from, from_byte, to, to_byte);
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, nchars_del);
CHARS_MODIFF = MODIFF;
/* Relocate point as if it were a marker. */
@@ -1909,7 +1910,7 @@ modify_text (ptrdiff_t start, ptrdiff_t end)
BUF_COMPUTE_UNCHANGED (current_buffer, start - 1, end);
if (MODIFF <= SAVE_MODIFF)
record_first_change ();
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, end - start);
CHARS_MODIFF = MODIFF;
bset_point_before_scroll (current_buffer, Qnil);
diff --git a/src/keyboard.c b/src/keyboard.c
index 2863058d633..1d7125a0a3e 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1295,7 +1295,8 @@ command_loop_1 (void)
/* Note that the value cell will never directly contain nil
if the symbol is a local variable. */
if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks))
- safe_run_hooks (Qpost_command_hook);
+ safe_run_hooks_maybe_narrowed (Qpost_command_hook,
+ XWINDOW (selected_window));
/* If displaying a message, resize the echo area window to fit
that message's size exactly. */
@@ -1330,6 +1331,7 @@ command_loop_1 (void)
display_malloc_warning ();
Vdeactivate_mark = Qnil;
+ backtrace_yet = false;
/* Don't ignore mouse movements for more than a single command
loop. (This flag is set in xdisp.c whenever the tool bar is
@@ -1461,7 +1463,9 @@ command_loop_1 (void)
}
Vthis_command = cmd;
Vreal_this_command = cmd;
- safe_run_hooks (Qpre_command_hook);
+
+ safe_run_hooks_maybe_narrowed (Qpre_command_hook,
+ XWINDOW (selected_window));
already_adjusted = 0;
@@ -1513,7 +1517,8 @@ command_loop_1 (void)
}
kset_last_prefix_arg (current_kboard, Vcurrent_prefix_arg);
- safe_run_hooks (Qpost_command_hook);
+ safe_run_hooks_maybe_narrowed (Qpost_command_hook,
+ XWINDOW (selected_window));
/* If displaying a message, resize the echo area window to fit
that message's size exactly. Do this only if the echo area
@@ -1827,8 +1832,16 @@ adjust_point_for_property (ptrdiff_t last_pt, bool modified)
static Lisp_Object
safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args)
{
- eassert (nargs == 2);
- return call0 (args[1]);
+ eassert (nargs >= 2 && nargs <= 4);
+ switch (nargs)
+ {
+ case 2:
+ return call0 (args[1]);
+ case 3:
+ return call1 (args[1], args[2]);
+ default:
+ return call2 (args[1], args[2], args[3]);
+ }
}
/* Subroutine for safe_run_hooks: handle an error by clearing out the function
@@ -1837,7 +1850,7 @@ safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args)
static Lisp_Object
safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args)
{
- eassert (nargs == 2);
+ eassert (nargs >= 2 && nargs <= 4);
AUTO_STRING (format, "Error in %s (%S): %S");
Lisp_Object hook = args[0];
Lisp_Object fun = args[1];
@@ -1873,11 +1886,27 @@ safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args)
static Lisp_Object
safe_run_hook_funcall (ptrdiff_t nargs, Lisp_Object *args)
{
- eassert (nargs == 2);
+ eassert (nargs >= 2 && nargs <= 4);
/* Yes, run_hook_with_args works with args in the other order. */
- internal_condition_case_n (safe_run_hooks_1,
- 2, ((Lisp_Object []) {args[1], args[0]}),
- Qt, safe_run_hooks_error);
+ switch (nargs)
+ {
+ case 2:
+ internal_condition_case_n (safe_run_hooks_1,
+ 2, ((Lisp_Object []) {args[1], args[0]}),
+ Qt, safe_run_hooks_error);
+ break;
+ case 3:
+ internal_condition_case_n (safe_run_hooks_1,
+ 3, ((Lisp_Object []) {args[1], args[0], args[2]}),
+ Qt, safe_run_hooks_error);
+ break;
+ default:
+ internal_condition_case_n (safe_run_hooks_1,
+ 4, ((Lisp_Object [])
+ {args[1], args[0], args[2], args[3]}),
+ Qt, safe_run_hooks_error);
+ break;
+ }
return Qnil;
}
@@ -1895,6 +1924,33 @@ safe_run_hooks (Lisp_Object hook)
unbind_to (count, Qnil);
}
+void
+safe_run_hooks_maybe_narrowed (Lisp_Object hook, struct window *w)
+{
+ specpdl_ref count = SPECPDL_INDEX ();
+
+ specbind (Qinhibit_quit, Qt);
+
+ if (current_buffer->long_line_optimizations_p)
+ narrow_to_region_internal (make_fixnum (get_narrowed_begv (w, PT)),
+ make_fixnum (get_narrowed_zv (w, PT)),
+ true);
+
+ run_hook_with_args (2, ((Lisp_Object []) {hook, hook}), safe_run_hook_funcall);
+ unbind_to (count, Qnil);
+}
+
+void
+safe_run_hooks_2 (Lisp_Object hook, Lisp_Object arg1, Lisp_Object arg2)
+{
+ specpdl_ref count = SPECPDL_INDEX ();
+
+ specbind (Qinhibit_quit, Qt);
+ run_hook_with_args (4, ((Lisp_Object []) {hook, hook, arg1, arg2}),
+ safe_run_hook_funcall);
+ unbind_to (count, Qnil);
+}
+
/* Nonzero means polling for input is temporarily suppressed. */
@@ -4622,6 +4678,11 @@ timer_check_2 (Lisp_Object timers, Lisp_Object idle_timers)
/* If timer is ripe, run it if it hasn't been run. */
if (ripe)
{
+ /* If we got here, presumably `decode_timer` has checked
+ that this timer has not yet been triggered. */
+ eassert (NILP (AREF (chosen_timer, 0)));
+ /* In a production build, where assertions compile to
+ nothing, we still want to play it safe here. */
if (NILP (AREF (chosen_timer, 0)))
{
specpdl_ref count = SPECPDL_INDEX ();
@@ -4640,8 +4701,8 @@ timer_check_2 (Lisp_Object timers, Lisp_Object idle_timers)
/* Since we have handled the event,
we don't need to tell the caller to wake up and do it. */
- /* But the caller must still wait for the next timer, so
- return 0 to indicate that. */
+ /* But the caller must still wait for the next timer, so
+ return 0 to indicate that. */
}
nexttime = make_timespec (0, 0);
@@ -12613,32 +12674,55 @@ cancels any modification. */);
DEFSYM (Qdeactivate_mark, "deactivate-mark");
DEFVAR_LISP ("deactivate-mark", Vdeactivate_mark,
- doc: /* If an editing command sets this to t, deactivate the mark afterward.
+ doc: /* Whether to deactivate the mark after an editing command.
The command loop sets this to nil before each command,
and tests the value when the command returns.
-Buffer modification stores t in this variable. */);
+If an editing command sets this non-nil, deactivate the mark after
+the command returns.
+
+Buffer modifications store t in this variable.
+
+By default, deactivating the mark will save the contents of the region
+according to `select-active-regions', unless this is set to the symbol
+`dont-save'. */);
Vdeactivate_mark = Qnil;
Fmake_variable_buffer_local (Qdeactivate_mark);
DEFVAR_LISP ("pre-command-hook", Vpre_command_hook,
doc: /* Normal hook run before each command is executed.
-If an unhandled error happens in running this hook,
-the function in which the error occurred is unconditionally removed, since
-otherwise the error might happen repeatedly and make Emacs nonfunctional.
+
+If an unhandled error happens in running this hook, the function in
+which the error occurred is unconditionally removed, since otherwise
+the error might happen repeatedly and make Emacs nonfunctional.
+
+Note that, when the current buffer contains one or more lines whose
+length is above `long-line-threshold', these hook functions are called
+with the buffer narrowed to a small portion around point, and the
+narrowing is locked (see `narrow-to-region'), so that these hook
+functions cannot use `widen' to gain access to other portions of
+buffer text.
See also `post-command-hook'. */);
Vpre_command_hook = Qnil;
DEFVAR_LISP ("post-command-hook", Vpost_command_hook,
doc: /* Normal hook run after each command is executed.
-If an unhandled error happens in running this hook,
-the function in which the error occurred is unconditionally removed, since
-otherwise the error might happen repeatedly and make Emacs nonfunctional.
+
+If an unhandled error happens in running this hook, the function in
+which the error occurred is unconditionally removed, since otherwise
+the error might happen repeatedly and make Emacs nonfunctional.
It is a bad idea to use this hook for expensive processing. If
unavoidable, wrap your code in `(while-no-input (redisplay) CODE)' to
avoid making Emacs unresponsive while the user types.
+Note that, when the current buffer contains one or more lines whose
+length is above `long-line-threshold', these hook functions are called
+with the buffer narrowed to a small portion around point, and the
+narrowing is locked (see `narrow-to-region'), so that these hook
+functions cannot use `widen' to gain access to other portions of
+buffer text.
+
See also `pre-command-hook'. */);
Vpost_command_hook = Qnil;
@@ -12914,7 +12998,10 @@ This variable only has an effect when Transient Mark mode is enabled.
If the value is `only', only temporarily active regions (usually made
by mouse-dragging or shift-selection) set the window system's primary
-selection. */);
+selection.
+
+If this variable causes the region to be set as the primary selection,
+`post-select-region-hook' is then run afterwards. */);
Vselect_active_regions = Qt;
DEFVAR_LISP ("saved-region-selection",
diff --git a/src/lisp.h b/src/lisp.h
index dc496cc1658..2f73ba4c617 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3146,7 +3146,7 @@ CHECK_NUMBER (Lisp_Object x)
INLINE void
CHECK_INTEGER (Lisp_Object x)
{
- CHECK_TYPE (INTEGERP (x), Qnumberp, x);
+ CHECK_TYPE (INTEGERP (x), Qintegerp, x);
}
INLINE void
@@ -3793,10 +3793,10 @@ make_symbol_constant (Lisp_Object sym)
/* Buffer-local variable access functions. */
-INLINE int
+INLINE bool
blv_found (struct Lisp_Buffer_Local_Value *blv)
{
- eassert (blv->found == !EQ (blv->defcell, blv->valcell));
+ eassert (blv->found == !BASE_EQ (blv->defcell, blv->valcell));
return blv->found;
}
@@ -3911,10 +3911,14 @@ integer_to_uintmax (Lisp_Object num, uintmax_t *n)
typedef intmax_t modiff_count;
INLINE modiff_count
-modiff_incr (modiff_count *a)
-{
- modiff_count a0 = *a;
- bool modiff_overflow = INT_ADD_WRAPV (a0, 1, a);
+modiff_incr (modiff_count *a, ptrdiff_t len)
+{
+ modiff_count a0 = *a; int incr = len ? 1 : 0;
+ /* Increase the counter more for a large modification and less for a
+ small modification. Increase it logarithmically to avoid
+ increasing it too much. */
+ while (len >>= 1) incr++;
+ bool modiff_overflow = INT_ADD_WRAPV (a0, incr, a);
eassert (!modiff_overflow && *a >> 30 >> 30 == 0);
return a0;
}
@@ -4526,6 +4530,7 @@ extern Lisp_Object Vrun_hooks;
extern Lisp_Object Vsignaling_function;
extern Lisp_Object inhibit_lisp_code;
extern bool signal_quit_p (Lisp_Object);
+extern bool backtrace_yet;
/* To run a normal hook, use the appropriate function from the list below.
The calling convention:
@@ -4675,6 +4680,7 @@ extern void save_restriction_restore (Lisp_Object);
extern Lisp_Object make_buffer_string (ptrdiff_t, ptrdiff_t, bool);
extern Lisp_Object make_buffer_string_both (ptrdiff_t, ptrdiff_t, ptrdiff_t,
ptrdiff_t, bool);
+extern Lisp_Object narrow_to_region_internal (Lisp_Object, Lisp_Object, bool);
extern void init_editfns (void);
extern void syms_of_editfns (void);
@@ -4762,6 +4768,8 @@ extern ptrdiff_t fast_c_string_match_ignore_case (Lisp_Object, const char *,
ptrdiff_t);
extern ptrdiff_t fast_looking_at (Lisp_Object, ptrdiff_t, ptrdiff_t,
ptrdiff_t, ptrdiff_t, Lisp_Object);
+extern ptrdiff_t find_newline1 (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t *, ptrdiff_t *, bool);
extern ptrdiff_t find_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
ptrdiff_t, ptrdiff_t *, ptrdiff_t *, bool);
extern void scan_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
@@ -4823,6 +4831,8 @@ extern bool detect_input_pending (void);
extern bool detect_input_pending_ignore_squeezables (void);
extern bool detect_input_pending_run_timers (bool);
extern void safe_run_hooks (Lisp_Object);
+extern void safe_run_hooks_maybe_narrowed (Lisp_Object, struct window *);
+extern void safe_run_hooks_2 (Lisp_Object, Lisp_Object, Lisp_Object);
extern void cmd_error_internal (Lisp_Object, const char *);
extern Lisp_Object command_loop_2 (Lisp_Object);
extern Lisp_Object read_menu_command (void);
@@ -4935,7 +4945,8 @@ extern void setup_process_coding_systems (Lisp_Object);
#endif
extern int emacs_spawn (pid_t *, int, int, int, char **, char **,
- const char *, const char *, const sigset_t *);
+ const char *, const char *, bool, bool,
+ const sigset_t *);
extern char **make_environment_block (Lisp_Object) ATTRIBUTE_RETURNS_NONNULL;
extern void init_callproc_1 (void);
extern void init_callproc (void);
diff --git a/src/lread.c b/src/lread.c
index 0b46a2e4ee5..ccccd79cd7c 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -131,25 +131,15 @@ static ptrdiff_t read_from_string_limit;
/* Position in object from which characters are being read by `readchar'. */
static EMACS_INT readchar_offset;
-/* This contains the last string skipped with #@. */
-static char *saved_doc_string;
-/* Length of buffer allocated in saved_doc_string. */
-static ptrdiff_t saved_doc_string_size;
-/* Length of actual data in saved_doc_string. */
-static ptrdiff_t saved_doc_string_length;
-/* This is the file position that string came from. */
-static file_offset saved_doc_string_position;
-
-/* This contains the previous string skipped with #@.
- We copy it from saved_doc_string when a new string
- is put in saved_doc_string. */
-static char *prev_saved_doc_string;
-/* Length of buffer allocated in prev_saved_doc_string. */
-static ptrdiff_t prev_saved_doc_string_size;
-/* Length of actual data in prev_saved_doc_string. */
-static ptrdiff_t prev_saved_doc_string_length;
-/* This is the file position that string came from. */
-static file_offset prev_saved_doc_string_position;
+struct saved_string {
+ char *string; /* string in allocated buffer */
+ ptrdiff_t size; /* allocated size of buffer */
+ ptrdiff_t length; /* length of string in buffer */
+ file_offset position; /* position in file the string came from */
+};
+
+/* The last two strings skipped with #@ (most recent first). */
+static struct saved_string saved_strings[2];
/* A list of file names for files being loaded in Fload. Used to
check for recursive loads. */
@@ -1605,13 +1595,12 @@ Return t if the file exists and loads successfully. */)
if (!NILP (Ffboundp (Qdo_after_load_evaluation)))
call1 (Qdo_after_load_evaluation, hist_file_name) ;
- xfree (saved_doc_string);
- saved_doc_string = 0;
- saved_doc_string_size = 0;
-
- xfree (prev_saved_doc_string);
- prev_saved_doc_string = 0;
- prev_saved_doc_string_size = 0;
+ for (int i = 0; i < ARRAYELTS (saved_strings); i++)
+ {
+ xfree (saved_strings[i].string);
+ saved_strings[i].string = NULL;
+ saved_strings[i].size = 0;
+ }
if (!noninteractive && (NILP (nomessage) || force_load_messages))
{
@@ -3056,7 +3045,6 @@ read_string_literal (char stackbuf[VLA_ELEMS (stackbufsize)],
/* True if we saw an escape sequence specifying
a single-byte character. */
bool force_singlebyte = false;
- bool cancel = false;
ptrdiff_t nchars = 0;
int ch;
@@ -3085,8 +3073,6 @@ read_string_literal (char stackbuf[VLA_ELEMS (stackbufsize)],
case ' ':
case '\n':
/* `\SPC' and `\LF' generate no characters at all. */
- if (p == read_buffer)
- cancel = true;
continue;
default:
UNREAD (ch);
@@ -3152,15 +3138,6 @@ read_string_literal (char stackbuf[VLA_ELEMS (stackbufsize)],
if (ch < 0)
end_of_file_error ();
- /* If purifying, and string starts with \ newline,
- return zero instead. This is for doc strings
- that we are really going to find in etc/DOC.nn.nn. */
- if (!NILP (Vpurify_flag) && NILP (Vdoc_file_name) && cancel)
- {
- unbind_to (count, Qnil);
- return make_fixnum (0);
- }
-
if (!force_multibyte && force_singlebyte)
{
/* READ_BUFFER contains raw 8-bit bytes and no multibyte
@@ -3457,57 +3434,95 @@ skip_lazy_string (Lisp_Object readcharfun)
record the last string that we skipped,
and record where in the file it comes from. */
- /* But first exchange saved_doc_string
- with prev_saved_doc_string, so we save two strings. */
- {
- char *temp = saved_doc_string;
- ptrdiff_t temp_size = saved_doc_string_size;
- file_offset temp_pos = saved_doc_string_position;
- ptrdiff_t temp_len = saved_doc_string_length;
-
- saved_doc_string = prev_saved_doc_string;
- saved_doc_string_size = prev_saved_doc_string_size;
- saved_doc_string_position = prev_saved_doc_string_position;
- saved_doc_string_length = prev_saved_doc_string_length;
-
- prev_saved_doc_string = temp;
- prev_saved_doc_string_size = temp_size;
- prev_saved_doc_string_position = temp_pos;
- prev_saved_doc_string_length = temp_len;
- }
+ /* First exchange the two saved_strings. */
+ verify (ARRAYELTS (saved_strings) == 2);
+ struct saved_string t = saved_strings[0];
+ saved_strings[0] = saved_strings[1];
+ saved_strings[1] = t;
enum { extra = 100 };
- if (saved_doc_string_size == 0)
+ struct saved_string *ss = &saved_strings[0];
+ if (ss->size == 0)
{
- saved_doc_string = xmalloc (nskip + extra);
- saved_doc_string_size = nskip + extra;
+ ss->size = nskip + extra;
+ ss->string = xmalloc (ss->size);
}
- if (nskip > saved_doc_string_size)
+ else if (nskip > ss->size)
{
- saved_doc_string = xrealloc (saved_doc_string, nskip + extra);
- saved_doc_string_size = nskip + extra;
+ ss->size = nskip + extra;
+ ss->string = xrealloc (ss->string, ss->size);
}
FILE *instream = infile->stream;
- saved_doc_string_position = (file_tell (instream) - infile->lookahead);
+ ss->position = (file_tell (instream) - infile->lookahead);
- /* Copy that many bytes into saved_doc_string. */
+ /* Copy that many bytes into the saved string. */
ptrdiff_t i = 0;
int c = 0;
for (int n = min (nskip, infile->lookahead); n > 0; n--)
- saved_doc_string[i++] = c = infile->buf[--infile->lookahead];
+ ss->string[i++] = c = infile->buf[--infile->lookahead];
block_input ();
for (; i < nskip && c >= 0; i++)
- saved_doc_string[i] = c = getc (instream);
+ ss->string[i] = c = getc (instream);
unblock_input ();
- saved_doc_string_length = i;
+ ss->length = i;
}
else
/* Skip that many bytes. */
skip_dyn_bytes (readcharfun, nskip);
}
+/* Given a lazy-loaded string designator VAL, return the actual string.
+ VAL is (FILENAME . POS). */
+static Lisp_Object
+get_lazy_string (Lisp_Object val)
+{
+ /* Get a doc string from the file we are loading.
+ If it's in a saved string, get it from there.
+
+ Here, we don't know if the string is a bytecode string or a doc
+ string. As a bytecode string must be unibyte, we always return a
+ unibyte string. If it is actually a doc string, caller must make
+ it multibyte. */
+
+ /* We used to emit negative positions for 'user variables' (whose doc
+ strings started with an asterisk); take the absolute value for
+ compatibility. */
+ EMACS_INT pos = eabs (XFIXNUM (XCDR (val)));
+ struct saved_string *ss = &saved_strings[0];
+ struct saved_string *ssend = ss + ARRAYELTS (saved_strings);
+ while (ss < ssend
+ && !(pos >= ss->position && pos < ss->position + ss->length))
+ ss++;
+ if (ss >= ssend)
+ return get_doc_string (val, 1, 0);
+
+ ptrdiff_t start = pos - ss->position;
+ char *str = ss->string;
+ ptrdiff_t from = start;
+ ptrdiff_t to = start;
+
+ /* Process quoting with ^A, and find the end of the string,
+ which is marked with ^_ (037). */
+ while (str[from] != 037)
+ {
+ int c = str[from++];
+ if (c == 1)
+ {
+ c = str[from++];
+ str[to++] = (c == 1 ? c
+ : c == '0' ? 0
+ : c == '_' ? 037
+ : c);
+ }
+ else
+ str[to++] = c;
+ }
+
+ return make_unibyte_string (str + start, to - start);
+}
+
/* Length of prefix only consisting of symbol constituent characters. */
static ptrdiff_t
@@ -4249,6 +4264,15 @@ read0 (Lisp_Object readcharfun, bool locate_syms)
XSETCDR (e->u.list.tail, obj);
read_stack_pop ();
obj = e->u.list.head;
+
+ /* Hack: immediately convert (#$ . FIXNUM) to the corresponding
+ string if load-force-doc-strings is set. */
+ if (load_force_doc_strings
+ && BASE_EQ (XCAR (obj), Vload_file_name)
+ && !NILP (XCAR (obj))
+ && FIXNUMP (XCDR (obj)))
+ obj = get_lazy_string (obj);
+
break;
}
diff --git a/src/macfont.m b/src/macfont.m
index fe30908f5d6..4de056cb361 100644
--- a/src/macfont.m
+++ b/src/macfont.m
@@ -2645,6 +2645,9 @@ macfont_open (struct frame * f, Lisp_Object entity, int pixel_size)
font->pixel_size = size;
font->driver = &macfont_driver;
font->encoding_charset = font->repertory_charset = -1;
+ /* Clear font->space_width so macfont_monospace_width_multiplier may
+ not be confused by an uninitialized value. */
+ font->space_width = 0;
block_input ();
diff --git a/src/marker.c b/src/marker.c
index 3c8e628762e..9727586f424 100644
--- a/src/marker.c
+++ b/src/marker.c
@@ -214,11 +214,12 @@ buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos)
We have one known above and one known below.
Scan, counting characters, from whichever one is closer. */
+ eassert (best_below <= charpos && charpos <= best_above);
if (charpos - best_below < best_above - charpos)
{
bool record = charpos - best_below > 5000;
- while (best_below != charpos)
+ while (best_below < charpos)
{
best_below++;
best_below_byte += buf_next_char_len (b, best_below_byte);
@@ -243,7 +244,7 @@ buf_charpos_to_bytepos (struct buffer *b, ptrdiff_t charpos)
{
bool record = best_above - charpos > 5000;
- while (best_above != charpos)
+ while (best_above > charpos)
{
best_above--;
best_above_byte -= buf_prev_char_len (b, best_above_byte);
diff --git a/src/nsfns.m b/src/nsfns.m
index 16174210669..1d3dcd31243 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -1057,6 +1057,7 @@ frame_parm_handler ns_frame_parm_handlers[] =
0, /* x_set_override_redirect */
gui_set_no_special_glyphs,
gui_set_alpha_background,
+ NULL,
#ifdef NS_IMPL_COCOA
ns_set_appearance,
ns_set_transparent_titlebar,
@@ -3210,7 +3211,8 @@ x_hide_tip (bool delete)
DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
doc: /* SKIP: real doc in xfns.c. */)
- (Lisp_Object string, Lisp_Object frame, Lisp_Object parms, Lisp_Object timeout, Lisp_Object dx, Lisp_Object dy)
+ (Lisp_Object string, Lisp_Object frame, Lisp_Object parms,
+ Lisp_Object timeout, Lisp_Object dx, Lisp_Object dy)
{
int root_x, root_y;
specpdl_ref count = SPECPDL_INDEX ();
@@ -3224,6 +3226,10 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
Lisp_Object window, size, tip_buf;
char *str;
NSWindow *nswindow;
+ bool displayed;
+#ifdef ENABLE_CHECKING
+ struct glyph_row *row, *end;
+#endif
AUTO_STRING (tip, " *tip*");
@@ -3287,7 +3293,6 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
if (!NILP (tip_frame) && FRAME_LIVE_P (XFRAME (tip_frame)))
{
if (FRAME_VISIBLE_P (XFRAME (tip_frame))
- && EQ (frame, tip_last_frame)
&& !NILP (Fequal_including_properties (tip_last_string, string))
&& !NILP (Fequal (tip_last_parms, parms)))
{
@@ -3454,7 +3459,26 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
clear_glyph_matrix (w->desired_matrix);
clear_glyph_matrix (w->current_matrix);
SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
- try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+ displayed = try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+
+ if (!displayed && NILP (Vx_max_tooltip_size))
+ {
+#ifdef ENABLE_CHECKING
+ row = w->desired_matrix->rows;
+ end = w->desired_matrix->rows + w->desired_matrix->nrows;
+
+ while (row < end)
+ {
+ if (!row->displays_text_p
+ || row->ends_at_zv_p)
+ break;
+ ++row;
+ }
+
+ eassert (row < end && row->ends_at_zv_p);
+#endif
+ }
+
/* Calculate size of tooltip window. */
size = Fwindow_text_pixel_size (window, Qnil, Qnil, Qnil,
make_fixnum (w->pixel_height), Qnil,
@@ -3889,7 +3913,7 @@ Default is t. */);
DEFVAR_LISP ("x-max-tooltip-size", Vx_max_tooltip_size,
doc: /* SKIP: real doc in xfns.c. */);
- Vx_max_tooltip_size = Fcons (make_fixnum (80), make_fixnum (40));
+ Vx_max_tooltip_size = Qnil;
defsubr (&Sns_read_file_name);
defsubr (&Sns_get_resource);
diff --git a/src/nsterm.m b/src/nsterm.m
index 2ba167f189b..e3f47eb905e 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -2900,10 +2900,7 @@ ns_define_fringe_bitmap (int which, unsigned short *bits, int h, int w)
for (int y = 0 ; y < h ; y++)
for (int x = 0 ; x < w ; x++)
{
- /* XBM rows are always round numbers of bytes, with any unused
- bits ignored. */
- int byte = y * (w/8 + (w%8 ? 1 : 0)) + x/8;
- bool bit = bits[byte] & (0x80 >> x%8);
+ bool bit = bits[y] & (1 << (w - x - 1));
if (bit)
[p appendBezierPathWithRect:NSMakeRect (x, y, 1, 1)];
}
@@ -3103,16 +3100,21 @@ ns_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
case NO_CURSOR:
break;
case FILLED_BOX_CURSOR:
+ /* The call to draw_phys_cursor_glyph can end up undoing the
+ ns_focus, so unfocus here and regain focus later. */
+ [ctx restoreGraphicsState];
+ ns_unfocus (f);
draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
+ ns_focus (f, &r, 1);
break;
case HOLLOW_BOX_CURSOR:
- draw_phys_cursor_glyph (w, glyph_row, DRAW_NORMAL_TEXT);
-
/* This works like it does in PostScript, not X Windows. */
[NSBezierPath strokeRect: NSInsetRect (r, 0.5, 0.5)];
+ [ctx restoreGraphicsState];
break;
case HBAR_CURSOR:
NSRectFill (r);
+ [ctx restoreGraphicsState];
break;
case BAR_CURSOR:
s = r;
@@ -3123,10 +3125,10 @@ ns_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
s.origin.x += cursor_glyph->pixel_width - s.size.width;
NSRectFill (s);
+ [ctx restoreGraphicsState];
break;
}
- [ctx restoreGraphicsState];
ns_unfocus (f);
}
@@ -3991,42 +3993,104 @@ ns_dumpglyphs_image (struct glyph_string *s, NSRect r)
static void
-ns_dumpglyphs_stretch (struct glyph_string *s)
+ns_draw_stretch_glyph_string (struct glyph_string *s)
{
- NSRect glyphRect;
- struct face *face = s->face;
- NSColor *fgCol, *bgCol;
+ struct face *face;
- if (!s->background_filled_p)
+ if (s->hl == DRAW_CURSOR
+ && !x_stretch_cursor_p)
{
+ /* If `x-stretch-cursor' is nil, don't draw a block cursor as
+ wide as the stretch glyph. */
+ int width, background_width = s->background_width;
+ int x = s->x;
- face = s->face;
+ if (!s->row->reversed_p)
+ {
+ int left_x = window_box_left_offset (s->w, TEXT_AREA);
- bgCol = [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)];
- fgCol = [NSColor colorWithUnsignedLong:NS_FACE_FOREGROUND (face)];
+ if (x < left_x)
+ {
+ background_width -= left_x - x;
+ x = left_x;
+ }
+ }
+ else
+ {
+ /* In R2L rows, draw the cursor on the right edge of the
+ stretch glyph. */
+ int right_x = window_box_right (s->w, TEXT_AREA);
+
+ if (x + background_width > right_x)
+ background_width -= x - right_x;
+ x += background_width;
+ }
+
+ width = min (FRAME_COLUMN_WIDTH (s->f), background_width);
+ if (s->row->reversed_p)
+ x -= width;
if (s->hl == DRAW_CURSOR)
+ [FRAME_CURSOR_COLOR (s->f) set];
+ else
+ [[NSColor colorWithUnsignedLong: s->face->foreground] set];
+
+ NSRectFill (NSMakeRect (x, s->y, width, s->height));
+
+ /* Clear rest using the GC of the original non-cursor face. */
+ if (width < background_width)
{
- fgCol = bgCol;
- bgCol = FRAME_CURSOR_COLOR (s->f);
- }
+ int y = s->y;
+ int w = background_width - width, h = s->height;
+
+ if (!s->row->reversed_p)
+ x += width;
+ else
+ x = s->x;
- glyphRect = NSMakeRect (s->x, s->y, s->background_width, s->height);
+ if (s->row->mouse_face_p
+ && cursor_in_mouse_face_p (s->w))
+ {
+ face = FACE_FROM_ID_OR_NULL (s->f,
+ MOUSE_HL_INFO (s->f)->mouse_face_face_id);
+
+ if (!s->face)
+ face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
+ prepare_face_for_display (s->f, face);
- [bgCol set];
+ [[NSColor colorWithUnsignedLong: face->background] set];
+ }
+ else
+ [[NSColor colorWithUnsignedLong: s->face->background] set];
+ NSRectFill (NSMakeRect (x, y, w, h));
+ }
+ }
+ else if (!s->background_filled_p)
+ {
+ int background_width = s->background_width;
+ int x = s->x, text_left_x = window_box_left (s->w, TEXT_AREA);
- NSRectFill (glyphRect);
+ /* Don't draw into left fringe or scrollbar area except for
+ header line and mode line. */
+ if (s->area == TEXT_AREA
+ && x < text_left_x && !s->row->mode_line_p)
+ {
+ background_width -= text_left_x - x;
+ x = text_left_x;
+ }
- /* Draw overlining, etc. on the stretch glyph (or the part of
- the stretch glyph after the cursor). If the glyph has a box,
- then decorations will be drawn after drawing the box in
- ns_draw_glyph_string, in order to prevent them from being
- overwritten by the box. */
- if (s->face->box == FACE_NO_BOX)
- ns_draw_text_decoration (s, face, fgCol, NSWidth (glyphRect),
- NSMinX (glyphRect));
+ if (!s->row->stipple_p)
+ s->row->stipple_p = s->stippled_p;
- s->background_filled_p = 1;
+ if (background_width > 0)
+ {
+ if (s->hl == DRAW_CURSOR)
+ [FRAME_CURSOR_COLOR (s->f) set];
+ else
+ [[NSColor colorWithUnsignedLong: s->face->background] set];
+
+ NSRectFill (NSMakeRect (x, s->y, background_width, s->height));
+ }
}
}
@@ -4248,13 +4312,9 @@ ns_draw_glyph_string (struct glyph_string *s)
n = ns_get_glyph_string_clip_rect (s->next, r);
ns_focus (s->f, r, n);
if (next->first_glyph->type != STRETCH_GLYPH)
- {
- ns_maybe_dumpglyphs_background (s->next, 1);
- }
- else
- {
- ns_dumpglyphs_stretch (s->next);
- }
+ ns_maybe_dumpglyphs_background (s->next, 1);
+ else
+ ns_draw_stretch_glyph_string (s->next);
ns_unfocus (s->f);
next->num_clips = 0;
}
@@ -4294,7 +4354,7 @@ ns_draw_glyph_string (struct glyph_string *s)
break;
case STRETCH_GLYPH:
- ns_dumpglyphs_stretch (s);
+ ns_draw_stretch_glyph_string (s);
break;
case CHAR_GLYPH:
diff --git a/src/pdumper.c b/src/pdumper.c
index af451920eb6..33cb804dbae 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -2701,7 +2701,7 @@ dump_hash_table (struct dump_context *ctx,
static dump_off
dump_buffer (struct dump_context *ctx, const struct buffer *in_buffer)
{
-#if CHECK_STRUCTS && !defined HASH_buffer_F8FE65D42F
+#if CHECK_STRUCTS && !defined HASH_buffer_AA373AEE10
# error "buffer changed. See CHECK_STRUCTS comment in config.h."
#endif
struct buffer munged_buffer = *in_buffer;
@@ -2813,6 +2813,7 @@ dump_buffer (struct dump_context *ctx, const struct buffer *in_buffer)
DUMP_FIELD_COPY (out, buffer, prevent_redisplay_optimizations_p);
DUMP_FIELD_COPY (out, buffer, clip_changed);
DUMP_FIELD_COPY (out, buffer, inhibit_buffer_hooks);
+ DUMP_FIELD_COPY (out, buffer, long_line_optimizations_p);
dump_field_lv_rawptr (ctx, out, buffer, &buffer->overlays_before,
Lisp_Vectorlike, WEIGHT_NORMAL);
diff --git a/src/pgtkfns.c b/src/pgtkfns.c
index 5c43e5f3607..beaf28f69d9 100644
--- a/src/pgtkfns.c
+++ b/src/pgtkfns.c
@@ -991,6 +991,7 @@ frame_parm_handler pgtk_frame_parm_handlers[] =
pgtk_set_override_redirect,
gui_set_no_special_glyphs,
pgtk_set_alpha_background,
+ NULL,
};
@@ -3130,6 +3131,10 @@ Text larger than the specified size is clipped. */)
int old_windows_or_buffers_changed = windows_or_buffers_changed;
specpdl_ref count = SPECPDL_INDEX ();
Lisp_Object window, size, tip_buf;
+ bool displayed;
+#ifdef ENABLE_CHECKING
+ struct glyph_row *row, *end;
+#endif
AUTO_STRING (tip, " *tip*");
specbind (Qinhibit_redisplay, Qt);
@@ -3334,7 +3339,26 @@ Text larger than the specified size is clipped. */)
clear_glyph_matrix (w->desired_matrix);
clear_glyph_matrix (w->current_matrix);
SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
- try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+ displayed = try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+
+ if (!displayed && NILP (Vx_max_tooltip_size))
+ {
+#ifdef ENABLE_CHECKING
+ row = w->desired_matrix->rows;
+ end = w->desired_matrix->rows + w->desired_matrix->nrows;
+
+ while (row < end)
+ {
+ if (!row->displays_text_p
+ || row->ends_at_zv_p)
+ break;
+ ++row;
+ }
+
+ eassert (row < end && row->ends_at_zv_p);
+#endif
+ }
+
/* Calculate size of tooltip window. */
size = Fwindow_text_pixel_size (window, Qnil, Qnil, Qnil,
make_fixnum (w->pixel_height), Qnil,
@@ -3924,7 +3948,7 @@ syms_of_pgtkfns (void)
DEFVAR_LISP ("x-max-tooltip-size", Vx_max_tooltip_size,
doc: /* SKIP: real doc in xfns.c. */);
- Vx_max_tooltip_size = Fcons (make_fixnum (80), make_fixnum (40));
+ Vx_max_tooltip_size = Qnil;
DEFSYM (Qmono, "mono");
DEFSYM (Qassq_delete_all, "assq-delete-all");
diff --git a/src/print.c b/src/print.c
index b5a621f80aa..1c96ec14b86 100644
--- a/src/print.c
+++ b/src/print.c
@@ -63,16 +63,17 @@ static Lisp_Object being_printed[PRINT_CIRCLE];
/* Last char printed to stdout by printchar. */
static unsigned int printchar_stdout_last;
+struct print_buffer
+{
+ char *buffer; /* Allocated buffer. */
+ ptrdiff_t size; /* Size of allocated buffer. */
+ ptrdiff_t pos; /* Chars stored in buffer. */
+ ptrdiff_t pos_byte; /* Bytes stored in buffer. */
+};
+
/* When printing into a buffer, first we put the text in this
block, then insert it all at once. */
-static char *print_buffer;
-
-/* Size allocated in print_buffer. */
-static ptrdiff_t print_buffer_size;
-/* Chars stored in print_buffer. */
-static ptrdiff_t print_buffer_pos;
-/* Bytes stored in print_buffer. */
-static ptrdiff_t print_buffer_pos_byte;
+static struct print_buffer print_buffer;
/* Vprint_number_table is a table, that keeps objects that are going to
be printed, to allow use of #n= and #n# to express sharing.
@@ -91,117 +92,139 @@ bool print_output_debug_flag EXTERNALLY_VISIBLE = 1;
/* Low level output routines for characters and strings. */
-/* Lisp functions to do output using a stream
- must have the stream in a variable called printcharfun
- and must start with PRINTPREPARE, end with PRINTFINISH.
- Use printchar to output one character,
- or call strout to output a block of characters. */
-
-#define PRINTPREPARE \
- struct buffer *old = current_buffer; \
- ptrdiff_t old_point = -1, start_point = -1; \
- ptrdiff_t old_point_byte = -1, start_point_byte = -1; \
- specpdl_ref specpdl_count = SPECPDL_INDEX (); \
- bool free_print_buffer = 0; \
- bool multibyte \
- = !NILP (BVAR (current_buffer, enable_multibyte_characters)); \
- Lisp_Object original = printcharfun; \
- if (NILP (printcharfun)) printcharfun = Qt; \
- if (BUFFERP (printcharfun)) \
- { \
- if (XBUFFER (printcharfun) != current_buffer) \
- Fset_buffer (printcharfun); \
- printcharfun = Qnil; \
- } \
- if (MARKERP (printcharfun)) \
- { \
- ptrdiff_t marker_pos; \
- if (! XMARKER (printcharfun)->buffer) \
- error ("Marker does not point anywhere"); \
- if (XMARKER (printcharfun)->buffer != current_buffer) \
- set_buffer_internal (XMARKER (printcharfun)->buffer); \
- marker_pos = marker_position (printcharfun); \
- if (marker_pos < BEGV || marker_pos > ZV) \
- signal_error ("Marker is outside the accessible " \
- "part of the buffer", printcharfun); \
- old_point = PT; \
- old_point_byte = PT_BYTE; \
- SET_PT_BOTH (marker_pos, \
- marker_byte_position (printcharfun)); \
- start_point = PT; \
- start_point_byte = PT_BYTE; \
- printcharfun = Qnil; \
- } \
- if (NILP (printcharfun)) \
- { \
- Lisp_Object string; \
- if (NILP (BVAR (current_buffer, enable_multibyte_characters)) \
- && ! print_escape_multibyte) \
- specbind (Qprint_escape_multibyte, Qt); \
- if (! NILP (BVAR (current_buffer, enable_multibyte_characters)) \
- && ! print_escape_nonascii) \
- specbind (Qprint_escape_nonascii, Qt); \
- if (print_buffer != 0) \
- { \
- string = make_string_from_bytes (print_buffer, \
- print_buffer_pos, \
- print_buffer_pos_byte); \
- record_unwind_protect (print_unwind, string); \
- } \
- else \
- { \
- int new_size = 1000; \
- print_buffer = xmalloc (new_size); \
- print_buffer_size = new_size; \
- free_print_buffer = 1; \
- } \
- print_buffer_pos = 0; \
- print_buffer_pos_byte = 0; \
- } \
- if (EQ (printcharfun, Qt) && ! noninteractive) \
- setup_echo_area_for_printing (multibyte);
-
-#define PRINTFINISH \
- if (NILP (printcharfun)) \
- { \
- if (print_buffer_pos != print_buffer_pos_byte \
- && NILP (BVAR (current_buffer, enable_multibyte_characters)))\
- { \
- USE_SAFE_ALLOCA; \
- unsigned char *temp = SAFE_ALLOCA (print_buffer_pos + 1); \
- copy_text ((unsigned char *) print_buffer, temp, \
- print_buffer_pos_byte, 1, 0); \
- insert_1_both ((char *) temp, print_buffer_pos, \
- print_buffer_pos, 0, 1, 0); \
- SAFE_FREE (); \
- } \
- else \
- insert_1_both (print_buffer, print_buffer_pos, \
- print_buffer_pos_byte, 0, 1, 0); \
- signal_after_change (PT - print_buffer_pos, 0, print_buffer_pos);\
- } \
- if (free_print_buffer) \
- { \
- xfree (print_buffer); \
- print_buffer = 0; \
- } \
- unbind_to (specpdl_count, Qnil); \
- if (MARKERP (original)) \
- set_marker_both (original, Qnil, PT, PT_BYTE); \
- if (old_point >= 0) \
- SET_PT_BOTH (old_point + (old_point >= start_point \
- ? PT - start_point : 0), \
- old_point_byte + (old_point_byte >= start_point_byte \
- ? PT_BYTE - start_point_byte : 0)); \
- set_buffer_internal (old);
+/* This is used to free the print buffer; we don't simply record xfree
+ since print_buffer can be reallocated during the printing. */
+static void
+print_free_buffer (void)
+{
+ xfree (print_buffer.buffer);
+ print_buffer.buffer = NULL;
+}
/* This is used to restore the saved contents of print_buffer
when there is a recursive call to print. */
-
static void
print_unwind (Lisp_Object saved_text)
{
- memcpy (print_buffer, SDATA (saved_text), SCHARS (saved_text));
+ memcpy (print_buffer.buffer, SDATA (saved_text), SCHARS (saved_text));
+}
+
+/* Lisp functions to do output using a stream must start with a call to
+ print_prepare, and end with calling print_finish.
+ Use printchar to output one character, or call strout to output a
+ block of characters. */
+
+/* State carried between print_prepare and print_finish. */
+struct print_context
+{
+ Lisp_Object printcharfun;
+ Lisp_Object old_printcharfun;
+ ptrdiff_t old_point, start_point;
+ ptrdiff_t old_point_byte, start_point_byte;
+ specpdl_ref specpdl_count;
+};
+
+static inline struct print_context
+print_prepare (Lisp_Object printcharfun)
+{
+ struct print_context pc = {
+ .old_printcharfun = printcharfun,
+ .old_point = -1,
+ .start_point = -1,
+ .old_point_byte = -1,
+ .start_point_byte = -1,
+ .specpdl_count = SPECPDL_INDEX (),
+ };
+ bool multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters));
+ record_unwind_current_buffer ();
+ specbind(Qprint__unreadable_callback_buffer, Fcurrent_buffer ());
+ if (NILP (printcharfun))
+ printcharfun = Qt;
+ if (BUFFERP (printcharfun))
+ {
+ if (XBUFFER (printcharfun) != current_buffer)
+ Fset_buffer (printcharfun);
+ printcharfun = Qnil;
+ }
+ if (MARKERP (printcharfun))
+ {
+ if (! XMARKER (printcharfun)->buffer)
+ error ("Marker does not point anywhere");
+ if (XMARKER (printcharfun)->buffer != current_buffer)
+ set_buffer_internal (XMARKER (printcharfun)->buffer);
+ ptrdiff_t marker_pos = marker_position (printcharfun);
+ if (marker_pos < BEGV || marker_pos > ZV)
+ signal_error ("Marker is outside the accessible part of the buffer",
+ printcharfun);
+ pc.old_point = PT;
+ pc.old_point_byte = PT_BYTE;
+ SET_PT_BOTH (marker_pos, marker_byte_position (printcharfun));
+ pc.start_point = PT;
+ pc.start_point_byte = PT_BYTE;
+ printcharfun = Qnil;
+ }
+ if (NILP (printcharfun))
+ {
+ if (NILP (BVAR (current_buffer, enable_multibyte_characters))
+ && ! print_escape_multibyte)
+ specbind (Qprint_escape_multibyte, Qt);
+ if (! NILP (BVAR (current_buffer, enable_multibyte_characters))
+ && ! print_escape_nonascii)
+ specbind (Qprint_escape_nonascii, Qt);
+ if (print_buffer.buffer != NULL)
+ {
+ Lisp_Object string = make_string_from_bytes (print_buffer.buffer,
+ print_buffer.pos,
+ print_buffer.pos_byte);
+ record_unwind_protect (print_unwind, string);
+ }
+ else
+ {
+ int new_size = 1000;
+ print_buffer.buffer = xmalloc (new_size);
+ print_buffer.size = new_size;
+ record_unwind_protect_void (print_free_buffer);
+ }
+ print_buffer.pos = 0;
+ print_buffer.pos_byte = 0;
+ }
+ if (EQ (printcharfun, Qt) && ! noninteractive)
+ setup_echo_area_for_printing (multibyte);
+ pc.printcharfun = printcharfun;
+ return pc;
+}
+
+static inline void
+print_finish (struct print_context *pc)
+{
+ if (NILP (pc->printcharfun))
+ {
+ if (print_buffer.pos != print_buffer.pos_byte
+ && NILP (BVAR (current_buffer, enable_multibyte_characters)))
+ {
+ USE_SAFE_ALLOCA;
+ unsigned char *temp = SAFE_ALLOCA (print_buffer.pos + 1);
+ copy_text ((unsigned char *) print_buffer.buffer, temp,
+ print_buffer.pos_byte, 1, 0);
+ insert_1_both ((char *) temp, print_buffer.pos,
+ print_buffer.pos, 0, 1, 0);
+ SAFE_FREE ();
+ }
+ else
+ insert_1_both (print_buffer.buffer, print_buffer.pos,
+ print_buffer.pos_byte, 0, 1, 0);
+ signal_after_change (PT - print_buffer.pos, 0, print_buffer.pos);
+ }
+ if (MARKERP (pc->old_printcharfun))
+ set_marker_both (pc->old_printcharfun, Qnil, PT, PT_BYTE);
+ if (pc->old_point >= 0)
+ SET_PT_BOTH (pc->old_point
+ + (pc->old_point >= pc->start_point
+ ? PT - pc->start_point : 0),
+ pc->old_point_byte
+ + (pc->old_point_byte >= pc->start_point_byte
+ ? PT_BYTE - pc->start_point_byte : 0));
+ unbind_to (pc->specpdl_count, Qnil);
}
/* Print character CH to the stdio stream STREAM. */
@@ -289,13 +312,14 @@ printchar (unsigned int ch, Lisp_Object fun)
if (NILP (fun))
{
- ptrdiff_t incr = len - (print_buffer_size - print_buffer_pos_byte);
+ ptrdiff_t incr = len - (print_buffer.size - print_buffer.pos_byte);
if (incr > 0)
- print_buffer = xpalloc (print_buffer, &print_buffer_size,
- incr, -1, 1);
- memcpy (print_buffer + print_buffer_pos_byte, str, len);
- print_buffer_pos += 1;
- print_buffer_pos_byte += len;
+ print_buffer.buffer = xpalloc (print_buffer.buffer,
+ &print_buffer.size,
+ incr, -1, 1);
+ memcpy (print_buffer.buffer + print_buffer.pos_byte, str, len);
+ print_buffer.pos += 1;
+ print_buffer.pos_byte += len;
}
else if (noninteractive)
{
@@ -354,12 +378,13 @@ strout (const char *ptr, ptrdiff_t size, ptrdiff_t size_byte,
{
if (NILP (printcharfun))
{
- ptrdiff_t incr = size_byte - (print_buffer_size - print_buffer_pos_byte);
+ ptrdiff_t incr = size_byte - (print_buffer.size - print_buffer.pos_byte);
if (incr > 0)
- print_buffer = xpalloc (print_buffer, &print_buffer_size, incr, -1, 1);
- memcpy (print_buffer + print_buffer_pos_byte, ptr, size_byte);
- print_buffer_pos += size;
- print_buffer_pos_byte += size_byte;
+ print_buffer.buffer = xpalloc (print_buffer.buffer,
+ &print_buffer.size, incr, -1, 1);
+ memcpy (print_buffer.buffer + print_buffer.pos_byte, ptr, size_byte);
+ print_buffer.pos += size;
+ print_buffer.pos_byte += size_byte;
}
else if (noninteractive && EQ (printcharfun, Qt))
{
@@ -523,14 +548,14 @@ PRINTCHARFUN defaults to the value of `standard-output' (which see). */)
if (NILP (printcharfun))
printcharfun = Vstandard_output;
CHECK_FIXNUM (character);
- PRINTPREPARE;
- printchar (XFIXNUM (character), printcharfun);
- PRINTFINISH;
+ struct print_context pc = print_prepare (printcharfun);
+ printchar (XFIXNUM (character), pc.printcharfun);
+ print_finish (&pc);
return character;
}
/* Print the contents of a unibyte C string STRING using PRINTCHARFUN.
- The caller should arrange to put this inside PRINTPREPARE and PRINTFINISH.
+ The caller should arrange to put this inside print_prepare and print_finish.
Do not use this on the contents of a Lisp string. */
static void
@@ -546,9 +571,9 @@ print_c_string (char const *string, Lisp_Object printcharfun)
static void
write_string (const char *data, Lisp_Object printcharfun)
{
- PRINTPREPARE;
- print_c_string (data, printcharfun);
- PRINTFINISH;
+ struct print_context pc = print_prepare (printcharfun);
+ print_c_string (data, pc.printcharfun);
+ print_finish (&pc);
}
@@ -601,21 +626,21 @@ If PRINTCHARFUN is omitted or nil, the value of `standard-output' is used. */)
if (NILP (printcharfun))
printcharfun = Vstandard_output;
- PRINTPREPARE;
+ struct print_context pc = print_prepare (printcharfun);
if (NILP (ensure))
val = Qt;
/* Difficult to check if at line beginning so abort. */
- else if (FUNCTIONP (printcharfun))
- signal_error ("Unsupported function argument", printcharfun);
- else if (noninteractive && !NILP (printcharfun))
+ else if (FUNCTIONP (pc.printcharfun))
+ signal_error ("Unsupported function argument", pc.printcharfun);
+ else if (noninteractive && !NILP (pc.printcharfun))
val = printchar_stdout_last == 10 ? Qnil : Qt;
else
val = NILP (Fbolp ()) ? Qt : Qnil;
if (!NILP (val))
- printchar ('\n', printcharfun);
- PRINTFINISH;
+ printchar ('\n', pc.printcharfun);
+ print_finish (&pc);
return val;
}
@@ -746,9 +771,9 @@ means "use default values for all the print-related settings". */)
if (!NILP (overrides))
print_bind_overrides (overrides);
- PRINTPREPARE;
- print (object, printcharfun, 1);
- PRINTFINISH;
+ struct print_context pc = print_prepare (printcharfun);
+ print (object, pc.printcharfun, 1);
+ print_finish (&pc);
return unbind_to (count, object);
}
@@ -783,11 +808,10 @@ A printed representation of an object is text which describes that object. */)
No need for specbind, since errors deactivate the mark. */
Lisp_Object save_deactivate_mark = Vdeactivate_mark;
- Lisp_Object printcharfun = Vprin1_to_string_buffer;
- PRINTPREPARE;
- print (object, printcharfun, NILP (noescape));
- /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINISH */
- PRINTFINISH;
+ struct print_context pc = print_prepare (Vprin1_to_string_buffer);
+ print (object, pc.printcharfun, NILP (noescape));
+ /* Make Vprin1_to_string_buffer be the default buffer after print_finish */
+ print_finish (&pc);
struct buffer *previous = current_buffer;
set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
@@ -832,15 +856,15 @@ is used instead. */)
{
if (NILP (printcharfun))
printcharfun = Vstandard_output;
- PRINTPREPARE;
+ struct print_context pc = print_prepare (printcharfun);
if (STRINGP (object)
&& !string_intervals (object)
&& NILP (Vprint_continuous_numbering))
/* fast path for plain strings */
- print_string (object, printcharfun);
+ print_string (object, pc.printcharfun);
else
- print (object, printcharfun, 0);
- PRINTFINISH;
+ print (object, pc.printcharfun, 0);
+ print_finish (&pc);
return object;
}
@@ -871,11 +895,11 @@ is used instead. */)
{
if (NILP (printcharfun))
printcharfun = Vstandard_output;
- PRINTPREPARE;
- printchar ('\n', printcharfun);
- print (object, printcharfun, 1);
- printchar ('\n', printcharfun);
- PRINTFINISH;
+ struct print_context pc = print_prepare (printcharfun);
+ printchar ('\n', pc.printcharfun);
+ print (object, pc.printcharfun, 1);
+ printchar ('\n', pc.printcharfun);
+ print_finish (&pc);
return object;
}
@@ -1652,6 +1676,17 @@ print_vectorlike (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag,
infinite recursion in the function called. */
Lisp_Object func = Vprint_unreadable_function;
specbind (Qprint_unreadable_function, Qnil);
+
+ /* If we're being called from `prin1-to-string' or the like,
+ we're now in the secret " prin1" buffer. This can lead to
+ problems if, for instance, the callback function switches a
+ window to this buffer -- this will make Emacs segfault. */
+ if (!NILP (Vprint__unreadable_callback_buffer)
+ && !NILP (Fbuffer_live_p (Vprint__unreadable_callback_buffer)))
+ {
+ record_unwind_current_buffer ();
+ set_buffer_internal (XBUFFER (Vprint__unreadable_callback_buffer));
+ }
Lisp_Object result = CALLN (Ffuncall, func, obj,
escapeflag? Qt: Qnil);
unbind_to (count, Qnil);
@@ -2910,6 +2945,15 @@ be printed. */);
Vprint_unreadable_function = Qnil;
DEFSYM (Qprint_unreadable_function, "print-unreadable-function");
+ DEFVAR_LISP ("print--unreadable-callback-buffer",
+ Vprint__unreadable_callback_buffer,
+ doc: /* Dynamically bound to indicate current buffer. */);
+ Vprint__unreadable_callback_buffer = Qnil;
+ DEFSYM (Qprint__unreadable_callback_buffer,
+ "print--unreadable-callback-buffer");
+ /* Don't export this variable to Elisp. */
+ Funintern (Qprint__unreadable_callback_buffer, Qnil);
+
defsubr (&Sflush_standard_output);
/* Initialized in print_create_variable_mapping. */
diff --git a/src/process.c b/src/process.c
index d6d51b26e11..23479c06194 100644
--- a/src/process.c
+++ b/src/process.c
@@ -1243,14 +1243,31 @@ or t (process is stopped). */)
return XPROCESS (process)->command;
}
-DEFUN ("process-tty-name", Fprocess_tty_name, Sprocess_tty_name, 1, 1, 0,
+DEFUN ("process-tty-name", Fprocess_tty_name, Sprocess_tty_name, 1, 2, 0,
doc: /* Return the name of the terminal PROCESS uses, or nil if none.
This is the terminal that the process itself reads and writes on,
-not the name of the pty that Emacs uses to talk with that terminal. */)
- (register Lisp_Object process)
+not the name of the pty that Emacs uses to talk with that terminal.
+
+If STREAM is nil, return the terminal name if any of PROCESS's
+standard streams use a terminal for communication. If STREAM is one
+of `stdin', `stdout', or `stderr', return the name of the terminal
+PROCESS uses for that stream specifically, or nil if that stream
+communicates via a pipe. */)
+ (register Lisp_Object process, Lisp_Object stream)
{
CHECK_PROCESS (process);
- return XPROCESS (process)->tty_name;
+ register struct Lisp_Process *p = XPROCESS (process);
+
+ if (NILP (stream))
+ return p->tty_name;
+ else if (EQ (stream, Qstdin))
+ return p->pty_in ? p->tty_name : Qnil;
+ else if (EQ (stream, Qstdout))
+ return p->pty_out ? p->tty_name : Qnil;
+ else if (EQ (stream, Qstderr))
+ return p->pty_out && NILP (p->stderrproc) ? p->tty_name : Qnil;
+ else
+ signal_error ("Unknown stream", stream);
}
static void
@@ -1316,6 +1333,19 @@ set_process_filter_masks (struct Lisp_Process *p)
add_process_read_fd (p->infd);
}
+static bool
+is_pty_from_symbol (Lisp_Object symbol)
+{
+ if (EQ (symbol, Qpty))
+ return true;
+ else if (EQ (symbol, Qpipe))
+ return false;
+ else if (NILP (symbol))
+ return !NILP (Vprocess_connection_type);
+ else
+ report_file_error ("Unknown connection type", symbol);
+}
+
DEFUN ("set-process-filter", Fset_process_filter, Sset_process_filter,
2, 2, 0,
doc: /* Give PROCESS the filter function FILTER; nil means default.
@@ -1741,15 +1771,18 @@ signals to stop and continue a process.
:connection-type TYPE -- TYPE is control type of device used to
communicate with subprocesses. Values are `pipe' to use a pipe, `pty'
to use a pty, or nil to use the default specified through
-`process-connection-type'.
+`process-connection-type'. If TYPE is a cons (INPUT . OUTPUT), then
+INPUT will be used for standard input and OUTPUT for standard output
+(and standard error if `:stderr' is nil).
:filter FILTER -- Install FILTER as the process filter.
:sentinel SENTINEL -- Install SENTINEL as the process sentinel.
:stderr STDERR -- STDERR is either a buffer or a pipe process attached
-to the standard error of subprocess. Specifying this implies
-`:connection-type' is set to `pipe'. If STDERR is nil, standard error
+to the standard error of subprocess. When specifying this, the
+subprocess's standard error will always communicate via a pipe, no
+matter the value of `:connection-type'. If STDERR is nil, standard error
is mixed with standard output and sent to BUFFER or FILTER. (Note
that specifying :stderr will create a new, separate (but associated)
process, with its own filter and sentinel. See
@@ -1845,22 +1878,20 @@ usage: (make-process &rest ARGS) */)
CHECK_TYPE (NILP (tem), Qnull, tem);
tem = plist_get (contact, QCconnection_type);
- if (EQ (tem, Qpty))
- XPROCESS (proc)->pty_flag = true;
- else if (EQ (tem, Qpipe))
- XPROCESS (proc)->pty_flag = false;
- else if (NILP (tem))
- XPROCESS (proc)->pty_flag = !NILP (Vprocess_connection_type);
+ if (CONSP (tem))
+ {
+ XPROCESS (proc)->pty_in = is_pty_from_symbol (XCAR (tem));
+ XPROCESS (proc)->pty_out = is_pty_from_symbol (XCDR (tem));
+ }
else
- report_file_error ("Unknown connection type", tem);
-
- if (!NILP (stderrproc))
{
- pset_stderrproc (XPROCESS (proc), stderrproc);
-
- XPROCESS (proc)->pty_flag = false;
+ XPROCESS (proc)->pty_in = XPROCESS (proc)->pty_out =
+ is_pty_from_symbol (tem);
}
+ if (!NILP (stderrproc))
+ pset_stderrproc (XPROCESS (proc), stderrproc);
+
#ifdef HAVE_GNUTLS
/* AKA GNUTLS_INITSTAGE(proc). */
verify (GNUTLS_STAGE_EMPTY == 0);
@@ -2099,66 +2130,80 @@ static void
create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
{
struct Lisp_Process *p = XPROCESS (process);
- int inchannel, outchannel;
+ int inchannel = -1, outchannel = -1;
pid_t pid = -1;
int vfork_errno;
int forkin, forkout, forkerr = -1;
- bool pty_flag = 0;
+ bool pty_in = false, pty_out = false;
char pty_name[PTY_NAME_SIZE];
Lisp_Object lisp_pty_name = Qnil;
+ int ptychannel = -1, pty_tty = -1;
sigset_t oldset;
/* Ensure that the SIGCHLD handler can notify
`wait_reading_process_output'. */
child_signal_init ();
- inchannel = outchannel = -1;
+ if (p->pty_in || p->pty_out)
+ ptychannel = allocate_pty (pty_name);
- if (p->pty_flag)
- outchannel = inchannel = allocate_pty (pty_name);
-
- if (inchannel >= 0)
+ if (ptychannel >= 0)
{
- p->open_fd[READ_FROM_SUBPROCESS] = inchannel;
#if ! defined (USG) || defined (USG_SUBTTY_WORKS)
/* On most USG systems it does not work to open the pty's tty here,
then close it and reopen it in the child. */
/* Don't let this terminal become our controlling terminal
(in case we don't have one). */
- forkout = forkin = emacs_open (pty_name, O_RDWR | O_NOCTTY, 0);
- if (forkin < 0)
+ pty_tty = emacs_open (pty_name, O_RDWR | O_NOCTTY, 0);
+ if (pty_tty < 0)
report_file_error ("Opening pty", Qnil);
- p->open_fd[SUBPROCESS_STDIN] = forkin;
-#else
- forkin = forkout = -1;
#endif /* not USG, or USG_SUBTTY_WORKS */
- pty_flag = 1;
+ pty_in = p->pty_in;
+ pty_out = p->pty_out;
lisp_pty_name = build_string (pty_name);
}
+
+ /* Set up stdin for the child process. */
+ if (ptychannel >= 0 && p->pty_in)
+ {
+ p->open_fd[SUBPROCESS_STDIN] = forkin = pty_tty;
+ outchannel = ptychannel;
+ }
else
{
- if (emacs_pipe (p->open_fd + SUBPROCESS_STDIN) != 0
- || emacs_pipe (p->open_fd + READ_FROM_SUBPROCESS) != 0)
+ if (emacs_pipe (p->open_fd + SUBPROCESS_STDIN) != 0)
report_file_error ("Creating pipe", Qnil);
forkin = p->open_fd[SUBPROCESS_STDIN];
outchannel = p->open_fd[WRITE_TO_SUBPROCESS];
+ }
+
+ /* Set up stdout for the child process. */
+ if (ptychannel >= 0 && p->pty_out)
+ {
+ forkout = pty_tty;
+ p->open_fd[READ_FROM_SUBPROCESS] = inchannel = ptychannel;
+ }
+ else
+ {
+ if (emacs_pipe (p->open_fd + READ_FROM_SUBPROCESS) != 0)
+ report_file_error ("Creating pipe", Qnil);
inchannel = p->open_fd[READ_FROM_SUBPROCESS];
forkout = p->open_fd[SUBPROCESS_STDOUT];
#if defined(GNU_LINUX) && defined(F_SETPIPE_SZ)
fcntl (inchannel, F_SETPIPE_SZ, read_process_output_max);
#endif
+ }
- if (!NILP (p->stderrproc))
- {
- struct Lisp_Process *pp = XPROCESS (p->stderrproc);
+ if (!NILP (p->stderrproc))
+ {
+ struct Lisp_Process *pp = XPROCESS (p->stderrproc);
- forkerr = pp->open_fd[SUBPROCESS_STDOUT];
+ forkerr = pp->open_fd[SUBPROCESS_STDOUT];
- /* Close unnecessary file descriptors. */
- close_process_fd (&pp->open_fd[WRITE_TO_SUBPROCESS]);
- close_process_fd (&pp->open_fd[SUBPROCESS_STDIN]);
- }
+ /* Close unnecessary file descriptors. */
+ close_process_fd (&pp->open_fd[WRITE_TO_SUBPROCESS]);
+ close_process_fd (&pp->open_fd[SUBPROCESS_STDIN]);
}
if (FD_SETSIZE <= inchannel || FD_SETSIZE <= outchannel)
@@ -2183,7 +2228,8 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
we just reopen the device (see emacs_get_tty_pgrp) as this is
more portable (see USG_SUBTTY_WORKS above). */
- p->pty_flag = pty_flag;
+ p->pty_in = pty_in;
+ p->pty_out = pty_out;
pset_status (p, Qrun);
if (!EQ (p->command, Qt)
@@ -2199,13 +2245,15 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
block_input ();
block_child_signal (&oldset);
- pty_flag = p->pty_flag;
- eassert (pty_flag == ! NILP (lisp_pty_name));
+ pty_in = p->pty_in;
+ pty_out = p->pty_out;
+ eassert ((pty_in || pty_out) == ! NILP (lisp_pty_name));
vfork_errno
= emacs_spawn (&pid, forkin, forkout, forkerr, new_argv, env,
SSDATA (current_dir),
- pty_flag ? SSDATA (lisp_pty_name) : NULL, &oldset);
+ pty_in || pty_out ? SSDATA (lisp_pty_name) : NULL,
+ pty_in, pty_out, &oldset);
eassert ((vfork_errno == 0) == (0 < pid));
@@ -2263,7 +2311,7 @@ create_pty (Lisp_Object process)
{
struct Lisp_Process *p = XPROCESS (process);
char pty_name[PTY_NAME_SIZE];
- int pty_fd = !p->pty_flag ? -1 : allocate_pty (pty_name);
+ int pty_fd = !(p->pty_in || p->pty_out) ? -1 : allocate_pty (pty_name);
if (pty_fd >= 0)
{
@@ -2301,7 +2349,7 @@ create_pty (Lisp_Object process)
we just reopen the device (see emacs_get_tty_pgrp) as this is
more portable (see USG_SUBTTY_WORKS above). */
- p->pty_flag = 1;
+ p->pty_in = p->pty_out = true;
pset_status (p, Qrun);
setup_process_coding_systems (process);
@@ -2412,7 +2460,7 @@ usage: (make-pipe-process &rest ARGS) */)
p->kill_without_query = 1;
if (tem = plist_get (contact, QCstop), !NILP (tem))
pset_command (p, Qt);
- eassert (! p->pty_flag);
+ eassert (! p->pty_in && ! p->pty_out);
if (!EQ (p->command, Qt)
&& !EQ (p->filter, Qt))
@@ -3147,7 +3195,7 @@ usage: (make-serial-process &rest ARGS) */)
p->kill_without_query = 1;
if (tem = plist_get (contact, QCstop), !NILP (tem))
pset_command (p, Qt);
- eassert (! p->pty_flag);
+ eassert (! p->pty_in && ! p->pty_out);
if (!EQ (p->command, Qt)
&& !EQ (p->filter, Qt))
@@ -4641,15 +4689,20 @@ network_lookup_address_info_1 (Lisp_Object host, const char *service,
}
DEFUN ("network-lookup-address-info", Fnetwork_lookup_address_info,
- Snetwork_lookup_address_info, 1, 2, 0,
+ Snetwork_lookup_address_info, 1, 3, 0,
doc: /* Look up Internet Protocol (IP) address info of NAME.
-Optional parameter FAMILY controls whether to look up IPv4 or IPv6
+Optional argument FAMILY controls whether to look up IPv4 or IPv6
addresses. The default of nil means both, symbol `ipv4' means IPv4
-only, symbol `ipv6' means IPv6 only. Returns a list of addresses, or
-nil if none were found. Each address is a vector of integers, as per
-the description of ADDRESS in `make-network-process'. In case of
-error displays the error message. */)
- (Lisp_Object name, Lisp_Object family)
+only, symbol `ipv6' means IPv6 only.
+Optional argument HINTS allows specifying the hints passed to the
+underlying library call. The only supported value is `numeric', which
+means treat NAME as a numeric IP address. This also suppresses DNS
+traffic.
+Return a list of addresses, or nil if none were found. Each address
+is a vector of integers, as per the description of ADDRESS in
+`make-network-process'. In case of error log the error message
+returned from the lookup. */)
+ (Lisp_Object name, Lisp_Object family, Lisp_Object hint)
{
Lisp_Object addresses = Qnil;
Lisp_Object msg = Qnil;
@@ -4667,9 +4720,14 @@ error displays the error message. */)
hints.ai_family = AF_INET6;
#endif
else
- error ("Unsupported lookup type");
+ error ("Unsupported family");
hints.ai_socktype = SOCK_DGRAM;
+ if (EQ (hint, Qnumeric))
+ hints.ai_flags = AI_NUMERICHOST;
+ else if (!NILP (hint))
+ error ("Unsupported hints value");
+
msg = network_lookup_address_info_1 (name, NULL, &hints, &res);
if (!EQ (msg, Qt))
message ("%s", SSDATA(msg));
@@ -6798,7 +6856,7 @@ process_send_signal (Lisp_Object process, int signo, Lisp_Object current_group,
error ("Process %s is not active",
SDATA (p->name));
- if (!p->pty_flag)
+ if (! p->pty_in)
current_group = Qnil;
/* If we are using pgrps, get a pgrp number and make it negative. */
@@ -7167,7 +7225,7 @@ process has been transmitted to the serial port. */)
send_process (proc, "", 0, Qnil);
}
- if (XPROCESS (proc)->pty_flag)
+ if (XPROCESS (proc)->pty_in)
send_process (proc, "\004", 1, Qnil);
else if (EQ (XPROCESS (proc)->type, Qserial))
{
@@ -8515,6 +8573,7 @@ syms_of_process (void)
#ifdef AF_INET6
DEFSYM (Qipv6, "ipv6");
#endif
+ DEFSYM (Qnumeric, "numeric");
DEFSYM (Qdatagram, "datagram");
DEFSYM (Qseqpacket, "seqpacket");
diff --git a/src/process.h b/src/process.h
index 392b661ce69..92baf0c4cb9 100644
--- a/src/process.h
+++ b/src/process.h
@@ -156,8 +156,9 @@ struct Lisp_Process
/* True means kill silently if Emacs is exited.
This is the inverse of the `query-on-exit' flag. */
bool_bf kill_without_query : 1;
- /* True if communicating through a pty. */
- bool_bf pty_flag : 1;
+ /* True if communicating through a pty for input or output. */
+ bool_bf pty_in : 1;
+ bool_bf pty_out : 1;
/* Flag to set coding-system of the process buffer from the
coding_system used to decode process output. */
bool_bf inherit_coding_system_flag : 1;
diff --git a/src/puresize.h b/src/puresize.h
index 5516747ac2b..4b746924bb1 100644
--- a/src/puresize.h
+++ b/src/puresize.h
@@ -47,7 +47,7 @@ INLINE_HEADER_BEGIN
#endif
#ifndef BASE_PURESIZE
-#define BASE_PURESIZE (2000000 + SYSTEM_PURESIZE_EXTRA + SITELOAD_PURESIZE_EXTRA)
+#define BASE_PURESIZE (2750000 + SYSTEM_PURESIZE_EXTRA + SITELOAD_PURESIZE_EXTRA)
#endif
/* Increase BASE_PURESIZE by a ratio depending on the machine's word size. */
diff --git a/src/search.c b/src/search.c
index 9d6bd074e1b..b5d6a442c0f 100644
--- a/src/search.c
+++ b/src/search.c
@@ -3192,7 +3192,7 @@ DEFUN ("regexp-quote", Fregexp_quote, Sregexp_quote, 1, 1, 0,
}
/* Like find_newline, but doesn't use the cache, and only searches forward. */
-static ptrdiff_t
+ptrdiff_t
find_newline1 (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end,
ptrdiff_t end_byte, ptrdiff_t count, ptrdiff_t *counted,
ptrdiff_t *bytepos, bool allow_quit)
diff --git a/src/sheap.h b/src/sheap.h
index 9133f0b292f..cef111bc2f9 100644
--- a/src/sheap.h
+++ b/src/sheap.h
@@ -23,7 +23,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
/* Size of the static heap. Guess a value that is probably too large,
by up to a factor of four or so. Typically the unused part is not
paged in and so does not cost much. */
-enum { STATIC_HEAP_SIZE = sizeof (Lisp_Object) << 23 };
+enum { STATIC_HEAP_SIZE = sizeof (Lisp_Object) << 24 };
extern char bss_sbrk_buffer[STATIC_HEAP_SIZE];
extern char *max_bss_sbrk_ptr;
diff --git a/src/sysdep.c b/src/sysdep.c
index c1545622dfc..efd9638b07a 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -3169,7 +3169,8 @@ list_system_processes (void)
#endif /* !defined (WINDOWSNT) */
-#if defined __FreeBSD__ || defined DARWIN_OS || defined __OpenBSD__
+#if (HAVE_GETRUSAGE \
+ || defined __FreeBSD__ || defined DARWIN_OS || defined __OpenBSD__)
static Lisp_Object
make_lisp_s_us (time_t s, long us)
@@ -4276,7 +4277,7 @@ does the same thing as `current-time'. */)
usecs -= 1000000;
secs++;
}
- return make_lisp_time (make_timespec (secs, usecs * 1000));
+ return make_lisp_s_us (secs, usecs);
#else /* ! HAVE_GETRUSAGE */
#ifdef WINDOWSNT
return w32_get_internal_run_time ();
diff --git a/src/terminal.c b/src/terminal.c
index dcde8e9f557..d366e9d2438 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -402,7 +402,7 @@ but if the second argument FORCE is non-nil, you may do so. */)
DEFUN ("frame-terminal", Fframe_terminal, Sframe_terminal, 0, 1, 0,
doc: /* Return the terminal that FRAME is displayed on.
-If FRAME is nil, the selected frame is used.
+If FRAME is nil, use the selected frame.
The terminal device is represented by its integer identifier. */)
(Lisp_Object frame)
@@ -421,10 +421,12 @@ The terminal device is represented by its integer identifier. */)
DEFUN ("terminal-live-p", Fterminal_live_p, Sterminal_live_p, 1, 1, 0,
doc: /* Return non-nil if OBJECT is a terminal which has not been deleted.
-Value is nil if OBJECT is not a live display terminal.
-If object is a live display terminal, the return value indicates what
-sort of output terminal it uses. See the documentation of `framep' for
-possible return values. */)
+Return nil if OBJECT is not a live display terminal.
+OBJECT may be a terminal object, a frame, or nil (meaning the
+selected frame's terminal).
+If OBJECT is a live display terminal, return what sort of output
+terminal it uses. See the documentation of `framep' for possible
+return values. */)
(Lisp_Object object)
{
struct terminal *t = decode_terminal (object);
diff --git a/src/textprop.c b/src/textprop.c
index 96d07b44be8..c91a2b729c6 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -88,7 +88,7 @@ modify_text_properties (Lisp_Object buffer, Lisp_Object start, Lisp_Object end)
BUF_COMPUTE_UNCHANGED (buf, b - 1, e);
if (MODIFF <= SAVE_MODIFF)
record_first_change ();
- modiff_incr (&MODIFF);
+ modiff_incr (&MODIFF, 1);
bset_point_before_scroll (current_buffer, Qnil);
diff --git a/src/timefns.c b/src/timefns.c
index 9df50eaecc3..eed2edf1cc0 100644
--- a/src/timefns.c
+++ b/src/timefns.c
@@ -387,9 +387,9 @@ enum { flt_radix_power_size = DBL_MANT_DIG - DBL_MIN_EXP + 1 };
equals FLT_RADIX**P. */
static Lisp_Object flt_radix_power;
-/* Convert T into an Emacs time *RESULT, truncating toward minus infinity.
- Return zero if successful, an error number otherwise. */
-static int
+/* Convert the finite number T into an Emacs time *RESULT, truncating
+ toward minus infinity. Signal an error if unsuccessful. */
+static void
decode_float_time (double t, struct lisp_time *result)
{
Lisp_Object ticks, hz;
@@ -401,6 +401,11 @@ decode_float_time (double t, struct lisp_time *result)
else
{
int scale = double_integer_scale (t);
+ /* FIXME: `double_integer_scale` often returns values that are
+ "pessimistic" (i.e. larger than necessary), so 3.5 gets converted
+ to (7881299347898368 . 2251799813685248) rather than (7 . 2).
+ On 64bit systems, this should not matter very much, tho. */
+ eassume (scale < flt_radix_power_size);
if (scale < 0)
{
@@ -412,8 +417,6 @@ decode_float_time (double t, struct lisp_time *result)
which is typically better than signaling overflow. */
scale = 0;
}
- else if (flt_radix_power_size <= scale)
- return isnan (t) ? EDOM : EOVERFLOW;
/* Compute TICKS, HZ such that TICKS / HZ exactly equals T, where HZ is
T's frequency or 1, whichever is greater. Here, “frequency” means
@@ -431,7 +434,6 @@ decode_float_time (double t, struct lisp_time *result)
}
result->ticks = ticks;
result->hz = hz;
- return 0;
}
/* Make a 4-element timestamp (HI LO US PS) from TICKS and HZ.
@@ -705,7 +707,7 @@ enum timeform
TIMEFORM_TICKS_HZ /* fractional time: HI is ticks, LO is ticks per second */
};
-/* From the valid form FORM and the time components HIGH, LOW, USEC
+/* From the non-float form FORM and the time components HIGH, LOW, USEC
and PSEC, generate the corresponding time value. If LOW is
floating point, the other components should be zero and FORM should
not be TIMEFORM_TICKS_HZ.
@@ -734,16 +736,7 @@ decode_time_components (enum timeform form,
return EINVAL;
case TIMEFORM_FLOAT:
- {
- double t = XFLOAT_DATA (low);
- if (result)
- return decode_float_time (t, result);
- else
- {
- *dresult = t;
- return 0;
- }
- }
+ eassume (false);
case TIMEFORM_NIL:
return decode_ticks_hz (timespec_ticks (current_timespec ()),
@@ -829,8 +822,6 @@ decode_lisp_time (Lisp_Object specified_time, bool decode_secs_only,
if (NILP (specified_time))
form = TIMEFORM_NIL;
- else if (FLOATP (specified_time))
- form = TIMEFORM_FLOAT;
else if (CONSP (specified_time))
{
high = XCAR (specified_time);
@@ -870,6 +861,22 @@ decode_lisp_time (Lisp_Object specified_time, bool decode_secs_only,
if (! INTEGERP (low))
form = TIMEFORM_INVALID;
}
+ else if (FASTER_TIMEFNS && INTEGERP (specified_time))
+ {
+ decode_ticks_hz (specified_time, make_fixnum (1), result, dresult);
+ return form;
+ }
+ else if (FLOATP (specified_time))
+ {
+ double d = XFLOAT_DATA (specified_time);
+ if (!isfinite (d))
+ time_error (isnan (d) ? EDOM : EOVERFLOW);
+ if (result)
+ decode_float_time (d, result);
+ else
+ *dresult = d;
+ return TIMEFORM_FLOAT;
+ }
int err = decode_time_components (form, high, low, usec, psec,
result, dresult);
@@ -878,7 +885,7 @@ decode_lisp_time (Lisp_Object specified_time, bool decode_secs_only,
return form;
}
-/* Convert a Lisp timestamp SPECIFIED_TIME to double.
+/* Convert a non-float Lisp timestamp SPECIFIED_TIME to double.
Signal an error if unsuccessful. */
double
float_time (Lisp_Object specified_time)
@@ -1074,27 +1081,9 @@ lispint_arith (Lisp_Object a, Lisp_Object b, bool subtract)
static Lisp_Object
time_arith (Lisp_Object a, Lisp_Object b, bool subtract)
{
- if (FLOATP (a) && !isfinite (XFLOAT_DATA (a)))
- {
- double da = XFLOAT_DATA (a);
- double db = float_time (b);
- return make_float (subtract ? da - db : da + db);
- }
enum timeform aform, bform;
struct lisp_time ta = lisp_time_struct (a, &aform);
-
- if (FLOATP (b) && !isfinite (XFLOAT_DATA (b)))
- return subtract ? make_float (-XFLOAT_DATA (b)) : b;
-
- /* Subtract nil from nil correctly, and handle other eq values
- quicker while we're at it. Compare here rather than earlier, to
- handle NaNs and check formats. */
- struct lisp_time tb;
- if (BASE_EQ (a, b))
- bform = aform, tb = ta;
- else
- tb = lisp_time_struct (b, &bform);
-
+ struct lisp_time tb = lisp_time_struct (b, &bform);
Lisp_Object ticks, hz;
if (FASTER_TIMEFNS && BASE_EQ (ta.hz, tb.hz))
@@ -1201,30 +1190,38 @@ See `format-time-string' for the various forms of a time value.
For example, nil stands for the current time. */)
(Lisp_Object a, Lisp_Object b)
{
+ /* Subtract nil from nil correctly, and handle other eq values
+ quicker while we're at it. This means (time-subtract X X) does
+ not signal an error if X is not a valid time value, but that's OK. */
+ if (BASE_EQ (a, b))
+ return timespec_to_lisp ((struct timespec) {0});
+
return time_arith (a, b, true);
}
-/* Return negative, 0, positive if a < b, a == b, a > b respectively.
- Return positive if either a or b is a NaN; this is good enough
- for the current callers. */
-static int
+/* Return negative, 0, positive if A < B, A == B, A > B respectively.
+ A and B should be Lisp time values. */
+static EMACS_INT
time_cmp (Lisp_Object a, Lisp_Object b)
{
- if ((FLOATP (a) && !isfinite (XFLOAT_DATA (a)))
- || (FLOATP (b) && !isfinite (XFLOAT_DATA (b))))
- {
- double da = FLOATP (a) ? XFLOAT_DATA (a) : 0;
- double db = FLOATP (b) ? XFLOAT_DATA (b) : 0;
- return da < db ? -1 : da != db;
- }
-
/* Compare nil to nil correctly, and handle other eq values quicker
- while we're at it. Compare here rather than earlier, to handle
- NaNs. This means (time-equal-p X X) does not signal an error if
- X is not a valid time value, but that's OK. */
+ while we're at it. This means (time-equal-p X X) does not signal
+ an error if X is not a valid time value, but that's OK. */
if (BASE_EQ (a, b))
return 0;
+ /* Compare (X . Z) to (Y . Z) quickly if X and Y are fixnums.
+ Do not inspect Z, as it is OK to not signal if A and B are invalid.
+ Also, compare X to Y quickly if X and Y are fixnums. */
+ if (FASTER_TIMEFNS)
+ {
+ Lisp_Object x = a, y = b;
+ if (CONSP (a) && CONSP (b) && BASE_EQ (XCDR (a), XCDR (b)))
+ x = XCAR (a), y = XCAR (b);
+ if (FIXNUMP (x) && FIXNUMP (y))
+ return XFIXNUM (x) - XFIXNUM (y);
+ }
+
/* Compare (ATICKS . AZ) to (BTICKS . BHZ) by comparing
ATICKS * BHZ to BTICKS * AHZ. */
struct lisp_time ta = lisp_time_struct (a, 0);
@@ -1258,7 +1255,9 @@ DEFUN ("time-equal-p", Ftime_equal_p, Stime_equal_p, 2, 2, 0,
See `format-time-string' for the various forms of a time value. */)
(Lisp_Object a, Lisp_Object b)
{
- return time_cmp (a, b) == 0 ? Qt : Qnil;
+ /* A nil arg compares unequal to a non-nil arg. This also saves the
+ expense of current_timespec if either arg is nil. */
+ return NILP (a) == NILP (b) && time_cmp (a, b) == 0 ? Qt : Qnil;
}
@@ -1269,11 +1268,12 @@ instead of the current time. See `format-time-string' for the various
forms of a time value.
WARNING: Since the result is floating point, it may not be exact.
-If precise time stamps are required, use either `encode-time',
+If precise time stamps are required, use either `time-convert',
or (if you need time as a string) `format-time-string'. */)
(Lisp_Object specified_time)
{
- return make_float (float_time (specified_time));
+ return (FLOATP (specified_time) ? specified_time
+ : make_float (float_time (specified_time)));
}
/* Write information into buffer S of size MAXSIZE, according to the
@@ -1729,21 +1729,29 @@ usage: (encode-time TIME &rest OBSOLESCENT-ARGUMENTS) */)
}
DEFUN ("time-convert", Ftime_convert, Stime_convert, 1, 2, 0,
- doc: /* Convert TIME value to a Lisp timestamp.
-With optional FORM, convert to that timestamp form.
+ doc: /* Convert TIME value to a Lisp timestamp of the given FORM.
Truncate the returned value toward minus infinity.
-If FORM is nil (the default), return the same form as `current-time'.
If FORM is a positive integer, return a pair of integers (TICKS . FORM),
where TICKS is the number of clock ticks and FORM is the clock frequency
-in ticks per second. If FORM is t, return (TICKS . PHZ), where
-PHZ is a suitable clock frequency in ticks per second. If FORM is
-`integer', return an integer count of seconds. If FORM is `list',
-return an integer list (HIGH LOW USEC PSEC), where HIGH has the most
-significant bits of the seconds, LOW has the least significant 16
-bits, and USEC and PSEC are the microsecond and picosecond counts. */)
+in ticks per second.
+
+If FORM is t, return (TICKS . PHZ), where PHZ is a suitable clock
+frequency in ticks per second.
+
+If FORM is `integer', return an integer count of seconds.
+
+If FORM is `list', return an integer list (HIGH LOW USEC PSEC), where
+HIGH has the most significant bits of the seconds, LOW has the least
+significant 16 bits, and USEC and PSEC are the microsecond and
+picosecond counts.
+
+If FORM is nil, the behavior depends on `current-time-list',
+but new code should not rely on it. */)
(Lisp_Object time, Lisp_Object form)
{
+ /* FIXME: Any reason why we don't offer a `float` output format option as
+ well, since we accept it as input? */
struct lisp_time t;
enum timeform input_form = decode_lisp_time (time, false, &t, 0);
if (NILP (form))
diff --git a/src/w32.c b/src/w32.c
index e4c6d007661..cbcfcdd4f6d 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -8573,6 +8573,7 @@ int
sys_close (int fd)
{
int rc = -1;
+ bool reader_thread_exited = false;
if (fd < 0)
{
@@ -8583,6 +8584,13 @@ sys_close (int fd)
if (fd < MAXDESC && fd_info[fd].cp)
{
child_process * cp = fd_info[fd].cp;
+ DWORD thrd_status = STILL_ACTIVE;
+
+ /* Thread handle will be NULL if we already called delete_child. */
+ if (cp->thrd != NULL
+ && GetExitCodeThread (cp->thrd, &thrd_status)
+ && thrd_status != STILL_ACTIVE)
+ reader_thread_exited = true;
fd_info[fd].cp = NULL;
@@ -8633,7 +8641,11 @@ sys_close (int fd)
because socket handles are fully fledged kernel handles. */
if (fd < MAXDESC)
{
- if ((fd_info[fd].flags & FILE_DONT_CLOSE) == 0)
+ if ((fd_info[fd].flags & FILE_DONT_CLOSE) == 0
+ /* If the reader thread already exited, close the descriptor,
+ since otherwise no one will close it, and we will be
+ leaking descriptors. */
+ || reader_thread_exited)
{
fd_info[fd].flags = 0;
rc = _close (fd);
@@ -8641,10 +8653,11 @@ sys_close (int fd)
else
{
/* We don't close here descriptors open by pipe processes
- for reading from the pipe, because the reader thread
- might be stuck in _sys_read_ahead, and then we will hang
- here. If the reader thread exits normally, it will close
- the descriptor; otherwise we will leave a zombie thread
+ for reading from the pipe when the reader thread might
+ still be running, since that thread might be stuck in
+ _sys_read_ahead, and then we will hang here. If the
+ reader thread exits normally, it will close the
+ descriptor; otherwise we will leave a zombie thread
hanging around. */
rc = 0;
/* Leave the flag set for the reader thread to close the
diff --git a/src/w32fns.c b/src/w32fns.c
index 51540e1880c..28d13a68d45 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -7568,7 +7568,23 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
clear_glyph_matrix (w->desired_matrix);
clear_glyph_matrix (w->current_matrix);
SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
- try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+ bool displayed = try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+ if (!displayed && NILP (Vx_max_tooltip_size))
+ {
+#ifdef ENABLE_CHECKING
+ struct glyph_row *row = w->desired_matrix->rows;
+ struct glyph_row *end =
+ w->desired_matrix->rows + w->desired_matrix->nrows;
+ while (row < end)
+ {
+ if (!row->displays_text_p
+ || row->ends_at_zv_p)
+ break;
+ ++row;
+ }
+ eassert (row < end && row->ends_at_zv_p);
+#endif
+ }
/* Calculate size of tooltip window. */
size = Fwindow_text_pixel_size (window, Qnil, Qnil, Qnil,
make_fixnum (w->pixel_height), Qnil,
@@ -10492,6 +10508,7 @@ frame_parm_handler w32_frame_parm_handlers[] =
0, /* x_set_override_redirect */
gui_set_no_special_glyphs,
gui_set_alpha_background,
+ 0, /* x_set_use_frame_synchronization */
};
void
@@ -10770,7 +10787,7 @@ bass-down, bass-boost, bass-up, treble-down, treble-up */);
DEFVAR_LISP ("x-max-tooltip-size", Vx_max_tooltip_size,
doc: /* SKIP: real doc in xfns.c. */);
- Vx_max_tooltip_size = Fcons (make_fixnum (80), make_fixnum (40));
+ Vx_max_tooltip_size = Qnil;
DEFVAR_LISP ("x-no-window-manager", Vx_no_window_manager,
doc: /* SKIP: real doc in xfns.c. */);
diff --git a/src/w32proc.c b/src/w32proc.c
index 7acfba64d70..f771ebc8511 100644
--- a/src/w32proc.c
+++ b/src/w32proc.c
@@ -1287,10 +1287,21 @@ reader_thread (void *arg)
}
/* If this thread was reading from a pipe process, close the
descriptor used for reading, as sys_close doesn't in that case. */
- if (fd_info[fd].flags == FILE_DONT_CLOSE)
+ if ((fd_info[fd].flags & FILE_DONT_CLOSE) == FILE_DONT_CLOSE)
{
- fd_info[fd].flags = 0;
- _close (fd);
+ int i;
+ /* If w32.c:sys_close is still processing this descriptor, wait
+ for a while for it to finish. */
+ for (i = 0; i < 5; i++)
+ {
+ if (fd_info[fd].flags == FILE_DONT_CLOSE)
+ {
+ fd_info[fd].flags = 0;
+ _close (fd);
+ break;
+ }
+ Sleep (5);
+ }
}
return 0;
}
diff --git a/src/window.c b/src/window.c
index 10373f8a2bf..c8fcb3a607f 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1028,7 +1028,7 @@ window_body_unit_from_symbol (Lisp_Object unit)
/* Return the number of lines/pixels of W's body. Don't count any mode
or header line or horizontal divider of W. Rounds down to nearest
integer when not working pixelwise. */
-static int
+int
window_body_height (struct window *w, enum window_body_unit pixelwise)
{
int height = (w->pixel_height
@@ -1275,7 +1275,10 @@ set_window_hscroll (struct window *w, EMACS_INT hscroll)
/* Prevent redisplay shortcuts when changing the hscroll. */
if (w->hscroll != new_hscroll)
- XBUFFER (w->contents)->prevent_redisplay_optimizations_p = true;
+ {
+ XBUFFER (w->contents)->prevent_redisplay_optimizations_p = true;
+ wset_redisplay (w);
+ }
w->hscroll = new_hscroll;
w->suspend_auto_hscroll = true;
@@ -1297,31 +1300,6 @@ window so that the location of point moves off-window. */)
return set_window_hscroll (decode_live_window (window), XFIXNUM (ncol));
}
-DEFUN ("window-redisplay-end-trigger", Fwindow_redisplay_end_trigger,
- Swindow_redisplay_end_trigger, 0, 1, 0,
- doc: /* Return WINDOW's redisplay end trigger value.
-WINDOW must be a live window and defaults to the selected one.
-See `set-window-redisplay-end-trigger' for more information. */)
- (Lisp_Object window)
-{
- return decode_live_window (window)->redisplay_end_trigger;
-}
-
-DEFUN ("set-window-redisplay-end-trigger", Fset_window_redisplay_end_trigger,
- Sset_window_redisplay_end_trigger, 2, 2, 0,
- doc: /* Set WINDOW's redisplay end trigger value to VALUE.
-WINDOW must be a live window and defaults to the selected one. VALUE
-should be a buffer position (typically a marker) or nil. If it is a
-buffer position, then if redisplay in WINDOW reaches a position beyond
-VALUE, the functions in `redisplay-end-trigger-functions' are called
-with two arguments: WINDOW, and the end trigger value. Afterwards the
-end-trigger value is reset to nil. */)
- (register Lisp_Object window, Lisp_Object value)
-{
- wset_redisplay_end_trigger (decode_live_window (window), value);
- return value;
-}
-
/* Test if the character at column X, row Y is within window W.
If it is not, return ON_NOTHING;
if it is on the window's vertical divider, return
@@ -6597,9 +6575,12 @@ and redisplay normally--don't erase and redraw the frame. */)
in case scroll_margin is buffer-local. */
this_scroll_margin = window_scroll_margin (w, MARGIN_IN_LINES);
- /* Don't use redisplay code for initial frames, as the necessary
- data structures might not be set up yet then. */
- if (!FRAME_INITIAL_P (XFRAME (w->frame)))
+ /* Don't use the display code for initial frames, as the necessary
+ data structures might not be set up yet then. Also don't use it
+ for buffers with very long lines, as it tremdously slows down
+ redisplay, especially when lines are truncated. */
+ if (!FRAME_INITIAL_P (XFRAME (w->frame))
+ && !current_buffer->long_line_optimizations_p)
{
specpdl_ref count = SPECPDL_INDEX ();
@@ -6684,7 +6665,7 @@ and redisplay normally--don't erase and redraw the frame. */)
considered to be part of the visible height of the line.
*/
h += extra_line_spacing;
- while (-it.current_y > h)
+ while (-it.current_y > h && it.what != IT_EOB)
move_it_by_lines (&it, 1);
charpos = IT_CHARPOS (it);
@@ -8637,8 +8618,6 @@ displayed after a scrolling operation to be somewhat inaccurate. */);
defsubr (&Swindow_body_width);
defsubr (&Swindow_hscroll);
defsubr (&Sset_window_hscroll);
- defsubr (&Swindow_redisplay_end_trigger);
- defsubr (&Sset_window_redisplay_end_trigger);
defsubr (&Swindow_mode_line_height);
defsubr (&Swindow_header_line_height);
defsubr (&Swindow_tab_line_height);
diff --git a/src/window.h b/src/window.h
index 298a80a5366..93817a95445 100644
--- a/src/window.h
+++ b/src/window.h
@@ -199,10 +199,6 @@ struct window
and Qt, so bitfield can't be used here. */
Lisp_Object dedicated;
- /* If redisplay in this window goes beyond this buffer position,
- must run the redisplay-end-trigger-hook. */
- Lisp_Object redisplay_end_trigger;
-
/* t means this window's child windows are not (re-)combined. */
Lisp_Object combination_limit;
@@ -498,12 +494,6 @@ wset_prev (struct window *w, Lisp_Object val)
}
INLINE void
-wset_redisplay_end_trigger (struct window *w, Lisp_Object val)
-{
- w->redisplay_end_trigger = val;
-}
-
-INLINE void
wset_mode_line_help_echo (struct window *w, Lisp_Object val)
{
w->mode_line_help_echo = val;
@@ -1193,6 +1183,7 @@ enum window_body_unit
WINDOW_BODY_IN_REMAPPED_CHARS
};
extern int window_body_width (struct window *w, enum window_body_unit);
+extern int window_body_height (struct window *w, enum window_body_unit);
enum margin_unit { MARGIN_IN_LINES, MARGIN_IN_PIXELS };
extern int window_scroll_margin (struct window *, enum margin_unit);
extern void temp_output_buffer_show (Lisp_Object);
diff --git a/src/xdisp.c b/src/xdisp.c
index f205327cc34..03c43be5bc0 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -1138,7 +1138,6 @@ static int display_string (const char *, Lisp_Object, Lisp_Object,
ptrdiff_t, ptrdiff_t, struct it *, int, int, int,
int);
static void compute_line_metrics (struct it *);
-static void run_redisplay_end_trigger_hook (struct it *);
static bool get_overlay_strings (struct it *, ptrdiff_t);
static bool get_overlay_strings_1 (struct it *, ptrdiff_t, bool);
static void next_overlay_string (struct it *);
@@ -3230,6 +3229,7 @@ init_iterator (struct it *it, struct window *w,
it->f = XFRAME (w->frame);
it->cmp_it.id = -1;
+ it->cmp_it.parent_it = it;
if (max_redisplay_ticks > 0)
update_redisplay_ticks (0, w);
@@ -3279,17 +3279,6 @@ init_iterator (struct it *it, struct window *w,
/* Are multibyte characters enabled in current_buffer? */
it->multibyte_p = !NILP (BVAR (current_buffer, enable_multibyte_characters));
- /* Get the position at which the redisplay_end_trigger hook should
- be run, if it is to be run at all. */
- if (MARKERP (w->redisplay_end_trigger)
- && XMARKER (w->redisplay_end_trigger)->buffer != 0)
- it->redisplay_end_trigger_charpos
- = marker_position (w->redisplay_end_trigger);
- else if (FIXNUMP (w->redisplay_end_trigger))
- it->redisplay_end_trigger_charpos
- = clip_to_bounds (PTRDIFF_MIN, XFIXNUM (w->redisplay_end_trigger),
- PTRDIFF_MAX);
-
it->tab_width = SANE_TAB_WIDTH (current_buffer);
/* Are lines in the display truncated? */
@@ -3484,6 +3473,10 @@ init_iterator (struct it *it, struct window *w,
&it->bidi_it);
}
+ /* This is set only when long_line_optimizations_p is non-zero
+ for the current buffer. */
+ it->narrowed_begv = 0;
+
/* Compute faces etc. */
reseat (it, it->current.pos, true);
}
@@ -3491,6 +3484,70 @@ init_iterator (struct it *it, struct window *w,
CHECK_IT (it);
}
+/* Compute a suitable alternate value for BEGV and ZV that may be used
+ temporarily to optimize display if the buffer in window W contains
+ long lines. */
+
+static int
+get_narrowed_width (struct window *w)
+{
+ int fact;
+ /* In a character-only terminal, only one font size is used, so we
+ can use a smaller factor. */
+ fact = EQ (Fterminal_live_p (Qnil), Qt) ? 2 : 3;
+ return fact * window_body_width (w, WINDOW_BODY_IN_CANONICAL_CHARS);
+}
+
+static int
+get_narrowed_len (struct window *w)
+{
+ return get_narrowed_width (w) *
+ window_body_height (w, WINDOW_BODY_IN_CANONICAL_CHARS);
+}
+
+ptrdiff_t
+get_narrowed_begv (struct window *w, ptrdiff_t pos)
+{
+ int len = get_narrowed_len (w);
+ return max ((pos / len - 1) * len, BEGV);
+}
+
+ptrdiff_t
+get_narrowed_zv (struct window *w, ptrdiff_t pos)
+{
+ int len = get_narrowed_len (w);
+ return min ((pos / len + 1) * len, ZV);
+}
+
+ptrdiff_t
+get_closer_narrowed_begv (struct window *w, ptrdiff_t pos)
+{
+ int len = get_narrowed_width (w);
+ return max ((pos / len - 1) * len, BEGV);
+}
+
+static void
+unwind_narrowed_begv (Lisp_Object point_min)
+{
+ SET_BUF_BEGV (current_buffer, XFIXNUM (point_min));
+}
+
+/* Set DST to EXPR. When IT indicates that BEGV should temporarily be
+ updated to optimize display, evaluate EXPR with BEGV set to BV. */
+
+#define SET_WITH_NARROWED_BEGV(IT,DST,EXPR,BV) \
+ do { \
+ if (IT->narrowed_begv) \
+ { \
+ specpdl_ref count = SPECPDL_INDEX (); \
+ record_unwind_protect (unwind_narrowed_begv, Fpoint_min ()); \
+ SET_BUF_BEGV (current_buffer, BV); \
+ DST = EXPR; \
+ unbind_to (count, Qnil); \
+ } \
+ else \
+ DST = EXPR; \
+ } while (0)
/* Initialize IT for the display of window W with window start POS. */
@@ -4335,6 +4392,20 @@ handle_fontified_prop (struct it *it)
eassert (it->end_charpos == ZV);
+ if (current_buffer->long_line_optimizations_p)
+ {
+ ptrdiff_t begv = it->narrowed_begv;
+ ptrdiff_t zv = it->narrowed_zv;
+ ptrdiff_t charpos = IT_CHARPOS (*it);
+ if (charpos < begv || charpos > zv)
+ {
+ begv = get_narrowed_begv (it->w, charpos);
+ zv = get_narrowed_zv (it->w, charpos);
+ }
+ narrow_to_region_internal (make_fixnum (begv), make_fixnum (zv), true);
+ specbind (Qrestrictions_locked, Qt);
+ }
+
/* Don't allow Lisp that runs from 'fontification-functions'
clear our face and image caches behind our back. */
it->f->inhibit_clear_image_cache = true;
@@ -6992,7 +7063,109 @@ back_to_previous_line_start (struct it *it)
ptrdiff_t cp = IT_CHARPOS (*it), bp = IT_BYTEPOS (*it);
dec_both (&cp, &bp);
- IT_CHARPOS (*it) = find_newline_no_quit (cp, bp, -1, &IT_BYTEPOS (*it));
+ SET_WITH_NARROWED_BEGV (it, IT_CHARPOS (*it),
+ find_newline_no_quit (cp, bp, -1, &IT_BYTEPOS (*it)),
+ get_closer_narrowed_begv (it->w, IT_CHARPOS (*it)));
+}
+
+/* Find in the current buffer the first display or overlay string
+ between STARTPOS and ENDPOS that includes embedded newlines.
+ Consider only overlays that apply to window W.
+ Value is non-zero if such a display/overlay string is found. */
+static bool
+strings_with_newlines (ptrdiff_t startpos, ptrdiff_t endpos, struct window *w)
+{
+ /* Process overlays before the overlay center. */
+ for (struct Lisp_Overlay *ov = current_buffer->overlays_before;
+ ov; ov = ov->next)
+ {
+ Lisp_Object overlay = make_lisp_ptr (ov, Lisp_Vectorlike);
+ eassert (OVERLAYP (overlay));
+
+ /* Skip this overlay if it doesn't apply to our window. */
+ Lisp_Object window = Foverlay_get (overlay, Qwindow);
+ if (WINDOWP (window) && XWINDOW (window) != w)
+ continue;
+
+ ptrdiff_t ostart = OVERLAY_POSITION (OVERLAY_START (overlay));
+ ptrdiff_t oend = OVERLAY_POSITION (OVERLAY_END (overlay));
+
+ /* Due to the order of overlays in overlays_before, once we get
+ to an overlay whose end position is before STARTPOS, all the
+ rest also end before STARTPOS, and thus are of no concern to us. */
+ if (oend < startpos)
+ break;
+
+ /* Skip overlays that don't overlap the range. */
+ if (!((startpos < oend && ostart < endpos)
+ || (ostart == oend
+ && (startpos == oend || (endpos == ZV && oend == endpos)))))
+ continue;
+
+ Lisp_Object str;
+ str = Foverlay_get (overlay, Qbefore_string);
+ if (STRINGP (str) && SCHARS (str)
+ && memchr (SDATA (str), '\n', SBYTES (str)))
+ return true;
+ str = Foverlay_get (overlay, Qafter_string);
+ if (STRINGP (str) && SCHARS (str)
+ && memchr (SDATA (str), '\n', SBYTES (str)))
+ return true;
+ }
+
+ /* Process overlays after the overlay center. */
+ for (struct Lisp_Overlay *ov = current_buffer->overlays_after;
+ ov; ov = ov->next)
+ {
+ Lisp_Object overlay = make_lisp_ptr (ov, Lisp_Vectorlike);
+ eassert (OVERLAYP (overlay));
+
+ /* Skip this overlay if it doesn't apply to our window. */
+ Lisp_Object window = Foverlay_get (overlay, Qwindow);
+ if (WINDOWP (window) && XWINDOW (window) != w)
+ continue;
+
+ ptrdiff_t ostart = OVERLAY_POSITION (OVERLAY_START (overlay));
+ ptrdiff_t oend = OVERLAY_POSITION (OVERLAY_END (overlay));
+
+ /* Due to the order of overlays in overlays_after, once we get
+ to an overlay whose start position is after ENDPOS, all the
+ rest also start after ENDPOS, and thus are of no concern to us. */
+ if (ostart > endpos)
+ break;
+
+ /* Skip overlays that don't overlap the range. */
+ if (!((startpos < oend && ostart < endpos)
+ || (ostart == oend
+ && (startpos == oend || (endpos == ZV && oend == endpos)))))
+ continue;
+
+ Lisp_Object str;
+ str = Foverlay_get (overlay, Qbefore_string);
+ if (STRINGP (str) && SCHARS (str)
+ && memchr (SDATA (str), '\n', SBYTES (str)))
+ return true;
+ str = Foverlay_get (overlay, Qafter_string);
+ if (STRINGP (str) && SCHARS (str)
+ && memchr (SDATA (str), '\n', SBYTES (str)))
+ return true;
+ }
+
+ /* Check for 'display' properties whose values include strings. */
+ Lisp_Object cpos = make_fixnum (startpos);
+ Lisp_Object limpos = make_fixnum (endpos);
+
+ while ((cpos = Fnext_single_property_change (cpos, Qdisplay, Qnil, limpos),
+ !(NILP (cpos) || XFIXNAT (cpos) >= endpos)))
+ {
+ Lisp_Object spec = Fget_char_property (cpos, Qdisplay, Qnil);
+ Lisp_Object string = string_from_display_spec (spec);
+ if (STRINGP (string)
+ && memchr (SDATA (string), '\n', SBYTES (string)))
+ return true;
+ }
+
+ return false;
}
@@ -7047,7 +7220,8 @@ forward_to_next_line_start (struct it *it, bool *skipped_p,
it->selective = 0;
/* Scan for a newline within MAX_NEWLINE_DISTANCE display elements
- from buffer text. */
+ from buffer text, or till the end of the string if iterating a
+ string. */
for (n = 0;
!newline_found_p && n < MAX_NEWLINE_DISTANCE;
n += !STRINGP (it->string))
@@ -7067,27 +7241,55 @@ forward_to_next_line_start (struct it *it, bool *skipped_p,
ptrdiff_t bytepos, start = IT_CHARPOS (*it);
ptrdiff_t limit = find_newline_no_quit (start, IT_BYTEPOS (*it),
1, &bytepos);
- Lisp_Object pos;
-
eassert (!STRINGP (it->string));
- /* If there isn't any `display' property in sight, and no
- overlays, we can just use the position of the newline in
- buffer text. */
- if (it->stop_charpos >= limit
- || ((pos = Fnext_single_property_change (make_fixnum (start),
- Qdisplay, Qnil,
- make_fixnum (limit)),
- NILP (pos))
- && next_overlay_change (start) == ZV))
+ /* it->stop_charpos >= limit means we already know there's no
+ stop position up until the newline at LIMIT, so there's no
+ need for any further checks. */
+ bool no_strings_with_newlines = it->stop_charpos >= limit;
+
+ if (!no_strings_with_newlines)
{
- if (!it->bidi_p)
+ if (!(current_buffer->long_line_optimizations_p
+ && it->line_wrap == TRUNCATE))
+ {
+ /* Quick-and-dirty check: if there isn't any `display'
+ property in sight, and no overlays, we're done. */
+ Lisp_Object pos =
+ Fnext_single_property_change (make_fixnum (start),
+ Qdisplay, Qnil,
+ make_fixnum (limit));
+ no_strings_with_newlines =
+ (NILP (pos) || XFIXNAT (pos) == limit) /* no 'display' props */
+ && next_overlay_change (start) == ZV; /* no overlays */
+ }
+ else
{
+ /* For buffers with very long and truncated lines we try
+ harder, because it's worth our while to spend some
+ time looking into the overlays and 'display' properties
+ if we can then avoid iterating through all of them. */
+ no_strings_with_newlines =
+ !strings_with_newlines (start, limit, it->w);
+ }
+ }
+
+ /* If there's no display or overlay strings with embedded
+ newlines until the position of the newline in buffer text, we
+ can just use that position. */
+ if (no_strings_with_newlines)
+ {
+ if (!it->bidi_p || !bidi_it_prev)
+ {
+ /* The optimal case: just jump there. */
IT_CHARPOS (*it) = limit;
IT_BYTEPOS (*it) = bytepos;
}
else
{
+ /* The less optimal case: need to bidi-walk there, but
+ this is still cheaper that the full iteration using
+ get_next_display_element and set_iterator_to_next. */
struct bidi_it bprev;
/* Help bidi.c avoid expensive searches for display
@@ -7111,6 +7313,7 @@ forward_to_next_line_start (struct it *it, bool *skipped_p,
}
else
{
+ /* The slow case. */
while (!newline_found_p)
{
if (!get_next_display_element (it))
@@ -7210,7 +7413,8 @@ back_to_previous_visible_line_start (struct it *it)
it->continuation_lines_width = 0;
eassert (IT_CHARPOS (*it) >= BEGV);
- eassert (IT_CHARPOS (*it) == BEGV
+ eassert (it->narrowed_begv > 0 /* long-line optimizations: all bets off */
+ || IT_CHARPOS (*it) == BEGV
|| FETCH_BYTE (IT_BYTEPOS (*it) - 1) == '\n');
CHECK_IT (it);
}
@@ -7243,7 +7447,8 @@ reseat_at_next_visible_line_start (struct it *it, bool on_newline_p)
bool skipped_p = false;
struct bidi_it bidi_it_prev;
bool newline_found_p
- = forward_to_next_line_start (it, &skipped_p, &bidi_it_prev);
+ = forward_to_next_line_start (it, &skipped_p,
+ on_newline_p ? &bidi_it_prev : NULL);
/* Skip over lines that are invisible because they are indented
more than the value of IT->selective. */
@@ -7255,7 +7460,8 @@ reseat_at_next_visible_line_start (struct it *it, bool on_newline_p)
eassert (IT_BYTEPOS (*it) == BEGV
|| FETCH_BYTE (IT_BYTEPOS (*it) - 1) == '\n');
newline_found_p =
- forward_to_next_line_start (it, &skipped_p, &bidi_it_prev);
+ forward_to_next_line_start (it, &skipped_p,
+ on_newline_p ? &bidi_it_prev : NULL);
}
/* Position on the newline if that's what's requested. */
@@ -7323,6 +7529,21 @@ reseat (struct it *it, struct text_pos pos, bool force_p)
reseat_1 (it, pos, false);
+ if (current_buffer->long_line_optimizations_p)
+ {
+ if (!it->narrowed_begv)
+ {
+ it->narrowed_begv = get_narrowed_begv (it->w, window_point (it->w));
+ it->narrowed_zv = get_narrowed_zv (it->w, window_point (it->w));
+ }
+ else if ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
+ && (!redisplaying_p || it->line_wrap == TRUNCATE))
+ {
+ it->narrowed_begv = get_narrowed_begv (it->w, pos.charpos);
+ it->narrowed_zv = get_narrowed_zv (it->w, pos.charpos);
+ }
+ }
+
/* Determine where to check text properties. Avoid doing it
where possible because text property lookup is very expensive. */
if (force_p
@@ -8623,7 +8844,13 @@ get_visually_first_element (struct it *it)
{
bool string_p = STRINGP (it->string) || it->s;
ptrdiff_t eob = (string_p ? it->bidi_it.string.schars : ZV);
- ptrdiff_t bob = (string_p ? 0 : BEGV);
+ ptrdiff_t bob;
+ ptrdiff_t obegv = BEGV;
+
+ SET_WITH_NARROWED_BEGV (it, bob,
+ string_p ? 0 :
+ IT_CHARPOS (*it) < BEGV ? obegv : BEGV,
+ it->narrowed_begv);
if (STRINGP (it->string))
{
@@ -8663,9 +8890,11 @@ get_visually_first_element (struct it *it)
if (string_p)
it->bidi_it.charpos = it->bidi_it.bytepos = 0;
else
- it->bidi_it.charpos = find_newline_no_quit (IT_CHARPOS (*it),
- IT_BYTEPOS (*it), -1,
- &it->bidi_it.bytepos);
+ SET_WITH_NARROWED_BEGV (it, it->bidi_it.charpos,
+ find_newline_no_quit (IT_CHARPOS (*it),
+ IT_BYTEPOS (*it), -1,
+ &it->bidi_it.bytepos),
+ it->narrowed_begv);
bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it, true);
do
{
@@ -9201,13 +9430,6 @@ next_element_from_buffer (struct it *it)
previously seen overlays is no longer valid. */
it->ignore_overlay_strings_at_pos_p = false;
- /* Maybe run the redisplay end trigger hook. Performance note:
- This doesn't seem to cost measurable time. */
- if (it->redisplay_end_trigger_charpos
- && it->glyph_row
- && IT_CHARPOS (*it) >= it->redisplay_end_trigger_charpos)
- run_redisplay_end_trigger_hook (it);
-
if (composition_break_at_point
&& !NILP (BVAR (current_buffer, enable_multibyte_characters))
&& !NILP (Vauto_composition_mode))
@@ -9275,29 +9497,6 @@ next_element_from_buffer (struct it *it)
}
-/* Run the redisplay end trigger hook for IT. */
-
-static void
-run_redisplay_end_trigger_hook (struct it *it)
-{
- /* IT->glyph_row should be non-null, i.e. we should be actually
- displaying something, or otherwise we should not run the hook. */
- eassert (it->glyph_row);
-
- ptrdiff_t charpos = it->redisplay_end_trigger_charpos;
- it->redisplay_end_trigger_charpos = 0;
-
- /* Since we are *trying* to run these functions, don't try to run
- them again, even if they get an error. */
- wset_redisplay_end_trigger (it->w, Qnil);
- CALLN (Frun_hook_with_args, Qredisplay_end_trigger_functions, it->window,
- make_fixnum (charpos));
-
- /* Notice if it changed the face of the character we are on. */
- handle_face_prop (it);
-}
-
-
/* Deliver a composition display element. Unlike the other
next_element_from_XXX, this function is not registered in the array
get_next_element[]. It is called from next_element_from_buffer and
@@ -10512,6 +10711,11 @@ move_it_vertically_backward (struct it *it, int dy)
while (nlines-- && IT_CHARPOS (*it) > pos_limit)
back_to_previous_visible_line_start (it);
+ /* Move one line more back, for the (rare) situation where we have
+ bidi-reordered continued lines, and we start from the top-most
+ screen line, which is the last in logical order. */
+ if (it->bidi_p && dy == 0)
+ back_to_previous_visible_line_start (it);
/* Reseat the iterator here. When moving backward, we don't want
reseat to skip forward over invisible text, set up the iterator
to deliver from overlay strings at the new position etc. So,
@@ -10583,7 +10787,9 @@ move_it_vertically_backward (struct it *it, int dy)
ptrdiff_t cp = IT_CHARPOS (*it), bp = IT_BYTEPOS (*it);
dec_both (&cp, &bp);
- cp = find_newline_no_quit (cp, bp, -1, NULL);
+ SET_WITH_NARROWED_BEGV (it, cp,
+ find_newline_no_quit (cp, bp, -1, NULL),
+ get_closer_narrowed_begv (it->w, IT_CHARPOS (*it)));
move_it_to (it, cp, -1, -1, -1, MOVE_TO_POS);
}
bidi_unshelve_cache (it3data, true);
@@ -10761,6 +10967,7 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos)
position. This may actually move vertically backwards,
in case of overlays, so adjust dvpos accordingly. */
dvpos += it->vpos;
+ start_charpos = IT_CHARPOS (*it);
move_it_vertically_backward (it, 0);
dvpos -= it->vpos;
@@ -10814,7 +11021,7 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos)
SAVE_IT (it2, *it, it2data);
move_it_to (it, -1, -1, -1, it->vpos + delta, MOVE_TO_VPOS);
/* Move back again if we got too far ahead. */
- if (IT_CHARPOS (*it) >= start_charpos)
+ if (it->vpos - it2.vpos > delta)
RESTORE_IT (it, &it2, it2data);
else
bidi_unshelve_cache (it2data, true);
@@ -10847,6 +11054,15 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos)
int
partial_line_height (struct it *it_origin)
{
+ /* In a buffer with very long and truncated lines, we ignore the
+ possibly-partial height of the last line in the window: it is too
+ expensive to compute that (since in most cases that involves
+ going all the way to ZV), and the effect of ignoring it is
+ relatively minor. */
+ if (XBUFFER (it_origin->w->contents)->long_line_optimizations_p
+ && it_origin->line_wrap == TRUNCATE)
+ return 0;
+
int partial_height;
void *it_data = NULL;
struct it it;
@@ -10870,6 +11086,51 @@ partial_line_height (struct it *it_origin)
return partial_height;
}
+/* Approximate move_it_in_display_line_to for very long and truncated
+ display lines, when moving horizontally. This is used when the
+ buffer's long_line_optimizations_p flag is set. It ignores various
+ complications, like different font sizes, invisible text, display
+ and overlay strings, and, to some degree, bidirectional text. So
+ caveat emptor!
+
+ Starting from IT's position, reseat IT after skipping NCHARS
+ characters or to the next newline/ZV, whichever comes first. Return
+ what move_it_in_display_line_to would have returned in this case. */
+
+static enum move_it_result
+fast_move_it_horizontally (struct it *it, ptrdiff_t nchars)
+{
+ ptrdiff_t nl_bytepos;
+ ptrdiff_t nl_pos = find_newline_no_quit (IT_CHARPOS (*it), IT_BYTEPOS (*it),
+ 1, &nl_bytepos);
+ struct text_pos new_pos;
+ enum move_it_result move_result;
+
+ if (nl_pos - IT_CHARPOS (*it) > nchars)
+ {
+ SET_TEXT_POS (new_pos,
+ IT_CHARPOS (*it) + nchars,
+ CHAR_TO_BYTE (IT_CHARPOS (*it) + nchars));
+ move_result = MOVE_X_REACHED;
+ }
+ else
+ {
+ if (nl_bytepos < ZV_BYTE
+ || (nl_bytepos > BEGV_BYTE
+ && FETCH_BYTE (nl_bytepos - 1) == '\n'))
+ {
+ nl_pos--;
+ nl_bytepos--;
+ move_result = MOVE_NEWLINE_OR_CR;
+ }
+ else
+ move_result = MOVE_POS_MATCH_OR_ZV;
+ SET_TEXT_POS (new_pos, nl_pos, nl_bytepos);
+ }
+ reseat (it, new_pos, false);
+ return move_result;
+}
+
/* Return true if IT points into the middle of a display vector. */
bool
@@ -14054,15 +14315,41 @@ redisplay_tab_bar (struct frame *f)
return false;
}
+ /* Build a string that represents the contents of the tab-bar. */
+ build_desired_tab_bar_string (f);
+
+ int new_nrows;
+ int new_height = tab_bar_height (f, &new_nrows, true);
+
+ if (f->n_tab_bar_rows == 0)
+ {
+ f->n_tab_bar_rows = new_nrows;
+ if (new_height != WINDOW_PIXEL_HEIGHT (w))
+ frame_default_tab_bar_height = new_height;
+ }
+
+ /* If new_height or new_nrows indicate that we need to enlarge the
+ tab-bar window, we can return right away. */
+ if (new_nrows > f->n_tab_bar_rows
+ || (EQ (Vauto_resize_tab_bars, Qgrow_only)
+ && !f->minimize_tab_bar_window_p
+ && new_height > WINDOW_PIXEL_HEIGHT (w)))
+ {
+ if (FRAME_TERMINAL (f)->change_tab_bar_height_hook)
+ FRAME_TERMINAL (f)->change_tab_bar_height_hook (f, new_height);
+ if (new_nrows != f->n_tab_bar_rows)
+ f->n_tab_bar_rows = new_nrows;
+ clear_glyph_matrix (w->desired_matrix);
+ f->fonts_changed = true;
+ return true;
+ }
+
/* Set up an iterator for the tab-bar window. */
init_iterator (&it, w, -1, -1, w->desired_matrix->rows, TAB_BAR_FACE_ID);
it.first_visible_x = 0;
it.last_visible_x = WINDOW_PIXEL_WIDTH (w);
row = it.glyph_row;
row->reversed_p = false;
-
- /* Build a string that represents the contents of the tab-bar. */
- build_desired_tab_bar_string (f);
reseat_to_string (&it, NULL, f->desired_tab_bar_string, 0, 0, 0,
STRING_MULTIBYTE (f->desired_tab_bar_string));
/* FIXME: This should be controlled by a user option. But it
@@ -14074,22 +14361,6 @@ redisplay_tab_bar (struct frame *f)
do. */
it.paragraph_embedding = L2R;
- if (f->n_tab_bar_rows == 0)
- {
- int new_height = tab_bar_height (f, &f->n_tab_bar_rows, true);
-
- if (new_height != WINDOW_PIXEL_HEIGHT (w))
- {
- if (FRAME_TERMINAL (f)->change_tab_bar_height_hook)
- FRAME_TERMINAL (f)->change_tab_bar_height_hook (f, new_height);
- frame_default_tab_bar_height = new_height;
- /* Always do that now. */
- clear_glyph_matrix (w->desired_matrix);
- f->fonts_changed = true;
- return true;
- }
- }
-
/* Display as many lines as needed to display all tab-bar items. */
if (f->n_tab_bar_rows > 0)
@@ -14135,7 +14406,7 @@ redisplay_tab_bar (struct frame *f)
if (!NILP (Vauto_resize_tab_bars))
{
- bool change_height_p = true;
+ bool change_height_p = false;
/* If we couldn't display everything, change the tab-bar's
height if there is room for more. */
@@ -15063,7 +15334,7 @@ redisplay_tool_bar (struct frame *f)
if (!NILP (Vauto_resize_tool_bars))
{
- bool change_height_p = true;
+ bool change_height_p = false;
/* If we couldn't display everything, change the tool-bar's
height if there is room for more. */
@@ -15572,7 +15843,20 @@ hscroll_window_tree (Lisp_Object window)
it.first_visible_x = window_hscroll_limited (w, it.f)
* FRAME_COLUMN_WIDTH (it.f);
it.last_visible_x = DISP_INFINITY;
- move_it_in_display_line_to (&it, pt, -1, MOVE_TO_POS);
+
+ ptrdiff_t nchars = pt - IT_CHARPOS (it);
+ if (current_buffer->long_line_optimizations_p
+ && nchars > large_hscroll_threshold)
+ {
+ /* Special optimization for very long and truncated
+ lines which need to be hscrolled far to the left:
+ jump directly to the (approximate) first position
+ that is visible, instead of slowly walking there. */
+ fast_move_it_horizontally (&it, nchars);
+ it.current_x += nchars * FRAME_COLUMN_WIDTH (it.f);
+ }
+ else
+ move_it_in_display_line_to (&it, pt, -1, MOVE_TO_POS);
/* If the line ends in an overlay string with a newline,
we might infloop, because displaying the window will
want to put the cursor after the overlay, i.e. at X
@@ -15585,7 +15869,14 @@ hscroll_window_tree (Lisp_Object window)
if (hscl)
it.first_visible_x = (window_hscroll_limited (w, it.f)
* FRAME_COLUMN_WIDTH (it.f));
- move_it_in_display_line_to (&it, pt - 1, -1, MOVE_TO_POS);
+ if (current_buffer->long_line_optimizations_p
+ && nchars > large_hscroll_threshold)
+ {
+ fast_move_it_horizontally (&it, nchars - 1);
+ it.current_x += (nchars - 1) * FRAME_COLUMN_WIDTH (it.f);
+ }
+ else
+ move_it_in_display_line_to (&it, pt - 1, -1, MOVE_TO_POS);
}
current_buffer = saved_current_buffer;
@@ -16523,9 +16814,23 @@ redisplay_internal (void)
it.current_y = this_line_y;
it.vpos = this_line_vpos;
- /* The call to move_it_to stops in front of PT, but
- moves over before-strings. */
- move_it_to (&it, PT, -1, -1, -1, MOVE_TO_POS);
+ if (current_buffer->long_line_optimizations_p
+ && it.line_wrap == TRUNCATE
+ && PT - CHARPOS (tlbufpos) > large_hscroll_threshold)
+ {
+ /* When lines are very long and truncated, jumping to
+ the next visible line is much faster than slowly
+ iterating there. */
+ reseat_at_next_visible_line_start (&it, false);
+ if (IT_CHARPOS (it) <= PT) /* point moved off this line */
+ it.vpos = this_line_vpos + 1;
+ }
+ else
+ {
+ /* The call to move_it_to stops in front of PT, but
+ moves over before-strings. */
+ move_it_to (&it, PT, -1, -1, -1, MOVE_TO_POS);
+ }
if (it.vpos == this_line_vpos
&& (row = MATRIX_ROW (w->current_matrix, this_line_vpos),
@@ -17915,8 +18220,8 @@ run_window_scroll_functions (Lisp_Object window, struct text_pos startp)
{
specpdl_ref count = SPECPDL_INDEX ();
specbind (Qinhibit_quit, Qt);
- run_hook_with_args_2 (Qwindow_scroll_functions, window,
- make_fixnum (CHARPOS (startp)));
+ safe_run_hooks_2
+ (Qwindow_scroll_functions, window, make_fixnum (CHARPOS (startp)));
unbind_to (count, Qnil);
SET_TEXT_POS_FROM_MARKER (startp, w->start);
/* In case the hook functions switch buffers. */
@@ -18625,6 +18930,8 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp,
{
/* Cursor has to be moved backward. Note that PT >=
CHARPOS (startp) because of the outer if-statement. */
+ struct glyph_row *row0 = row;
+
while (!row->mode_line_p
&& (MATRIX_ROW_START_CHARPOS (row) > PT
|| (MATRIX_ROW_START_CHARPOS (row) == PT
@@ -18639,6 +18946,23 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp,
--row;
}
+ /* With bidi-reordered rows we can have buffer positions
+ _decrease_ when going down by rows. If we haven't
+ found our row in the loop above, give it another try
+ now going in the other direction from the original row. */
+ if (!(MATRIX_ROW_START_CHARPOS (row) <= PT
+ && PT <= MATRIX_ROW_END_CHARPOS (row))
+ && row0->continued_p)
+ {
+ row = row0;
+ while (MATRIX_ROW_START_CHARPOS (row) > PT
+ && MATRIX_ROW_BOTTOM_Y (row) < last_y)
+ {
+ eassert (row->enabled_p);
+ ++row;
+ }
+ }
+
/* Consider the following case: Window starts at BEGV,
there is invisible, intangible text at BEGV, so that
display starts at some point START > BEGV. It can
@@ -18662,9 +18986,16 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp,
&& !cursor_row_p (row))
++row;
- /* If within the scroll margin, scroll. */
- if (row->y < top_scroll_margin
- && CHARPOS (startp) != BEGV)
+ /* If within the scroll margin, either the top one or
+ the bottom one, scroll. */
+ if ((row->y < top_scroll_margin
+ && CHARPOS (startp) != BEGV)
+ || MATRIX_ROW_BOTTOM_Y (row) > last_y
+ || PT > MATRIX_ROW_END_CHARPOS (row)
+ || (MATRIX_ROW_BOTTOM_Y (row) == last_y
+ && PT == MATRIX_ROW_END_CHARPOS (row)
+ && !row->ends_at_zv_p
+ && !MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row)))
scroll_p = true;
}
else
@@ -18869,12 +19200,31 @@ set_vertical_scroll_bar (struct window *w)
&& NILP (echo_area_buffer[0])))
{
struct buffer *buf = XBUFFER (w->contents);
+
whole = BUF_ZV (buf) - BUF_BEGV (buf);
start = marker_position (w->start) - BUF_BEGV (buf);
- /* I don't think this is guaranteed to be right. For the
- moment, we'll pretend it is. */
end = BUF_Z (buf) - w->window_end_pos - BUF_BEGV (buf);
+ /* If w->window_end_pos cannot be trusted, recompute it "the
+ hard way". But don't bother to be too accurate when
+ long-line shortcuts are in effect. */
+ if (!w->window_end_valid && !buf->long_line_optimizations_p)
+ {
+ struct it it;
+ struct text_pos start_pos;
+ struct buffer *obuf = current_buffer;
+ /* When we display the scroll bar of a mini-window,
+ current_buffer is not guaranteed to be the mini-window's
+ buffer, see the beginning of redisplay_window. */
+ set_buffer_internal_1 (XBUFFER (w->contents));
+ SET_TEXT_POS_FROM_MARKER (start_pos, w->start);
+ start_display (&it, w, start_pos);
+ move_it_to (&it, -1, it.last_visible_x, window_box_height (w), -1,
+ MOVE_TO_X | MOVE_TO_Y);
+ end -= (BUF_Z (buf) - IT_CHARPOS (it)) - w->window_end_pos;
+ set_buffer_internal_1 (obuf);
+ }
+
if (end < start)
end = start;
if (whole < (end - start))
@@ -18980,6 +19330,16 @@ window_start_acceptable_p (Lisp_Object window, ptrdiff_t startp)
return true;
}
+DEFUN ("long-line-optimizations-p", Flong_line_optimizations_p, Slong_line_optimizations_p,
+ 0, 0, 0,
+ doc: /* Return non-nil if long-line optimizations are in effect in current buffer.
+See `long-line-threshold' and `large-hscroll-threshold' for what these
+optimizations mean and when they are in effect. */)
+ (void)
+{
+ return current_buffer->long_line_optimizations_p ? Qt : Qnil;
+}
+
/* Redisplay leaf window WINDOW. JUST_THIS_ONE_P means only
selected_window is redisplayed.
@@ -19222,6 +19582,24 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
}
}
+ /* Check whether the buffer to be displayed contains long lines. */
+ if (!NILP (Vlong_line_threshold)
+ && !current_buffer->long_line_optimizations_p
+ && MODIFF - UNCHANGED_MODIFIED > 8)
+ {
+ ptrdiff_t cur, next, found, max = 0, threshold;
+ threshold = XFIXNUM (Vlong_line_threshold);
+ for (cur = BEGV; cur < ZV; cur = next)
+ {
+ next = find_newline1 (cur, CHAR_TO_BYTE (cur), 0, -1, 1,
+ &found, NULL, true);
+ if (next - cur > max) max = next - cur;
+ if (!found || max > threshold) break;
+ }
+ if (max > threshold)
+ current_buffer->long_line_optimizations_p = true;
+ }
+
/* If window-start is screwed up, choose a new one. */
if (XMARKER (w->start)->buffer != current_buffer)
goto recenter;
@@ -19237,33 +19615,36 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
ptrdiff_t it_charpos;
w->optional_new_start = false;
- start_display (&it, w, startp);
- move_it_to (&it, PT, 0, it.last_visible_y, -1,
- MOVE_TO_POS | MOVE_TO_X | MOVE_TO_Y);
- /* Record IT's position now, since line_bottom_y might change
- that. */
- it_charpos = IT_CHARPOS (it);
- /* Make sure we set the force_start flag only if the cursor row
- will be fully visible. Otherwise, the code under force_start
- label below will try to move point back into view, which is
- not what the code which sets optional_new_start wants. */
- if ((it.current_y == 0 || line_bottom_y (&it) < it.last_visible_y)
- && !w->force_start)
- {
- if (it_charpos == PT)
- w->force_start = true;
- /* IT may overshoot PT if text at PT is invisible. */
- else if (it_charpos > PT && CHARPOS (startp) <= PT)
- w->force_start = true;
+ if (!w->force_start)
+ {
+ start_display (&it, w, startp);
+ move_it_to (&it, PT, 0, it.last_visible_y, -1,
+ MOVE_TO_POS | MOVE_TO_X | MOVE_TO_Y);
+ /* Record IT's position now, since line_bottom_y might
+ change that. */
+ it_charpos = IT_CHARPOS (it);
+ /* Make sure we set the force_start flag only if the cursor
+ row will be fully visible. Otherwise, the code under
+ force_start label below will try to move point back into
+ view, which is not what the code which sets
+ optional_new_start wants. */
+ if (it.current_y == 0 || line_bottom_y (&it) < it.last_visible_y)
+ {
+ if (it_charpos == PT)
+ w->force_start = true;
+ /* IT may overshoot PT if text at PT is invisible. */
+ else if (it_charpos > PT && CHARPOS (startp) <= PT)
+ w->force_start = true;
#ifdef GLYPH_DEBUG
- if (w->force_start)
- {
- if (window_frozen_p (w))
- debug_method_add (w, "set force_start from frozen window start");
- else
- debug_method_add (w, "set force_start from optional_new_start");
- }
+ if (w->force_start)
+ {
+ if (window_frozen_p (w))
+ debug_method_add (w, "set force_start from frozen window start");
+ else
+ debug_method_add (w, "set force_start from optional_new_start");
+ }
#endif
+ }
}
}
@@ -20171,11 +20552,19 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
buffer position POS.
Value is 1 if successful. It is zero if fonts were loaded during
- redisplay which makes re-adjusting glyph matrices necessary, and -1
- if point would appear in the scroll margins.
- (We check the former only if TRY_WINDOW_IGNORE_FONTS_CHANGE is
- unset in FLAGS, and the latter only if TRY_WINDOW_CHECK_MARGINS is
- set in FLAGS.) */
+ redisplay or the dimensions of the desired matrix were found
+ insufficient, which makes re-adjusting glyph matrices necessary.
+ Value is -1 if point would appear in the scroll margins. (We check
+ the former only if TRY_WINDOW_IGNORE_FONTS_CHANGE is unset in
+ FLAGS, and the latter only if TRY_WINDOW_CHECK_MARGINS is set in
+ FLAGS.)
+
+ Note that 'x-show-tip' invokes this function in a special way, and
+ in that case the return value of zero doesn't necessarily mean the
+ glyph matrices need to be re-adjusted, if the entire text of the
+ tooltip was processed and has its glyphs in the matrix's glyph
+ rows, i.e. if the dimensions of the matrix were found insufficient
+ while producing empty glyph rows beyond ZV. */
int
try_window (Lisp_Object window, struct text_pos pos, int flags)
@@ -20200,9 +20589,16 @@ try_window (Lisp_Object window, struct text_pos pos, int flags)
/* Display all lines of W. */
while (it.current_y < it.last_visible_y)
{
+ int last_row_scale = it.w->nrows_scale_factor;
+ int last_col_scale = it.w->ncols_scale_factor;
if (display_line (&it, cursor_vpos))
last_text_row = it.glyph_row - 1;
- if (f->fonts_changed && !(flags & TRY_WINDOW_IGNORE_FONTS_CHANGE))
+ if (f->fonts_changed
+ && !((flags & TRY_WINDOW_IGNORE_FONTS_CHANGE)
+ /* If the matrix dimensions are insufficient, we _must_
+ fail and let dispnew.c reallocate the matrix. */
+ && last_row_scale == it.w->nrows_scale_factor
+ && last_col_scale == it.w->ncols_scale_factor))
return 0;
}
@@ -24213,8 +24609,26 @@ display_line (struct it *it, int cursor_vpos)
it->first_visible_x += x_incr;
it->last_visible_x += x_incr;
}
- move_result = move_it_in_display_line_to (it, ZV, it->first_visible_x,
- MOVE_TO_POS | MOVE_TO_X);
+ if (current_buffer->long_line_optimizations_p
+ && it->line_wrap == TRUNCATE
+ && window_hscroll_limited (it->w, it->f) > large_hscroll_threshold)
+ {
+ /* Special optimization for very long and truncated lines
+ which are hscrolled far to the left: jump directly to the
+ (approximate) position that is visible, instead of slowly
+ walking there. */
+ ptrdiff_t chars_to_skip =
+ it->first_visible_x / FRAME_COLUMN_WIDTH (it->f);
+ move_result = fast_move_it_horizontally (it, chars_to_skip);
+
+ if (move_result == MOVE_X_REACHED)
+ it->current_x = it->first_visible_x;
+ else /* use arbitrary value < first_visible_x */
+ it->current_x = it->first_visible_x - FRAME_COLUMN_WIDTH (it->f);
+ }
+ else
+ move_result = move_it_in_display_line_to (it, ZV, it->first_visible_x,
+ MOVE_TO_POS | MOVE_TO_X);
/* If we are under a large hscroll, move_it_in_display_line_to
could hit the end of the line without reaching
first_visible_x. Pretend that we did reach it. This is
@@ -35818,12 +36232,12 @@ be let-bound around code that needs to disable messages temporarily. */);
defsubr (&Sbidi_find_overridden_directionality);
defsubr (&Sdisplay__line_is_continued_p);
defsubr (&Sget_display_property);
+ defsubr (&Slong_line_optimizations_p);
DEFSYM (Qmenu_bar_update_hook, "menu-bar-update-hook");
DEFSYM (Qoverriding_terminal_local_map, "overriding-terminal-local-map");
DEFSYM (Qoverriding_local_map, "overriding-local-map");
DEFSYM (Qwindow_scroll_functions, "window-scroll-functions");
- DEFSYM (Qredisplay_end_trigger_functions, "redisplay-end-trigger-functions");
DEFSYM (Qinhibit_point_motion_hooks, "inhibit-point-motion-hooks");
DEFSYM (Qeval, "eval");
DEFSYM (QCdata, ":data");
@@ -36227,12 +36641,6 @@ is scrolled. It is not designed for that, and such use probably won't
work. */);
Vwindow_scroll_functions = Qnil;
- DEFVAR_LISP ("redisplay-end-trigger-functions", Vredisplay_end_trigger_functions,
- doc: /* Functions called when redisplay of a window reaches the end trigger.
-Each function is called with two arguments, the window and the end trigger value.
-See `set-window-redisplay-end-trigger'. */);
- Vredisplay_end_trigger_functions = Qnil;
-
DEFVAR_LISP ("mouse-autoselect-window", Vmouse_autoselect_window,
doc: /* Non-nil means autoselect window with mouse pointer.
If nil, do not autoselect windows.
@@ -36361,7 +36769,13 @@ The tool bar style must also show labels for this to have any effect, see
doc: /* List of functions to call to fontify regions of text.
Each function is called with one argument POS. Functions must
fontify a region starting at POS in the current buffer, and give
-fontified regions the property `fontified'. */);
+fontified regions the property `fontified' with a non-nil value.
+
+Note that, when the buffer contains one or more lines whose length is
+above `long-line-threshold', these functions are called with the buffer
+narrowed to a small portion around POS, and the narrowing is locked (see
+`narrow-to-region'), so that these functions cannot use `widen' to gain
+access to other portions of buffer text. */);
Vfontification_functions = Qnil;
Fmake_variable_buffer_local (Qfontification_functions);
diff --git a/src/xfns.c b/src/xfns.c
index 748ea10c952..a275e3e11a8 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -609,24 +609,24 @@ x_relative_mouse_position (struct frame *f, int *x, int *y)
block_input ();
- XQueryPointer (FRAME_X_DISPLAY (f),
- FRAME_DISPLAY_INFO (f)->root_window,
+ x_query_pointer (FRAME_X_DISPLAY (f),
+ FRAME_DISPLAY_INFO (f)->root_window,
- /* The root window which contains the pointer. */
- &root,
+ /* The root window which contains the pointer. */
+ &root,
- /* Window pointer is on, not used */
- &dummy_window,
+ /* Window pointer is on, not used */
+ &dummy_window,
- /* The position on that root window. */
- x, y,
+ /* The position on that root window. */
+ x, y,
- /* x/y in dummy_window coordinates, not used. */
- &dummy, &dummy,
+ /* x/y in dummy_window coordinates, not used. */
+ &dummy, &dummy,
- /* Modifier keys and pointer buttons, about which
- we don't care. */
- (unsigned int *) &dummy);
+ /* Modifier keys and pointer buttons, about which
+ we don't care. */
+ (unsigned int *) &dummy);
XTranslateCoordinates (FRAME_X_DISPLAY (f),
@@ -838,21 +838,9 @@ x_set_inhibit_double_buffering (struct frame *f,
block_input ();
if (want_double_buffering != was_double_buffered)
- {
- /* Force XftDraw etc to be recreated with the new double
- buffered drawable. */
- font_drop_xrender_surfaces (f);
-
- /* Scroll bars decide whether or not to use a back buffer
- based on the value of this frame parameter, so destroy
- all scroll bars. */
-#ifndef USE_TOOLKIT_SCROLL_BARS
- if (FRAME_TERMINAL (f)->condemn_scroll_bars_hook)
- FRAME_TERMINAL (f)->condemn_scroll_bars_hook (f);
- if (FRAME_TERMINAL (f)->judge_scroll_bars_hook)
- FRAME_TERMINAL (f)->judge_scroll_bars_hook (f);
-#endif
- }
+ /* Force XftDraw etc to be recreated with the new double
+ buffered drawable. */
+ font_drop_xrender_surfaces (f);
if (FRAME_X_DOUBLE_BUFFERED_P (f) && !want_double_buffering)
tear_down_x_back_buffer (f);
else if (!FRAME_X_DOUBLE_BUFFERED_P (f) && want_double_buffering)
@@ -976,6 +964,16 @@ x_set_parent_frame (struct frame *f, Lisp_Object new_value, Lisp_Object old_valu
gdk_x11_window_set_frame_sync_enabled (window, FALSE);
}
#endif
+
+#if defined HAVE_XSYNC && !defined USE_GTK
+ /* Frame synchronization can't be used in child frames since
+ they are not directly managed by the compositing manager.
+ Re-enabling vsync in former child frames also leads to
+ inconsistent display. In addition, they can only be updated
+ outside of a toplevel frame. */
+ FRAME_X_OUTPUT (f)->use_vsync_p = false;
+ FRAME_X_WAITING_FOR_DRAW (f) = false;
+#endif
unblock_input ();
fset_parent_frame (f, new_value);
@@ -1204,20 +1202,6 @@ x_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
xg_set_background_color (f, bg);
#endif
-#ifndef USE_TOOLKIT_SCROLL_BARS /* Turns out to be annoying with
- toolkit scroll bars. */
- {
- Lisp_Object bar;
- for (bar = FRAME_SCROLL_BARS (f);
- !NILP (bar);
- bar = XSCROLL_BAR (bar)->next)
- {
- Window window = XSCROLL_BAR (bar)->x_window;
- XSetWindowBackground (dpy, window, bg);
- }
- }
-#endif /* USE_TOOLKIT_SCROLL_BARS */
-
unblock_input ();
update_face_from_frame_parameter (f, Qbackground_color, arg);
@@ -2433,6 +2417,28 @@ x_set_alpha (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
}
}
+static void
+x_set_use_frame_synchronization (struct frame *f, Lisp_Object arg,
+ Lisp_Object oldval)
+{
+#if !defined USE_GTK && defined HAVE_XSYNC
+ struct x_display_info *dpyinfo;
+
+ dpyinfo = FRAME_DISPLAY_INFO (f);
+
+ if (!NILP (arg) && FRAME_X_EXTENDED_COUNTER (f))
+ FRAME_X_OUTPUT (f)->use_vsync_p
+ = x_wm_supports (f, dpyinfo->Xatom_net_wm_frame_drawn);
+ else
+ FRAME_X_OUTPUT (f)->use_vsync_p = false;
+
+ store_frame_param (f, Quse_frame_synchronization,
+ FRAME_X_OUTPUT (f)->use_vsync_p ? Qt : Qnil);
+#else
+ store_frame_param (f, Quse_frame_synchronization, Qnil);
+#endif
+}
+
/* Record in frame F the specified or default value according to ALIST
of the parameter named PROP (a Lisp symbol). If no value is
@@ -3767,14 +3773,11 @@ setup_xi_event_mask (struct frame *f)
memset (m, 0, l);
#endif
- mask.deviceid = XIAllDevices;
-
- XISetMask (m, XI_PropertyEvent);
- XISetMask (m, XI_HierarchyChanged);
- XISetMask (m, XI_DeviceChanged);
#ifdef HAVE_XINPUT2_2
if (FRAME_DISPLAY_INFO (f)->xi2_version >= 2)
{
+ mask.deviceid = XIAllDevices;
+
XISetMask (m, XI_TouchBegin);
XISetMask (m, XI_TouchUpdate);
XISetMask (m, XI_TouchEnd);
@@ -3786,11 +3789,12 @@ setup_xi_event_mask (struct frame *f)
XISetMask (m, XI_GesturePinchEnd);
}
#endif
+
+ XISelectEvents (FRAME_X_DISPLAY (f),
+ FRAME_X_WINDOW (f),
+ &mask, 1);
}
#endif
- XISelectEvents (FRAME_X_DISPLAY (f),
- FRAME_X_WINDOW (f),
- &mask, 1);
#ifndef HAVE_XINPUT2_1
FRAME_X_OUTPUT (f)->xi_masks = selected;
@@ -5113,7 +5117,10 @@ This function is an internal primitive--use `make-frame' instead. */)
}
#ifdef HAVE_XSYNC
- if (dpyinfo->xsync_supported_p)
+ if (dpyinfo->xsync_supported_p
+ /* Frame synchronization isn't supported in child frames. */
+ && NILP (parent_frame)
+ && !f->output_data.x->explicit_parent)
{
#ifndef HAVE_GTK3
XSyncValue initial_value;
@@ -5148,12 +5155,20 @@ This function is an internal primitive--use `make-frame' instead. */)
(unsigned char *) &counters,
((STRINGP (value)
&& !strcmp (SSDATA (value), "extended")) ? 2 : 1));
+
+#if defined HAVE_XSYNCTRIGGERFENCE && !defined USE_GTK
+ x_sync_init_fences (f);
+#endif
#endif
}
#endif
unblock_input ();
+ /* Set whether or not frame synchronization is enabled. */
+ gui_default_parameter (f, parms, Quse_frame_synchronization, Qt,
+ NULL, NULL, RES_TYPE_BOOLEAN);
+
/* Works iff frame has been already mapped. */
gui_default_parameter (f, parms, Qskip_taskbar, Qnil,
NULL, NULL, RES_TYPE_BOOLEAN);
@@ -6806,10 +6821,10 @@ selected frame's display. */)
return Qnil;
block_input ();
- XQueryPointer (FRAME_X_DISPLAY (f),
- FRAME_DISPLAY_INFO (f)->root_window,
- &root, &dummy_window, &x, &y, &dummy, &dummy,
- (unsigned int *) &dummy);
+ x_query_pointer (FRAME_X_DISPLAY (f),
+ FRAME_DISPLAY_INFO (f)->root_window,
+ &root, &dummy_window, &x, &y, &dummy, &dummy,
+ (unsigned int *) &dummy);
unblock_input ();
return Fcons (make_fixnum (x), make_fixnum (y));
@@ -6834,17 +6849,16 @@ The coordinates X and Y are interpreted in pixels relative to a position
#ifdef HAVE_XINPUT2
int deviceid;
- if (FRAME_DISPLAY_INFO (f)->supports_xi2)
+ deviceid = FRAME_DISPLAY_INFO (f)->client_pointer_device;
+
+ if (FRAME_DISPLAY_INFO (f)->supports_xi2
+ && deviceid != -1)
{
- XGrabServer (FRAME_X_DISPLAY (f));
- if (XIGetClientPointer (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
- &deviceid))
- {
- XIWarpPointer (FRAME_X_DISPLAY (f), deviceid, None,
- FRAME_DISPLAY_INFO (f)->root_window,
- 0, 0, 0, 0, xval, yval);
- }
- XUngrabServer (FRAME_X_DISPLAY (f));
+ x_catch_errors_for_lisp (FRAME_DISPLAY_INFO (f));
+ XIWarpPointer (FRAME_X_DISPLAY (f), deviceid, None,
+ FRAME_DISPLAY_INFO (f)->root_window,
+ 0, 0, 0, 0, xval, yval);
+ x_uncatch_errors_for_lisp (FRAME_DISPLAY_INFO (f));
}
else
#endif
@@ -7833,6 +7847,92 @@ Otherwise, the return value is a vector with the following fields:
return prop_attr;
}
+
+/***********************************************************************
+ Coordinate management
+ ***********************************************************************/
+
+DEFUN ("x-translate-coordinates", Fx_translate_coordinates,
+ Sx_translate_coordinates,
+ 1, 5, 0, doc: /* Translate coordinates from FRAME.
+Translate the given coordinates SOURCE-X and SOURCE-Y from
+SOURCE-WINDOW's coordinate space to that of DEST-WINDOW, on FRAME.
+
+If SOURCE-X and SOURCE-Y are nil, use 0 instead.
+
+FRAME can either be a terminal or a frame. If nil, it defaults to the
+selected frame. SOURCE-WINDOW must be an X window ID, 0 (which means
+to use the root window), or nil, which means to use FRAME's inner
+window. DEST-WINDOW must be another X window ID, or nil (which means
+to use the root window).
+
+Return a list of (X Y CHILD) if the given coordinates are on the same
+screen, or nil otherwise, where X and Y are the coordinates in
+DEST-WINDOW's coordinate space, and CHILD is the window ID of any
+mapped child in DEST-WINDOW at those coordinates, or nil if there is
+no such window. */)
+ (Lisp_Object frame, Lisp_Object source_window,
+ Lisp_Object dest_window, Lisp_Object source_x,
+ Lisp_Object source_y)
+{
+ struct x_display_info *dpyinfo;
+ struct frame *source_frame;
+ int dest_x, dest_y;
+ Window child_return, src, dest;
+ Bool rc;
+
+ dpyinfo = check_x_display_info (frame);
+ dest_x = 0;
+ dest_y = 0;
+
+ if (!NILP (source_x))
+ {
+ CHECK_FIXNUM (source_x);
+ dest_x = XFIXNUM (source_x);
+ }
+
+ if (!NILP (source_y))
+ {
+ CHECK_FIXNUM (source_y);
+ dest_y = XFIXNUM (source_y);
+ }
+
+ if (!NILP (source_window))
+ CONS_TO_INTEGER (source_window, Window, src);
+ else
+ {
+ source_frame = decode_window_system_frame (frame);
+ src = FRAME_X_WINDOW (source_frame);
+ }
+
+ if (!src)
+ src = dpyinfo->root_window;
+
+ if (!NILP (dest_window))
+ CONS_TO_INTEGER (dest_window, Window, dest);
+ else
+ dest = dpyinfo->root_window;
+
+ block_input ();
+ x_catch_errors (dpyinfo->display);
+ rc = XTranslateCoordinates (dpyinfo->display, src, dest,
+ dest_x, dest_y, &dest_x, &dest_y,
+ &child_return);
+ x_check_errors (dpyinfo->display,
+ "Couldn't translate coordinates: %s");
+ x_uncatch_errors_after_check ();
+ unblock_input ();
+
+ if (!rc)
+ return Qnil;
+
+ return list3 (make_int (dest_x),
+ make_int (dest_y),
+ (child_return != None
+ ? make_uint (child_return)
+ : Qnil));
+}
+
/***********************************************************************
Tool tips
***********************************************************************/
@@ -8279,8 +8379,8 @@ compute_tip_xy (struct frame *f, Lisp_Object parms, Lisp_Object dx,
Lisp_Object frame, attributes, monitor, geometry;
block_input ();
- XQueryPointer (FRAME_X_DISPLAY (f), FRAME_DISPLAY_INFO (f)->root_window,
- &root, &child, root_x, root_y, &win_x, &win_y, &pmask);
+ x_query_pointer (FRAME_X_DISPLAY (f), FRAME_DISPLAY_INFO (f)->root_window,
+ &root, &child, root_x, root_y, &win_x, &win_y, &pmask);
unblock_input ();
XSETFRAME (frame, f);
@@ -8537,6 +8637,10 @@ Text larger than the specified size is clipped. */)
Window child;
XWindowAttributes child_attrs;
int dest_x_return, dest_y_return;
+ bool displayed;
+#ifdef ENABLE_CHECKING
+ struct glyph_row *row, *end;
+#endif
AUTO_STRING (tip, " *tip*");
specbind (Qinhibit_redisplay, Qt);
@@ -8591,7 +8695,8 @@ Text larger than the specified size is clipped. */)
if (!NILP (tip_frame) && FRAME_LIVE_P (XFRAME (tip_frame)))
{
if (FRAME_VISIBLE_P (XFRAME (tip_frame))
- && BASE_EQ (frame, tip_last_frame)
+ && (FRAME_X_DISPLAY (XFRAME (frame))
+ == FRAME_X_DISPLAY (XFRAME (tip_last_frame)))
&& !NILP (Fequal_including_properties (tip_last_string, string))
&& !NILP (Fequal (tip_last_parms, parms)))
{
@@ -8749,7 +8854,26 @@ Text larger than the specified size is clipped. */)
clear_glyph_matrix (w->desired_matrix);
clear_glyph_matrix (w->current_matrix);
SET_TEXT_POS (pos, BEGV, BEGV_BYTE);
- try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+ displayed = try_window (window, pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
+
+ if (!displayed && NILP (Vx_max_tooltip_size))
+ {
+#ifdef ENABLE_CHECKING
+ row = w->desired_matrix->rows;
+ end = w->desired_matrix->rows + w->desired_matrix->nrows;
+
+ while (row < end)
+ {
+ if (!row->displays_text_p
+ || row->ends_at_zv_p)
+ break;
+ ++row;
+ }
+
+ eassert (row < end && row->ends_at_zv_p);
+#endif
+ }
+
/* Calculate size of tooltip window. */
size = Fwindow_text_pixel_size (window, Qnil, Qnil, Qnil,
make_fixnum (w->pixel_height), Qnil,
@@ -9340,6 +9464,24 @@ present and mapped to the usual X keysyms. */)
#endif
}
+DEFUN ("x-get-modifier-masks", Fx_get_modifier_masks, Sx_get_modifier_masks,
+ 0, 1, 0,
+ doc: /* Return the X modifier masks corresponding to keyboard modifiers.
+The optional second argument TERMINAL specifies which display to fetch
+modifier masks from. TERMINAL should be a terminal object, a frame or
+a display name (a string). If TERMINAL is omitted or nil, that stands
+for the selected frame's display.
+
+Return a list of (HYPER SUPER ALT SHIFT-LOCK META), each element being
+a number describing the modifier mask for the corresponding Emacs
+modifier. */)
+ (Lisp_Object terminal)
+{
+ struct x_display_info *dpyinfo;
+
+ dpyinfo = check_x_display_info (terminal);
+ return x_get_keyboard_modifiers (dpyinfo);
+}
/***********************************************************************
@@ -9640,6 +9782,7 @@ frame_parm_handler x_frame_parm_handlers[] =
x_set_override_redirect,
gui_set_no_special_glyphs,
x_set_alpha_background,
+ x_set_use_frame_synchronization,
x_set_shaded,
};
@@ -9845,7 +9988,7 @@ or when you set the mouse color. */);
DEFVAR_LISP ("x-max-tooltip-size", Vx_max_tooltip_size,
doc: /* Maximum size for tooltips.
Value is a pair (COLUMNS . ROWS). Text larger than this is clipped. */);
- Vx_max_tooltip_size = Fcons (make_fixnum (80), make_fixnum (40));
+ Vx_max_tooltip_size = Qnil;
DEFVAR_LISP ("x-no-window-manager", Vx_no_window_manager,
doc: /* Non-nil if no X window manager is in use.
@@ -10003,6 +10146,9 @@ eliminated in future versions of Emacs. */);
defsubr (&Sx_double_buffered_p);
defsubr (&Sx_begin_drag);
defsubr (&Sx_display_set_last_user_time);
+ defsubr (&Sx_translate_coordinates);
+ defsubr (&Sx_get_modifier_masks);
+
tip_timer = Qnil;
staticpro (&tip_timer);
tip_frame = Qnil;
diff --git a/src/xmenu.c b/src/xmenu.c
index e5e24b87d16..5b8a8f77a2d 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -232,6 +232,7 @@ static void
x_menu_translate_generic_event (XEvent *event)
{
struct x_display_info *dpyinfo;
+ struct xi_device_t *device;
XEvent copy;
XIDeviceEvent *xev;
@@ -265,6 +266,16 @@ x_menu_translate_generic_event (XEvent *event)
copy.xbutton.button = xev->detail;
copy.xbutton.same_screen = True;
+ device = xi_device_from_id (dpyinfo, xev->deviceid);
+
+ /* I don't know the repercussions of changing
+ device->grab on XI_ButtonPress events, so be safe and
+ only do what is necessary to prevent the grab from
+ being left invalid as XMenuActivate swallows
+ events. */
+ if (device && xev->evtype == XI_ButtonRelease)
+ device->grab &= ~(1 << xev->detail);
+
XPutBackEvent (dpyinfo->display, &copy);
break;
@@ -2507,6 +2518,10 @@ pop_down_menu (void *arg)
struct pop_down_menu *data = arg;
struct frame *f = data->frame;
XMenu *menu = data->menu;
+#ifdef HAVE_XINPUT2
+ int i;
+ struct xi_device_t *device;
+#endif
block_input ();
#ifndef MSDOS
@@ -2526,6 +2541,17 @@ pop_down_menu (void *arg)
results, and it is a pain to ask which are actually held now. */
FRAME_DISPLAY_INFO (f)->grabbed = 0;
+#ifdef HAVE_XINPUT2
+ /* Likewise for XI grabs when the mouse is released on top of the
+ menu itself. */
+
+ for (i = 0; i < FRAME_DISPLAY_INFO (f)->num_devices; ++i)
+ {
+ device = &FRAME_DISPLAY_INFO (f)->devices[i];
+ device->grab = 0;
+ }
+#endif
+
#endif /* HAVE_X_WINDOWS */
unblock_input ();
@@ -2536,6 +2562,9 @@ Lisp_Object
x_menu_show (struct frame *f, int x, int y, int menuflags,
Lisp_Object title, const char **error_name)
{
+#ifdef HAVE_X_WINDOWS
+ Window dummy_window;
+#endif
Window root;
XMenu *menu;
int pane, selidx, lpane, status;
@@ -2584,20 +2613,22 @@ x_menu_show (struct frame *f, int x, int y, int menuflags,
inhibit_garbage_collection ();
#ifdef HAVE_X_WINDOWS
- {
- /* Adjust coordinates to relative to the outer (window manager) window. */
- int left_off, top_off;
+ XTranslateCoordinates (FRAME_X_DISPLAY (f),
- x_real_pos_and_offsets (f, &left_off, NULL, &top_off, NULL,
- NULL, NULL, NULL, NULL, NULL);
+ /* From-window, to-window. */
+ FRAME_X_WINDOW (f),
+ FRAME_DISPLAY_INFO (f)->root_window,
- x += left_off;
- y += top_off;
- }
-#endif /* HAVE_X_WINDOWS */
+ /* From-position, to-position. */
+ x, y, &x, &y,
+ /* Child of win. */
+ &dummy_window);
+#else
+ /* MSDOS without X support. */
x += f->left_pos;
y += f->top_pos;
+#endif
/* Create all the necessary panes and their items. */
maxwidth = maxlines = lines = i = 0;
diff --git a/src/xselect.c b/src/xselect.c
index 1750cfb8bd8..d6e6d0c30b8 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -1084,6 +1084,26 @@ x_handle_selection_event (struct selection_input_event *event)
x_handle_selection_request (event);
}
+static bool
+x_should_preserve_selection (Lisp_Object selection)
+{
+ Lisp_Object tem;
+
+ tem = Vx_auto_preserve_selections;
+
+ if (CONSP (Vx_auto_preserve_selections))
+ {
+ FOR_EACH_TAIL_SAFE (tem)
+ {
+ if (EQ (XCAR (tem), selection))
+ return true;
+ }
+
+ return false;
+ }
+
+ return !NILP (tem);
+}
/* Clear all selections that were made from frame F.
We do this when about to delete a frame. */
@@ -1091,7 +1111,7 @@ x_handle_selection_event (struct selection_input_event *event)
void
x_clear_frame_selections (struct frame *f)
{
- Lisp_Object frame, rest, lost;
+ Lisp_Object frame, rest, lost, selection;
struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
struct terminal *t = dpyinfo->terminal;
@@ -1102,10 +1122,12 @@ x_clear_frame_selections (struct frame *f)
while (CONSP (t->Vselection_alist)
&& EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (t->Vselection_alist)))))))
{
- if (!x_auto_preserve_selections)
+ selection = Fcar (Fcar (t->Vselection_alist));
+
+ if (!x_should_preserve_selection (selection))
/* Run the `x-lost-selection-functions' abnormal hook. */
CALLN (Frun_hook_with_args, Qx_lost_selection_functions,
- Fcar (Fcar (t->Vselection_alist)));
+ selection);
else
lost = Fcons (Fcar (t->Vselection_alist), lost);
@@ -1117,9 +1139,11 @@ x_clear_frame_selections (struct frame *f)
if (CONSP (XCDR (rest))
&& EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (XCDR (rest))))))))
{
- if (!x_auto_preserve_selections)
+ selection = XCAR (XCAR (XCDR (rest)));
+
+ if (!x_should_preserve_selection (selection))
CALLN (Frun_hook_with_args, Qx_lost_selection_functions,
- XCAR (XCAR (XCDR (rest))));
+ selection);
else
lost = Fcons (XCAR (XCDR (rest)), lost);
@@ -1127,7 +1151,7 @@ x_clear_frame_selections (struct frame *f)
break;
}
- if (x_auto_preserve_selections)
+ if (!NILP (lost))
x_preserve_selections (dpyinfo, lost, frame);
}
diff --git a/src/xsettings.c b/src/xsettings.c
index c29a844e0a8..9c60ff825a4 100644
--- a/src/xsettings.c
+++ b/src/xsettings.c
@@ -964,9 +964,10 @@ read_and_apply_settings (Display_Info *dpyinfo, bool send_event_p)
#endif
#ifndef HAVE_PGTK
-/* Check if EVENT for the display in DPYINFO is XSettings related. */
+/* Check if EVENT for the display in DPYINFO is XSettings related.
+ Return true if it is, after performing associated side effects. */
-void
+bool
xft_settings_event (Display_Info *dpyinfo, const XEvent *event)
{
bool check_window_p = false, apply_settings_p = false;
@@ -1004,6 +1005,8 @@ xft_settings_event (Display_Info *dpyinfo, const XEvent *event)
if (apply_settings_p)
read_and_apply_settings (dpyinfo, true);
+
+ return check_window_p || apply_settings_p;
}
#endif
diff --git a/src/xsettings.h b/src/xsettings.h
index 5e5df37062b..833c2b367dc 100644
--- a/src/xsettings.h
+++ b/src/xsettings.h
@@ -36,7 +36,7 @@ typedef struct pgtk_display_info Display_Info;
extern void xsettings_initialize (Display_Info *);
#ifndef HAVE_PGTK
-extern void xft_settings_event (Display_Info *, const XEvent *);
+extern bool xft_settings_event (Display_Info *, const XEvent *);
#endif
extern const char *xsettings_get_system_font (void);
#ifdef USE_LUCID
diff --git a/src/xterm.c b/src/xterm.c
index 94fb0bfa1a0..7487450d649 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -997,7 +997,9 @@ static const struct x_atom_ref x_atom_refs[] =
ATOM_REFS_INIT ("_NET_WORKAREA", Xatom_net_workarea)
ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST", Xatom_net_wm_sync_request)
ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST_COUNTER", Xatom_net_wm_sync_request_counter)
+ ATOM_REFS_INIT ("_NET_WM_SYNC_FENCES", Xatom_net_wm_sync_fences)
ATOM_REFS_INIT ("_NET_WM_FRAME_DRAWN", Xatom_net_wm_frame_drawn)
+ ATOM_REFS_INIT ("_NET_WM_FRAME_TIMINGS", Xatom_net_wm_frame_timings)
ATOM_REFS_INIT ("_NET_WM_USER_TIME", Xatom_net_wm_user_time)
ATOM_REFS_INIT ("_NET_WM_USER_TIME_WINDOW", Xatom_net_wm_user_time_window)
ATOM_REFS_INIT ("_NET_CLIENT_LIST_STACKING", Xatom_net_client_list_stacking)
@@ -1128,10 +1130,6 @@ static void x_initialize (void);
static bool x_get_current_wm_state (struct frame *, Window, int *, bool *, bool *);
static void x_update_opaque_region (struct frame *, XEvent *);
-#if !defined USE_TOOLKIT_SCROLL_BARS && defined HAVE_XDBE
-static void x_scroll_bar_end_update (struct x_display_info *, struct scroll_bar *);
-#endif
-
#ifdef HAVE_X_I18N
static int x_filter_event (struct x_display_info *, XEvent *);
#endif
@@ -1141,6 +1139,10 @@ static struct frame *x_tooltip_window_to_frame (struct x_display_info *,
Window, bool *);
static Window x_get_window_below (Display *, Window, int, int, int *, int *);
+#ifndef USE_TOOLKIT_SCROLL_BARS
+static void x_scroll_bar_redraw (struct scroll_bar *);
+#endif
+
/* Global state maintained during a drag-and-drop operation. */
/* Flag that indicates if a drag-and-drop operation is in progress. */
@@ -1285,6 +1287,15 @@ static Window x_dnd_waiting_for_status_window;
upon receiving an XdndStatus event from said window. */
static XEvent x_dnd_pending_send_position;
+/* Whether or not that event corresponds to a button press. */
+static bool x_dnd_pending_send_position_button;
+
+/* The root-window position of that event. */
+static int x_dnd_pending_send_position_root_x;
+
+/* Likewise. */
+static int x_dnd_pending_send_position_root_y;
+
/* If true, send a drop from `x_dnd_finish_frame' to the pending
status window after receiving all pending XdndStatus events. */
static bool x_dnd_need_send_drop;
@@ -1344,6 +1355,21 @@ static struct frame *x_dnd_movement_frame;
with. */
static int x_dnd_movement_x, x_dnd_movement_y;
+/* The frame for which `x-dnd-wheel-function' should be called. */
+static struct frame *x_dnd_wheel_frame;
+
+/* The coordinates which the wheel function should be called with. */
+static int x_dnd_wheel_x, x_dnd_wheel_y;
+
+/* The button that was pressed. */
+static int x_dnd_wheel_button;
+
+/* The modifier state when the button was pressed. */
+static int x_dnd_wheel_state;
+
+/* When the button was pressed. */
+static Time x_dnd_wheel_time;
+
#ifdef HAVE_XKB
/* The keyboard state during the drag-and-drop operation. */
static unsigned int x_dnd_keyboard_state;
@@ -1366,6 +1392,21 @@ static int x_dnd_recursion_depth;
initiating Motif drag-and-drop for the first time. */
static Lisp_Object x_dnd_selection_alias_cell;
+/* The last known position of the tooltip window. */
+static int x_dnd_last_tooltip_x, x_dnd_last_tooltip_y;
+
+/* Whether or not those values are actually known yet. */
+static bool x_dnd_last_tooltip_valid;
+
+#ifdef HAVE_XINPUT2
+/* The master pointer device being used for the drag-and-drop
+ operation. */
+static int x_dnd_pointer_device;
+
+/* The keyboard device attached to that pointer device. */
+static int x_dnd_keyboard_device;
+#endif
+
/* Structure describing a single window that can be the target of
drag-and-drop operations. */
struct x_client_list_window
@@ -2068,7 +2109,7 @@ xm_setup_dnd_targets (struct x_display_info *dpyinfo,
int rc, actual_format, idx;
bool had_errors;
xm_targets_table_header header;
- xm_targets_table_rec **recs;
+ xm_targets_table_rec **recs UNINIT;
xm_byte_order byteorder;
uint8_t *data;
ptrdiff_t total_bytes, total_items, i;
@@ -2806,20 +2847,16 @@ x_dnd_free_toplevels (bool display_alive)
struct x_client_list_window *last;
struct x_client_list_window *tem = x_dnd_toplevels;
ptrdiff_t n_windows, i, buffer_size;
- Window *destroy_windows;
- unsigned long *prev_masks;
+ Window *destroy_windows UNINIT;
+ unsigned long *prev_masks UNINIT;
specpdl_ref count;
- Display *dpy;
+ Display *dpy UNINIT;
struct x_display_info *dpyinfo;
if (!x_dnd_toplevels)
/* Probably called inside an IO error handler. */
return;
- /* Pacify GCC. */
- prev_masks = NULL;
- destroy_windows = NULL;
-
if (display_alive)
{
buffer_size = 1024;
@@ -2882,6 +2919,7 @@ x_dnd_free_toplevels (bool display_alive)
if (n_windows)
{
+ eassume (dpyinfo);
x_ignore_errors_for_next_request (dpyinfo);
for (i = 0; i < n_windows; ++i)
@@ -2907,7 +2945,7 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo)
Window *toplevels;
int format, rc;
unsigned long nitems, bytes_after;
- unsigned long i;
+ unsigned long i, real_nitems;
unsigned char *data = NULL;
int frame_extents[4];
@@ -2971,6 +3009,16 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo)
toplevels = (Window *) data;
+ for (i = 0, real_nitems = 0; i < nitems; ++i)
+ {
+ /* Some window managers with built in compositors end up putting
+ tooltips in the client list, which is silly. */
+ if (!x_tooltip_window_to_frame (dpyinfo, toplevels[i], NULL))
+ toplevels[real_nitems++] = toplevels[i];
+ }
+
+ nitems = real_nitems;
+
#ifdef USE_XCB
USE_SAFE_ALLOCA;
@@ -4453,19 +4501,6 @@ x_dnd_send_position (struct frame *f, Window target, int supported,
struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
XEvent msg;
- if (target == x_dnd_mouse_rect_target
- && x_dnd_mouse_rect.width
- && x_dnd_mouse_rect.height)
- {
- if (root_x >= x_dnd_mouse_rect.x
- && root_x < (x_dnd_mouse_rect.x
- + x_dnd_mouse_rect.width)
- && root_y >= x_dnd_mouse_rect.y
- && root_y < (x_dnd_mouse_rect.y
- + x_dnd_mouse_rect.height))
- return;
- }
-
msg.xclient.type = ClientMessage;
msg.xclient.message_type = dpyinfo->Xatom_XdndPosition;
msg.xclient.format = 32;
@@ -4473,21 +4508,22 @@ x_dnd_send_position (struct frame *f, Window target, int supported,
msg.xclient.data.l[0] = FRAME_X_WINDOW (f);
msg.xclient.data.l[1] = 0;
- if (supported >= 5)
+ /* This is problematic because it's not specified in the
+ freedesktop.org copy of the protocol specification, but the copy
+ maintained by the original author of the protocol specifies it
+ for all versions. Since at least one program supports these
+ flags, but uses protocol v4 (and not v5), set them for all
+ protocool versions. */
+ if (button >= 4 && button <= 7)
{
- if (button >= 4 && button <= 7)
- {
- msg.xclient.data.l[1] |= (1 << 9);
- msg.xclient.data.l[1] |= (button - 4) << 7;
- }
- else if (button)
- return;
-
- msg.xclient.data.l[1] |= state & 0x3f;
+ msg.xclient.data.l[1] |= (1 << 10);
+ msg.xclient.data.l[1] |= (button - 4) << 8;
}
else if (button)
return;
+ msg.xclient.data.l[1] |= state & 0xff;
+
msg.xclient.data.l[2] = (root_x << 16) | root_y;
msg.xclient.data.l[3] = 0;
msg.xclient.data.l[4] = 0;
@@ -4499,9 +4535,30 @@ x_dnd_send_position (struct frame *f, Window target, int supported,
msg.xclient.data.l[4] = action;
if (x_dnd_waiting_for_status_window == target)
- x_dnd_pending_send_position = msg;
+ {
+ x_dnd_pending_send_position = msg;
+ x_dnd_pending_send_position_button = button;
+ x_dnd_pending_send_position_root_x = root_x;
+ x_dnd_pending_send_position_root_y = root_y;
+ }
else
{
+ if (target == x_dnd_mouse_rect_target
+ && x_dnd_mouse_rect.width
+ && x_dnd_mouse_rect.height
+ /* Ignore the mouse rectangle if we're supposed to be sending a
+ button press instead. */
+ && !button)
+ {
+ if (root_x >= x_dnd_mouse_rect.x
+ && root_x < (x_dnd_mouse_rect.x
+ + x_dnd_mouse_rect.width)
+ && root_y >= x_dnd_mouse_rect.y
+ && root_y < (x_dnd_mouse_rect.y
+ + x_dnd_mouse_rect.height))
+ return;
+ }
+
x_ignore_errors_for_next_request (dpyinfo);
XSendEvent (FRAME_X_DISPLAY (f), target, False, NoEventMask, &msg);
x_stop_ignoring_errors (dpyinfo);
@@ -4527,6 +4584,7 @@ x_dnd_send_leave (struct frame *f, Window target)
msg.xclient.data.l[4] = 0;
x_dnd_waiting_for_status_window = None;
+ x_dnd_pending_send_position.type = 0;
x_ignore_errors_for_next_request (dpyinfo);
XSendEvent (FRAME_X_DISPLAY (f), target, False, NoEventMask, &msg);
@@ -4656,6 +4714,67 @@ x_restore_events_after_dnd (struct frame *f, XWindowAttributes *wa)
dpyinfo->Xatom_XdndTypeList);
}
+#ifdef HAVE_XINPUT2
+
+/* Cancel the current drag-and-drop operation, sending leave messages
+ to any relevant toplevels. This is called from the event loop when
+ an event is received telling Emacs to gracefully cancel the
+ drag-and-drop operation. */
+
+static void
+x_dnd_cancel_dnd_early (void)
+{
+ struct frame *f;
+ xm_drop_start_message dmsg;
+
+ eassert (x_dnd_frame && x_dnd_in_progress);
+
+ f = x_dnd_frame;
+
+ if (x_dnd_last_seen_window != None
+ && x_dnd_last_protocol_version != -1)
+ x_dnd_send_leave (x_dnd_frame,
+ x_dnd_last_seen_window);
+ else if (x_dnd_last_seen_window != None
+ && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
+ && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
+ && x_dnd_motif_setup_p)
+ {
+ dmsg.reason = XM_DRAG_REASON (XM_DRAG_ORIGINATOR_INITIATOR,
+ XM_DRAG_REASON_DROP_START);
+ dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
+ dmsg.timestamp = FRAME_DISPLAY_INFO (f)->last_user_time;
+ dmsg.side_effects
+ = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action (FRAME_DISPLAY_INFO (f),
+ x_dnd_wanted_action),
+ XM_DROP_SITE_VALID, x_dnd_motif_operations,
+ XM_DROP_ACTION_DROP_CANCEL);
+ dmsg.x = 0;
+ dmsg.y = 0;
+ dmsg.index_atom = x_dnd_motif_atom;
+ dmsg.source_window = FRAME_X_WINDOW (f);
+
+ x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (f), f,
+ x_dnd_last_seen_window,
+ FRAME_DISPLAY_INFO (f)->last_user_time);
+ xm_send_drop_message (FRAME_DISPLAY_INFO (f), FRAME_X_WINDOW (f),
+ x_dnd_last_seen_window, &dmsg);
+ }
+
+ x_dnd_last_seen_window = None;
+ x_dnd_last_seen_toplevel = None;
+ x_dnd_in_progress = false;
+ x_dnd_waiting_for_finish = false;
+ x_dnd_return_frame_object = NULL;
+ x_dnd_movement_frame = NULL;
+ x_dnd_wheel_frame = NULL;
+ x_dnd_frame = NULL;
+ x_dnd_action = None;
+ x_dnd_action_symbol = Qnil;
+}
+
+#endif
+
static void
x_dnd_cleanup_drag_and_drop (void *frame)
{
@@ -4715,6 +4834,7 @@ x_dnd_cleanup_drag_and_drop (void *frame)
#endif
x_dnd_return_frame_object = NULL;
x_dnd_movement_frame = NULL;
+ x_dnd_wheel_frame = NULL;
x_dnd_frame = NULL;
x_restore_events_after_dnd (f, &x_dnd_old_window_attrs);
@@ -4745,6 +4865,37 @@ x_dnd_note_self_position (struct x_display_info *dpyinfo, Window target,
}
static void
+x_dnd_note_self_wheel (struct x_display_info *dpyinfo, Window target,
+ unsigned short root_x, unsigned short root_y,
+ int button, unsigned int state, Time time)
+{
+ struct frame *f;
+ int dest_x, dest_y;
+ Window child_return;
+
+ if (button < 4 || button > 7)
+ return;
+
+ f = x_top_window_to_frame (dpyinfo, target);
+
+ if (f && XTranslateCoordinates (dpyinfo->display,
+ dpyinfo->root_window,
+ FRAME_X_WINDOW (f),
+ root_x, root_y, &dest_x,
+ &dest_y, &child_return))
+ {
+ x_dnd_wheel_frame = f;
+ x_dnd_wheel_x = dest_x;
+ x_dnd_wheel_y = dest_y;
+ x_dnd_wheel_button = button;
+ x_dnd_wheel_state = state;
+ x_dnd_wheel_time = time;
+
+ return;
+ }
+}
+
+static void
x_dnd_note_self_drop (struct x_display_info *dpyinfo, Window target,
unsigned short root_x, unsigned short root_y,
Time timestamp)
@@ -4880,15 +5031,6 @@ x_xr_ensure_picture (struct frame *f)
}
#endif
-/* Remove calls to XFlush by defining XFlush to an empty replacement.
- Calls to XFlush should be unnecessary because the X output buffer
- is flushed automatically as needed by calls to XPending,
- XNextEvent, or XWindowEvent according to the XFlush man page.
- XTread_socket calls XPending. Removing XFlush improves
- performance. */
-
-#define XFlush(DISPLAY) (void) 0
-
/***********************************************************************
Debugging
@@ -5210,15 +5352,15 @@ xi_populate_device_from_info (struct xi_device_t *xi_device,
* device->num_classes);
values = NULL;
#endif
-#ifdef HAVE_XINPUT2_2
- xi_device->touchpoints = NULL;
-#endif
xi_device->use = device->use;
+ xi_device->name = build_string (device->name);
+ xi_device->attachment = device->attachment;
+
#ifdef HAVE_XINPUT2_2
+ xi_device->touchpoints = NULL;
xi_device->direct_p = false;
#endif
- xi_device->name = build_string (device->name);
for (c = 0; c < device->num_classes; ++c)
{
@@ -5291,12 +5433,16 @@ xi_populate_device_from_info (struct xi_device_t *xi_device,
#endif
}
-/* The code below handles the tracking of scroll valuators on XInput
- 2, in order to support scroll wheels that report information more
- granular than a screen line.
+/* Populate our client-side record of all devices, which includes
+ basic information about the device and also touchscreen tracking
+ information and scroll valuators.
+
+ Keeping track of scroll valuators is required in order to support
+ scroll wheels that report information in a fashion more detailed
+ than a single turn of a "step" in the wheel.
- On X, when the XInput 2 extension is being utilized, the states of
- the mouse wheels in each axis are stored as absolute values inside
+ When the input extension is being utilized, the states of the mouse
+ wheels on each axis are stored as absolute values inside
"valuators" attached to each mouse device. To obtain the delta of
the scroll wheel from a motion event (which is used to report that
some valuator has changed), it is necessary to iterate over every
@@ -5310,22 +5456,15 @@ xi_populate_device_from_info (struct xi_device_t *xi_device,
This delta however is still intermediate, to make driver
implementations easier. The XInput developers recommend (and most
programs use) the following algorithm to convert from scroll unit
- deltas to pixel deltas:
+ deltas to pixel deltas by which the display must actually be
+ scrolled:
pixels_scrolled = pow (window_height, 2.0 / 3.0) * delta; */
-/* Setup valuator tracking for XI2 master devices on
- DPYINFO->display. */
-
-/* This function's name is a misnomer: these days, it keeps a
- client-side record of all devices, which includes basic information
- about the device and also touchscreen tracking information, instead
- of just scroll valuators. */
-
static void
-x_init_master_valuators (struct x_display_info *dpyinfo)
+x_cache_xi_devices (struct x_display_info *dpyinfo)
{
- int ndevices, actual_devices;
+ int ndevices, actual_devices, i;
XIDeviceInfo *infos;
actual_devices = 0;
@@ -5342,9 +5481,9 @@ x_init_master_valuators (struct x_display_info *dpyinfo)
return;
}
- dpyinfo->devices = xmalloc (sizeof *dpyinfo->devices * ndevices);
+ dpyinfo->devices = xzalloc (sizeof *dpyinfo->devices * ndevices);
- for (int i = 0; i < ndevices; ++i)
+ for (i = 0; i < ndevices; ++i)
{
if (infos[i].enabled)
xi_populate_device_from_info (&dpyinfo->devices[actual_devices++],
@@ -6516,6 +6655,371 @@ x_set_frame_alpha (struct frame *f)
Starting and ending an update
***********************************************************************/
+#if defined HAVE_XSYNC && !defined USE_GTK
+
+/* Wait for an event matching PREDICATE to show up in the event
+ queue, or TIMEOUT to elapse.
+
+ If TIMEOUT passes without an event being found, return 1.
+ Otherwise, return 0 and behave as XIfEvent would. */
+
+static int
+x_if_event (Display *dpy, XEvent *event_return,
+ Bool (*predicate) (Display *, XEvent *, XPointer),
+ XPointer arg, struct timespec timeout)
+{
+ struct timespec current_time, target;
+ int fd;
+ fd_set fds;
+
+ fd = ConnectionNumber (dpy);
+ current_time = current_timespec ();
+ target = timespec_add (current_time, timeout);
+
+ /* Check if an event is already in the queue. If it is, avoid
+ syncing. */
+ if (XCheckIfEvent (dpy, event_return, predicate, arg))
+ return 0;
+
+ while (true)
+ {
+ /* Get events into the queue. */
+ XSync (dpy, False);
+
+ /* Look for an event again. */
+ if (XCheckIfEvent (dpy, event_return, predicate, arg))
+ return 0;
+
+ /* Calculate the timeout. */
+ current_time = current_timespec ();
+ timeout = timespec_sub (target, current_time);
+
+ /* If not, wait for some input to show up on the X connection,
+ or for the timeout to elapse. */
+ FD_ZERO (&fds);
+ FD_SET (fd, &fds);
+
+ /* If this fails due to an IO error, XSync will call the IO
+ error handler. */
+ pselect (fd + 1, &fds, NULL, NULL, &timeout, NULL);
+
+ /* Timeout elapsed. */
+ current_time = current_timespec ();
+ if (timespec_cmp (target, current_time) < 0)
+ return 1;
+ }
+}
+
+/* Return the monotonic time corresponding to the high-resolution
+ server timestamp TIMESTAMP. Return 0 if the necessary information
+ is not available. */
+
+static uint64_t
+x_sync_get_monotonic_time (struct x_display_info *dpyinfo,
+ uint64_t timestamp)
+{
+ if (dpyinfo->server_time_monotonic_p)
+ return timestamp;
+
+ /* This means we haven't yet initialized the server time offset. */
+ if (!dpyinfo->server_time_offset)
+ return 0;
+
+ return timestamp - dpyinfo->server_time_offset;
+}
+
+/* Return the current monotonic time in the same format as a
+ high-resolution server timestamp. */
+
+static uint64_t
+x_sync_current_monotonic_time (void)
+{
+ struct timespec time;
+
+ clock_gettime (CLOCK_MONOTONIC, &time);
+ return time.tv_sec * 1000000 + time.tv_nsec / 1000;
+}
+
+/* Decode a _NET_WM_FRAME_DRAWN message and calculate the time it took
+ to draw the last frame. */
+
+static void
+x_sync_note_frame_times (struct x_display_info *dpyinfo,
+ struct frame *f, XEvent *event)
+{
+ uint64_t low, high, time;
+ struct x_output *output;
+
+ low = event->xclient.data.l[2];
+ high = event->xclient.data.l[3];
+ output = FRAME_X_OUTPUT (f);
+
+ time = x_sync_get_monotonic_time (dpyinfo, low | (high << 32));
+
+ if (time)
+ output->last_frame_time = time - output->temp_frame_time;
+
+#ifdef FRAME_DEBUG
+ fprintf (stderr, "Drawing the last frame took: %lu ms (%lu)\n",
+ output->last_frame_time / 1000, time);
+#endif
+}
+
+static Bool
+x_sync_is_frame_drawn_event (Display *dpy, XEvent *event,
+ XPointer user_data)
+{
+ struct frame *f;
+ struct x_display_info *dpyinfo;
+
+ f = (struct frame *) user_data;
+ dpyinfo = FRAME_DISPLAY_INFO (f);
+
+ if (event->type == ClientMessage
+ && (event->xclient.message_type
+ == dpyinfo->Xatom_net_wm_frame_drawn)
+ && event->xclient.window == FRAME_OUTER_WINDOW (f))
+ return True;
+
+ return False;
+}
+
+/* Wait for the compositing manager to finish drawing the last frame.
+ If the compositing manager has already drawn everything, do
+ nothing. */
+
+static void
+x_sync_wait_for_frame_drawn_event (struct frame *f)
+{
+ XEvent event;
+
+ if (!FRAME_X_WAITING_FOR_DRAW (f)
+ /* The compositing manager can't draw a frame if it is
+ unmapped. */
+ || !FRAME_VISIBLE_P (f))
+ return;
+
+ /* Wait for the frame drawn message to arrive. */
+ if (x_if_event (FRAME_X_DISPLAY (f), &event,
+ x_sync_is_frame_drawn_event, (XPointer) f,
+ make_timespec (1, 0)))
+ {
+ /* TODO: display this warning in the echo area. */
+ fprintf (stderr, "Warning: compositing manager spent more than 1 second "
+ "drawing a frame. Frame synchronization has been disabled\n");
+ FRAME_X_OUTPUT (f)->use_vsync_p = false;
+
+ /* Also change the frame parameter to reflect the new state. */
+ store_frame_param (f, Quse_frame_synchronization, Qnil);
+ }
+ else
+ x_sync_note_frame_times (FRAME_DISPLAY_INFO (f), f, &event);
+
+ FRAME_X_WAITING_FOR_DRAW (f) = false;
+}
+
+/* Tell the compositing manager to postpone updates of F until a frame
+ has finished drawing. */
+
+static void
+x_sync_update_begin (struct frame *f)
+{
+ XSyncValue value, add;
+ Bool overflow;
+
+ if (FRAME_X_EXTENDED_COUNTER (f) == None)
+ return;
+
+ value = FRAME_X_COUNTER_VALUE (f);
+
+ if (FRAME_X_OUTPUT (f)->ext_sync_end_pending_p)
+ {
+ FRAME_X_COUNTER_VALUE (f)
+ = FRAME_X_OUTPUT (f)->resize_counter_value;
+
+ value = FRAME_X_COUNTER_VALUE (f);
+
+ if (XSyncValueLow32 (value) % 2)
+ {
+ XSyncIntToValue (&add, 1);
+ XSyncValueAdd (&value, value, add, &overflow);
+
+ if (overflow)
+ XSyncIntToValue (&value, 0);
+ }
+
+ FRAME_X_OUTPUT (f)->ext_sync_end_pending_p = false;
+ }
+
+ /* Since a frame is already in progress, there is no point in
+ continuing. */
+ if (XSyncValueLow32 (value) % 2)
+ return;
+
+ /* Wait for the last frame to be drawn before drawing this one. */
+ x_sync_wait_for_frame_drawn_event (f);
+
+ /* Make a note of the time at which we started to draw this
+ frame. */
+ FRAME_X_OUTPUT (f)->temp_frame_time = x_sync_current_monotonic_time ();
+
+ /* Since Emacs needs a non-urgent redraw, ensure that value % 4 ==
+ 1. Later, add 3 to create the even counter value. */
+ if (XSyncValueLow32 (value) % 4 == 2)
+ XSyncIntToValue (&add, 3);
+ else
+ XSyncIntToValue (&add, 1);
+
+ XSyncValueAdd (&FRAME_X_COUNTER_VALUE (f),
+ value, add, &overflow);
+
+ if (overflow)
+ XSyncIntToValue (&FRAME_X_COUNTER_VALUE (f), 3);
+
+ eassert (XSyncValueLow32 (FRAME_X_COUNTER_VALUE (f)) % 4 == 1);
+
+ XSyncSetCounter (FRAME_X_DISPLAY (f),
+ FRAME_X_EXTENDED_COUNTER (f),
+ FRAME_X_COUNTER_VALUE (f));
+}
+
+#ifdef HAVE_XSYNCTRIGGERFENCE
+
+/* Trigger the sync fence for counter VALUE immediately before a frame
+ finishes. */
+
+static void
+x_sync_trigger_fence (struct frame *f, XSyncValue value)
+{
+ uint64_t n, low, high, idx;
+
+ /* Sync fences aren't supported by the X server. */
+ if (FRAME_DISPLAY_INFO (f)->xsync_major < 3
+ || (FRAME_DISPLAY_INFO (f)->xsync_major == 3
+ && FRAME_DISPLAY_INFO (f)->xsync_minor < 1))
+ return;
+
+ low = XSyncValueLow32 (value);
+ high = XSyncValueHigh32 (value);
+
+ n = low | (high << 32);
+ idx = (n / 4) % 2;
+
+#ifdef FRAME_DEBUG
+ fprintf (stderr, "Triggering synchronization fence: %lu\n", idx);
+#endif
+
+ XSyncTriggerFence (FRAME_X_DISPLAY (f),
+ FRAME_X_OUTPUT (f)->sync_fences[idx]);
+}
+
+/* Initialize the sync fences on F. */
+
+void
+x_sync_init_fences (struct frame *f)
+{
+ struct x_output *output;
+ struct x_display_info *dpyinfo;
+
+ output = FRAME_X_OUTPUT (f);
+ dpyinfo = FRAME_DISPLAY_INFO (f);
+
+ /* Sync fences aren't supported by the X server. */
+ if (dpyinfo->xsync_major < 3
+ || (dpyinfo->xsync_major == 3
+ && dpyinfo->xsync_minor < 1))
+ return;
+
+ output->sync_fences[0]
+ = XSyncCreateFence (FRAME_X_DISPLAY (f),
+ /* The drawable given below is only used to
+ determine the screen on which the fence is
+ created. */
+ FRAME_X_WINDOW (f),
+ False);
+ output->sync_fences[1]
+ = XSyncCreateFence (FRAME_X_DISPLAY (f),
+ FRAME_X_WINDOW (f),
+ False);
+
+ XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
+ dpyinfo->Xatom_net_wm_sync_fences, XA_CARDINAL,
+ 32, PropModeReplace,
+ (unsigned char *) &output->sync_fences, 2);
+}
+
+static void
+x_sync_free_fences (struct frame *f)
+{
+ if (FRAME_X_OUTPUT (f)->sync_fences[0] != None)
+ XSyncDestroyFence (FRAME_X_DISPLAY (f),
+ FRAME_X_OUTPUT (f)->sync_fences[0]);
+
+ if (FRAME_X_OUTPUT (f)->sync_fences[1] != None)
+ XSyncDestroyFence (FRAME_X_DISPLAY (f),
+ FRAME_X_OUTPUT (f)->sync_fences[1]);
+}
+
+#endif
+
+/* Tell the compositing manager that FRAME has been drawn and can be
+ updated. */
+
+static void
+x_sync_update_finish (struct frame *f)
+{
+ XSyncValue value, add;
+ Bool overflow;
+
+ if (FRAME_X_EXTENDED_COUNTER (f) == None)
+ return;
+
+ value = FRAME_X_COUNTER_VALUE (f);
+
+ if (!(XSyncValueLow32 (value) % 2))
+ return;
+
+ if ((XSyncValueLow32 (value) % 4) == 1)
+ /* This means the frame is non-urgent and should be drawn at the
+ next redraw point. */
+ XSyncIntToValue (&add, 3);
+ else
+ /* Otherwise, the frame is urgent and should be drawn as soon as
+ possible. */
+ XSyncIntToValue (&add, 1);
+
+ XSyncValueAdd (&FRAME_X_COUNTER_VALUE (f),
+ value, add, &overflow);
+
+ if (overflow)
+ XSyncIntToValue (&FRAME_X_COUNTER_VALUE (f), 0);
+
+ /* Trigger any sync fences if necessary. */
+#ifdef HAVE_XSYNCTRIGGERFENCE
+ x_sync_trigger_fence (f, FRAME_X_COUNTER_VALUE (f));
+#endif
+
+ XSyncSetCounter (FRAME_X_DISPLAY (f),
+ FRAME_X_EXTENDED_COUNTER (f),
+ FRAME_X_COUNTER_VALUE (f));
+
+ if (FRAME_OUTPUT_DATA (f)->use_vsync_p)
+ FRAME_X_WAITING_FOR_DRAW (f) = true;
+}
+
+/* Handle a _NET_WM_FRAME_DRAWN message from the compositor. */
+
+static void
+x_sync_handle_frame_drawn (struct x_display_info *dpyinfo,
+ XEvent *message, struct frame *f)
+{
+ if (FRAME_OUTER_WINDOW (f) == message->xclient.window)
+ FRAME_X_WAITING_FOR_DRAW (f) = false;
+
+ x_sync_note_frame_times (dpyinfo, f, message);
+}
+#endif
+
/* Start an update of frame F. This function is installed as a hook
for update_begin, i.e. it is called when update_begin is called.
This function is called prior to calls to gui_update_window_begin for
@@ -6525,7 +7029,16 @@ x_set_frame_alpha (struct frame *f)
static void
x_update_begin (struct frame *f)
{
+#if defined HAVE_XSYNC && !defined USE_GTK
+ /* If F is double-buffered, we can make the entire frame center
+ around XdbeSwapBuffers. */
+#ifdef HAVE_XDBE
+ if (!FRAME_X_DOUBLE_BUFFERED_P (f))
+#endif
+ x_sync_update_begin (f);
+#else
/* Nothing to do. */
+#endif
}
/* Draw a vertical window border from (x,y0) to (x,y1) */
@@ -6607,33 +7120,54 @@ x_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
}
}
+#ifdef HAVE_XDBE
+
/* Show the frame back buffer. If frame is double-buffered,
atomically publish to the user's screen graphics updates made since
the last call to show_back_buffer. */
-#ifdef HAVE_XDBE
static void
show_back_buffer (struct frame *f)
{
+ XdbeSwapInfo swap_info;
+#ifdef USE_CAIRO
+ cairo_t *cr;
+#endif
+
block_input ();
if (FRAME_X_DOUBLE_BUFFERED_P (f))
{
+#if defined HAVE_XSYNC && !defined USE_GTK
+ /* Wait for drawing of the previous frame to complete before
+ displaying this new frame. */
+ x_sync_wait_for_frame_drawn_event (f);
+
+ /* Begin a new frame. */
+ x_sync_update_begin (f);
+#endif
+
#ifdef USE_CAIRO
- cairo_t *cr = FRAME_CR_CONTEXT (f);
+ cr = FRAME_CR_CONTEXT (f);
if (cr)
cairo_surface_flush (cairo_get_target (cr));
#endif
- XdbeSwapInfo swap_info;
memset (&swap_info, 0, sizeof (swap_info));
swap_info.swap_window = FRAME_X_WINDOW (f);
swap_info.swap_action = XdbeCopied;
XdbeSwapBuffers (FRAME_X_DISPLAY (f), &swap_info, 1);
+
+#if defined HAVE_XSYNC && !defined USE_GTK
+ /* Finish the frame here. */
+ x_sync_update_finish (f);
+#endif
}
+
FRAME_X_NEED_BUFFER_FLIP (f) = false;
unblock_input ();
}
+
#endif
/* Updates back buffer and flushes changes to display. Called from
@@ -6671,17 +7205,17 @@ x_update_end (struct frame *f)
#ifdef USE_CAIRO
if (!FRAME_X_DOUBLE_BUFFERED_P (f) && FRAME_CR_CONTEXT (f))
- {
- block_input ();
- cairo_surface_flush (cairo_get_target (FRAME_CR_CONTEXT (f)));
- unblock_input ();
- }
+ cairo_surface_flush (cairo_get_target (FRAME_CR_CONTEXT (f)));
#endif
-#ifndef XFlush
- block_input ();
- XFlush (FRAME_X_DISPLAY (f));
- unblock_input ();
+ /* If double buffering is disabled, finish the update here.
+ Otherwise, finish the update when the back buffer is next
+ displayed. */
+#if defined HAVE_XSYNC && !defined USE_GTK
+#ifdef HAVE_XDBE
+ if (!FRAME_X_DOUBLE_BUFFERED_P (f))
+#endif
+ x_sync_update_finish (f);
#endif
}
@@ -6691,11 +7225,7 @@ x_update_end (struct frame *f)
static void
XTframe_up_to_date (struct frame *f)
{
-#if defined HAVE_XSYNC && !defined HAVE_GTK3
- XSyncValue add;
- XSyncValue current;
- Bool overflow_p;
-#elif defined HAVE_XSYNC
+#if defined HAVE_XSYNC && defined HAVE_GTK3
GtkWidget *widget;
GdkWindow *window;
GdkFrameClock *clock;
@@ -6721,29 +7251,6 @@ XTframe_up_to_date (struct frame *f)
FRAME_X_OUTPUT (f)->pending_basic_counter_value);
FRAME_X_OUTPUT (f)->sync_end_pending_p = false;
}
-
- if (FRAME_X_OUTPUT (f)->ext_sync_end_pending_p
- && FRAME_X_EXTENDED_COUNTER (f) != None)
- {
- current = FRAME_X_OUTPUT (f)->current_extended_counter_value;
-
- if (XSyncValueLow32 (current) % 2)
- XSyncIntToValue (&add, 1);
- else
- XSyncIntToValue (&add, 2);
-
- XSyncValueAdd (&FRAME_X_OUTPUT (f)->current_extended_counter_value,
- current, add, &overflow_p);
-
- if (overflow_p)
- emacs_abort ();
-
- XSyncSetCounter (FRAME_X_DISPLAY (f),
- FRAME_X_EXTENDED_COUNTER (f),
- FRAME_X_OUTPUT (f)->current_extended_counter_value);
-
- FRAME_X_OUTPUT (f)->ext_sync_end_pending_p = false;
- }
#else
if (FRAME_X_OUTPUT (f)->xg_sync_end_pending_p)
{
@@ -7091,7 +7598,14 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time,
bool send_event)
{
#ifndef USE_GTK
- struct frame *focus_frame = dpyinfo->x_focus_frame;
+ struct frame *focus_frame;
+ Time old_time;
+#if defined HAVE_XSYNC
+ uint64_t monotonic_time;
+#endif
+
+ focus_frame = dpyinfo->x_focus_frame;
+ old_time = dpyinfo->last_user_time;
#endif
#ifdef ENABLE_CHECKING
@@ -7101,9 +7615,34 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time,
if (!send_event || time > dpyinfo->last_user_time)
dpyinfo->last_user_time = time;
+#if defined HAVE_XSYNC && !defined USE_GTK
+ if (!send_event)
+ {
+ /* See if the current CLOCK_MONOTONIC time is reasonably close
+ to the X server time. */
+ monotonic_time = x_sync_current_monotonic_time ();
+
+ if (time * 1000 > monotonic_time - 500 * 1000
+ && time * 1000 < monotonic_time + 500 * 1000)
+ dpyinfo->server_time_monotonic_p = true;
+ else
+ {
+ /* Compute an offset that can be subtracted from the server
+ time to estimate the monotonic time on the X server. */
+
+ dpyinfo->server_time_monotonic_p = false;
+ dpyinfo->server_time_offset
+ = ((int64_t) time * 1000) - monotonic_time;
+ }
+ }
+#endif
+
#ifndef USE_GTK
- if (focus_frame)
+ /* Don't waste bandwidth if the time hasn't actually changed. */
+ if (focus_frame && old_time != dpyinfo->last_user_time)
{
+ time = dpyinfo->last_user_time;
+
while (FRAME_PARENT_FRAME (focus_frame))
focus_frame = FRAME_PARENT_FRAME (focus_frame);
@@ -7117,6 +7656,26 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time,
#endif
}
+#ifdef USE_GTK
+
+static void
+x_set_gtk_user_time (struct frame *f, Time time)
+{
+ GtkWidget *widget;
+ GdkWindow *window;
+
+ widget = FRAME_GTK_OUTER_WIDGET (f);
+ window = gtk_widget_get_window (widget);
+
+ /* This widget isn't realized yet. */
+ if (!window)
+ return;
+
+ gdk_x11_window_set_user_time (window, time);
+}
+
+#endif
+
/* Not needed on GTK because GTK handles reporting the user time
itself. */
@@ -9006,9 +9565,7 @@ x_composite_image (struct glyph_string *s, Pixmap dest,
{
Picture destination;
XRenderPictFormat *default_format;
- XRenderPictureAttributes attr;
- /* Pacify GCC. */
- memset (&attr, 0, sizeof attr);
+ XRenderPictureAttributes attr UNINIT;
default_format = FRAME_X_PICTURE_FORMAT (s->f);
destination = XRenderCreatePicture (display, dest,
@@ -10164,16 +10721,12 @@ x_clear_frame (struct frame *f)
mark_window_cursors_off (XWINDOW (FRAME_ROOT_WINDOW (f)));
block_input ();
-
font_drop_xrender_surfaces (f);
x_clear_window (f);
/* We have to clear the scroll bars. If we have changed colors or
something like that, then they should be notified. */
x_scroll_bar_clear (f);
-
- XFlush (FRAME_X_DISPLAY (f));
-
unblock_input ();
}
@@ -10551,7 +11104,6 @@ x_scroll_run (struct window *w, struct run *run)
view->clip_bottom - view->clip_top);
}
xwidget_expose (view);
- XFlush (dpy);
}
}
}
@@ -10993,7 +11545,8 @@ x_tooltip_window_to_frame (struct x_display_info *dpyinfo,
GdkWindow *tooltip_window;
#endif
- *unrelated_tooltip_p = false;
+ if (unrelated_tooltip_p)
+ *unrelated_tooltip_p = false;
FOR_EACH_FRAME (tail, frame)
{
@@ -11022,14 +11575,16 @@ x_tooltip_window_to_frame (struct x_display_info *dpyinfo,
if (tooltip_window
&& (gdk_x11_window_get_xid (tooltip_window) == wdesc))
{
- *unrelated_tooltip_p = true;
+ if (unrelated_tooltip_p)
+ *unrelated_tooltip_p = true;
break;
}
#else
if (tooltip_window
&& (GDK_WINDOW_XID (tooltip_window) == wdesc))
{
- *unrelated_tooltip_p = true;
+ if (unrelated_tooltip_p)
+ *unrelated_tooltip_p = true;
break;
}
#endif
@@ -11376,6 +11931,7 @@ x_dnd_process_quit (struct frame *f, Time timestamp)
x_dnd_waiting_for_finish = false;
x_dnd_return_frame_object = NULL;
x_dnd_movement_frame = NULL;
+ x_dnd_wheel_frame = NULL;
}
/* This function is defined far away from the rest of the XDND code so
@@ -11423,6 +11979,9 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
struct x_display_info *event_display;
#endif
unsigned int additional_mask;
+#ifdef HAVE_XINPUT2
+ struct xi_device_t *device;
+#endif
base = SPECPDL_INDEX ();
@@ -11596,11 +12155,40 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
x_dnd_run_unsupported_drop_function = false;
x_dnd_use_toplevels
= x_wm_supports (f, FRAME_DISPLAY_INFO (f)->Xatom_net_client_list_stacking);
+ x_dnd_last_tooltip_valid = false;
x_dnd_toplevels = NULL;
x_dnd_allow_current_frame = allow_current_frame;
x_dnd_movement_frame = NULL;
+ x_dnd_wheel_frame = NULL;
x_dnd_init_type_lists = false;
x_dnd_need_send_drop = false;
+
+#ifdef HAVE_XINPUT2
+
+ if (FRAME_DISPLAY_INFO (f)->supports_xi2)
+ {
+ /* Only accept input from the last master pointer to have interacted
+ with Emacs. This prevents another pointer device getting our
+ idea of the button state messed up. */
+ if (FRAME_DISPLAY_INFO (f)->client_pointer_device != -1)
+ x_dnd_pointer_device
+ = FRAME_DISPLAY_INFO (f)->client_pointer_device;
+ else
+ /* This returns Bool but cannot actually fail. */
+ XIGetClientPointer (FRAME_X_DISPLAY (f), None,
+ &x_dnd_pointer_device);
+
+ x_dnd_keyboard_device = -1;
+
+ device = xi_device_from_id (FRAME_DISPLAY_INFO (f),
+ x_dnd_pointer_device);
+
+ if (device)
+ x_dnd_keyboard_device = device->attachment;
+ }
+
+#endif
+
#ifdef HAVE_XKB
x_dnd_keyboard_state = 0;
@@ -11760,6 +12348,48 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
Fposn_at_x_y (x, y, frame_object, Qnil));
x_dnd_unwind_flag = false;
unbind_to (ref, Qnil);
+
+ /* Redisplay this way to preserve the echo area.
+ Otherwise, the contents will abruptly disappear
+ when the mouse moves over a frame. */
+ redisplay_preserve_echo_area (33);
+ }
+ }
+
+ if (x_dnd_wheel_frame
+ && (x_dnd_in_progress || x_dnd_waiting_for_finish))
+ {
+ XSETFRAME (frame_object, x_dnd_wheel_frame);
+ XSETINT (x, x_dnd_wheel_x);
+ XSETINT (y, x_dnd_wheel_y);
+ x_dnd_wheel_frame = NULL;
+
+ if (!NILP (Vx_dnd_wheel_function)
+ && FRAME_LIVE_P (XFRAME (frame_object))
+ && !FRAME_TOOLTIP_P (XFRAME (frame_object))
+ && x_dnd_movement_x >= 0
+ && x_dnd_movement_y >= 0
+ && x_dnd_frame
+ && (XFRAME (frame_object) != x_dnd_frame
+ || x_dnd_allow_current_frame))
+ {
+ x_dnd_old_window_attrs = root_window_attrs;
+ x_dnd_unwind_flag = true;
+
+ ref = SPECPDL_INDEX ();
+ record_unwind_protect_ptr (x_dnd_cleanup_drag_and_drop, f);
+ call4 (Vx_dnd_wheel_function,
+ Fposn_at_x_y (x, y, frame_object, Qnil),
+ make_fixnum (x_dnd_wheel_button),
+ make_uint (x_dnd_wheel_state),
+ make_uint (x_dnd_wheel_time));
+ x_dnd_unwind_flag = false;
+ unbind_to (ref, Qnil);
+
+ /* Redisplay this way to preserve the echo area.
+ Otherwise, the contents will abruptly disappear
+ when the mouse moves over a frame. */
+ redisplay_preserve_echo_area (33);
}
}
@@ -11866,6 +12496,9 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
if (x_dnd_movement_frame)
x_dnd_movement_frame = NULL;
+ if (x_dnd_wheel_frame)
+ x_dnd_wheel_frame = NULL;
+
if (hold_quit.kind != NO_EVENT)
EVENT_INIT (hold_quit);
}
@@ -11878,6 +12511,7 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
current_hold_quit = NULL;
#endif
x_dnd_movement_frame = NULL;
+ x_dnd_wheel_frame = NULL;
x_restore_events_after_dnd (f, &root_window_attrs);
if (x_dnd_return_frame == 3
@@ -11932,6 +12566,466 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
return unbind_to (base, Qnil);
}
+#ifdef HAVE_XINPUT2
+
+/* Since the input extension assigns a keyboard focus to each master
+ device, there is no longer a 1:1 correspondence between the
+ selected frame and the focus frame immediately after the keyboard
+ focus is switched to a given frame. This situation is handled by
+ keeping track of each master device's focus frame, the time of the
+ last interaction with that frame, and always keeping the focus on
+ the most recently selected frame. We also use the pointer of the
+ device that is keeping the current frame focused in functions like
+ `mouse-position'. */
+
+static void
+xi_handle_focus_change (struct x_display_info *dpyinfo)
+{
+ struct input_event ie;
+ struct frame *focus, *new;
+ struct xi_device_t *device, *source = NULL;
+ ptrdiff_t i;
+ Time time;
+#ifdef USE_GTK
+ struct x_output *output;
+ GtkWidget *widget;
+#endif
+
+ focus = dpyinfo->x_focus_frame;
+ new = NULL;
+ time = 0;
+
+ dpyinfo->client_pointer_device = -1;
+
+ for (i = 0; i < dpyinfo->num_devices; ++i)
+ {
+ device = &dpyinfo->devices[i];
+
+ if (device->focus_frame
+ && device->focus_frame_time > time)
+ {
+ new = device->focus_frame;
+ time = device->focus_frame_time;
+ source = device;
+
+ /* Use this device for future calls to `mouse-position' etc.
+ If it is a keyboard, use its attached pointer. */
+
+ if (device->use == XIMasterKeyboard)
+ dpyinfo->client_pointer_device = device->attachment;
+ else
+ dpyinfo->client_pointer_device = device->device_id;
+ }
+
+ if (device->focus_implicit_frame
+ && device->focus_implicit_time > time)
+ {
+ new = device->focus_implicit_frame;
+ time = device->focus_implicit_time;
+ source = device;
+
+ /* Use this device for future calls to `mouse-position' etc.
+ If it is a keyboard, use its attached pointer. */
+
+ if (device->use == XIMasterKeyboard)
+ dpyinfo->client_pointer_device = device->attachment;
+ else
+ dpyinfo->client_pointer_device = device->device_id;
+ }
+ }
+
+ if (new != focus && focus)
+ {
+#ifdef HAVE_X_I18N
+ if (FRAME_XIC (focus))
+ XUnsetICFocus (FRAME_XIC (focus));
+#endif
+
+#ifdef USE_GTK
+ output = FRAME_X_OUTPUT (focus);
+
+ if (x_gtk_use_native_input)
+ {
+ gtk_im_context_focus_out (output->im_context);
+ gtk_im_context_set_client_window (output->im_context,
+ NULL);
+ }
+#endif
+
+ EVENT_INIT (ie);
+ ie.kind = FOCUS_OUT_EVENT;
+ XSETFRAME (ie.frame_or_window, focus);
+
+ kbd_buffer_store_event (&ie);
+ }
+
+ if (new != focus && new)
+ {
+#ifdef HAVE_X_I18N
+ if (FRAME_XIC (new))
+ XSetICFocus (FRAME_XIC (new));
+#endif
+
+#ifdef USE_GTK
+ output = FRAME_X_OUTPUT (new);
+
+ if (x_gtk_use_native_input)
+ {
+ widget = FRAME_GTK_OUTER_WIDGET (new);
+
+ gtk_im_context_focus_in (output->im_context);
+ gtk_im_context_set_client_window (output->im_context,
+ gtk_widget_get_window (widget));
+ }
+#endif
+
+ EVENT_INIT (ie);
+ ie.kind = FOCUS_IN_EVENT;
+ ie.device = source->name;
+ XSETFRAME (ie.frame_or_window, new);
+
+ kbd_buffer_store_event (&ie);
+ }
+
+ x_new_focus_frame (dpyinfo, new);
+}
+
+static void
+xi_focus_handle_for_device (struct x_display_info *dpyinfo,
+ struct frame *mentioned_frame,
+ XIEvent *base_event)
+{
+ struct xi_device_t *device;
+ XIEnterEvent *event;
+
+ /* XILeaveEvent, XIFocusInEvent, etc are just synonyms for
+ XIEnterEvent. */
+ event = (XIEnterEvent *) base_event;
+ device = xi_device_from_id (dpyinfo, event->deviceid);
+
+ if (!device)
+ return;
+
+ switch (event->evtype)
+ {
+ case XI_FocusIn:
+ device->focus_frame = mentioned_frame;
+ device->focus_frame_time = event->time;
+ break;
+
+ case XI_FocusOut:
+ device->focus_frame = NULL;
+ break;
+
+ case XI_Enter:
+ if (!event->focus)
+ break;
+
+ if (device->use == XIMasterPointer)
+ device = xi_device_from_id (dpyinfo, device->attachment);
+
+ if (!device)
+ break;
+
+ device->focus_implicit_frame = mentioned_frame;
+ device->focus_implicit_time = event->time;
+ break;
+
+ case XI_Leave:
+ if (!event->focus)
+ break;
+
+ if (device->use == XIMasterPointer)
+ device = xi_device_from_id (dpyinfo, device->attachment);
+
+ if (!device)
+ break;
+
+ device->focus_implicit_frame = NULL;
+ break;
+ }
+
+ xi_handle_focus_change (dpyinfo);
+}
+
+static void
+xi_handle_delete_frame (struct x_display_info *dpyinfo,
+ struct frame *f)
+{
+ struct xi_device_t *device;
+ ptrdiff_t i;
+
+ for (i = 0; i < dpyinfo->num_devices; ++i)
+ {
+ device = &dpyinfo->devices[i];
+
+ if (device->focus_frame == f)
+ device->focus_frame = NULL;
+
+ if (device->focus_implicit_frame == f)
+ device->focus_implicit_frame = NULL;
+ }
+}
+
+/* Handle an interaction by DEVICE on frame F. TIME is the time of
+ the interaction; if F isn't currently the global focus frame, but
+ is the focus of DEVICE, make it the focus frame. */
+
+static void
+xi_handle_interaction (struct x_display_info *dpyinfo,
+ struct frame *f, struct xi_device_t *device,
+ Time time)
+{
+ bool change;
+
+ /* If DEVICE is a pointer, use its attached keyboard device. */
+ if (device->use == XIMasterPointer)
+ device = xi_device_from_id (dpyinfo, device->attachment);
+
+ if (!device)
+ return;
+
+ change = false;
+
+ if (device->focus_frame == f)
+ {
+ device->focus_frame_time = time;
+ change = true;
+ }
+
+ if (device->focus_implicit_frame == f)
+ {
+ device->focus_implicit_time = time;
+ change = true;
+ }
+
+ /* If F isn't currently focused, update the focus state. */
+ if (change && f != dpyinfo->x_focus_frame)
+ xi_handle_focus_change (dpyinfo);
+}
+
+#ifdef HAVE_XINPUT2_1
+
+/* Look up a scroll valuator in DEVICE by NUMBER. */
+
+static struct xi_scroll_valuator_t *
+xi_get_scroll_valuator (struct xi_device_t *device, int number)
+{
+ int i;
+
+ for (i = 0; i < device->scroll_valuator_count; ++i)
+ {
+ if (device->valuators[i].number == number)
+ return &device->valuators[i];
+ }
+
+ return NULL;
+}
+
+#endif
+
+/* Handle EVENT, a DeviceChanged event. Look up the device that
+ changed, and update its information with the data in EVENT. */
+
+static void
+xi_handle_device_changed (struct x_display_info *dpyinfo,
+ struct xi_device_t *device,
+ XIDeviceChangedEvent *event)
+{
+#ifdef HAVE_XINPUT2_1
+ XIDeviceInfo *info;
+ XIScrollClassInfo *scroll;
+ int i, ndevices;
+ struct xi_scroll_valuator_t *valuator;
+ XIValuatorClassInfo *valuator_info;
+#endif
+#ifdef HAVE_XINPUT2_2
+ struct xi_touch_point_t *tem, *last;
+ XITouchClassInfo *touch;
+#endif
+
+#ifdef HAVE_XINPUT2_1
+ /* When a DeviceChange event is received for a master device, we
+ don't get any scroll valuators along with it. This is possibly
+ an X server bug but I really don't want to dig any further, so
+ fetch the scroll valuators manually. (bug#57020) */
+
+ x_catch_errors (dpyinfo->display);
+ info = XIQueryDevice (dpyinfo->display, event->deviceid,
+ /* ndevices is always 1 if a deviceid is
+ specified. If the request fails, NULL will
+ be returned. */
+ &ndevices);
+ x_uncatch_errors ();
+
+ if (info)
+ {
+ device->valuators = xrealloc (device->valuators,
+ (info->num_classes
+ * sizeof *device->valuators));
+ device->scroll_valuator_count = 0;
+#ifdef HAVE_XINPUT2_2
+ device->direct_p = false;
+#endif
+
+ for (i = 0; i < info->num_classes; ++i)
+ {
+ switch (info->classes[i]->type)
+ {
+ case XIScrollClass:
+ scroll = (XIScrollClassInfo *) info->classes[i];
+
+ valuator = &device->valuators[device->scroll_valuator_count++];
+ valuator->horizontal = (scroll->scroll_type
+ == XIScrollTypeHorizontal);
+ valuator->invalid_p = true;
+ valuator->emacs_value = DBL_MIN;
+ valuator->increment = scroll->increment;
+ valuator->number = scroll->number;
+ break;
+
+#ifdef HAVE_XINPUT2_2
+ case XITouchClass:
+ touch = (XITouchClassInfo *) info->classes[i];
+
+ if (touch->mode == XIDirectTouch)
+ device->direct_p = true;
+ break;
+#endif
+ }
+ }
+
+ /* Restore the values of any scroll valuators that we already
+ know about. */
+
+ for (i = 0; i < info->num_classes; ++i)
+ {
+ switch (info->classes[i]->type)
+ {
+ case XIValuatorClass:
+ valuator_info = (XIValuatorClassInfo *) info->classes[i];
+
+ valuator = xi_get_scroll_valuator (device,
+ valuator_info->number);
+ if (valuator)
+ {
+ valuator->invalid_p = false;
+ valuator->current_value = valuator_info->value;
+
+ /* Make sure that this is reset if the pointer moves
+ into a window of ours.
+
+ Otherwise the valuator state could be left
+ invalid if the DeviceChange event happened with
+ the pointer outside any Emacs frame. */
+ valuator->pending_enter_reset = true;
+ }
+
+ break;
+ }
+ }
+
+#ifdef HAVE_XINPUT2_2
+ /* The device is no longer a DirectTouch device, so
+ remove any touchpoints that we might have
+ recorded. */
+ if (!device->direct_p)
+ {
+ tem = device->touchpoints;
+
+ while (tem)
+ {
+ last = tem;
+ tem = tem->next;
+ xfree (last);
+ }
+
+ device->touchpoints = NULL;
+ }
+#endif
+
+ XIFreeDeviceInfo (info);
+ }
+#endif
+}
+
+/* Remove the client-side record of every device in TO_DISABLE.
+ Called while processing XI_HierarchyChanged events. We batch up
+ multiple disabled devices because it is more efficient to disable
+ them at once. */
+
+static void
+xi_disable_devices (struct x_display_info *dpyinfo,
+ int *to_disable, int n_disabled)
+{
+ struct xi_device_t *devices;
+ int ndevices, i, j;
+#ifdef HAVE_XINPUT2_2
+ struct xi_touch_point_t *tem, *last;
+#endif
+
+ /* Don't pointlessly copy dpyinfo->devices if there are no devices
+ to disable. */
+ if (!n_disabled)
+ return;
+
+ ndevices = 0;
+ devices = xzalloc (sizeof *devices * dpyinfo->num_devices);
+
+ /* Loop through every device currently in DPYINFO, and copy it to
+ DEVICES if it is not in TO_DISABLE. Note that this function
+ should be called with input blocked, since xfree can otherwise
+ call GC, which will call mark_xterm with invalid state. */
+ for (i = 0; i < dpyinfo->num_devices; ++i)
+ {
+ for (j = 0; j < n_disabled; ++j)
+ {
+ if (to_disable[j] == dpyinfo->devices[i].device_id)
+ {
+ if (x_dnd_in_progress
+ /* If the drag-and-drop pointer device is being
+ disabled, then cancel the drag and drop
+ operation. */
+ && to_disable[j] == x_dnd_pointer_device)
+ x_dnd_cancel_dnd_early ();
+
+ /* Free any scroll valuators that might be on this
+ device. */
+#ifdef HAVE_XINPUT2_1
+ xfree (dpyinfo->devices[i].valuators);
+#endif
+
+ /* Free any currently active touch points on this
+ device. */
+#ifdef HAVE_XINPUT2_2
+ tem = dpyinfo->devices[i].touchpoints;
+ while (tem)
+ {
+ last = tem;
+ tem = tem->next;
+ xfree (last);
+ }
+#endif
+
+ goto out;
+ }
+
+ devices[ndevices++] = dpyinfo->devices[i];
+
+ out:
+ continue;
+ }
+ }
+
+ /* Free the old devices array and replace it with ndevices. */
+ xfree (dpyinfo->devices);
+
+ dpyinfo->devices = devices;
+ dpyinfo->num_devices = ndevices;
+}
+
+#endif
+
/* The focus may have changed. Figure out if it is a real focus change,
by checking both FocusIn/Out and Enter/LeaveNotify events.
@@ -11962,37 +13056,6 @@ x_detect_focus_change (struct x_display_info *dpyinfo, struct frame *frame,
}
break;
-#ifdef HAVE_XINPUT2
- case GenericEvent:
- {
- XIEvent *xi_event = event->xcookie.data;
- XIEnterEvent *enter_or_focus = event->xcookie.data;
-
- struct frame *focus_frame = dpyinfo->x_focus_event_frame;
- int focus_state
- = focus_frame ? focus_frame->output_data.x->focus_state : 0;
-
- if (xi_event->evtype == XI_FocusIn
- || xi_event->evtype == XI_FocusOut)
- x_focus_changed ((xi_event->evtype == XI_FocusIn
- ? FocusIn : FocusOut),
- ((enter_or_focus->detail
- == XINotifyPointer)
- ? FOCUS_IMPLICIT : FOCUS_EXPLICIT),
- dpyinfo, frame, bufp);
- else if ((xi_event->evtype == XI_Enter
- || xi_event->evtype == XI_Leave)
- && (enter_or_focus->detail != XINotifyInferior)
- && enter_or_focus->focus
- && !(focus_state & FOCUS_EXPLICIT))
- x_focus_changed ((xi_event->evtype == XI_Enter
- ? FocusIn : FocusOut),
- FOCUS_IMPLICIT,
- dpyinfo, frame, bufp);
- break;
- }
-#endif
-
case FocusIn:
case FocusOut:
/* Ignore transient focus events from hotkeys, window manager
@@ -12338,6 +13401,68 @@ get_keysym_name (int keysym)
return value;
}
+/* Like XQueryPointer, but always use the right client pointer
+ device. */
+
+Bool
+x_query_pointer (Display *dpy, Window w, Window *root_return,
+ Window *child_return, int *root_x_return,
+ int *root_y_return, int *win_x_return,
+ int *win_y_return, unsigned int *mask_return)
+{
+ Bool rc;
+#ifdef HAVE_XINPUT2
+ struct x_display_info *dpyinfo;
+ bool had_errors;
+ XIModifierState modifiers;
+ XIButtonState buttons;
+ XIGroupState group; /* Unused. */
+ double root_x, root_y, win_x, win_y;
+ unsigned int state;
+#endif
+
+#ifdef HAVE_XINPUT2
+ dpyinfo = x_display_info_for_display (dpy);
+ if (dpyinfo && dpyinfo->client_pointer_device != -1)
+ {
+ /* Catch errors caused by the device going away. This is not
+ very expensive, since XIQueryPointer will sync anyway. */
+ x_catch_errors (dpy);
+ rc = XIQueryPointer (dpyinfo->display,
+ dpyinfo->client_pointer_device,
+ w, root_return, child_return,
+ &root_x, &root_y, &win_x, &win_y,
+ &buttons, &modifiers, &group);
+ had_errors = x_had_errors_p (dpy);
+ x_uncatch_errors_after_check ();
+
+ if (had_errors)
+ rc = XQueryPointer (dpyinfo->display, w, root_return,
+ child_return, root_x_return,
+ root_y_return, win_x_return,
+ win_y_return, mask_return);
+ else
+ {
+ state = 0;
+
+ xi_convert_button_state (&buttons, &state);
+ *mask_return = state | modifiers.effective;
+
+ *root_x_return = lrint (root_x);
+ *root_y_return = lrint (root_y);
+ *win_x_return = lrint (win_x);
+ *win_y_return = lrint (win_y);
+ }
+ }
+ else
+#endif
+ rc = XQueryPointer (dpy, w, root_return, child_return,
+ root_x_return, root_y_return, win_x_return,
+ win_y_return, mask_return);
+
+ return rc;
+}
+
/* Mouse clicks and mouse movement. Rah.
Formerly, we used PointerMotionHintMask (in standard_event_mask)
@@ -12604,20 +13729,20 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
dpyinfo->last_mouse_scroll_bar = NULL;
/* Figure out which root window we're on. */
- XQueryPointer (FRAME_X_DISPLAY (*fp),
- DefaultRootWindow (FRAME_X_DISPLAY (*fp)),
- /* The root window which contains the pointer. */
- &root,
- /* Trash which we can't trust if the pointer is on
- a different screen. */
- &dummy_window,
- /* The position on that root window. */
- &root_x, &root_y,
- /* More trash we can't trust. */
- &dummy, &dummy,
- /* Modifier keys and pointer buttons, about which
- we don't care. */
- (unsigned int *) &dummy);
+ x_query_pointer (FRAME_X_DISPLAY (*fp),
+ DefaultRootWindow (FRAME_X_DISPLAY (*fp)),
+ /* The root window which contains the pointer. */
+ &root,
+ /* Trash which we can't trust if the pointer is on
+ a different screen. */
+ &dummy_window,
+ /* The position on that root window. */
+ &root_x, &root_y,
+ /* More trash we can't trust. */
+ &dummy, &dummy,
+ /* Modifier keys and pointer buttons, about which
+ we don't care. */
+ (unsigned int *) &dummy);
/* Now we have a position on the root; find the innermost window
containing the pointer. */
@@ -12852,6 +13977,37 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
/* Scroll bar support. */
+#if defined HAVE_XINPUT2
+
+/* Select for input extension events used by scroll bars. This will
+ result in the corresponding core events not being generated for
+ SCROLL_BAR. */
+
+MAYBE_UNUSED static void
+xi_select_scroll_bar_events (struct x_display_info *dpyinfo,
+ Window scroll_bar)
+{
+ XIEventMask mask;
+ unsigned char *m;
+ ptrdiff_t length;
+
+ length = XIMaskLen (XI_LASTEVENT);
+ mask.mask = m = alloca (length);
+ memset (m, 0, length);
+ mask.mask_len = length;
+
+ mask.deviceid = XIAllMasterDevices;
+ XISetMask (m, XI_ButtonPress);
+ XISetMask (m, XI_ButtonRelease);
+ XISetMask (m, XI_Motion);
+ XISetMask (m, XI_Enter);
+ XISetMask (m, XI_Leave);
+
+ XISelectEvents (dpyinfo->display, scroll_bar, &mask, 1);
+}
+
+#endif
+
/* Given an X window ID and a DISPLAY, find the struct scroll_bar which
manages it.
This can be called in GC, so we have to make sure to strip off mark
@@ -12933,15 +14089,26 @@ static void x_send_scroll_bar_event (Lisp_Object, enum scroll_bar_part,
static Lisp_Object window_being_scrolled;
-/* Whether this is an Xaw with arrow-scrollbars. This should imply
- that movements of 1/20 of the screen size are mapped to up/down. */
+static Time
+x_get_last_toolkit_time (struct x_display_info *dpyinfo)
+{
+#ifdef USE_X_TOOLKIT
+ return XtLastTimestampProcessed (dpyinfo->display);
+#else
+ return dpyinfo->last_user_time;
+#endif
+}
#ifndef USE_GTK
-/* Id of action hook installed for scroll bars. */
+/* Id of action hook installed for scroll bars and horizontal scroll
+ bars. */
static XtActionHookId action_hook_id;
static XtActionHookId horizontal_action_hook_id;
+/* Whether this is an Xaw with arrow-scrollbars. This should imply
+ that movements of 1/20 of the screen size are mapped to up/down. */
+
static Boolean xaw3d_arrow_scroll;
/* Whether the drag scrolling maintains the mouse at the top of the
@@ -13104,11 +14271,13 @@ x_send_scroll_bar_event (Lisp_Object window, enum scroll_bar_part part,
ev->window = FRAME_X_WINDOW (f);
ev->format = 32;
- /* A 32-bit X client on a 64-bit X server can pass a window pointer
- as-is. A 64-bit client on a 32-bit X server is in trouble
- because a pointer does not fit and would be truncated while
- passing through the server. So use two slots and hope that X12
- will resolve such issues someday. */
+ /* A 32-bit X client can pass a window pointer through the X server
+ as-is.
+
+ A 64-bit client is in trouble because a pointer does not fit in
+ the 32 bits given for ClientMessage data and will be truncated by
+ Xlib. So use two slots and hope that X12 will resolve such
+ issues someday. */
ev->data.l[0] = iw >> 31 >> 1;
ev->data.l[1] = sign_shift <= 0 ? iw : iw << sign_shift >> sign_shift;
ev->data.l[2] = part;
@@ -13152,12 +14321,8 @@ x_scroll_bar_to_input_event (const XEvent *event,
ievent->kind = SCROLL_BAR_CLICK_EVENT;
ievent->frame_or_window = window;
ievent->arg = Qnil;
-#ifdef USE_GTK
- ievent->timestamp = CurrentTime;
-#else
- ievent->timestamp =
- XtLastTimestampProcessed (FRAME_X_DISPLAY (XFRAME (w->frame)));
-#endif
+ ievent->timestamp
+ = x_get_last_toolkit_time (FRAME_DISPLAY_INFO (XFRAME (w->frame)));
ievent->code = 0;
ievent->part = ev->data.l[2];
ievent->x = make_fixnum (ev->data.l[3]);
@@ -13187,12 +14352,8 @@ x_horizontal_scroll_bar_to_input_event (const XEvent *event,
ievent->kind = HORIZONTAL_SCROLL_BAR_CLICK_EVENT;
ievent->frame_or_window = window;
ievent->arg = Qnil;
-#ifdef USE_GTK
- ievent->timestamp = CurrentTime;
-#else
- ievent->timestamp =
- XtLastTimestampProcessed (FRAME_X_DISPLAY (XFRAME (w->frame)));
-#endif
+ ievent->timestamp
+ = x_get_last_toolkit_time (FRAME_DISPLAY_INFO (XFRAME (w->frame)));
ievent->code = 0;
ievent->part = ev->data.l[2];
ievent->x = make_fixnum (ev->data.l[3]);
@@ -13296,19 +14457,31 @@ xm_scroll_callback (Widget widget, XtPointer client_data, XtPointer call_data)
bar widget. DATA is a pointer to the scroll_bar structure. */
static gboolean
-xg_scroll_callback (GtkRange *range,
- GtkScrollType scroll,
- gdouble value,
- gpointer user_data)
+xg_scroll_callback (GtkRange *range, GtkScrollType scroll,
+ gdouble value, gpointer user_data)
{
- int whole = 0, portion = 0;
- struct scroll_bar *bar = user_data;
- enum scroll_bar_part part = scroll_bar_nowhere;
- GtkAdjustment *adj = GTK_ADJUSTMENT (gtk_range_get_adjustment (range));
- struct frame *f = g_object_get_data (G_OBJECT (range), XG_FRAME_DATA);
+ int whole, portion;
+ struct scroll_bar *bar;
+ enum scroll_bar_part part;
+ GtkAdjustment *adj;
+ struct frame *f;
+ guint32 time;
+ struct x_display_info *dpyinfo;
if (xg_ignore_gtk_scrollbar) return false;
+ whole = 0;
+ portion = 0;
+ bar = user_data;
+ part = scroll_bar_nowhere;
+ adj = GTK_ADJUSTMENT (gtk_range_get_adjustment (range));
+ f = g_object_get_data (G_OBJECT (range), XG_FRAME_DATA);
+ time = gtk_get_current_event_time ();
+ dpyinfo = FRAME_DISPLAY_INFO (f);
+
+ if (time != GDK_CURRENT_TIME)
+ x_display_set_last_user_time (dpyinfo, time, true);
+
switch (scroll)
{
case GTK_SCROLL_JUMP:
@@ -13375,8 +14548,11 @@ xg_end_scroll_callback (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
- struct scroll_bar *bar = user_data;
+ struct scroll_bar *bar;
+
+ bar = user_data;
bar->dragging = -1;
+
if (WINDOWP (window_being_scrolled))
{
x_send_scroll_bar_event (window_being_scrolled,
@@ -13624,25 +14800,8 @@ x_create_toolkit_scroll_bar (struct frame *f, struct scroll_bar *bar)
/* Ask for input extension button and motion events. This lets us
send the proper `wheel-up' or `wheel-down' events to Emacs. */
if (FRAME_DISPLAY_INFO (f)->supports_xi2)
- {
- XIEventMask mask;
- ptrdiff_t l = XIMaskLen (XI_LASTEVENT);
- unsigned char *m;
-
- mask.mask = m = alloca (l);
- memset (m, 0, l);
- mask.mask_len = l;
-
- mask.deviceid = XIAllMasterDevices;
- XISetMask (m, XI_ButtonPress);
- XISetMask (m, XI_ButtonRelease);
- XISetMask (m, XI_Motion);
- XISetMask (m, XI_Enter);
- XISetMask (m, XI_Leave);
-
- XISelectEvents (XtDisplay (widget), XtWindow (widget),
- &mask, 1);
- }
+ xi_select_scroll_bar_events (FRAME_DISPLAY_INFO (f),
+ XtWindow (widget));
#endif
#else /* !USE_MOTIF i.e. use Xaw */
@@ -13849,25 +15008,8 @@ x_create_horizontal_toolkit_scroll_bar (struct frame *f, struct scroll_bar *bar)
/* Ask for input extension button and motion events. This lets us
send the proper `wheel-up' or `wheel-down' events to Emacs. */
if (FRAME_DISPLAY_INFO (f)->supports_xi2)
- {
- XIEventMask mask;
- ptrdiff_t l = XIMaskLen (XI_LASTEVENT);
- unsigned char *m;
-
- mask.mask = m = alloca (l);
- memset (m, 0, l);
- mask.mask_len = l;
-
- mask.deviceid = XIAllMasterDevices;
- XISetMask (m, XI_ButtonPress);
- XISetMask (m, XI_ButtonRelease);
- XISetMask (m, XI_Motion);
- XISetMask (m, XI_Enter);
- XISetMask (m, XI_Leave);
-
- XISelectEvents (XtDisplay (widget), XtWindow (widget),
- &mask, 1);
- }
+ xi_select_scroll_bar_events (FRAME_DISPLAY_INFO (f),
+ XtWindow (widget));
#endif
#else /* !USE_MOTIF i.e. use Xaw */
@@ -14255,20 +15397,12 @@ x_scroll_bar_create (struct window *w, int top, int left,
XSetWindowAttributes a;
unsigned long mask;
Window window;
-#ifdef HAVE_XDBE
- Drawable drawable;
-#endif
-
- a.background_pixel = f->output_data.x->scroll_bar_background_pixel;
- if (a.background_pixel == -1)
- a.background_pixel = FRAME_BACKGROUND_PIXEL (f);
a.event_mask = (ButtonPressMask | ButtonReleaseMask
- | ButtonMotionMask | PointerMotionHintMask
- | ExposureMask);
+ | ButtonMotionMask | PointerMotionHintMask);
a.cursor = FRAME_DISPLAY_INFO (f)->vertical_scroll_bar_cursor;
- mask = (CWBackPixel | CWEventMask | CWCursor);
+ mask = (CWEventMask | CWCursor);
/* Clear the area of W that will serve as a scroll bar. This is
for the case that a window has been split horizontally. In
@@ -14276,61 +15410,32 @@ x_scroll_bar_create (struct window *w, int top, int left,
if (width > 0 && window_box_height (w) > 0)
x_clear_area (f, left, top, width, window_box_height (w));
+ /* Create an input only window. Scroll bar contents are drawn to
+ the frame window itself, so they can be double buffered and
+ synchronized using the same mechanism as the frame. */
window = XCreateWindow (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
/* Position and size of scroll bar. */
left, top, width, height,
- /* Border width, depth, class, and visual. */
+ /* Border width. */
0,
+ /* Depth. */
CopyFromParent,
- CopyFromParent,
+ /* Class. */
+ InputOnly,
+ /* Visual class. */
CopyFromParent,
/* Attributes. */
mask, &a);
-#ifdef HAVE_XDBE
- if (FRAME_DISPLAY_INFO (f)->supports_xdbe
- && FRAME_X_DOUBLE_BUFFERED_P (f))
- {
- x_catch_errors (FRAME_X_DISPLAY (f));
- drawable = XdbeAllocateBackBufferName (FRAME_X_DISPLAY (f),
- window, XdbeCopied);
- if (x_had_errors_p (FRAME_X_DISPLAY (f)))
- drawable = window;
- else
- XSetWindowBackgroundPixmap (FRAME_X_DISPLAY (f), window, None);
- x_uncatch_errors_after_check ();
- }
- else
- drawable = window;
-#endif
#ifdef HAVE_XINPUT2
/* Ask for input extension button and motion events. This lets us
send the proper `wheel-up' or `wheel-down' events to Emacs. */
if (FRAME_DISPLAY_INFO (f)->supports_xi2)
- {
- XIEventMask mask;
- ptrdiff_t l = XIMaskLen (XI_LASTEVENT);
- unsigned char *m;
-
- mask.mask = m = alloca (l);
- memset (m, 0, l);
- mask.mask_len = l;
-
- mask.deviceid = XIAllMasterDevices;
- XISetMask (m, XI_ButtonPress);
- XISetMask (m, XI_ButtonRelease);
- XISetMask (m, XI_Motion);
- XISetMask (m, XI_Enter);
- XISetMask (m, XI_Leave);
-
- XISelectEvents (FRAME_X_DISPLAY (f), window, &mask, 1);
- }
+ xi_select_scroll_bar_events (FRAME_DISPLAY_INFO (f),
+ window);
#endif
bar->x_window = window;
-#ifdef HAVE_XDBE
- bar->x_drawable = drawable;
-#endif
}
#endif /* not USE_TOOLKIT_SCROLL_BARS */
@@ -14403,14 +15508,11 @@ static void
x_scroll_bar_set_handle (struct scroll_bar *bar, int start, int end,
bool rebuild)
{
- bool dragging = bar->dragging != -1;
-#ifndef HAVE_XDBE
- Window w = bar->x_window;
-#else
- Drawable w = bar->x_drawable;
-#endif
- struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
- GC gc = f->output_data.x->normal_gc;
+ bool dragging;
+ struct frame *f;
+ Drawable w;
+ GC gc;
+ int inside_width, inside_height, top_range, length;
/* If the display is already accurate, do nothing. */
if (! rebuild
@@ -14418,106 +15520,102 @@ x_scroll_bar_set_handle (struct scroll_bar *bar, int start, int end,
&& end == bar->end)
return;
+ f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
+ dragging = bar->dragging != -1;
+ gc = f->output_data.x->normal_gc;
+ w = FRAME_X_DRAWABLE (f);
+
block_input ();
- {
- int inside_width = VERTICAL_SCROLL_BAR_INSIDE_WIDTH (f, bar->width);
- int inside_height = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, bar->height);
- int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height);
+ inside_width = VERTICAL_SCROLL_BAR_INSIDE_WIDTH (f, bar->width);
+ inside_height = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, bar->height);
+ top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height);
- /* Make sure the values are reasonable, and try to preserve
- the distance between start and end. */
- {
- int length = end - start;
+ /* Make sure the values are reasonable, and try to preserve
+ the distance between start and end. */
+ length = end - start;
- if (start < 0)
- start = 0;
- else if (start > top_range)
- start = top_range;
- end = start + length;
+ if (start < 0)
+ start = 0;
+ else if (start > top_range)
+ start = top_range;
+ end = start + length;
- if (end < start)
- end = start;
- else if (end > top_range && ! dragging)
- end = top_range;
- }
+ if (end < start)
+ end = start;
+ else if (end > top_range && ! dragging)
+ end = top_range;
- /* Store the adjusted setting in the scroll bar. */
- bar->start = start;
- bar->end = end;
+ /* Store the adjusted setting in the scroll bar. */
+ bar->start = start;
+ bar->end = end;
- /* Clip the end position, just for display. */
- if (end > top_range)
- end = top_range;
+ /* Clip the end position, just for display. */
+ if (end > top_range)
+ end = top_range;
- /* Draw bottom positions VERTICAL_SCROLL_BAR_MIN_HANDLE pixels
- below top positions, to make sure the handle is always at least
- that many pixels tall. */
- end += VERTICAL_SCROLL_BAR_MIN_HANDLE;
-
- /* Draw the empty space above the handle. Note that we can't clear
- zero-height areas; that means "clear to end of window." */
- if ((inside_width > 0) && (start > 0))
- {
- if (f->output_data.x->scroll_bar_background_pixel != -1)
- XSetForeground (FRAME_X_DISPLAY (f), gc,
- f->output_data.x->scroll_bar_background_pixel);
- else
- XSetForeground (FRAME_X_DISPLAY (f), gc,
- FRAME_BACKGROUND_PIXEL (f));
-
- XFillRectangle (FRAME_X_DISPLAY (f), w, gc,
- VERTICAL_SCROLL_BAR_LEFT_BORDER,
- VERTICAL_SCROLL_BAR_TOP_BORDER,
- inside_width, start);
+ /* Draw bottom positions VERTICAL_SCROLL_BAR_MIN_HANDLE pixels
+ below top positions, to make sure the handle is always at least
+ that many pixels tall. */
+ end += VERTICAL_SCROLL_BAR_MIN_HANDLE;
+ /* Draw the empty space above the handle. Note that we can't clear
+ zero-height areas; that means "clear to end of window." */
+ if ((inside_width > 0) && (start > 0))
+ {
+ if (f->output_data.x->scroll_bar_background_pixel != -1)
XSetForeground (FRAME_X_DISPLAY (f), gc,
- FRAME_FOREGROUND_PIXEL (f));
- }
+ f->output_data.x->scroll_bar_background_pixel);
+ else
+ XSetForeground (FRAME_X_DISPLAY (f), gc,
+ FRAME_BACKGROUND_PIXEL (f));
- /* Change to proper foreground color if one is specified. */
- if (f->output_data.x->scroll_bar_foreground_pixel != -1)
- XSetForeground (FRAME_X_DISPLAY (f), gc,
- f->output_data.x->scroll_bar_foreground_pixel);
+ XFillRectangle (FRAME_X_DISPLAY (f), w, gc,
+ bar->left + VERTICAL_SCROLL_BAR_LEFT_BORDER,
+ bar->top + VERTICAL_SCROLL_BAR_TOP_BORDER,
+ inside_width, start);
- /* Draw the handle itself. */
- XFillRectangle (FRAME_X_DISPLAY (f), w, gc,
- /* x, y, width, height */
- VERTICAL_SCROLL_BAR_LEFT_BORDER,
- VERTICAL_SCROLL_BAR_TOP_BORDER + start,
- inside_width, end - start);
+ XSetForeground (FRAME_X_DISPLAY (f), gc,
+ FRAME_FOREGROUND_PIXEL (f));
+ }
+ /* Change to proper foreground color if one is specified. */
+ if (f->output_data.x->scroll_bar_foreground_pixel != -1)
+ XSetForeground (FRAME_X_DISPLAY (f), gc,
+ f->output_data.x->scroll_bar_foreground_pixel);
- /* Draw the empty space below the handle. Note that we can't
- clear zero-height areas; that means "clear to end of window." */
- if ((inside_width > 0) && (end < inside_height))
- {
- if (f->output_data.x->scroll_bar_background_pixel != -1)
- XSetForeground (FRAME_X_DISPLAY (f), gc,
- f->output_data.x->scroll_bar_background_pixel);
- else
- XSetForeground (FRAME_X_DISPLAY (f), gc,
- FRAME_BACKGROUND_PIXEL (f));
+ /* Draw the handle itself. */
+ XFillRectangle (FRAME_X_DISPLAY (f), w, gc,
+ /* x, y, width, height */
+ bar->left + VERTICAL_SCROLL_BAR_LEFT_BORDER,
+ bar->top + VERTICAL_SCROLL_BAR_TOP_BORDER + start,
+ inside_width, end - start);
- XFillRectangle (FRAME_X_DISPLAY (f), w, gc,
- VERTICAL_SCROLL_BAR_LEFT_BORDER,
- VERTICAL_SCROLL_BAR_TOP_BORDER + end,
- inside_width, inside_height - end);
+ /* Draw the empty space below the handle. Note that we can't
+ clear zero-height areas; that means "clear to end of window." */
+ if ((inside_width > 0) && (end < inside_height))
+ {
+ if (f->output_data.x->scroll_bar_background_pixel != -1)
XSetForeground (FRAME_X_DISPLAY (f), gc,
- FRAME_FOREGROUND_PIXEL (f));
- }
+ f->output_data.x->scroll_bar_background_pixel);
+ else
+ XSetForeground (FRAME_X_DISPLAY (f), gc,
+ FRAME_BACKGROUND_PIXEL (f));
+
+ XFillRectangle (FRAME_X_DISPLAY (f), w, gc,
+ bar->left + VERTICAL_SCROLL_BAR_LEFT_BORDER,
+ bar->top + VERTICAL_SCROLL_BAR_TOP_BORDER + end,
+ inside_width, inside_height - end);
- /* Restore the foreground color of the GC if we changed it above. */
- if (f->output_data.x->scroll_bar_foreground_pixel != -1)
XSetForeground (FRAME_X_DISPLAY (f), gc,
FRAME_FOREGROUND_PIXEL (f));
- }
+ }
-#ifdef HAVE_XDBE
- if (!rebuild)
- x_scroll_bar_end_update (FRAME_DISPLAY_INFO (f), bar);
-#endif
+ /* Restore the foreground color of the GC if we changed it above. */
+ if (f->output_data.x->scroll_bar_foreground_pixel != -1)
+ XSetForeground (FRAME_X_DISPLAY (f), gc,
+ FRAME_FOREGROUND_PIXEL (f));
unblock_input ();
}
@@ -14540,11 +15638,6 @@ x_scroll_bar_remove (struct scroll_bar *bar)
XtDestroyWidget (SCROLL_BAR_X_WIDGET (FRAME_X_DISPLAY (f), bar));
#endif /* not USE_GTK */
#else
-#ifdef HAVE_XDBE
- if (bar->x_window != bar->x_drawable)
- XdbeDeallocateBackBufferName (FRAME_X_DISPLAY (f),
- bar->x_drawable);
-#endif
XDestroyWindow (FRAME_X_DISPLAY (f), bar->x_window);
#endif
@@ -14590,6 +15683,12 @@ XTset_vertical_scroll_bar (struct window *w, int portion, int whole, int positio
}
bar = x_scroll_bar_create (w, top, left, width, max (height, 1), false);
+#ifndef USE_TOOLKIT_SCROLL_BARS
+ /* Since non-toolkit scroll bars don't display their contents to
+ a dedicated window, no expose event will be generated.
+ Redraw the scroll bar manually. */
+ x_scroll_bar_redraw (bar);
+#endif
}
else
{
@@ -14649,6 +15748,11 @@ XTset_vertical_scroll_bar (struct window *w, int portion, int whole, int positio
bar->width = width;
bar->height = height;
+#ifndef USE_TOOLKIT_SCROLL_BARS
+ /* Redraw the scroll bar. */
+ x_scroll_bar_redraw (bar);
+#endif
+
unblock_input ();
}
@@ -14956,60 +16060,84 @@ XTjudge_scroll_bars (struct frame *f)
#ifndef USE_TOOLKIT_SCROLL_BARS
-/* Handle an Expose or GraphicsExpose event on a scroll bar. This
- is a no-op when using toolkit scroll bars.
-
- This may be called from a signal handler, so we have to ignore GC
- mark bits. */
+/* Handle exposure event EVENT generated for F, by redrawing all
+ intersecting scroll bars. */
static void
-x_scroll_bar_expose (struct scroll_bar *bar, const XEvent *event)
+x_scroll_bar_handle_exposure (struct frame *f, XEvent *event)
{
-#ifndef HAVE_XDBE
- Window w = bar->x_window;
-#else
- Drawable w = bar->x_drawable;
int x, y, width, height;
+ XRectangle rect, scroll_bar_rect, intersection;
+ Lisp_Object bar, condemned;
+ struct scroll_bar *b;
- if (event->type == Expose)
+ if (event->type == GraphicsExpose)
+ {
+ x = event->xgraphicsexpose.x;
+ y = event->xgraphicsexpose.y;
+ width = event->xgraphicsexpose.width;
+ height = event->xgraphicsexpose.height;
+ }
+ else
{
x = event->xexpose.x;
y = event->xexpose.y;
width = event->xexpose.width;
height = event->xexpose.height;
}
- else
+
+ rect.x = x;
+ rect.y = y;
+ rect.width = width;
+ rect.height = height;
+
+ /* Scan this frame's scroll bar list for intersecting scroll
+ bars. */
+ condemned = FRAME_CONDEMNED_SCROLL_BARS (f);
+ for (bar = FRAME_SCROLL_BARS (f);
+ /* This trick allows us to search both the ordinary and
+ condemned scroll bar lists with one loop. */
+ !NILP (bar) || (bar = condemned,
+ condemned = Qnil,
+ !NILP (bar));
+ bar = XSCROLL_BAR (bar)->next)
{
- x = event->xgraphicsexpose.x;
- y = event->xgraphicsexpose.y;
- width = event->xgraphicsexpose.width;
- height = event->xgraphicsexpose.height;
+ b = XSCROLL_BAR (bar);
+
+ scroll_bar_rect.x = b->left;
+ scroll_bar_rect.y = b->top;
+ scroll_bar_rect.width = b->width;
+ scroll_bar_rect.height = b->height;
+
+ if (gui_intersect_rectangles (&rect,
+ &scroll_bar_rect,
+ &intersection))
+ x_scroll_bar_redraw (b);
}
-#endif
+}
+
+/* Redraw the scroll bar BAR. Draw its border and set its thumb.
+ This is usually called from x_clear_frame, but is also used to
+ handle exposure events that overlap scroll bars. */
+static void
+x_scroll_bar_redraw (struct scroll_bar *bar)
+{
struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
GC gc = f->output_data.x->normal_gc;
- block_input ();
-
-#ifdef HAVE_XDBE
- if (w != bar->x_window)
- {
- if (f->output_data.x->scroll_bar_background_pixel != -1)
- XSetForeground (FRAME_X_DISPLAY (f), gc,
- f->output_data.x->scroll_bar_background_pixel);
- else
- XSetForeground (FRAME_X_DISPLAY (f), gc,
- FRAME_BACKGROUND_PIXEL (f));
+ if (f->output_data.x->scroll_bar_background_pixel != -1)
+ XSetForeground (FRAME_X_DISPLAY (f), gc,
+ f->output_data.x->scroll_bar_background_pixel);
+ else
+ XSetForeground (FRAME_X_DISPLAY (f), gc,
+ FRAME_BACKGROUND_PIXEL (f));
- XFillRectangle (FRAME_X_DISPLAY (f),
- bar->x_drawable,
- gc, x, y, width, height);
+ XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f), gc,
+ bar->left, bar->top, bar->width, bar->height);
- XSetForeground (FRAME_X_DISPLAY (f), gc,
- FRAME_FOREGROUND_PIXEL (f));
- }
-#endif
+ XSetForeground (FRAME_X_DISPLAY (f), gc,
+ FRAME_FOREGROUND_PIXEL (f));
x_scroll_bar_set_handle (bar, bar->start, bar->end, true);
@@ -15019,27 +16147,13 @@ x_scroll_bar_expose (struct scroll_bar *bar, const XEvent *event)
f->output_data.x->scroll_bar_foreground_pixel);
/* Draw a one-pixel border just inside the edges of the scroll bar. */
- XDrawRectangle (FRAME_X_DISPLAY (f), w, gc,
- /* x, y, width, height */
- 0, 0, bar->width - 1, bar->height - 1);
-
- /* XDrawPoint (FRAME_X_DISPLAY (f), w, gc,
- bar->width - 1, bar->height - 1);
-
- This code is no longer required since the normal GC now uses the
- regular line width. */
+ XDrawRectangle (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f), gc,
+ bar->left, bar->top, bar->width - 1, bar->height - 1);
/* Restore the foreground color of the GC if we changed it above. */
if (f->output_data.x->scroll_bar_foreground_pixel != -1)
XSetForeground (FRAME_X_DISPLAY (f), gc,
FRAME_FOREGROUND_PIXEL (f));
-
-#ifdef HAVE_XDBE
- x_scroll_bar_end_update (FRAME_DISPLAY_INFO (f), bar);
-#endif
-
- unblock_input ();
-
}
#endif /* not USE_TOOLKIT_SCROLL_BARS */
@@ -15180,24 +16294,6 @@ x_scroll_bar_note_movement (struct scroll_bar *bar,
}
}
-#ifdef HAVE_XDBE
-static void
-x_scroll_bar_end_update (struct x_display_info *dpyinfo,
- struct scroll_bar *bar)
-{
- XdbeSwapInfo swap_info;
-
- /* This means the scroll bar is double-buffered. */
- if (bar->x_drawable != bar->x_window)
- {
- memset (&swap_info, 0, sizeof swap_info);
- swap_info.swap_window = bar->x_window;
- swap_info.swap_action = XdbeCopied;
- XdbeSwapBuffers (dpyinfo->display, &swap_info, 1);
- }
-}
-#endif
-
#endif /* !USE_TOOLKIT_SCROLL_BARS */
/* Return information to the user about the current position of the mouse
@@ -15221,17 +16317,17 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window,
/* Get the mouse's position relative to the scroll bar window, and
report that. */
- if (XQueryPointer (FRAME_X_DISPLAY (f), w,
+ if (x_query_pointer (FRAME_X_DISPLAY (f), w,
- /* Root, child, root x and root y. */
- &dummy_window, &dummy_window,
- &dummy_coord, &dummy_coord,
+ /* Root, child, root x and root y. */
+ &dummy_window, &dummy_window,
+ &dummy_coord, &dummy_coord,
- /* Position relative to scroll bar. */
- &win_x, &win_y,
+ /* Position relative to scroll bar. */
+ &win_x, &win_y,
- /* Mouse buttons and modifier keys. */
- &dummy_mask))
+ /* Mouse buttons and modifier keys. */
+ &dummy_mask))
{
int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height);
@@ -15290,17 +16386,17 @@ x_horizontal_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_windo
/* Get the mouse's position relative to the scroll bar window, and
report that. */
- if (XQueryPointer (FRAME_X_DISPLAY (f), w,
+ if (x_query_pointer (FRAME_X_DISPLAY (f), w,
- /* Root, child, root x and root y. */
- &dummy_window, &dummy_window,
- &dummy_coord, &dummy_coord,
+ /* Root, child, root x and root y. */
+ &dummy_window, &dummy_window,
+ &dummy_coord, &dummy_coord,
- /* Position relative to scroll bar. */
- &win_x, &win_y,
+ /* Position relative to scroll bar. */
+ &win_x, &win_y,
- /* Mouse buttons and modifier keys. */
- &dummy_mask))
+ /* Mouse buttons and modifier keys. */
+ &dummy_mask))
{
int left_range = HORIZONTAL_SCROLL_BAR_LEFT_RANGE (f, bar->width);
@@ -15338,17 +16434,15 @@ x_horizontal_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_windo
}
-/* The screen has been cleared so we may have changed foreground or
- background colors, and the scroll bars may need to be redrawn.
- Clear out the scroll bars, and ask for expose events, so we can
- redraw them. */
+/* The screen has been cleared and foreground or background colors may
+ have changed, so the scroll bars need to be redrawn. Clear the
+ scroll bars and redraw them. */
static void
x_scroll_bar_clear (struct frame *f)
{
#ifndef USE_TOOLKIT_SCROLL_BARS
- Lisp_Object bar;
-#ifdef HAVE_XDBE
+ Lisp_Object bar, condemned;
GC gc = f->output_data.x->normal_gc;
if (f->output_data.x->scroll_bar_background_pixel != -1)
@@ -15357,35 +16451,25 @@ x_scroll_bar_clear (struct frame *f)
else
XSetForeground (FRAME_X_DISPLAY (f), gc,
FRAME_BACKGROUND_PIXEL (f));
-#endif
/* We can have scroll bars even if this is 0,
if we just turned off scroll bar mode.
But in that case we should not clear them. */
if (FRAME_HAS_VERTICAL_SCROLL_BARS (f))
- for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
- bar = XSCROLL_BAR (bar)->next)
- {
-#ifdef HAVE_XDBE
- if (XSCROLL_BAR (bar)->x_window
- == XSCROLL_BAR (bar)->x_drawable)
-#endif
- XClearArea (FRAME_X_DISPLAY (f),
- XSCROLL_BAR (bar)->x_window,
- 0, 0, 0, 0, True);
-#ifdef HAVE_XDBE
- else
- XFillRectangle (FRAME_X_DISPLAY (f),
- XSCROLL_BAR (bar)->x_drawable,
- gc, 0, 0, XSCROLL_BAR (bar)->width,
- XSCROLL_BAR (bar)->height);
-#endif
- }
+ {
+ condemned = FRAME_CONDEMNED_SCROLL_BARS (f);
+ for (bar = FRAME_SCROLL_BARS (f);
+ /* This trick allows us to search both the ordinary and
+ condemned scroll bar lists with one loop. */
+ !NILP (bar) || (bar = condemned,
+ condemned = Qnil,
+ !NILP (bar));
+ bar = XSCROLL_BAR (bar)->next)
+ x_scroll_bar_redraw (XSCROLL_BAR (bar));
+ }
-#ifdef HAVE_XDBE
XSetForeground (FRAME_X_DISPLAY (f), gc,
FRAME_FOREGROUND_PIXEL (f));
-#endif
#endif /* not USE_TOOLKIT_SCROLL_BARS */
}
@@ -15789,6 +16873,15 @@ x_dnd_update_tooltip_position (int root_x, int root_y)
x_dnd_compute_tip_xy (&root_x, &root_y,
x_dnd_monitors);
+ if (x_dnd_last_tooltip_valid
+ && root_x == x_dnd_last_tooltip_x
+ && root_y == x_dnd_last_tooltip_y)
+ return;
+
+ x_dnd_last_tooltip_x = root_x;
+ x_dnd_last_tooltip_y = root_y;
+ x_dnd_last_tooltip_valid = true;
+
XMoveWindow (FRAME_X_DISPLAY (x_dnd_frame),
tip_window, root_x, root_y);
}
@@ -16162,6 +17255,29 @@ x_wait_for_cell_change (Lisp_Object cell, struct timespec timeout)
}
}
+/* Find whether or not an undelivered MONITORS_CHANGED_EVENT is
+ already on the event queue. DPYINFO is the display any such event
+ must apply to. */
+
+static bool
+x_find_monitors_changed_event (struct x_display_info *dpyinfo)
+{
+ union buffered_input_event *event;
+
+ event = kbd_fetch_ptr;
+
+ while (event != kbd_store_ptr)
+ {
+ if (event->ie.kind == MONITORS_CHANGED_EVENT
+ && XTERMINAL (event->ie.arg) == dpyinfo->terminal)
+ return true;
+
+ event = X_NEXT_KBD_EVENT (event);
+ }
+
+ return false;
+}
+
#ifdef USE_GTK
static void
x_monitors_changed_cb (GdkScreen *gscr, gpointer user_data)
@@ -16179,6 +17295,9 @@ x_monitors_changed_cb (GdkScreen *gscr, gpointer user_data)
if (!dpyinfo)
return;
+ if (x_find_monitors_changed_event (dpyinfo))
+ return;
+
XSETTERMINAL (terminal, dpyinfo->terminal);
current_monitors
@@ -16306,6 +17425,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
union buffered_input_event inev;
int count = 0;
int do_help = 0;
+#ifdef HAVE_XINPUT2
+ struct xi_device_t *gen_help_device;
+ Time gen_help_time;
+#endif
ptrdiff_t nbytes = 0;
struct frame *any, *f = NULL;
Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
@@ -16335,6 +17458,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
EVENT_INIT (inev.ie);
inev.ie.kind = NO_EVENT;
inev.ie.arg = Qnil;
+#ifdef HAVE_XINPUT2
+ gen_help_device = NULL;
+#endif
/* Ignore events coming from various extensions, such as XFIXES and
XKB. */
@@ -16369,6 +17495,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
Window target;
unsigned long r1, r2;
+ int root_x, root_y;
+ bool button;
target = event->xclient.data.l[0];
@@ -16414,17 +17542,43 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
if (x_dnd_pending_send_position.type != 0)
{
- x_ignore_errors_for_next_request (dpyinfo);
- XSendEvent (dpyinfo->display, target,
- False, NoEventMask,
- &x_dnd_pending_send_position);
- x_stop_ignoring_errors (dpyinfo);
- x_dnd_pending_send_position.type = 0;
-
- /* Since we sent another XdndPosition message, we
- have to wait for another one in reply, so don't
- reset `x_dnd_waiting_for_status_window'
- here. */
+ /* If the last XdndStatus specified a mouse
+ rectangle and this event falls inside, don't
+ send the event, but clear
+ x_dnd_waiting_for_status_window instead. */
+
+ root_x = x_dnd_pending_send_position_root_x;
+ root_y = x_dnd_pending_send_position_root_y;
+ button = x_dnd_pending_send_position_button;
+
+ if (target == x_dnd_mouse_rect_target
+ && x_dnd_mouse_rect.width
+ && x_dnd_mouse_rect.height
+ /* Ignore the mouse rectangle if we're
+ supposed to be sending a button press
+ instead. */
+ && !button
+ && (root_x >= x_dnd_mouse_rect.x
+ && root_x < (x_dnd_mouse_rect.x
+ + x_dnd_mouse_rect.width)
+ && root_y >= x_dnd_mouse_rect.y
+ && root_y < (x_dnd_mouse_rect.y
+ + x_dnd_mouse_rect.height)))
+ x_dnd_waiting_for_status_window = None;
+ else
+ {
+ x_ignore_errors_for_next_request (dpyinfo);
+ XSendEvent (dpyinfo->display, target,
+ False, NoEventMask,
+ &x_dnd_pending_send_position);
+ x_stop_ignoring_errors (dpyinfo);
+ x_dnd_pending_send_position.type = 0;
+
+ /* Since we sent another XdndPosition message, we
+ have to wait for another one in reply, so don't
+ reset `x_dnd_waiting_for_status_window'
+ here. */
+ }
}
else
x_dnd_waiting_for_status_window = None;
@@ -16668,8 +17822,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
else if (event->xclient.data.l[4] == 1)
{
- XSyncIntsToValue (&FRAME_X_OUTPUT (f)->current_extended_counter_value,
- event->xclient.data.l[2], event->xclient.data.l[3]);
+ XSyncIntsToValue (&FRAME_X_OUTPUT (f)->resize_counter_value,
+ event->xclient.data.l[2],
+ event->xclient.data.l[3]);
+
FRAME_X_OUTPUT (f)->ext_sync_end_pending_p = true;
}
@@ -16786,10 +17942,29 @@ handle_one_xevent (struct x_display_info *dpyinfo,
goto done;
}
- xft_settings_event (dpyinfo, event);
+#if defined HAVE_XSYNC && !defined USE_GTK
+ /* These messages are sent by the compositing manager after a
+ frame is drawn under extended synchronization. */
+ if (event->xclient.message_type
+ == dpyinfo->Xatom_net_wm_frame_drawn)
+ {
+ if (any)
+ x_sync_handle_frame_drawn (dpyinfo, (XEvent *) event, any);
+
+ goto done;
+ }
+
+ if (event->xclient.message_type
+ == dpyinfo->Xatom_net_wm_frame_timings)
+ goto done;
+#endif
+
+ if (xft_settings_event (dpyinfo, event))
+ goto done;
f = any;
- if (!f)
+ /* We don't want to ever leak tooltip frames to Lisp code. */
+ if (!f || FRAME_TOOLTIP_P (f))
goto OTHER;
/* These values are always used initialized, but GCC doesn't
@@ -16811,6 +17986,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (!x_window_to_frame (dpyinfo, event->xselection.requestor))
goto OTHER;
#endif /* not USE_X_TOOLKIT and not USE_GTK */
+#ifdef HAVE_GTK3
+ /* GTK 3 apparently chokes on these events since they have no
+ associated device. (bug#56869, another bug as well that I
+ can't find) */
+ *finish = X_EVENT_DROP;
+#endif
x_handle_selection_notify (&event->xselection);
break;
@@ -16819,6 +18000,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (!x_window_to_frame (dpyinfo, event->xselectionclear.window))
goto OTHER;
#endif /* not USE_X_TOOLKIT and not USE_GTK */
+#ifdef HAVE_GTK3
+ *finish = X_EVENT_DROP;
+#endif
{
const XSelectionClearEvent *eventp = &event->xselectionclear;
@@ -16845,6 +18029,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (!x_window_to_frame (dpyinfo, event->xselectionrequest.owner))
goto OTHER;
#endif /* USE_X_TOOLKIT */
+#ifdef HAVE_GTK3
+ *finish = X_EVENT_DROP;
+#endif
{
const XSelectionRequestEvent *eventp = &event->xselectionrequest;
@@ -17214,7 +18401,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (!FRAME_GARBAGED_P (f))
{
-#ifdef USE_X_TOOLKIT
+#if defined USE_X_TOOLKIT && defined USE_TOOLKIT_SCROLL_BARS
if (f->output_data.x->edit_widget)
/* The widget's expose proc will be run in this
case. */
@@ -17229,10 +18416,17 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
expose_frame (f, event->xexpose.x, event->xexpose.y,
event->xexpose.width, event->xexpose.height);
+#ifndef USE_TOOLKIT_SCROLL_BARS
+ x_scroll_bar_handle_exposure (f, (XEvent *) event);
+#endif
#ifdef USE_GTK
x_clear_under_internal_border (f);
#endif
}
+#ifndef USE_TOOLKIT_SCROLL_BARS
+ else
+ x_scroll_bar_handle_exposure (f, (XEvent *) event);
+#endif
#ifdef HAVE_XDBE
if (!FRAME_GARBAGED_P (f))
@@ -17241,9 +18435,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
else
{
-#ifndef USE_TOOLKIT_SCROLL_BARS
- struct scroll_bar *bar;
-#endif
#if defined USE_LUCID
/* Submenus of the Lucid menu bar aren't widgets
themselves, so there's no way to dispatch events
@@ -17255,20 +18446,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
#endif /* USE_LUCID */
-#ifdef USE_TOOLKIT_SCROLL_BARS
/* Dispatch event to the widget. */
goto OTHER;
-#else /* not USE_TOOLKIT_SCROLL_BARS */
- bar = x_window_to_scroll_bar (event->xexpose.display,
- event->xexpose.window, 2);
-
- if (bar)
- x_scroll_bar_expose (bar, event);
-#ifdef USE_X_TOOLKIT
- else
- goto OTHER;
-#endif /* USE_X_TOOLKIT */
-#endif /* not USE_TOOLKIT_SCROLL_BARS */
}
break;
@@ -17282,6 +18461,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
event->xgraphicsexpose.y,
event->xgraphicsexpose.width,
event->xgraphicsexpose.height);
+#ifndef USE_TOOLKIT_SCROLL_BARS
+ x_scroll_bar_handle_exposure (f, (XEvent *) event);
+#endif
#ifdef USE_GTK
x_clear_under_internal_border (f);
#endif
@@ -17289,16 +18471,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
show_back_buffer (f);
#endif
}
-#ifndef USE_TOOLKIT_SCROLL_BARS
- struct scroll_bar *bar
- = x_window_to_scroll_bar (dpyinfo->display,
- /* Hopefully this is just a window,
- not the back buffer. */
- event->xgraphicsexpose.drawable, 2);
-
- if (bar)
- x_scroll_bar_expose (bar, event);
-#endif
#ifdef USE_X_TOOLKIT
else
goto OTHER;
@@ -17402,6 +18574,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
if (x_dnd_in_progress
+ /* When _NET_WM_CLIENT_LIST stacking is being used, changes
+ in that property are watched for, and it's not necessary
+ to update the state in response to ordinary window
+ substructure events. */
+ && !x_dnd_use_toplevels
&& dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
x_dnd_update_state (dpyinfo, dpyinfo->last_user_time);
@@ -17501,6 +18678,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
x_display_set_last_user_time (dpyinfo, event->xkey.time,
event->xkey.send_event);
ignore_next_mouse_click_timeout = 0;
+
coding = Qlatin_1;
#if defined (USE_X_TOOLKIT) || defined (USE_GTK)
@@ -17511,6 +18689,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = any;
+#ifdef USE_GTK
+ if (f)
+ x_set_gtk_user_time (f, event->xkey.time);
+#endif
+
/* If mouse-highlight is an integer, input clears out
mouse highlighting. */
if (!hlinfo->mouse_face_hidden && FIXNUMP (Vmouse_highlight)
@@ -17562,7 +18745,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
/* `xkey' will be modified, but it's not important to modify
`event' itself. */
XKeyEvent xkey = event->xkey;
- int i;
+
#ifdef HAVE_XINPUT2
Time pending_keystroke_time;
struct xi_device_t *source;
@@ -17612,27 +18795,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (modifiers & dpyinfo->meta_mod_mask)
memset (&compose_status, 0, sizeof (compose_status));
-#ifdef HAVE_XKB
- if (dpyinfo->xkb_desc)
- {
- XkbDescRec *rec = dpyinfo->xkb_desc;
-
- if (rec->map->modmap && rec->map->modmap[xkey.keycode])
- goto done_keysym;
- }
- else
-#endif
- {
- if (dpyinfo->modmap)
- {
- for (i = 0; i < 8 * dpyinfo->modmap->max_keypermod; i++)
- {
- if (xkey.keycode == dpyinfo->modmap->modifiermap[i])
- goto done_keysym;
- }
- }
- }
-
#ifdef HAVE_X_I18N
if (FRAME_XIC (f))
{
@@ -18109,6 +19271,19 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
if (f)
{
+ /* Now clear dpyinfo->last_mouse_motion_frame, or
+ gui_redo_mouse_highlight will end up highlighting the
+ last known position of the mouse if a tooltip frame is
+ later unmapped. */
+
+ if (f == dpyinfo->last_mouse_motion_frame)
+ dpyinfo->last_mouse_motion_frame = NULL;
+
+ /* Something similar applies to
+ dpyinfo->last_mouse_glyph_frame. */
+ if (f == dpyinfo->last_mouse_glyph_frame)
+ dpyinfo->last_mouse_glyph_frame = NULL;
+
if (f == hlinfo->mouse_face_mouse_frame)
{
/* If we move outside the frame, then we're
@@ -18521,13 +19696,24 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (configureEvent.xconfigure.width != dpyinfo->screen_width
|| configureEvent.xconfigure.height != dpyinfo->screen_height)
{
- inev.ie.kind = MONITORS_CHANGED_EVENT;
- XSETTERMINAL (inev.ie.arg, dpyinfo->terminal);
+ /* Also avoid storing duplicate events here, since
+ Fx_display_monitor_attributes_list will return the
+ same information for both invocations of the
+ hook. */
+ if (!x_find_monitors_changed_event (dpyinfo))
+ {
+ inev.ie.kind = MONITORS_CHANGED_EVENT;
+ XSETTERMINAL (inev.ie.arg, dpyinfo->terminal);
+
+ /* Store this event now since inev.ie.type could be set to
+ MOVE_FRAME_EVENT later. */
+ kbd_buffer_store_event (&inev.ie);
+ inev.ie.kind = NO_EVENT;
+ }
- /* Store this event now since inev.ie.type could be set to
- MOVE_FRAME_EVENT later. */
- kbd_buffer_store_event (&inev.ie);
- inev.ie.kind = NO_EVENT;
+ /* Also update the position of the drag-and-drop
+ tooltip. */
+ x_dnd_update_tooltip_now ();
}
#endif
@@ -18851,10 +20037,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
dpyinfo->grabbed |= (1 << event->xbutton.button);
dpyinfo->last_mouse_frame = f;
- if (f && !tab_bar_p)
+
+ if (f)
f->last_tab_bar_item = -1;
#if ! defined (USE_GTK)
- if (f && !tool_bar_p)
+ if (f)
f->last_tool_bar_item = -1;
#endif /* not USE_GTK */
}
@@ -18862,18 +20049,26 @@ handle_one_xevent (struct x_display_info *dpyinfo,
dpyinfo->grabbed &= ~(1 << event->xbutton.button);
if (event->xbutton.type == ButtonPress
- && x_dnd_last_seen_window != None
- && x_dnd_last_protocol_version != -1)
+ && x_dnd_last_seen_window != None)
{
- x_dnd_send_position (x_dnd_frame,
- x_dnd_last_seen_window,
- x_dnd_last_protocol_version,
- event->xbutton.x_root,
- event->xbutton.y_root,
- x_dnd_selection_timestamp,
- x_dnd_wanted_action,
- event->xbutton.button,
- event->xbutton.state);
+ if (x_dnd_last_window_is_frame)
+ x_dnd_note_self_wheel (dpyinfo,
+ x_dnd_last_seen_window,
+ event->xbutton.x_root,
+ event->xbutton.y_root,
+ event->xbutton.button,
+ event->xbutton.state,
+ event->xbutton.time);
+ else if (x_dnd_last_protocol_version != -1)
+ x_dnd_send_position (x_dnd_frame,
+ x_dnd_last_seen_window,
+ x_dnd_last_protocol_version,
+ event->xbutton.x_root,
+ event->xbutton.y_root,
+ event->xbutton.time,
+ x_dnd_wanted_action,
+ event->xbutton.button,
+ event->xbutton.state);
goto OTHER;
}
@@ -19218,6 +20413,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
case CirculateNotify:
if (x_dnd_in_progress
+ /* When _NET_WM_CLIENT_LIST stacking is being used, changes
+ in that property are watched for, and it's not necessary
+ to update the state in response to ordinary window
+ substructure events. */
+ && !x_dnd_use_toplevels
&& dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
x_dnd_update_state (dpyinfo, dpyinfo->last_user_time);
goto OTHER;
@@ -19286,11 +20486,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
case XI_FocusIn:
{
- XIFocusInEvent *focusin = (XIFocusInEvent *) xi_event;
- struct xi_device_t *source;
+ XIFocusInEvent *focusin;
+ focusin = (XIFocusInEvent *) xi_event;
any = x_any_window_to_frame (dpyinfo, focusin->event);
- source = xi_device_from_id (dpyinfo, focusin->sourceid);
+
#ifdef USE_GTK
/* Some WMs (e.g. Mutter in Gnome Shell), don't unmap
minimized/iconified windows; thus, for those WMs we won't get
@@ -19319,24 +20519,19 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
}
- x_detect_focus_change (dpyinfo, any, event, &inev.ie);
+ xi_focus_handle_for_device (dpyinfo, any, xi_event);
- if (inev.ie.kind != NO_EVENT && source)
- inev.ie.device = source->name;
goto XI_OTHER;
}
case XI_FocusOut:
{
- XIFocusOutEvent *focusout = (XIFocusOutEvent *) xi_event;
- struct xi_device_t *source;
+ XIFocusOutEvent *focusout;
+ focusout = (XIFocusOutEvent *) xi_event;
any = x_any_window_to_frame (dpyinfo, focusout->event);
- source = xi_device_from_id (dpyinfo, focusout->sourceid);
- x_detect_focus_change (dpyinfo, any, event, &inev.ie);
+ xi_focus_handle_for_device (dpyinfo, any, xi_event);
- if (inev.ie.kind != NO_EVENT && source)
- inev.ie.device = source->name;
goto XI_OTHER;
}
@@ -19385,7 +20580,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
are an inferiors of the frame's top window, which will
get virtual events. */
if (any)
- x_detect_focus_change (dpyinfo, any, event, &inev.ie);
+ xi_focus_handle_for_device (dpyinfo, any, xi_event);
if (!any)
any = x_any_window_to_frame (dpyinfo, enter->event);
@@ -19525,7 +20720,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
if (any)
- x_detect_focus_change (dpyinfo, any, event, &inev.ie);
+ xi_focus_handle_for_device (dpyinfo, any, xi_event);
#ifndef USE_X_TOOLKIT
f = x_top_window_to_frame (dpyinfo, leave->event);
@@ -19547,8 +20742,22 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (!f)
f = x_top_window_to_frame (dpyinfo, leave->event);
#endif
+
if (f)
{
+ /* Now clear dpyinfo->last_mouse_motion_frame, or
+ gui_redo_mouse_highlight will end up highlighting
+ the last known position of the mouse if a
+ tooltip frame is later unmapped. */
+
+ if (f == dpyinfo->last_mouse_motion_frame)
+ dpyinfo->last_mouse_motion_frame = NULL;
+
+ /* Something similar applies to
+ dpyinfo->last_mouse_glyph_frame. */
+ if (f == dpyinfo->last_mouse_glyph_frame)
+ dpyinfo->last_mouse_glyph_frame = NULL;
+
if (f == hlinfo->mouse_face_mouse_frame)
{
/* If we move outside the frame, then we're
@@ -19638,9 +20847,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
bar = NULL;
- /* See the comment on top of
- x_init_master_valuators for more details on how
- scroll wheel movement is reported on XInput 2. */
+ /* See the comment on top of x_cache_xi_devices
+ for more details on how scroll wheel movement
+ is reported on XInput 2. */
delta = x_get_scroll_valuator_delta (dpyinfo, device,
i, *values, &val);
values++;
@@ -19805,6 +21014,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
operation, don't send an event. We only have
to set the user time. */
if (x_dnd_in_progress
+ /* If another master device moved the
+ pointer, we should put a wheel event on
+ the keyboard buffer as usual. It will be
+ run once the drag-and-drop operation
+ completes. */
+ && xev->deviceid == x_dnd_pointer_device
&& (command_loop_level + minibuf_level
<= x_dnd_recursion_depth)
&& dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
@@ -19897,6 +21112,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
`x-dnd-movement-function`. */
&& (command_loop_level + minibuf_level
<= x_dnd_recursion_depth)
+ && xev->deviceid == x_dnd_pointer_device
&& dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
{
Window target, toplevel;
@@ -20199,7 +21415,15 @@ handle_one_xevent (struct x_display_info *dpyinfo,
has changed, generate a HELP_EVENT. */
if (!NILP (help_echo_string)
|| !NILP (previous_help_echo_string))
- do_help = 1;
+ {
+ /* Also allow the focus and client pointer to be
+ adjusted accordingly, in case a help tooltip is
+ shown. */
+ gen_help_device = device;
+ gen_help_time = xev->time;
+
+ do_help = 1;
+ }
goto XI_OTHER;
}
@@ -20223,6 +21447,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (x_dnd_in_progress
&& (command_loop_level + minibuf_level
<= x_dnd_recursion_depth)
+ && xev->deviceid == x_dnd_pointer_device
&& dpyinfo == FRAME_DISPLAY_INFO (x_dnd_frame))
{
f = mouse_or_wdesc_frame (dpyinfo, xev->event);
@@ -20246,10 +21471,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (device)
device->grab |= (1 << xev->detail);
- if (f && !tab_bar_p)
+ if (f)
f->last_tab_bar_item = -1;
#if ! defined (USE_GTK)
- if (f && !tool_bar_p)
+ if (f)
f->last_tool_bar_item = -1;
#endif /* not USE_GTK */
}
@@ -20262,18 +21487,41 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
#endif
+ if (f && device)
+ xi_handle_interaction (dpyinfo, f, device,
+ xev->time);
+
if (xev->evtype == XI_ButtonPress
- && x_dnd_last_seen_window != None
- && x_dnd_last_protocol_version != -1)
+ && x_dnd_last_seen_window != None)
{
dnd_state = xi_convert_event_state (xev);
- x_dnd_send_position (x_dnd_frame, x_dnd_last_seen_window,
- x_dnd_last_protocol_version, xev->root_x,
- xev->root_y, x_dnd_selection_timestamp,
- x_dnd_wanted_action, xev->detail, dnd_state);
-
- goto XI_OTHER;
+ if (x_dnd_last_window_is_frame)
+ {
+#ifdef XI_PointerEmulated
+ /* Set the last user time here even if this
+ is an emulated button event, since
+ something happened in response. */
+
+ if (xev->flags & XIPointerEmulated)
+ x_display_set_last_user_time (dpyinfo, xev->time,
+ xev->send_event);
+#endif
+ x_dnd_note_self_wheel (dpyinfo,
+ x_dnd_last_seen_window,
+ xev->root_x, xev->root_y,
+ xev->detail, dnd_state,
+ xev->time);
+ }
+ else
+ x_dnd_send_position (x_dnd_frame,
+ x_dnd_last_seen_window,
+ x_dnd_last_protocol_version,
+ xev->root_x, xev->root_y,
+ xev->time, x_dnd_wanted_action,
+ xev->detail, dnd_state);
+
+ goto OTHER;
}
if (xev->evtype == XI_ButtonRelease)
@@ -20489,11 +21737,19 @@ handle_one_xevent (struct x_display_info *dpyinfo,
xev->send_event);
source = xi_device_from_id (dpyinfo, xev->sourceid);
+ device = xi_device_from_id (dpyinfo, xev->deviceid);
#ifdef HAVE_XWIDGETS
xvw = xwidget_view_from_window (xev->event);
if (xvw)
{
+ /* If the user interacts with a frame that's focused
+ on another device, but not the current focus
+ frame, make it the focus frame. */
+ if (device)
+ xi_handle_interaction (dpyinfo, xvw->frame,
+ device, xev->time);
+
xwidget_button (xvw, xev->evtype == XI_ButtonPress,
lrint (xev->event_x), lrint (xev->event_y),
xev->detail, xi_convert_event_state (xev),
@@ -20513,8 +21769,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
#endif
- device = xi_device_from_id (dpyinfo, xev->deviceid);
-
if (!device)
goto XI_OTHER;
@@ -20552,6 +21806,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
}
+ if (f)
+ {
+ /* If the user interacts with a frame that's focused
+ on another device, but not the current focus
+ frame, make it the focus frame. */
+ if (device)
+ xi_handle_interaction (dpyinfo, f, device,
+ xev->time);
+ }
+
#ifdef USE_GTK
if (!f)
{
@@ -20833,6 +22097,25 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = x_any_window_to_frame (dpyinfo, xev->event);
+ /* GTK handles TAB events in an undesirable manner, so
+ keyboard events are always dropped. But as a side
+ effect, the user time will no longer be set by GDK,
+ so do that manually. */
+#ifdef USE_GTK
+ if (f)
+ x_set_gtk_user_time (f, xev->time);
+#endif
+
+ if (f)
+ {
+ /* If the user interacts with a frame that's focused
+ on another device, but not the current focus
+ frame, make it the focus frame. */
+ if (device)
+ xi_handle_interaction (dpyinfo, f, device,
+ xev->time);
+ }
+
XKeyPressedEvent xkey;
memset (&xkey, 0, sizeof xkey);
@@ -20910,27 +22193,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#ifdef HAVE_XKB
if (dpyinfo->xkb_desc)
{
- XkbDescRec *rec = dpyinfo->xkb_desc;
-
- if (rec->map->modmap && rec->map->modmap[xev->detail])
- goto xi_done_keysym;
- }
- else
-#endif
- {
- if (dpyinfo->modmap)
- {
- for (i = 0; i < 8 * dpyinfo->modmap->max_keypermod; i++)
- {
- if (xev->detail == dpyinfo->modmap->modifiermap[i])
- goto xi_done_keysym;
- }
- }
- }
-
-#ifdef HAVE_XKB
- if (dpyinfo->xkb_desc)
- {
uint xkb_state = state;
xkb_state &= ~(1 << 13 | 1 << 14);
xkb_state |= xev->group.effective << 13;
@@ -21064,7 +22326,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
inev.ie.modifiers = x_x_to_emacs_modifiers (dpyinfo, state);
#ifdef XK_F1
- if (x_dnd_in_progress && keysym == XK_F1)
+ if (x_dnd_in_progress
+ && xev->deviceid == x_dnd_keyboard_device
+ && keysym == XK_F1)
{
x_dnd_xm_use_help = true;
goto xi_done_keysym;
@@ -21328,14 +22592,14 @@ handle_one_xevent (struct x_display_info *dpyinfo,
case XI_HierarchyChanged:
{
- XIHierarchyEvent *hev = (XIHierarchyEvent *) xi_event;
+ XIHierarchyEvent *hev;
XIDeviceInfo *info;
- int i, j, ndevices, n_disabled, *disabled;
- struct xi_device_t *device, *devices;
-#ifdef HAVE_XINPUT2_2
- struct xi_touch_point_t *tem, *last;
-#endif
+ int i, ndevices, n_disabled, *disabled;
+ struct xi_device_t *device;
+ bool any_changed;
+ any_changed = false;
+ hev = (XIHierarchyEvent *) xi_event;
disabled = SAFE_ALLOCA (sizeof *disabled * hev->num_info);
n_disabled = 0;
@@ -21345,44 +22609,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
/* Handle all disabled devices now, to prevent
things happening out-of-order later. */
- if (n_disabled)
- {
- ndevices = 0;
- devices = xmalloc (sizeof *devices * dpyinfo->num_devices);
-
- for (i = 0; i < dpyinfo->num_devices; ++i)
- {
- for (j = 0; j < n_disabled; ++j)
- {
- if (disabled[j] == dpyinfo->devices[i].device_id)
- {
-#ifdef HAVE_XINPUT2_1
- xfree (dpyinfo->devices[i].valuators);
-#endif
-#ifdef HAVE_XINPUT2_2
- tem = dpyinfo->devices[i].touchpoints;
- while (tem)
- {
- last = tem;
- tem = tem->next;
- xfree (last);
- }
-#endif
- goto continue_detachment;
- }
- }
-
- devices[ndevices++] = dpyinfo->devices[i];
-
- continue_detachment:
- continue;
- }
-
- xfree (dpyinfo->devices);
- dpyinfo->devices = devices;
- dpyinfo->num_devices = ndevices;
+ if (ndevices)
+ {
+ xi_disable_devices (dpyinfo, disabled, n_disabled);
n_disabled = 0;
+
+ /* This flag really just means that disabled
+ devices were handled early and should be
+ used in conjunction with n_disabled. */
+ any_changed = true;
}
x_catch_errors (dpyinfo->display);
@@ -21395,6 +22631,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
dpyinfo->devices
= xrealloc (dpyinfo->devices, (sizeof *dpyinfo->devices
* ++dpyinfo->num_devices));
+ memset (dpyinfo->devices + dpyinfo->num_devices - 1,
+ 0, sizeof *dpyinfo->devices);
device = &dpyinfo->devices[dpyinfo->num_devices - 1];
xi_populate_device_from_info (device, info);
}
@@ -21416,7 +22654,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (info)
{
if (device && info->enabled)
- device->use = info->use;
+ {
+ device->use = info->use;
+ device->attachment = info->attachment;
+ }
else if (device)
disabled[n_disabled++] = hev->info[i].deviceid;
@@ -21425,174 +22666,37 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
}
- if (n_disabled)
- {
- ndevices = 0;
- devices = xmalloc (sizeof *devices * dpyinfo->num_devices);
-
- for (i = 0; i < dpyinfo->num_devices; ++i)
- {
- for (j = 0; j < n_disabled; ++j)
- {
- if (disabled[j] == dpyinfo->devices[i].device_id)
- {
-#ifdef HAVE_XINPUT2_1
- xfree (dpyinfo->devices[i].valuators);
-#endif
-#ifdef HAVE_XINPUT2_2
- tem = dpyinfo->devices[i].touchpoints;
- while (tem)
- {
- last = tem;
- tem = tem->next;
- xfree (last);
- }
-#endif
- goto break_detachment;
- }
- }
-
- devices[ndevices++] = dpyinfo->devices[i];
+ /* Delete all devices that were disabled by this
+ event. */
+ xi_disable_devices (dpyinfo, disabled, n_disabled);
- break_detachment:
- continue;
- }
-
- xfree (dpyinfo->devices);
- dpyinfo->devices = devices;
- dpyinfo->num_devices = ndevices;
- }
+ /* If the device hierarchy has been changed, recompute
+ focus. This might seem like a micro-optimization but
+ it actually keeps the focus from changing in some
+ cases where it would be undesierable. */
+ if (any_changed || n_disabled)
+ xi_handle_focus_change (dpyinfo);
goto XI_OTHER;
}
case XI_DeviceChanged:
{
- XIDeviceChangedEvent *device_changed = (XIDeviceChangedEvent *) xi_event;
+ XIDeviceChangedEvent *device_changed;
struct xi_device_t *device;
-#ifdef HAVE_XINPUT2_2
- struct xi_touch_point_t *tem, *last;
-#endif
- int c;
-#ifdef HAVE_XINPUT2_1
- int i;
-#endif
+ device_changed = (XIDeviceChangedEvent *) xi_event;
device = xi_device_from_id (dpyinfo, device_changed->deviceid);
- if (!device)
- {
- /* An existing device might have been enabled. */
- x_init_master_valuators (dpyinfo);
-
- /* Now try to find the device again, in case it was
- just enabled. */
- device = xi_device_from_id (dpyinfo, device_changed->deviceid);
- }
-
- /* If it wasn't enabled, then stop handling this event. */
+ /* If the device isn't enabled, then stop handling this
+ event. A HierarchyChanged event will be sent if it
+ is enabled afterwards. */
if (!device)
goto XI_OTHER;
- /* Free data that we will regenerate from new
- information. */
-#ifdef HAVE_XINPUT2_1
- device->valuators = xrealloc (device->valuators,
- (device_changed->num_classes
- * sizeof *device->valuators));
- device->scroll_valuator_count = 0;
-#endif
-#ifdef HAVE_XINPUT2_2
- device->direct_p = false;
-#endif
-
- for (c = 0; c < device_changed->num_classes; ++c)
- {
- switch (device_changed->classes[c]->type)
- {
-#ifdef HAVE_XINPUT2_1
- case XIScrollClass:
- {
- XIScrollClassInfo *info;
-
- info = (XIScrollClassInfo *) device_changed->classes[c];
- struct xi_scroll_valuator_t *valuator;
-
- valuator = &device->valuators[device->scroll_valuator_count++];
- valuator->horizontal
- = (info->scroll_type == XIScrollTypeHorizontal);
- valuator->invalid_p = true;
- valuator->emacs_value = DBL_MIN;
- valuator->increment = info->increment;
- valuator->number = info->number;
-
- break;
- }
-#endif
-
-#ifdef HAVE_XINPUT2_2
- case XITouchClass:
- {
- XITouchClassInfo *info;
-
- info = (XITouchClassInfo *) device_changed->classes[c];
- device->direct_p = info->mode == XIDirectTouch;
- }
-#endif
- default:
- break;
- }
- }
-
-#ifdef HAVE_XINPUT2_1
- for (c = 0; c < device_changed->num_classes; ++c)
- {
- if (device_changed->classes[c]->type == XIValuatorClass)
- {
- XIValuatorClassInfo *info;
-
- info = (XIValuatorClassInfo *) device_changed->classes[c];
-
- for (i = 0; i < device->scroll_valuator_count; ++i)
- {
- if (device->valuators[i].number == info->number)
- {
- device->valuators[i].invalid_p = false;
- device->valuators[i].current_value = info->value;
-
- /* Make sure that this is reset if the
- pointer moves into a window of ours.
-
- Otherwise the valuator state could be
- left invalid if the DeviceChange
- event happened with the pointer
- outside any Emacs frame. */
- device->valuators[i].pending_enter_reset = true;
- }
- }
- }
- }
-#endif
-
-#ifdef HAVE_XINPUT2_2
- /* The device is no longer a DirectTouch device, so
- remove any touchpoints that we might have
- recorded. */
- if (!device->direct_p)
- {
- tem = device->touchpoints;
-
- while (tem)
- {
- last = tem;
- tem = tem->next;
- xfree (last);
- }
-
- device->touchpoints = NULL;
- }
-#endif
-
+ /* Now handle the event by retrieving scroll valuators
+ and touch info. */
+ xi_handle_device_changed (dpyinfo, device, device_changed);
goto XI_OTHER;
}
@@ -21615,7 +22719,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (xi_find_touch_point (device, xev->detail))
emacs_abort ();
- f = x_any_window_to_frame (dpyinfo, xev->event);
+ f = x_window_to_frame (dpyinfo, xev->event);
#ifdef HAVE_GTK3
menu_bar_p = (f && FRAME_X_OUTPUT (f)->menubar_widget
@@ -21713,7 +22817,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
touchpoint->x = xev->event_x;
touchpoint->y = xev->event_y;
- f = x_any_window_to_frame (dpyinfo, xev->event);
+ f = x_window_to_frame (dpyinfo, xev->event);
if (f && device->direct_p)
{
@@ -21756,7 +22860,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (unlinked_p)
{
- f = x_any_window_to_frame (dpyinfo, xev->event);
+ f = x_window_to_frame (dpyinfo, xev->event);
if (f && device->direct_p)
{
@@ -22144,7 +23248,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|| event->type == (dpyinfo->xrandr_event_base
+ RRNotify)))
{
- union buffered_input_event *ev;
Time timestamp;
Lisp_Object current_monitors;
XRRScreenChangeNotifyEvent *notify;
@@ -22172,13 +23275,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
else
timestamp = 0;
- ev = (kbd_store_ptr == kbd_buffer
- ? kbd_buffer + KBD_BUFFER_SIZE - 1
- : kbd_store_ptr - 1);
-
- if (kbd_store_ptr != kbd_fetch_ptr
- && ev->ie.kind == MONITORS_CHANGED_EVENT
- && XTERMINAL (ev->ie.arg) == dpyinfo->terminal)
+ if (x_find_monitors_changed_event (dpyinfo))
/* Don't store a MONITORS_CHANGED_EVENT if there is
already an undelivered event on the queue. */
goto OTHER;
@@ -22266,6 +23363,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (do_help > 0)
{
any_help_event_p = true;
+#ifdef HAVE_XINPUT2
+ if (gen_help_device)
+ xi_handle_interaction (dpyinfo, f,
+ gen_help_device,
+ gen_help_time);
+#endif
gen_help_event (help_echo_string, frame, help_echo_window,
help_echo_object, help_echo_pos);
}
@@ -22743,8 +23846,6 @@ x_draw_window_cursor (struct window *w, struct glyph_row *glyph_row, int x,
xic_set_preeditarea (w, x, y);
#endif
}
-
- XFlush (FRAME_X_DISPLAY (f));
}
@@ -23430,6 +24531,7 @@ x_connection_closed (Display *dpy, const char *error_message, bool ioerror)
x_dnd_return_frame_object = NULL;
x_dnd_movement_frame = NULL;
+ x_dnd_wheel_frame = NULL;
x_dnd_frame = NULL;
}
@@ -24110,7 +25212,11 @@ x_set_offset (struct frame *f, int xoff, int yoff, int change_gravity)
#endif
/* 'x_sync_with_move' is too costly for dragging child frames. */
- if (!FRAME_PARENT_FRAME (f))
+ if (!FRAME_PARENT_FRAME (f)
+ /* If no window manager exists, just calling XSync will be
+ sufficient to ensure that the window geometry has been
+ updated. */
+ && NILP (Vx_no_window_manager))
{
x_sync_with_move (f, f->left_pos, f->top_pos,
FRAME_DISPLAY_INFO (f)->wm_type == X_WMTYPE_UNKNOWN);
@@ -24843,11 +25949,9 @@ x_sync_with_move (struct frame *f, int left, int top, bool fuzzy)
current_left = 0;
current_top = 0;
- /* In theory, this call to XSync only needs to happen once, but in
- practice, it doesn't seem to work, hence the need for the surrounding
- loop. */
-
- XSync (FRAME_X_DISPLAY (f), False);
+ /* There is no need to call XSync (even when no window manager
+ is present) because x_real_positions already does that
+ implicitly. */
x_real_positions (f, &current_left, &current_top);
if (fuzzy)
@@ -25030,27 +26134,25 @@ x_set_window_size (struct frame *f, bool change_gravity,
void
frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
{
- block_input ();
#ifdef HAVE_XINPUT2
int deviceid;
- if (FRAME_DISPLAY_INFO (f)->supports_xi2)
+ deviceid = FRAME_DISPLAY_INFO (f)->client_pointer_device;
+
+ if (FRAME_DISPLAY_INFO (f)->supports_xi2
+ && deviceid != -1)
{
- if (XIGetClientPointer (FRAME_X_DISPLAY (f),
- FRAME_X_WINDOW (f),
- &deviceid))
- {
- x_ignore_errors_for_next_request (FRAME_DISPLAY_INFO (f));
- XIWarpPointer (FRAME_X_DISPLAY (f), deviceid, None,
- FRAME_X_WINDOW (f), 0, 0, 0, 0, pix_x, pix_y);
- x_stop_ignoring_errors (FRAME_DISPLAY_INFO (f));
- }
+ block_input ();
+ x_ignore_errors_for_next_request (FRAME_DISPLAY_INFO (f));
+ XIWarpPointer (FRAME_X_DISPLAY (f), deviceid, None,
+ FRAME_X_WINDOW (f), 0, 0, 0, 0, pix_x, pix_y);
+ x_stop_ignoring_errors (FRAME_DISPLAY_INFO (f));
+ unblock_input ();
}
else
#endif
XWarpPointer (FRAME_X_DISPLAY (f), None, FRAME_X_WINDOW (f),
0, 0, 0, 0, pix_x, pix_y);
- unblock_input ();
}
/* Raise frame F. */
@@ -25065,18 +26167,52 @@ x_raise_frame (struct frame *f)
unblock_input ();
}
+static void
+x_lower_frame_1 (struct frame *f)
+{
+ Window *windows;
+ Lisp_Object frame, tail;
+ struct frame *sibling;
+
+ windows = alloca (2 * sizeof *windows);
+
+ /* Lowering a child frame leads to the window being put below any
+ scroll bars on the parent. To avoid that, restack the child
+ frame below all of its siblings instead of just lowering it. */
+
+ FOR_EACH_FRAME (tail, frame)
+ {
+ sibling = XFRAME (frame);
+
+ if (sibling == f)
+ continue;
+
+ if (FRAME_PARENT_FRAME (sibling)
+ != FRAME_PARENT_FRAME (f))
+ continue;
+
+ windows[0] = FRAME_OUTER_WINDOW (sibling);
+ windows[1] = FRAME_OUTER_WINDOW (f);
+
+ XRestackWindows (FRAME_X_DISPLAY (f), windows, 2);
+ }
+}
+
/* Lower frame F. */
static void
x_lower_frame (struct frame *f)
{
- if (FRAME_VISIBLE_P (f))
- {
- block_input ();
- XLowerWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f));
- XFlush (FRAME_X_DISPLAY (f));
- unblock_input ();
- }
+ if (FRAME_PARENT_FRAME (f)
+ && (FRAME_HAS_VERTICAL_SCROLL_BARS (FRAME_PARENT_FRAME (f))
+ || FRAME_HAS_HORIZONTAL_SCROLL_BARS (FRAME_PARENT_FRAME (f))))
+ x_lower_frame_1 (f);
+ else
+ XLowerWindow (FRAME_X_DISPLAY (f),
+ FRAME_OUTER_WINDOW (f));
+
+ XFlush (FRAME_X_DISPLAY (f));
+
#ifdef HAVE_XWIDGETS
/* Make sure any X windows owned by xwidget views of the parent
still display below the lowered frame. */
@@ -25256,6 +26392,7 @@ x_make_frame_visible (struct frame *f)
struct x_display_info *dpyinfo;
struct x_output *output;
#endif
+ bool output_flushed;
if (FRAME_PARENT_FRAME (f))
{
@@ -25346,8 +26483,6 @@ x_make_frame_visible (struct frame *f)
}
}
- XFlush (FRAME_X_DISPLAY (f));
-
/* Synchronize to ensure Emacs knows the frame is visible
before we do anything else. We do this loop with input not blocked
so that incoming events are handled. */
@@ -25366,6 +26501,10 @@ x_make_frame_visible (struct frame *f)
/* This must come after we set COUNT. */
unblock_input ();
+ /* Keep track of whether or not the output buffer was flushed, to
+ avoid any extra flushes. */
+ output_flushed = false;
+
/* We unblock here so that arriving X events are processed. */
/* Now move the window back to where it was "supposed to be".
@@ -25399,6 +26538,7 @@ x_make_frame_visible (struct frame *f)
there, and take the potential window manager hit. */
XGetGeometry (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
&rootw, &x, &y, &width, &height, &border, &depth);
+ output_flushed = true;
if (original_left != x || original_top != y)
XMoveWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
@@ -25433,7 +26573,11 @@ x_make_frame_visible (struct frame *f)
(f, build_string ("x_make_frame_visible"));
x_wait_for_event (f, MapNotify);
+ output_flushed = true;
}
+
+ if (!output_flushed)
+ x_flush (f);
}
}
@@ -25653,6 +26797,11 @@ x_free_frame_resources (struct frame *f)
block_input ();
+#ifdef HAVE_XINPUT2
+ /* Remove any record of this frame being focused. */
+ xi_handle_delete_frame (dpyinfo, f);
+#endif
+
/* If a display connection is dead, don't try sending more
commands to the X server. */
if (dpyinfo->display)
@@ -25800,7 +26949,10 @@ x_free_frame_resources (struct frame *f)
if (f->output_data.x->bottom_left_corner_cursor != 0)
XFreeCursor (FRAME_X_DISPLAY (f), f->output_data.x->bottom_left_corner_cursor);
- XFlush (FRAME_X_DISPLAY (f));
+ /* Free sync fences. */
+#if defined HAVE_XSYNCTRIGGERFENCE && !defined USE_GTK
+ x_sync_free_fences (f);
+#endif
}
#ifdef HAVE_GTK3
@@ -26482,6 +27634,33 @@ my_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
connection established. */
static unsigned x_display_id;
+#if defined HAVE_XINPUT2 && !defined HAVE_GTK3
+
+/* Select for device change events on the root window of DPYINFO.
+ These include device change and hierarchy change notifications. */
+
+static void
+xi_select_hierarchy_events (struct x_display_info *dpyinfo)
+{
+ XIEventMask mask;
+ ptrdiff_t l;
+ unsigned char *m;
+
+ l = XIMaskLen (XI_LASTEVENT);
+ mask.mask = m = alloca (l);
+ memset (m, 0, l);
+ mask.mask_len = l;
+
+ XISetMask (m, XI_PropertyEvent);
+ XISetMask (m, XI_HierarchyChanged);
+ XISetMask (m, XI_DeviceChanged);
+
+ XISelectEvents (dpyinfo->display, dpyinfo->root_window,
+ &mask, 1);
+}
+
+#endif
+
/* Open a connection to X display DISPLAY_NAME, and return
the structure that describes the open display.
If we cannot contact the display, return null. */
@@ -27024,6 +28203,8 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
int minor = 0;
#endif
+ dpyinfo->client_pointer_device = -1;
+
if (XQueryExtension (dpyinfo->display, "XInputExtension",
&dpyinfo->xi2_opcode, &xi_first_event,
&xi_first_error))
@@ -27109,7 +28290,13 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
if (rc == Success)
{
dpyinfo->supports_xi2 = true;
- x_init_master_valuators (dpyinfo);
+#ifndef HAVE_GTK3
+ /* Select for hierarchy events on the root window. GTK 3.x
+ does this itself. */
+ xi_select_hierarchy_events (dpyinfo);
+#endif
+
+ x_cache_xi_devices (dpyinfo);
}
}
@@ -27698,6 +28885,7 @@ x_delete_terminal (struct terminal *terminal)
x_dnd_return_frame_object = NULL;
x_dnd_movement_frame = NULL;
+ x_dnd_wheel_frame = NULL;
x_dnd_frame = NULL;
}
@@ -27956,6 +29144,12 @@ mark_xterm (void)
mark_object (val);
}
+ if (x_dnd_wheel_frame)
+ {
+ XSETFRAME (val, x_dnd_wheel_frame);
+ mark_object (val);
+ }
+
#if defined HAVE_XINPUT2 || defined USE_TOOLKIT_SCROLL_BARS \
|| defined HAVE_XRANDR || defined USE_GTK
for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
@@ -28013,7 +29207,7 @@ void
x_preserve_selections (struct x_display_info *dpyinfo, Lisp_Object lost,
Lisp_Object current_owner)
{
- Lisp_Object tail, frame, new_owner, tem;
+ Lisp_Object tail, frame, new_owner;
Time timestamp;
Window *owners;
Atom *names;
@@ -28043,7 +29237,7 @@ x_preserve_selections (struct x_display_info *dpyinfo, Lisp_Object lost,
FOR_EACH_TAIL_SAFE (tail)
{
- tem = XCAR (tail);
+ Lisp_Object tem = XCAR (tail);
++nowners;
/* The selection is really lost (since we cannot find a new
@@ -28077,7 +29271,7 @@ x_preserve_selections (struct x_display_info *dpyinfo, Lisp_Object lost,
FOR_EACH_TAIL_SAFE (tail)
{
- tem = XCAR (tail);
+ Lisp_Object tem = XCAR (tail);
/* Now check if we still don't own that selection, which can
happen if another program set itself as the owner. */
@@ -28093,12 +29287,14 @@ x_preserve_selections (struct x_display_info *dpyinfo, Lisp_Object lost,
}
nowners = 0;
+ tail = lost;
FOR_EACH_TAIL_SAFE (tail)
{
+ Lisp_Object tem = XCAR (tail);
+
reply = xcb_get_selection_owner_reply (dpyinfo->xcb_connection,
cookies[nowners++], &error);
-
if (reply)
owners[nowners - 1] = reply->owner;
else
@@ -28128,7 +29324,7 @@ x_preserve_selections (struct x_display_info *dpyinfo, Lisp_Object lost,
FOR_EACH_TAIL_SAFE (tail)
{
- tem = XCAR (tail);
+ Lisp_Object tem = XCAR (tail);
/* If the selection isn't owned by us anymore, note that the
selection was lost. */
@@ -28139,6 +29335,27 @@ x_preserve_selections (struct x_display_info *dpyinfo, Lisp_Object lost,
}
}
+/* Return a list of the keyboard modifier masks in DPYINFO.
+
+ Value is a list of (HYPER SUPER ALT SHIFT-LOCK META), each element
+ being the appropriate modifier mask. */
+
+Lisp_Object
+x_get_keyboard_modifiers (struct x_display_info *dpyinfo)
+{
+ /* This sometimes happens when the function is called during display
+ initialization, which can happen while obtaining vendor specific
+ keysyms. */
+ if (!dpyinfo->xkb_desc && !dpyinfo->modmap)
+ x_find_modifier_meanings (dpyinfo);
+
+ return list5 (make_uint (dpyinfo->hyper_mod_mask),
+ make_uint (dpyinfo->super_mod_mask),
+ make_uint (dpyinfo->alt_mod_mask),
+ make_uint (dpyinfo->shift_lock_mask),
+ make_uint (dpyinfo->meta_mod_mask));
+}
+
void
syms_of_xterm (void)
{
@@ -28380,6 +29597,15 @@ where FRAME is the frame the mouse is on top of, and POSITION is a
mouse position list. */);
Vx_dnd_movement_function = Qnil;
+ DEFVAR_LISP ("x-dnd-wheel-function", Vx_dnd_wheel_function,
+ doc: /* Function called upon wheel movement on a frame during drag-and-drop.
+It should either be nil, or accept four arguments POSITION, BUTTON,
+STATE and TIME, where POSITION is a mouse position list describing
+where the wheel moved, BUTTON is the wheel button that was pressed,
+STATE is the X modifier state at the time of the wheel movement, and
+TIME is the X server time at which the wheel moved. */);
+ Vx_dnd_wheel_function = Qnil;
+
DEFVAR_LISP ("x-dnd-unsupported-drop-function", Vx_dnd_unsupported_drop_function,
doc: /* Function called when trying to drop on an unsupported window.
This function is called whenever the user tries to drop something on a
@@ -28455,10 +29681,13 @@ executing the protocol request. Otherwise, errors will be silently
ignored without waiting, which is generally faster. */);
x_fast_protocol_requests = false;
- DEFVAR_BOOL ("x-auto-preserve-selections", x_auto_preserve_selections,
+ DEFVAR_LISP ("x-auto-preserve-selections", Vx_auto_preserve_selections,
doc: /* Whether or not to transfer selection ownership when deleting a frame.
When non-nil, deleting a frame that is currently the owner of a
selection will cause its ownership to be transferred to another frame
-on the same display. */);
- x_auto_preserve_selections = true;
+on the same display.
+
+In addition, when this variable is a list, only preserve the
+selections whose names are contained within. */);
+ Vx_auto_preserve_selections = list2 (QCLIPBOARD, QPRIMARY);
}
diff --git a/src/xterm.h b/src/xterm.h
index 6afd08eab2b..e97f3d4c831 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -238,23 +238,54 @@ struct xi_touch_point_t
struct xi_device_t
{
+ /* The numerical ID of this device. */
int device_id;
+
#ifdef HAVE_XINPUT2_1
+ /* The number of scroll valuators in `valuators'. */
int scroll_valuator_count;
#endif
+
+ /* Whether or not the device is grabbed and its use. */
int grab, use;
+
+ /* The attached device. Only valid if USE is some kind of master
+ device. */
+ int attachment;
+
#ifdef HAVE_XINPUT2_2
+ /* Whether or not this device is a direct touch device. */
bool direct_p;
#endif
#ifdef HAVE_XINPUT2_1
+ /* An array of scroll valuators Emacs knows about. */
struct xi_scroll_valuator_t *valuators;
#endif
+
#ifdef HAVE_XINPUT2_2
+ /* An array of in-progress touchscreen events. */
struct xi_touch_point_t *touchpoints;
#endif
+ /* The name of this device. */
Lisp_Object name;
+
+ /* The time at which `focus_frame' became the keyboard focus (only
+ applies to master devices). */
+ Time focus_frame_time;
+
+ /* The frame that is currently this device's keyboard focus, or
+ NULL. */
+ struct frame *focus_frame;
+
+ /* The time at which `focus_frame' became the implicit keyboard
+ focus. */
+ Time focus_implicit_time;
+
+ /* The frame that is currently this device's implicit keyboard
+ focus, or NULL. */
+ struct frame *focus_implicit_frame;
};
#endif
@@ -482,7 +513,10 @@ struct x_display_info
/* The last frame mentioned in a FocusIn or FocusOut event. This is
separate from x_focus_frame, because whether or not LeaveNotify
events cause us to lose focus depends on whether or not we have
- received a FocusIn event for it. */
+ received a FocusIn event for it.
+
+ This field is not used when the input extension is being
+ utilized. */
struct frame *x_focus_event_frame;
/* The frame which currently has the visual highlight, and should get
@@ -614,9 +648,9 @@ struct x_display_info
Xatom_net_wm_state_shaded, Xatom_net_frame_extents, Xatom_net_current_desktop,
Xatom_net_workarea, Xatom_net_wm_opaque_region, Xatom_net_wm_ping,
Xatom_net_wm_sync_request, Xatom_net_wm_sync_request_counter,
- Xatom_net_wm_frame_drawn, Xatom_net_wm_user_time,
- Xatom_net_wm_user_time_window, Xatom_net_client_list_stacking,
- Xatom_net_wm_pid;
+ Xatom_net_wm_sync_fences, Xatom_net_wm_frame_drawn, Xatom_net_wm_frame_timings,
+ Xatom_net_wm_user_time, Xatom_net_wm_user_time_window,
+ Xatom_net_client_list_stacking, Xatom_net_wm_pid;
/* XSettings atoms and windows. */
Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;
@@ -678,13 +712,27 @@ struct x_display_info
#ifdef HAVE_XINPUT2
bool supports_xi2;
+
+ /* The minor version of the input extension. (Major is always
+ 2.x.) */
int xi2_version;
+
+ /* The generic event opcode of XI2 events. */
int xi2_opcode;
+ /* The number of devices on this display known to Emacs. */
int num_devices;
+
+ /* Array of all input extension devices on this display known to
+ Emacs. */
struct xi_device_t *devices;
+ /* Pending keystroke time. */
Time pending_keystroke_time;
+
+ /* Pending keystroke source. If a core KeyPress event arrives with
+ the same timestamp as pending_keystroke_time, it will be treated
+ as originating from this device. */
int pending_keystroke_source;
#if defined USE_GTK && !defined HAVE_GTK3
@@ -694,6 +742,10 @@ struct x_display_info
input method) core key event. */
bool pending_keystroke_time_special_p;
#endif
+
+ /* The client pointer. We keep a record client-side to avoid
+ calling XISetClientPointer all the time. */
+ int client_pointer_device;
#endif
#ifdef HAVE_XKB
@@ -769,6 +821,16 @@ struct x_display_info
/* The pending drag-and-drop time for middle-click based
drag-and-drop emulation. */
Time pending_dnd_time;
+
+#if defined HAVE_XSYNC && !defined USE_GTK
+ /* Whether or not the server time is probably the same as
+ "clock_gettime (CLOCK_MONOTONIC, ...)". */
+ bool server_time_monotonic_p;
+
+ /* The time difference between the X server clock and the monotonic
+ clock. */
+ int64_t server_time_offset;
+#endif
};
#ifdef HAVE_X_I18N
@@ -1026,16 +1088,55 @@ struct x_output
#endif
#ifdef HAVE_XSYNC
+ /* The "basic frame counter" used for resize synchronization. */
XSyncCounter basic_frame_counter;
+
+ /* The "extended frame counter" used for frame synchronization. */
XSyncCounter extended_frame_counter;
+
+ /* The pending value of the basic counter. */
XSyncValue pending_basic_counter_value;
+
+ /* The current value of the extended counter. */
XSyncValue current_extended_counter_value;
+ /* The configure event value of the extended counter. */
+ XSyncValue resize_counter_value;
+
+ /* Whether or not basic resize synchronization is in progress. */
bool_bf sync_end_pending_p : 1;
+
+ /* Whether or not extended resize synchronization is in
+ progress. */
bool_bf ext_sync_end_pending_p : 1;
+
#ifdef HAVE_GTK3
+ /* Whether or not GDK resize synchronization is in progress. */
bool_bf xg_sync_end_pending_p : 1;
#endif
+
+ /* Whether or Emacs is waiting for the compositing manager to draw a
+ frame. */
+ bool_bf waiting_for_frame_p : 1;
+
+#ifndef USE_GTK
+ /* Whether or not Emacs should wait for the compositing manager to
+ draw frames before starting a new frame. */
+ bool_bf use_vsync_p : 1;
+
+ /* The time (in microseconds) it took to draw the last frame. */
+ uint64_t last_frame_time;
+
+ /* A temporary time used to calculate that value. */
+ uint64_t temp_frame_time;
+
+#ifdef HAVE_XSYNCTRIGGERFENCE
+ /* An array of two sync fences that are triggered in order after a
+ frame completes. Not initialized if the XSync extension is too
+ old to support sync fences. */
+ XSyncFence sync_fences[2];
+#endif
+#endif
#endif
/* Relief GCs, colors etc. */
@@ -1052,7 +1153,9 @@ struct x_output
/* Keep track of focus. May be EXPLICIT if we received a FocusIn for this
frame, or IMPLICIT if we received an EnterNotify.
- FocusOut and LeaveNotify clears EXPLICIT/IMPLICIT. */
+ FocusOut and LeaveNotify clears EXPLICIT/IMPLICIT.
+
+ Not used when the input extension is being utilized. */
int focus_state;
/* The offset we need to add to compensate for type A WMs. */
@@ -1211,8 +1314,14 @@ extern void x_mark_frame_dirty (struct frame *f);
#endif
#ifdef HAVE_XSYNC
-#define FRAME_X_BASIC_COUNTER(f) FRAME_X_OUTPUT (f)->basic_frame_counter
-#define FRAME_X_EXTENDED_COUNTER(f) FRAME_X_OUTPUT (f)->extended_frame_counter
+#define FRAME_X_BASIC_COUNTER(f) \
+ FRAME_X_OUTPUT (f)->basic_frame_counter
+#define FRAME_X_EXTENDED_COUNTER(f) \
+ FRAME_X_OUTPUT (f)->extended_frame_counter
+#define FRAME_X_WAITING_FOR_DRAW(f) \
+ FRAME_X_OUTPUT (f)->waiting_for_frame_p
+#define FRAME_X_COUNTER_VALUE(f) \
+ FRAME_X_OUTPUT (f)->current_extended_counter_value
#endif
/* This is the Colormap which frame F uses. */
@@ -1250,11 +1359,6 @@ struct scroll_bar
/* The X window representing this scroll bar. */
Window x_window;
-#if defined HAVE_XDBE && !defined USE_TOOLKIT_SCROLL_BARS
- /* The X drawable representing this scroll bar. */
- Drawable x_drawable;
-#endif
-
/* The position and size of the scroll bar in pixels, relative to the
frame. */
int top, left, width, height;
@@ -1473,6 +1577,9 @@ extern void x_make_frame_invisible (struct frame *);
extern void x_iconify_frame (struct frame *);
extern void x_free_frame_resources (struct frame *);
extern void x_wm_set_size_hint (struct frame *, long, bool);
+#if defined HAVE_XSYNCTRIGGERFENCE && !defined USE_GTK
+extern void x_sync_init_fences (struct frame *);
+#endif
extern void x_delete_terminal (struct terminal *);
extern Cursor x_create_font_cursor (struct x_display_info *, int);
@@ -1514,11 +1621,14 @@ extern Lisp_Object x_cr_export_frames (Lisp_Object, cairo_surface_type_t);
#ifdef HAVE_XRENDER
extern void x_xrender_color_from_gc_background (struct frame *, GC,
XRenderColor *, bool);
-extern void x_xr_ensure_picture (struct frame *f);
-extern void x_xr_apply_ext_clip (struct frame *f, GC gc);
-extern void x_xr_reset_ext_clip (struct frame *f);
+extern void x_xr_ensure_picture (struct frame *);
+extern void x_xr_apply_ext_clip (struct frame *, GC);
+extern void x_xr_reset_ext_clip (struct frame *);
#endif
+extern Bool x_query_pointer (Display *, Window, Window *, Window *, int *,
+ int *, int *, int *, unsigned int *);
+
#ifdef HAVE_GTK3
extern void x_scroll_bar_configure (GdkEvent *);
#endif
@@ -1645,6 +1755,7 @@ extern bool x_defined_color (struct frame *, const char *, Emacs_Color *,
bool, bool);
extern void x_preserve_selections (struct x_display_info *, Lisp_Object,
Lisp_Object);
+extern Lisp_Object x_get_keyboard_modifiers (struct x_display_info *);
#ifdef HAVE_X_I18N
extern void free_frame_xic (struct frame *);
# if defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT
diff --git a/test/lisp/net/netrc-resources/authinfo b/test/lisp/auth-source-resources/authinfo
index 88aa1712e9d..88aa1712e9d 100644
--- a/test/lisp/net/netrc-resources/authinfo
+++ b/test/lisp/auth-source-resources/authinfo
diff --git a/test/lisp/net/netrc-resources/netrc-folding b/test/lisp/auth-source-resources/netrc-folding
index 85e5e324cdf..85e5e324cdf 100644
--- a/test/lisp/net/netrc-resources/netrc-folding
+++ b/test/lisp/auth-source-resources/netrc-folding
diff --git a/test/lisp/auth-source-tests.el b/test/lisp/auth-source-tests.el
index 41f8b6d8c9d..a76e4fb0d2e 100644
--- a/test/lisp/auth-source-tests.el
+++ b/test/lisp/auth-source-tests.el
@@ -27,7 +27,7 @@
;;; Code:
(require 'ert)
-(eval-when-compile (require 'ert-x))
+(require 'ert-x)
(require 'cl-lib)
(require 'auth-source)
(require 'secrets)
@@ -410,5 +410,29 @@ machine c1 port c2 user c3 password c4\n"
;; this is actually the same as `auth-source-search'.
(should (equal found expected)))))
+(ert-deftest test-netrc-credentials ()
+ (let ((data (auth-source-netrc-parse-all (ert-resource-file "authinfo"))))
+ (should data)
+ (let ((imap (seq-find (lambda (elem)
+ (equal (cdr (assoc "machine" elem))
+ "imap.example.org"))
+ data)))
+ (should (equal (cdr (assoc "login" imap)) "jrh@example.org"))
+ (should (equal (cdr (assoc "password" imap)) "*foobar*")))
+ (let ((imap (seq-find (lambda (elem)
+ (equal (cdr (assoc "machine" elem))
+ "ftp.example.org"))
+ data)))
+ (should (equal (cdr (assoc "login" imap)) "jrh"))
+ (should (equal (cdr (assoc "password" imap)) "*baz*")))))
+
+(ert-deftest test-netrc-credentials-2 ()
+ (let ((data (auth-source-netrc-parse-all
+ (ert-resource-file "netrc-folding"))))
+ (should
+ (equal data
+ '((("machine" . "XM") ("login" . "XL") ("password" . "XP"))
+ (("machine" . "YM") ("login" . "YL") ("password" . "YP")))))))
+
(provide 'auth-source-tests)
;;; auth-source-tests.el ends here
diff --git a/test/lisp/calc/calc-tests.el b/test/lisp/calc/calc-tests.el
index 64e59f5b9b4..cd984f7ff7e 100644
--- a/test/lisp/calc/calc-tests.el
+++ b/test/lisp/calc/calc-tests.el
@@ -818,7 +818,3 @@ An existing calc stack is reused, otherwise a new one is created."
(provide 'calc-tests)
;;; calc-tests.el ends here
-
-;; Local Variables:
-;; bug-reference-url-format: "https://debbugs.gnu.org/%s"
-;; End:
diff --git a/test/lisp/calendar/icalendar-tests.el b/test/lisp/calendar/icalendar-tests.el
index ac7a84aa571..7f8cd479146 100644
--- a/test/lisp/calendar/icalendar-tests.el
+++ b/test/lisp/calendar/icalendar-tests.el
@@ -651,8 +651,8 @@ Argument INPUT-AMERICAN american style diary string.
Argument EXPECTED-OUTPUT expected iCalendar result string.
Optional argument ALARMS the value of `icalendar-export-alarms' for this test.
-European style input data must use german month names. American
-and ISO style input data must use english month names."
+European style input data must use German month names. American
+and ISO style input data must use English month names."
(let ((tz (getenv "TZ"))
(calendar-date-style 'iso)
(icalendar-recurring-start-year 2000)
diff --git a/test/lisp/cedet/semantic-utest-c.el b/test/lisp/cedet/semantic-utest-c.el
index 2da450c2736..87d754968f9 100644
--- a/test/lisp/cedet/semantic-utest-c.el
+++ b/test/lisp/cedet/semantic-utest-c.el
@@ -94,7 +94,7 @@ Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.3.1-9ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.3.1 (Ubuntu 4.3.1-9ubuntu1)"
- ;; My debian box:
+ ;; My Debian box:
"Using built-in specs.
Target: x86_64-unknown-linux-gnu
Configured with: ../../../sources/gcc/configure --prefix=/usr/local/glibc-2.3.6/x86_64/apps/gcc-4.2.3 --with-gmp=/usr/local/gcc/gmp --with-mpfr=/usr/local/gcc/mpfr --enable-languages=c,c++,fortran --with-as=/usr/local/glibc-2.3.6/x86_64/apps/gcc-4.2.3/bin/as --with-ld=/usr/local/glibc-2.3.6/x86_64/apps/gcc-4.2.3/bin/ld --disable-multilib
@@ -123,13 +123,13 @@ Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)"
- ;; David Engster's german gcc on ubuntu 4.3
+ ;; David Engster's German gcc on Ubuntu 4.3
"Es werden eingebaute Spezifikationen verwendet.
Ziel: i486-linux-gnu
Konfiguriert mit: ../src/configure -v --with-pkgversion='Ubuntu 4.3.2-1ubuntu12' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread-Modell: posix
gcc-Version 4.3.2 (Ubuntu 4.3.2-1ubuntu12)"
- ;; Damien Deville bsd
+ ;; Damien Deville BSD
"Using built-in specs.
Target: i386-undermydesk-freebsd
Configured with: FreeBSD/i386 system compiler
@@ -139,7 +139,7 @@ gcc version 4.2.1 20070719 [FreeBSD]"
"A bunch of sample gcc -v outputs from different machines.")
(defvar semantic-gcc-test-strings-fail
- '(;; A really old solaris box I found
+ '(;; A really old Solaris box I found
"Reading specs from /usr/local/gcc-2.95.2/lib/gcc-lib/sparc-sun-solaris2.6/2.95.2/specs
gcc version 2.95.2 19991024 (release)"
)
diff --git a/test/lisp/comint-tests.el b/test/lisp/comint-tests.el
index 2885aaa9146..8402c13daf3 100644
--- a/test/lisp/comint-tests.el
+++ b/test/lisp/comint-tests.el
@@ -95,8 +95,4 @@ flow. Hook function returns alternative password."
password flow if it returns a nil value."
(comint-tests/test-password-function #'ignore))
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
-
;;; comint-tests.el ends here
diff --git a/test/lisp/emacs-lisp/icons-tests.el b/test/lisp/emacs-lisp/icons-tests.el
new file mode 100644
index 00000000000..e6e71a8e4fd
--- /dev/null
+++ b/test/lisp/emacs-lisp/icons-tests.el
@@ -0,0 +1,63 @@
+;;; icons-tests.el --- Tests for icons.el -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'icons)
+(require 'ert)
+(require 'ert-x)
+(require 'cus-edit)
+
+(define-icon icon-test1 nil
+ '((symbol ">")
+ (text "great"))
+ "Test icon"
+ :version "29.1")
+
+(define-icon icon-test2 icon-test1
+ '((text "child"))
+ "Test icon"
+ :version "29.1")
+
+(deftheme test-icons-theme "")
+
+(ert-deftest test-icon-theme ()
+ (let ((icon-preference '(image emoji symbol text)))
+ (should (equal (icon-string 'icon-test1) ">")))
+ (let ((icon-preference '(text)))
+ (should (equal (icon-string 'icon-test1) "great")))
+ (custom-theme-set-icons
+ 'test-icons-theme
+ '(icon-test1 ((symbol "<") (text "less"))))
+ (let ((icon-preference '(image emoji symbol text)))
+ (should (equal (icon-string 'icon-test1) ">"))
+ (enable-theme 'test-icons-theme)
+ (should (equal (icon-string 'icon-test1) "<"))))
+
+(ert-deftest test-icon-inheretance ()
+ (let ((icon-preference '(image emoji symbol text)))
+ (should (equal (icon-string 'icon-test2) ">")))
+ (let ((icon-preference '(text)))
+ (should (equal (icon-string 'icon-test2) "child"))))
+
+;;; icons-tests.el ends here
diff --git a/test/lisp/emacs-lisp/lisp-mode-tests.el b/test/lisp/emacs-lisp/lisp-mode-tests.el
index fd1af75ba3f..d3e78aa1d7e 100644
--- a/test/lisp/emacs-lisp/lisp-mode-tests.el
+++ b/test/lisp/emacs-lisp/lisp-mode-tests.el
@@ -330,5 +330,28 @@ Expected initialization file: `%s'\"
(faceup-clean-buffer)
(should (faceup-test-font-lock-buffer 'emacs-lisp-mode faceup)))))
+(ert-deftest test-lisp-current-defun-name ()
+ (require 'edebug)
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "(defun foo ()\n'bar)\n")
+ (goto-char 5)
+ (should (equal (lisp-current-defun-name) "foo")))
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "(define-flabbergast-test zot ()\n'bar)\n")
+ (goto-char 5)
+ (should (equal (lisp-current-defun-name) "zot")))
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "(progn\n ;; comment\n ;; about that\n (define-key ...)\n )")
+ (goto-char 5)
+ (should (equal (lisp-current-defun-name) "progn")))
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "(defblarg \"a\" 'b)")
+ (goto-char 5)
+ (should (equal (lisp-current-defun-name) "defblarg"))))
+
(provide 'lisp-mode-tests)
;;; lisp-mode-tests.el ends here
diff --git a/test/lisp/emacs-lisp/package-tests.el b/test/lisp/emacs-lisp/package-tests.el
index d7a55998c20..b903cd781ba 100644
--- a/test/lisp/emacs-lisp/package-tests.el
+++ b/test/lisp/emacs-lisp/package-tests.el
@@ -638,6 +638,21 @@ but with a different end of line convention (bug#48137)."
(package-refresh-contents)
(should (equal (length package-archive-contents) 2)))))
+(ert-deftest package-test-package-installed-p ()
+ "Test package-installed-p before and after package initialization."
+ (with-package-test ()
+ ;; Verify that `package-installed-p' evaluates true for a built-in
+ ;; package, in this case `project', before package initialization.
+ (should (not package--initialized))
+ (should (package-installed-p 'project nil))
+ (should (not (package-installed-p 'imaginary-package nil)))
+
+ ;; The results don't change after package initialization.
+ (package-initialize)
+ (should package--initialized)
+ (should (package-installed-p 'project nil))
+ (should (not (package-installed-p 'imaginary-package nil)))))
+
(ert-deftest package-test-describe-package ()
"Test displaying help for a package."
diff --git a/test/lisp/emacs-lisp/seq-tests.el b/test/lisp/emacs-lisp/seq-tests.el
index d979604910e..1a27467d292 100644
--- a/test/lisp/emacs-lisp/seq-tests.el
+++ b/test/lisp/emacs-lisp/seq-tests.el
@@ -257,6 +257,19 @@ Evaluate BODY for each created sequence.
(with-test-sequences (seq '())
(should (equal (seq-uniq seq) '()))))
+(defun seq-tests--list-subseq-ref (list start &optional end)
+ "Reference implementation of `seq-subseq' for lists."
+ (let ((len (length list)))
+ (when (< start 0)
+ (setq start (+ start len)))
+ (unless end
+ (setq end len))
+ (when (< end 0)
+ (setq end (+ end len)))
+ (if (<= 0 start end len)
+ (take (- end start) (nthcdr start list))
+ (error "bad args"))))
+
(ert-deftest test-seq-subseq ()
(with-test-sequences (seq '(2 3 4 5))
(should (equal (seq-subseq seq 0 4) seq))
@@ -275,7 +288,21 @@ Evaluate BODY for each created sequence.
(should-error (seq-subseq [] -1))
(should-error (seq-subseq "" -1))
(should-not (seq-subseq '() 0))
- (should-error (seq-subseq '() 0 -1)))
+ (should-error (seq-subseq '() 0 -1))
+
+ (dolist (list '(() (a b c d)))
+ (ert-info ((prin1-to-string list) :prefix "list: ")
+ (let ((len (length list)))
+ (dolist (start (number-sequence (- -2 len) (+ 2 len)))
+ (ert-info ((prin1-to-string start) :prefix "start: ")
+ (dolist (end (cons nil (number-sequence (- -2 len) (+ 2 len))))
+ (ert-info ((prin1-to-string end) :prefix "end: ")
+ (condition-case res
+ (seq-tests--list-subseq-ref list start end)
+ (error
+ (should-error (seq-subseq list start end)))
+ (:success
+ (should (equal (seq-subseq list start end) res))))))))))))
(ert-deftest test-seq-concatenate ()
(with-test-sequences (seq '(2 4 6))
@@ -532,5 +559,23 @@ Evaluate BODY for each created sequence.
(should (equal (seq-split seq 3)
'("012" "345" "678" "9")))))
+(ert-deftest test-seq-uniq-list ()
+ (let ((list '(1 2 3)))
+ (should (equal (seq-uniq (append list list)) '(1 2 3))))
+ (let ((list '(1 2 3 2 1)))
+ (should (equal (seq-uniq list) '(1 2 3))))
+ (let ((list (list (substring "1")
+ (substring "2")
+ (substring "3")
+ (substring "2")
+ (substring "1"))))
+ (should (equal (seq-uniq list) '("1" "2" "3")))
+ (should (equal (seq-uniq list #'eq) '("1" "2" "3" "2" "1"))))
+ ;; Long lists have a different code path.
+ (let ((list (seq-map-indexed (lambda (_ i) i)
+ (make-list 10000 nil))))
+ (should (= (length list) 10000))
+ (should (= (length (seq-uniq (append list list))) 10000))))
+
(provide 'seq-tests)
;;; seq-tests.el ends here
diff --git a/test/lisp/emacs-lisp/subr-x-tests.el b/test/lisp/emacs-lisp/subr-x-tests.el
index 99c0e822155..7a3efe9db62 100644
--- a/test/lisp/emacs-lisp/subr-x-tests.el
+++ b/test/lisp/emacs-lisp/subr-x-tests.el
@@ -766,5 +766,10 @@
(should (equal (sort (hash-table-keys h) #'string<) '(a b c)))
(should (equal (sort (hash-table-values h) #'<) '(1 2 3)))))
+(ert-deftest test-string-truncate-left ()
+ (should (equal (string-truncate-left "band" 3) "...d"))
+ (should (equal (string-truncate-left "band" 2) "...d"))
+ (should (equal (string-truncate-left "longstring" 8) "...tring")))
+
(provide 'subr-x-tests)
;;; subr-x-tests.el ends here
diff --git a/test/lisp/emacs-lisp/syntax-tests.el b/test/lisp/emacs-lisp/syntax-tests.el
index 53812c0c80c..f266db5c702 100644
--- a/test/lisp/emacs-lisp/syntax-tests.el
+++ b/test/lisp/emacs-lisp/syntax-tests.el
@@ -60,8 +60,4 @@
(should-error
(syntax-propertize--shift-groups-and-backrefs "\\(a\\)\\3" 7)))
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
-
;;; syntax-tests.el ends here.
diff --git a/test/lisp/env-tests.el b/test/lisp/env-tests.el
new file mode 100644
index 00000000000..fd3d3cb2734
--- /dev/null
+++ b/test/lisp/env-tests.el
@@ -0,0 +1,40 @@
+;;; env-tests.el --- Tests for env.el -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Code:
+
+(require 'env)
+(require 'ert)
+
+(ert-deftest test-substitute-env-in-file-name ()
+ (should (equal (substitute-env-in-file-name "foo_${HOME}_bar")
+ (concat "foo_" (getenv "HOME") "_bar"))))
+
+(ert-deftest test-getenv-setenv ()
+ (should (equal (setenv "EMACS_ENV_EL_TEST_VAR" "foobar") "foobar"))
+ (should (equal (getenv "EMACS_ENV_EL_TEST_VAR") "foobar"))
+ (should-not (getenv "LIKELY_TO_BE_NON_EXISTENT_FOO_BAR_BAZ")))
+
+(ert-deftest test-with-environment-variables ()
+ (let ((A "TEST") (B "/foo/bar"))
+ (with-environment-variables ((A B))
+ (should (equal (getenv A) B)))))
+
+(provide 'env-tests)
+;;; env-tests.el ends here
diff --git a/test/lisp/erc/erc-scenarios-misc.el b/test/lisp/erc/erc-scenarios-misc.el
index 9d6d5bc1d6a..ded620ccc1d 100644
--- a/test/lisp/erc/erc-scenarios-misc.el
+++ b/test/lisp/erc/erc-scenarios-misc.el
@@ -138,4 +138,43 @@
(should-not (get-buffer "$*"))))
+(ert-deftest erc-scenarios-dcc-chat-accept ()
+ :tags '(:expensive-test)
+ (erc-scenarios-common-with-cleanup
+ ((erc-scenarios-common-dialog "dcc/chat")
+ (dcc-server (erc-d-run "127.0.0.1" t "erc-dcc-server" 'accept-dcc
+ :ending "\n"))
+ (dcc-port (process-contact dcc-server :service))
+ (dumb-server (erc-d-run "localhost" t 'accept :tmpl-vars
+ `((port . ,(number-to-string dcc-port)))))
+ (port (process-contact dumb-server :service))
+ (expect (erc-d-t-make-expecter)))
+
+ (ert-info ("Connect to foonet")
+ (with-current-buffer (erc :server "127.0.0.1"
+ :port port
+ :nick "tester"
+ :password "changeme"
+ :full-name "tester")
+ (should (string= (buffer-name) (format "127.0.0.1:%d" port)))))
+
+ (ert-info ("Offer received")
+ (with-current-buffer (erc-d-t-wait-for 10 (get-buffer "foonet"))
+ (funcall expect 10 "DCC: chat offered by dummy")
+ (erc-cmd-DCC "CHAT" "dummy")))
+
+ ;; Regression
+ (erc-d-t-ensure-for 1 (not (get-buffer "tester")))
+
+ ;; Becomes current buffer by default (because `erc-join-buffer')
+ (erc-d-t-wait-for 10 (get-buffer "DCC-CHAT-dummy"))
+
+ (with-current-buffer "foonet"
+ (funcall expect 10 "*** DCC: accepting chat from dummy"))
+
+ (ert-info ("Chat with dummy")
+ (with-current-buffer "DCC-CHAT-dummy"
+ (erc-scenarios-common-say "Hi")
+ (funcall expect 10 "Hola")))))
+
;;; erc-scenarios-misc.el ends here
diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el
index 4971d0e194f..0f222edacfa 100644
--- a/test/lisp/erc/erc-tests.el
+++ b/test/lisp/erc/erc-tests.el
@@ -893,4 +893,86 @@
(should-not calls))))))
+;; Note: if adding an erc-backend-tests.el, please relocate this there.
+
+(ert-deftest erc-message ()
+ (should-not erc-server-last-peers)
+ (let (server-proc
+ calls
+ erc-kill-channel-hook erc-kill-server-hook erc-kill-buffer-hook)
+ (cl-letf (((symbol-function 'erc-display-message)
+ (lambda (_ _ _ line) (push line calls)))
+ ((symbol-function 'erc-server-send)
+ (lambda (line _) (push line calls)))
+ ((symbol-function 'erc-server-buffer)
+ (lambda () (process-buffer server-proc))))
+ (with-current-buffer (get-buffer-create "ExampleNet")
+ (erc-mode)
+ (setq erc-server-current-nick "tester"
+ server-proc (start-process "sleep" (current-buffer) "sleep" "1")
+ erc-server-process server-proc
+ erc-server-last-peers (cons nil nil)
+ erc-server-users (make-hash-table :test 'equal)
+ erc-network 'ExampleNet)
+ (set-process-query-on-exit-flag erc-server-process nil))
+
+ (with-current-buffer (get-buffer-create "#chan")
+ (erc-mode)
+ (setq erc-server-process (buffer-local-value 'erc-server-process
+ (get-buffer "ExampleNet"))
+ erc-default-recipients '("#chan")
+ erc-channel-users (make-hash-table :test 'equal)
+ erc-network 'ExampleNet)
+ (erc-update-current-channel-member "alice" "alice")
+ (erc-update-current-channel-member "tester" "tester"))
+
+ (with-current-buffer "ExampleNet"
+ (erc-server-PRIVMSG erc-server-process
+ (make-erc-response
+ :sender "alice!~u@fsf.org"
+ :command "PRIVMSG"
+ :command-args '("#chan" "hi")
+ :unparsed ":alice!~u@fsf.org PRIVMSG #chan :hi"))
+ (should (equal erc-server-last-peers '("alice")))
+ (should (string-match "<alice>" (pop calls))))
+
+ (with-current-buffer "#chan"
+ (ert-info ("Shortcuts usable in target buffers")
+ (should-not (local-variable-p 'erc-server-last-peers))
+ (should-not erc-server-last-peers)
+ (erc-message "PRIVMSG" ". hi")
+ (should-not erc-server-last-peers)
+ (should (eq 'no-target (pop calls)))
+ (erc-message "PRIVMSG" ", hi")
+ (should-not erc-server-last-peers)
+ (should (string-match "alice :hi" (pop calls)))))
+
+ (with-current-buffer "ExampleNet"
+ (ert-info ("Shortcuts local in server bufs")
+ (should (equal erc-server-last-peers '("alice" . "alice")))
+ (erc-message "PRIVMSG" ", hi")
+ (should (equal erc-server-last-peers '("alice" . "alice")))
+ (should (string-match "PRIVMSG alice :hi" (pop calls)))
+ (setcdr erc-server-last-peers "bob")
+ (erc-message "PRIVMSG" ". hi")
+ (should (equal erc-server-last-peers '("alice" . "bob")))
+ (should (string-match "PRIVMSG bob :hi" (pop calls)))))
+
+ (with-current-buffer "#chan"
+ (ert-info ("Non-shortcuts are local to server buffer")
+ (should-not (local-variable-p 'erc-server-last-peers))
+ (should-not erc-server-last-peers)
+ (erc-message "PRIVMSG" "#chan hola")
+ (should-not erc-server-last-peers)
+ (should-not (default-value 'erc-server-last-peers))
+ (should (equal (buffer-local-value 'erc-server-last-peers
+ (get-buffer "ExampleNet"))
+ '("alice" . "#chan")))
+ (should (string-match "hola" (pop calls))))))
+
+ (should-not erc-server-last-peers)
+ (should-not calls)
+ (kill-buffer "ExampleNet")
+ (kill-buffer "#chan")))
+
;;; erc-tests.el ends here
diff --git a/test/lisp/erc/resources/dcc/chat/accept-dcc.eld b/test/lisp/erc/resources/dcc/chat/accept-dcc.eld
new file mode 100644
index 00000000000..23828a8115e
--- /dev/null
+++ b/test/lisp/erc/resources/dcc/chat/accept-dcc.eld
@@ -0,0 +1,3 @@
+;; -*- mode: lisp-data; -*-
+((open 10 "Hi")
+ (0 "Hola"))
diff --git a/test/lisp/erc/resources/dcc/chat/accept.eld b/test/lisp/erc/resources/dcc/chat/accept.eld
new file mode 100644
index 00000000000..a23e9580bcc
--- /dev/null
+++ b/test/lisp/erc/resources/dcc/chat/accept.eld
@@ -0,0 +1,23 @@
+;; -*- mode: lisp-data; -*-
+((pass 1 "PASS :changeme"))
+((nick 1 "NICK tester"))
+((user 1 "USER user 0 * :tester")
+ (0 ":irc.foonet.org 001 tester :Welcome to the foonet IRC Network tester")
+ (0 ":irc.foonet.org 002 tester :Your host is irc.foonet.org, running version oragono-2.6.0-7481bf0385b95b16")
+ (0 ":irc.foonet.org 003 tester :This server was created Mon, 31 May 2021 09:56:24 UTC")
+ (0 ":irc.foonet.org 004 tester irc.foonet.org oragono-2.6.0-7481bf0385b95b16 BERTZios CEIMRUabefhiklmnoqstuv Iabefhkloqv")
+ (0 ":irc.foonet.org 005 tester AWAYLEN=390 BOT=B CASEMAPPING=ascii CHANLIMIT=#:100 CHANMODES=Ibe,k,fl,CEMRUimnstu CHANNELLEN=64 CHANTYPES=# ELIST=U EXCEPTS EXTBAN=,m FORWARD=f INVEX KICKLEN=390 :are supported by this server")
+ (0 ":irc.foonet.org 005 tester MAXLIST=beI:60 MAXTARGETS=4 MODES MONITOR=100 NETWORK=foonet NICKLEN=32 PREFIX=(qaohv)~&@%+ STATUSMSG=~&@%+ TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,USERHOST:10,PRIVMSG:4,TAGMSG:4,NOTICE:4,MONITOR:100 TOPICLEN=390 UTF8MAPPING=rfc8265 UTF8ONLY WHOX :are supported by this server")
+ (0 ":irc.foonet.org 005 tester draft/CHATHISTORY=100 :are supported by this server")
+ (0 ":irc.foonet.org 251 tester :There are 0 users and 4 invisible on 1 server(s)")
+ (0 ":irc.foonet.org 252 tester 0 :IRC Operators online")
+ (0 ":irc.foonet.org 254 tester 2 :channels formed")
+ (0 ":irc.foonet.org 255 tester :I have 4 clients and 0 servers")
+ (0 ":irc.foonet.org 265 tester 4 4 :Current local users 4, max 4")
+ (0 ":irc.foonet.org 266 tester 4 4 :Current global users 4, max 4")
+ (0 ":irc.foonet.org 422 tester :MOTD File is missing"))
+
+((mode-user 1.2 "MODE tester +i")
+ ;; No mode answer
+ (0 ":irc.foonet.org NOTICE tester :This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect.")
+ (0.2 ":dummy!~u@34n9brushbpj2.irc PRIVMSG tester :\C-aDCC CHAT chat 2130706433 " port "\C-a"))
diff --git a/test/lisp/erc/resources/erc-d/erc-d-tests.el b/test/lisp/erc/resources/erc-d/erc-d-tests.el
index 21005cd7600..357bc48b088 100644
--- a/test/lisp/erc/resources/erc-d/erc-d-tests.el
+++ b/test/lisp/erc/resources/erc-d/erc-d-tests.el
@@ -1343,4 +1343,31 @@ DIALOGS are symbols representing the base names of dialog files in
(kill-buffer dumb-server-buffer)))
(delete-file sock))))
+(ert-deftest erc-d-run-direct-foreign-protocol ()
+ :tags '(:expensive-test)
+ (let* ((server (erc-d-run "localhost" t "erc-d-server" 'foreign
+ :ending "\n"))
+ (server-buffer (get-buffer "*erc-d-server*"))
+ (client-buffer (get-buffer-create "*erc-d-client*"))
+ client)
+ (with-current-buffer server-buffer (erc-d-t-search-for 4 "Starting"))
+ (setq client (make-network-process
+ :buffer client-buffer
+ :name "erc-d-client"
+ :family 'ipv4
+ :noquery t
+ :coding 'binary
+ :service (process-contact server :service)
+ :host "localhost"))
+ (process-send-string client "ONE one\n")
+ (with-current-buffer client-buffer
+ (erc-d-t-search-for 5 "echo ONE one"))
+ (process-send-string client "TWO two\n")
+ (with-current-buffer client-buffer
+ (erc-d-t-search-for 2 "echo TWO two"))
+ (erc-d-t-wait-for 2 "server death" (not (process-live-p server)))
+ (when noninteractive
+ (kill-buffer client-buffer)
+ (kill-buffer server-buffer))))
+
;;; erc-d-tests.el ends here
diff --git a/test/lisp/erc/resources/erc-d/erc-d.el b/test/lisp/erc/resources/erc-d/erc-d.el
index ee9b6a7fec9..d6082227c52 100644
--- a/test/lisp/erc/resources/erc-d/erc-d.el
+++ b/test/lisp/erc/resources/erc-d/erc-d.el
@@ -136,6 +136,9 @@ Only relevant when starting a server with `erc-d-run'.")
Possibly used by overriding handlers, like the one for PING, and/or
dialog templates for the sender portion of a reply message.")
+(defvar erc-d-line-ending "\r\n"
+ "Protocol line delimiter for sending and receiving.")
+
(defvar erc-d-linger-secs nil
"Seconds to wait before quitting for all dialogs.
For more granular control, use the provided LINGER `rx' variable (alone)
@@ -249,6 +252,7 @@ return a replacement.")
(mat-h (copy-sequence (process-get process :dialog-match-handlers)))
(fqdn (copy-sequence (process-get process :dialog-server-fqdn)))
(vars (copy-sequence (process-get process :dialog-vars)))
+ (ending (process-get process :dialog-ending))
(dialog (make-erc-d-dialog :name name
:process process
:queue (make-ring 5)
@@ -263,6 +267,8 @@ return a replacement.")
(erc-d-dialog-hunks dialog) reader)
;; Add reverse link, register client, launch
(process-put process :dialog dialog)
+ (process-put process :ending ending)
+ (process-put process :ending-regexp (rx-to-string `(+ ,ending)))
(push process erc-d--clients)
(erc-d--command-refresh dialog nil)
(erc-d--on-request process)))
@@ -311,7 +317,7 @@ PROCESS should be a client connection or a server network process."
(name (erc-d-dialog-name (process-get ,process :dialog))))
(if ,outbound
(erc-d--m process "-> %s:%s %s" name id ,string)
- (dolist (line (split-string ,string "\r\n"))
+ (dolist (line (split-string ,string (process-get process :ending)))
(erc-d--m process "<- %s:%s %s" name id line)))))
(defun erc-d--log-process-event (server process msg)
@@ -320,7 +326,7 @@ PROCESS should be a client connection or a server network process."
(defun erc-d--send (process string)
"Send STRING to PROCESS peer."
(erc-d--log process string 'outbound)
- (process-send-string process (concat string "\r\n")))
+ (process-send-string process (concat string (process-get process :ending))))
(define-inline erc-d--fuzzy-p (exchange)
(inline-letevals (exchange)
@@ -442,9 +448,10 @@ This will start the teardown for DIALOG."
"Handle input received from peer.
PROCESS represents a client peer connection and STRING is a raw request
including line delimiters."
- (let ((queue (erc-d-dialog-queue (process-get process :dialog))))
+ (let ((queue (erc-d-dialog-queue (process-get process :dialog)))
+ (delim (process-get process :ending-regexp)))
(setq string (concat (process-get process :stashed-input) string))
- (while (and string (string-match (rx (+ "\r\n")) string))
+ (while (and string (string-match delim string))
(let ((line (substring string 0 (match-beginning 0))))
(setq string (unless (= (match-end 0) (length string))
(substring string (match-end 0))))
@@ -913,35 +920,40 @@ Pass HOST and SERVICE directly to `make-network-process'. When present,
use string SERVER-NAME for the server-process name as well as that of
its buffer (w. surrounding asterisks). When absent, do the same with
`erc-d-server-name'. When running \"in process,\" return the server
-process, otherwise sleep for the duration of the server process.
+process; otherwise sleep until it dies.
A dialog must be a symbol matching the base name of a dialog file in
-`erc-d-u-canned-dialog-dir'.
-
-The variable `erc-d-tmpl-vars' determines the common members of the
-`erc-d--render-entries' ENTRIES param. Variables `erc-d-server-fqdn'
-and `erc-d-linger-secs' determine the `erc-d-dialog' items
-`:server-fqdn' and `:linger-secs' for all client processes.
-
-The variable `erc-d-tmpl-vars' can be used to initialize the
-process's `erc-d-dialog' vars item."
+`erc-d-u-canned-dialog-dir'. Global variables `erc-d-server-fqdn',
+`erc-d-linger-secs', and `erc-d-tmpl-vars' determine the process's
+`erc-d-dialog' fields `:server-fqdn', `:linger-secs', and `:vars',
+respectively. The latter may also be populated via keyword pairs
+appearing among DIALOGS."
(when (and server-name (symbolp server-name))
(push server-name dialogs)
(setq server-name nil))
- (let (loaded)
- (dolist (dialog (nreverse dialogs))
- (let ((reader (erc-d-u--canned-load-dialog dialog)))
- (when erc-d--slow-mo
- (setq reader (erc-d-u--rewrite-for-slow-mo erc-d--slow-mo reader)))
- (push (cons (erc-d-u--normalize-canned-name dialog) reader) loaded)))
- (setq dialogs loaded))
- (erc-d--start host service (or server-name erc-d-server-name)
- :dialog-dialogs dialogs
- :dialog-vars erc-d-tmpl-vars
- :dialog-linger-secs erc-d-linger-secs
- :dialog-server-fqdn erc-d-server-fqdn
- :dialog-match-handlers (erc-d-u--unkeyword
- erc-d-match-handlers)))
+ (let (loaded kwds defaults args)
+ (while dialogs
+ (if-let* ((dlog (pop dialogs))
+ ((keywordp dlog)))
+ (progn (push (pop dialogs) kwds) (push dlog kwds))
+ (let ((reader (erc-d-u--canned-load-dialog dlog)))
+ (when erc-d--slow-mo
+ (setq reader (erc-d-u--rewrite-for-slow-mo erc-d--slow-mo reader)))
+ (push (cons (erc-d-u--normalize-canned-name dlog) reader) loaded))))
+ (setq kwds (erc-d-u--unkeyword kwds)
+ defaults `((ending . ,erc-d-line-ending)
+ (server-fqdn . ,erc-d-server-fqdn)
+ (linger-secs . ,erc-d-linger-secs)
+ (vars . ,(or (plist-get kwds 'tmpl-vars) erc-d-tmpl-vars))
+ (dialogs . ,(nreverse loaded)))
+ args (list :dialog-match-handlers
+ (erc-d-u--unkeyword (or (plist-get kwds 'match-handlers)
+ erc-d-match-handlers))))
+ (pcase-dolist (`(,var . ,def) defaults)
+ (push (or (plist-get kwds var) def) args)
+ (push (intern (format ":dialog-%s" var)) args))
+ (apply #'erc-d--start host service (or server-name erc-d-server-name)
+ args)))
(defun erc-d-serve ()
"Start serving canned dialogs from the command line.
diff --git a/test/lisp/erc/resources/erc-d/resources/foreign.eld b/test/lisp/erc/resources/erc-d/resources/foreign.eld
new file mode 100644
index 00000000000..64a5dca8b10
--- /dev/null
+++ b/test/lisp/erc/resources/erc-d/resources/foreign.eld
@@ -0,0 +1,5 @@
+;;; -*- mode: lisp-data -*-
+((one 5 "ONE one")
+ (0 "echo ONE one"))
+((two 5 "TWO two")
+ (0 "echo TWO two"))
diff --git a/test/lisp/erc/resources/erc-scenarios-common.el b/test/lisp/erc/resources/erc-scenarios-common.el
index cbabfcd26be..bc2cb68cd86 100644
--- a/test/lisp/erc/resources/erc-scenarios-common.el
+++ b/test/lisp/erc/resources/erc-scenarios-common.el
@@ -142,10 +142,10 @@ Dialog resource directories are located by expanding the variable
(declare (indent 1))
(let* ((orig-autojoin-mode (make-symbol "orig-autojoin-mode"))
- (combind `((,orig-autojoin-mode (bound-and-true-p erc-autojoin-mode))
+ (combined `((,orig-autojoin-mode (bound-and-true-p erc-autojoin-mode))
,@(erc-scenarios-common--make-bindings bindings))))
- `(erc-d-t-with-cleanup (,@combind)
+ `(erc-d-t-with-cleanup (,@combined)
(ert-info ("Restore autojoin, etc., kill ERC buffers")
(dolist (buf (buffer-list))
diff --git a/test/lisp/eshell/em-alias-tests.el b/test/lisp/eshell/em-alias-tests.el
index 497159e3460..aca622220e3 100644
--- a/test/lisp/eshell/em-alias-tests.el
+++ b/test/lisp/eshell/em-alias-tests.el
@@ -38,50 +38,50 @@
"Test a simple alias with no arguments"
(with-temp-eshell
(eshell-insert-command "alias say-hi 'echo hi'")
- (eshell-command-result-p "say-hi" "hi\n")
- (eshell-command-result-p "say-hi bye" "hi\n")))
+ (eshell-match-command-output "say-hi" "hi\n")
+ (eshell-match-command-output "say-hi bye" "hi\n")))
(ert-deftest em-alias-test/alias-arg-vars ()
"Test alias with $0, $1, ... variables"
(with-temp-eshell
(eshell-insert-command "alias show-args 'printnl $0 \"$1 $2\"'")
- (eshell-command-result-p "show-args one two" "show-args\none two\n")))
+ (eshell-match-command-output "show-args one two" "show-args\none two\n")))
(ert-deftest em-alias-test/alias-arg-vars-indices ()
"Test alias with $1, $2, ... variables using indices"
(with-temp-eshell
(eshell-insert-command "alias funny-sum '+ $1[0] $2[1]'")
- (eshell-command-result-p "funny-sum (list 1 2) (list 3 4)"
- "5\n")))
+ (eshell-match-command-output "funny-sum (list 1 2) (list 3 4)"
+ "5\n")))
(ert-deftest em-alias-test/alias-arg-vars-split-indices ()
"Test alias with $0, $1, ... variables using split indices"
(with-temp-eshell
(eshell-insert-command "alias my-prefix 'echo $0[- 0]'")
- (eshell-command-result-p "my-prefix"
- "my\n")
+ (eshell-match-command-output "my-prefix"
+ "my\n")
(eshell-insert-command "alias funny-sum '+ $1[: 0] $2[: 1]'")
- (eshell-command-result-p "funny-sum 1:2 3:4"
- "5\n")))
+ (eshell-match-command-output "funny-sum 1:2 3:4"
+ "5\n")))
(ert-deftest em-alias-test/alias-all-args-var ()
"Test alias with the $* variable"
(with-temp-eshell
(eshell-insert-command "alias show-all-args 'printnl $*'")
- (eshell-command-result-p "show-all-args" "\\`\\'")
- (eshell-command-result-p "show-all-args a" "a\n")
- (eshell-command-result-p "show-all-args a b c" "a\nb\nc\n")))
+ (eshell-match-command-output "show-all-args" "\\`\\'")
+ (eshell-match-command-output "show-all-args a" "a\n")
+ (eshell-match-command-output "show-all-args a b c" "a\nb\nc\n")))
(ert-deftest em-alias-test/alias-all-args-var-indices ()
"Test alias with the $* variable using indices"
(with-temp-eshell
(eshell-insert-command "alias add-pair '+ $*[0] $*[1]'")
- (eshell-command-result-p "add-pair 1 2" "3\n")))
+ (eshell-match-command-output "add-pair 1 2" "3\n")))
(ert-deftest em-alias-test/alias-all-args-var-split-indices ()
"Test alias with the $* variable using split indices"
(with-temp-eshell
(eshell-insert-command "alias add-funny-pair '+ $*[0][: 0] $*[1][: 1]'")
- (eshell-command-result-p "add-funny-pair 1:2 3:4" "5\n")))
+ (eshell-match-command-output "add-funny-pair 1:2 3:4" "5\n")))
;; em-alias-tests.el ends here
diff --git a/test/lisp/eshell/em-basic-tests.el b/test/lisp/eshell/em-basic-tests.el
index 7a24f8b46c3..bc8baeaa035 100644
--- a/test/lisp/eshell/em-basic-tests.el
+++ b/test/lisp/eshell/em-basic-tests.el
@@ -36,25 +36,25 @@
(ert-deftest em-basic-test/umask-print-numeric ()
"Test printing umask numerically."
(cl-letf (((symbol-function 'default-file-modes) (lambda () #o775)))
- (should (equal (eshell-test-command-result "umask") "002\n")))
+ (eshell-command-result-equal "umask" "002\n"))
(cl-letf (((symbol-function 'default-file-modes) (lambda () #o654)))
- (should (equal (eshell-test-command-result "umask") "123\n")))
+ (eshell-command-result-equal "umask" "123\n"))
;; Make sure larger numbers don't cause problems.
(cl-letf (((symbol-function 'default-file-modes) (lambda () #o1775)))
- (should (equal (eshell-test-command-result "umask") "002\n"))))
+ (eshell-command-result-equal "umask" "002\n")))
(ert-deftest em-basic-test/umask-read-symbolic ()
"Test printing umask symbolically."
(cl-letf (((symbol-function 'default-file-modes) (lambda () #o775)))
- (should (equal (eshell-test-command-result "umask -S")
- "u=rwx,g=rwx,o=rx\n")))
+ (eshell-command-result-equal "umask -S"
+ "u=rwx,g=rwx,o=rx\n"))
(cl-letf (((symbol-function 'default-file-modes) (lambda () #o654)))
- (should (equal (eshell-test-command-result "umask -S")
- "u=wx,g=rx,o=x\n")))
+ (eshell-command-result-equal "umask -S"
+ "u=wx,g=rx,o=x\n"))
;; Make sure larger numbers don't cause problems.
(cl-letf (((symbol-function 'default-file-modes) (lambda () #o1775)))
- (should (equal (eshell-test-command-result "umask -S")
- "u=rwx,g=rwx,o=rx\n"))))
+ (eshell-command-result-equal "umask -S"
+ "u=rwx,g=rwx,o=rx\n")))
(ert-deftest em-basic-test/umask-set ()
"Test setting umask."
diff --git a/test/lisp/eshell/em-dirs-tests.el b/test/lisp/eshell/em-dirs-tests.el
index 8e96cc07471..f72d708dcae 100644
--- a/test/lisp/eshell/em-dirs-tests.el
+++ b/test/lisp/eshell/em-dirs-tests.el
@@ -37,66 +37,66 @@
(ert-deftest em-dirs-test/pwd-var ()
"Test using the $PWD variable."
(let ((default-directory "/some/path"))
- (should (equal (eshell-test-command-result "echo $PWD")
- (expand-file-name default-directory)))))
+ (eshell-command-result-equal "echo $PWD"
+ (expand-file-name default-directory))))
(ert-deftest em-dirs-test/pwd-var-indices ()
"Test using the $PWD variable with indices."
(let ((default-directory "/some/path/here"))
- (should (equal (eshell-test-command-result "echo $PWD[/ 1]")
- "some"))
- (should (equal (eshell-test-command-result "echo $PWD[/ 1 3]")
- '("some" "here")))))
+ (eshell-command-result-equal "echo $PWD[/ 1]"
+ "some")
+ (eshell-command-result-equal "echo $PWD[/ 1 3]"
+ '("some" "here"))))
(ert-deftest em-dirs-test/short-pwd-var ()
"Test using the $+ (current directory) variable."
(let ((default-directory "/some/path"))
- (should (equal (eshell-test-command-result "echo $+")
- (expand-file-name default-directory)))))
+ (eshell-command-result-equal "echo $+"
+ (expand-file-name default-directory))))
(ert-deftest em-dirs-test/oldpwd-var ()
"Test using the $OLDPWD variable."
(let (eshell-last-dir-ring-file-name)
(with-temp-eshell
- (eshell-command-result-p "echo $OLDPWD"
- "\\`\\'")
+ (eshell-match-command-output "echo $OLDPWD"
+ "\\`\\'")
(ring-insert eshell-last-dir-ring "/some/path")
- (eshell-command-result-p "echo $OLDPWD"
- "/some/path\n"))))
+ (eshell-match-command-output "echo $OLDPWD"
+ "/some/path\n"))))
(ert-deftest em-dirs-test/oldpwd-var-indices ()
"Test using the $OLDPWD variable with indices."
(let (eshell-last-dir-ring-file-name)
(with-temp-eshell
(ring-insert eshell-last-dir-ring "/some/path/here")
- (eshell-command-result-p "echo $OLDPWD[/ 1]"
- "some\n")
- (eshell-command-result-p "echo $OLDPWD[/ 1 3]"
- "(\"some\" \"here\")\n"))))
+ (eshell-match-command-output "echo $OLDPWD[/ 1]"
+ "some\n")
+ (eshell-match-command-output "echo $OLDPWD[/ 1 3]"
+ "(\"some\" \"here\")\n"))))
(ert-deftest em-dirs-test/directory-ring-var ()
"Test using the $- (directory ring) variable."
(let (eshell-last-dir-ring-file-name)
(with-temp-eshell
- (eshell-command-result-p "echo $-"
- "\\`\\'")
+ (eshell-match-command-output "echo $-"
+ "\\`\\'")
(ring-insert eshell-last-dir-ring "/some/path")
(ring-insert eshell-last-dir-ring "/other/path")
- (eshell-command-result-p "echo $-"
- "/other/path\n")
- (eshell-command-result-p "echo $-[0]"
- "/other/path\n")
- (eshell-command-result-p "echo $-[1]"
- "/some/path\n"))))
+ (eshell-match-command-output "echo $-"
+ "/other/path\n")
+ (eshell-match-command-output "echo $-[0]"
+ "/other/path\n")
+ (eshell-match-command-output "echo $-[1]"
+ "/some/path\n"))))
(ert-deftest em-dirs-test/directory-ring-var-indices ()
"Test using the $- (directory ring) variable with multiple indices."
(let (eshell-last-dir-ring-file-name)
(with-temp-eshell
(ring-insert eshell-last-dir-ring "/some/path/here")
- (eshell-command-result-p "echo $-[0][/ 1]"
- "some\n")
- (eshell-command-result-p "echo $-[1][/ 1 3]"
- "(\"some\" \"here\")\n"))))
+ (eshell-match-command-output "echo $-[0][/ 1]"
+ "some\n")
+ (eshell-match-command-output "echo $-[1][/ 1 3]"
+ "(\"some\" \"here\")\n"))))
;; em-dirs-tests.el ends here
diff --git a/test/lisp/eshell/em-extpipe-tests.el b/test/lisp/eshell/em-extpipe-tests.el
index 29f5dc05512..04e78279427 100644
--- a/test/lisp/eshell/em-extpipe-tests.el
+++ b/test/lisp/eshell/em-extpipe-tests.el
@@ -80,7 +80,7 @@
(should-parse '(eshell-named-command
"sh" (list "-c" "echo \"bar\" | rev >temp")))
(with-substitute-for-temp
- (eshell-command-result-p input "^$")
+ (eshell-match-command-output input "^$")
(temp-should-string= "rab")))
(em-extpipe-tests--deftest em-extpipe-test-2
@@ -91,7 +91,7 @@
'((eshell-named-command "echo" (list (eshell-escape-arg "bar")))
(eshell-named-command "sh" (list "-c" "rev >temp")))))
(with-substitute-for-temp
- (eshell-command-result-p input "^$")
+ (eshell-match-command-output input "^$")
(temp-should-string= "rab")))
(em-extpipe-tests--deftest em-extpipe-test-3 "foo *| bar | baz -d"
@@ -111,7 +111,7 @@
(eshell-named-command "sh"
(list "-c" "echo \"bar\" | rev"))))
(with-substitute-for-temp
- (eshell-command-result-p input "^$")
+ (eshell-match-command-output input "^$")
(temp-buffer-should-string= "rab")))
(em-extpipe-tests--deftest em-extpipe-test-5
@@ -177,7 +177,7 @@
(should-parse '(eshell-named-command "sh" (list "-c" "tac <temp")))
(with-substitute-for-temp
(with-temp-buffer (insert "bar\nbaz\n") (write-file temp))
- (eshell-command-result-p input "baz\nbar")))
+ (eshell-match-command-output input "baz\nbar")))
(em-extpipe-tests--deftest em-extpipe-test-15 "echo \"bar\" *| cat"
(skip-unless (executable-find "cat"))
@@ -185,8 +185,8 @@
'(eshell-named-command "sh" (list "-c" "echo \"bar\" | cat")))
(cl-letf (((symbol-function 'eshell/cat)
(lambda (&rest _args) (eshell-print "nonsense"))))
- (eshell-command-result-p input "bar")
- (eshell-command-result-p "echo \"bar\" | cat" "nonsense")))
+ (eshell-match-command-output input "bar")
+ (eshell-match-command-output "echo \"bar\" | cat" "nonsense")))
(em-extpipe-tests--deftest em-extpipe-test-16 "echo \"bar\" *| rev"
(skip-unless (executable-find "rev"))
@@ -195,11 +195,11 @@
(let ((eshell-prefer-lisp-functions t))
(cl-letf (((symbol-function 'rev)
(lambda (&rest _args) (eshell-print "nonsense"))))
- (eshell-command-result-p input "rab")
- (eshell-command-result-p "echo \"bar\" | rev" "nonsense"))))
+ (eshell-match-command-output input "rab")
+ (eshell-match-command-output "echo \"bar\" | rev" "nonsense"))))
;; Confirm we don't break input of sharp-quoted symbols (Bug#53518).
(em-extpipe-tests--deftest em-extpipe-test-17 "funcall #'upcase foo"
- (eshell-command-result-p input "FOO"))
+ (eshell-match-command-output input "FOO"))
;;; em-extpipe-tests.el ends here
diff --git a/test/lisp/eshell/em-pred-tests.el b/test/lisp/eshell/em-pred-tests.el
index c8c1a6a9317..0d6351ec826 100644
--- a/test/lisp/eshell/em-pred-tests.el
+++ b/test/lisp/eshell/em-pred-tests.el
@@ -75,7 +75,7 @@ The following attributes are recognized:
(`(,(and (or "links" "uid" "gid" "size") key) ,value)
(cons (intern key) (string-to-number value)))
(`(,(and (or "atime" "mtime" "ctime") key) ,value)
- (cons (intern key) (time-convert (string-to-number value))))
+ (cons (intern key) (time-convert (string-to-number value) t)))
(`(,key ,value)
(cons (intern key) value))
(_ (error "invalid format %S" i))))
diff --git a/test/lisp/eshell/em-script-tests.el b/test/lisp/eshell/em-script-tests.el
index a34f9434021..b837d464ccd 100644
--- a/test/lisp/eshell/em-script-tests.el
+++ b/test/lisp/eshell/em-script-tests.el
@@ -38,25 +38,25 @@
"Test sourcing script with no argumentss"
(ert-with-temp-file temp-file :text "echo hi"
(with-temp-eshell
- (eshell-command-result-p (format "source %s" temp-file)
- "hi\n"))))
+ (eshell-match-command-output (format "source %s" temp-file)
+ "hi\n"))))
(ert-deftest em-script-test/source-script-arg-vars ()
"Test sourcing script with $0, $1, ... variables"
(ert-with-temp-file temp-file :text "printnl $0 \"$1 $2\""
(with-temp-eshell
- (eshell-command-result-p (format "source %s one two" temp-file)
- (format "%s\none two\n" temp-file)))))
+ (eshell-match-command-output (format "source %s one two" temp-file)
+ (format "%s\none two\n" temp-file)))))
(ert-deftest em-script-test/source-script-all-args-var ()
"Test sourcing script with the $* variable"
(ert-with-temp-file temp-file :text "printnl $*"
(with-temp-eshell
- (eshell-command-result-p (format "source %s" temp-file)
- "\\`\\'")
- (eshell-command-result-p (format "source %s a" temp-file)
- "a\n")
- (eshell-command-result-p (format "source %s a b c" temp-file)
- "a\nb\nc\n"))))
+ (eshell-match-command-output (format "source %s" temp-file)
+ "\\`\\'")
+ (eshell-match-command-output (format "source %s a" temp-file)
+ "a\n")
+ (eshell-match-command-output (format "source %s a b c" temp-file)
+ "a\nb\nc\n"))))
;; em-script-tests.el ends here
diff --git a/test/lisp/eshell/esh-cmd-tests.el b/test/lisp/eshell/esh-cmd-tests.el
new file mode 100644
index 00000000000..3a582965d62
--- /dev/null
+++ b/test/lisp/eshell/esh-cmd-tests.el
@@ -0,0 +1,275 @@
+;;; esh-cmd-tests.el --- esh-cmd test suite -*- lexical-binding:t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Tests for Eshell's command invocation.
+
+;;; Code:
+
+(require 'ert)
+(require 'esh-mode)
+(require 'eshell)
+
+(require 'eshell-tests-helpers
+ (expand-file-name "eshell-tests-helpers"
+ (file-name-directory (or load-file-name
+ default-directory))))
+
+(defvar eshell-test-value nil)
+
+;;; Tests:
+
+
+;; Command invocation
+
+(ert-deftest esh-cmd-test/simple-command-result ()
+ "Test invocation with a simple command."
+ (eshell-command-result-equal "+ 1 2" 3))
+
+(ert-deftest esh-cmd-test/lisp-command ()
+ "Test invocation with an elisp command."
+ (eshell-command-result-equal "(+ 1 2)" 3))
+
+(ert-deftest esh-cmd-test/lisp-command-with-quote ()
+ "Test invocation with an elisp command containing a quote."
+ (eshell-command-result-equal "(eq 'foo nil)" nil))
+
+(ert-deftest esh-cmd-test/lisp-command-args ()
+ "Test invocation with elisp and trailing args.
+Test that trailing arguments outside the S-expression are
+ignored. e.g. \"(+ 1 2) 3\" => 3"
+ (eshell-command-result-equal "(+ 1 2) 3" 3))
+
+(ert-deftest esh-cmd-test/subcommand ()
+ "Test invocation with a simple subcommand."
+ (eshell-command-result-equal "{+ 1 2}" 3))
+
+(ert-deftest esh-cmd-test/subcommand-args ()
+ "Test invocation with a subcommand and trailing args.
+Test that trailing arguments outside the subcommand are ignored.
+e.g. \"{+ 1 2} 3\" => 3"
+ (eshell-command-result-equal "{+ 1 2} 3" 3))
+
+(ert-deftest esh-cmd-test/subcommand-lisp ()
+ "Test invocation with an elisp subcommand and trailing args.
+Test that trailing arguments outside the subcommand are ignored.
+e.g. \"{(+ 1 2)} 3\" => 3"
+ (eshell-command-result-equal "{(+ 1 2)} 3" 3))
+
+
+;; Logical operators
+
+(ert-deftest esh-cmd-test/and-operator ()
+ "Test logical && operator."
+ (skip-unless (executable-find "["))
+ (with-temp-eshell
+ (eshell-match-command-output "[ foo = foo ] && echo hi"
+ "hi\n")
+ (eshell-match-command-output "[ foo = bar ] && echo hi"
+ "\\`\\'")))
+
+(ert-deftest esh-cmd-test/or-operator ()
+ "Test logical || operator."
+ (skip-unless (executable-find "["))
+ (with-temp-eshell
+ (eshell-match-command-output "[ foo = foo ] || echo hi"
+ "\\`\\'")
+ (eshell-match-command-output "[ foo = bar ] || echo hi"
+ "hi\n")))
+
+
+;; Control flow statements
+
+(ert-deftest esh-cmd-test/for-loop ()
+ "Test invocation of a for loop."
+ (with-temp-eshell
+ (eshell-match-command-output "for i in 5 { echo $i }"
+ "5\n")))
+
+(ert-deftest esh-cmd-test/for-loop-list ()
+ "Test invocation of a for loop iterating over a list."
+ (with-temp-eshell
+ (eshell-match-command-output "for i in (list 1 2 (list 3 4)) { echo $i }"
+ "1\n2\n(3 4)\n")))
+
+(ert-deftest esh-cmd-test/for-loop-multiple-args ()
+ "Test invocation of a for loop iterating over multiple arguments."
+ (with-temp-eshell
+ (eshell-match-command-output "for i in 1 2 (list 3 4) { echo $i }"
+ "1\n2\n3\n4\n")))
+
+(ert-deftest esh-cmd-test/for-name-loop () ; bug#15231
+ "Test invocation of a for loop using `name'."
+ (let ((process-environment (cons "name" process-environment)))
+ (eshell-command-result-equal "for name in 3 { echo $name }"
+ 3)))
+
+(ert-deftest esh-cmd-test/for-name-shadow-loop () ; bug#15372
+ "Test invocation of a for loop using an env-var."
+ (let ((process-environment (cons "name=env-value" process-environment)))
+ (with-temp-eshell
+ (eshell-match-command-output
+ "echo $name; for name in 3 { echo $name }; echo $name"
+ "env-value\n3\nenv-value\n"))))
+
+(ert-deftest esh-cmd-test/while-loop ()
+ "Test invocation of a while loop."
+ (with-temp-eshell
+ (let ((eshell-test-value '(0 1 2)))
+ (eshell-match-command-output
+ (concat "while $eshell-test-value "
+ "{ setq eshell-test-value (cdr eshell-test-value) }")
+ "(1 2)\n(2)\n"))))
+
+(ert-deftest esh-cmd-test/while-loop-lisp-form ()
+ "Test invocation of a while loop using a Lisp form."
+ (with-temp-eshell
+ (let ((eshell-test-value 0))
+ (eshell-match-command-output
+ (concat "while (/= eshell-test-value 3) "
+ "{ setq eshell-test-value (1+ eshell-test-value) }")
+ "1\n2\n3\n"))))
+
+(ert-deftest esh-cmd-test/while-loop-ext-cmd ()
+ "Test invocation of a while loop using an external command."
+ (skip-unless (executable-find "["))
+ (with-temp-eshell
+ (let ((eshell-test-value 0))
+ (eshell-match-command-output
+ (concat "while {[ $eshell-test-value -ne 3 ]} "
+ "{ setq eshell-test-value (1+ eshell-test-value) }")
+ "1\n2\n3\n"))))
+
+(ert-deftest esh-cmd-test/until-loop ()
+ "Test invocation of an until loop."
+ (with-temp-eshell
+ (let ((eshell-test-value nil))
+ (eshell-match-command-output
+ (concat "until $eshell-test-value "
+ "{ setq eshell-test-value t }")
+ "t\n"))))
+
+(ert-deftest esh-cmd-test/until-loop-lisp-form ()
+ "Test invocation of an until loop using a Lisp form."
+ (skip-unless (executable-find "["))
+ (with-temp-eshell
+ (let ((eshell-test-value 0))
+ (eshell-match-command-output
+ (concat "until (= eshell-test-value 3) "
+ "{ setq eshell-test-value (1+ eshell-test-value) }")
+ "1\n2\n3\n"))))
+
+(ert-deftest esh-cmd-test/until-loop-ext-cmd ()
+ "Test invocation of an until loop using an external command."
+ (skip-unless (executable-find "["))
+ (with-temp-eshell
+ (let ((eshell-test-value 0))
+ (eshell-match-command-output
+ (concat "until {[ $eshell-test-value -eq 3 ]} "
+ "{ setq eshell-test-value (1+ eshell-test-value) }")
+ "1\n2\n3\n"))))
+
+(ert-deftest esh-cmd-test/if-statement ()
+ "Test invocation of an if statement."
+ (let ((eshell-test-value t))
+ (eshell-command-result-equal "if $eshell-test-value {echo yes}"
+ "yes"))
+ (let ((eshell-test-value nil))
+ (eshell-command-result-equal "if $eshell-test-value {echo yes}"
+ nil)))
+
+(ert-deftest esh-cmd-test/if-else-statement ()
+ "Test invocation of an if/else statement."
+ (let ((eshell-test-value t))
+ (eshell-command-result-equal "if $eshell-test-value {echo yes} {echo no}"
+ "yes"))
+ (let ((eshell-test-value nil))
+ (eshell-command-result-equal "if $eshell-test-value {echo yes} {echo no}"
+ "no")))
+
+(ert-deftest esh-cmd-test/if-else-statement-lisp-form ()
+ "Test invocation of an if/else statement using a Lisp form."
+ (eshell-command-result-equal "if (zerop 0) {echo yes} {echo no}"
+ "yes")
+ (eshell-command-result-equal "if (zerop 1) {echo yes} {echo no}"
+ "no")
+ (let ((debug-on-error nil))
+ (eshell-command-result-equal "if (zerop \"foo\") {echo yes} {echo no}"
+ "no")))
+
+(ert-deftest esh-cmd-test/if-else-statement-lisp-form-2 ()
+ "Test invocation of an if/else statement using a Lisp form.
+This tests when `eshell-lisp-form-nil-is-failure' is nil."
+ (let ((eshell-lisp-form-nil-is-failure nil))
+ (eshell-command-result-equal "if (zerop 0) {echo yes} {echo no}"
+ "yes")
+ (eshell-command-result-equal "if (zerop 1) {echo yes} {echo no}"
+ "yes")
+ (let ((debug-on-error nil))
+ (eshell-command-result-equal "if (zerop \"foo\") {echo yes} {echo no}"
+ "no"))))
+
+(ert-deftest esh-cmd-test/if-else-statement-ext-cmd ()
+ "Test invocation of an if/else statement using an external command."
+ (skip-unless (executable-find "["))
+ (eshell-command-result-equal "if {[ foo = foo ]} {echo yes} {echo no}"
+ "yes")
+ (eshell-command-result-equal "if {[ foo = bar ]} {echo yes} {echo no}"
+ "no"))
+
+(ert-deftest esh-cmd-test/unless-statement ()
+ "Test invocation of an unless statement."
+ (let ((eshell-test-value t))
+ (eshell-command-result-equal "unless $eshell-test-value {echo no}"
+ nil))
+ (let ((eshell-test-value nil))
+ (eshell-command-result-equal "unless $eshell-test-value {echo no}"
+ "no")))
+
+(ert-deftest esh-cmd-test/unless-else-statement ()
+ "Test invocation of an unless/else statement."
+ (let ((eshell-test-value t))
+ (eshell-command-result-equal
+ "unless $eshell-test-value {echo no} {echo yes}"
+ "yes"))
+ (let ((eshell-test-value nil))
+ (eshell-command-result-equal
+ "unless $eshell-test-value {echo no} {echo yes}"
+ "no")))
+
+(ert-deftest esh-cmd-test/unless-else-statement-lisp-form ()
+ "Test invocation of an unless/else statement using a Lisp form."
+ (eshell-command-result-equal "unless (zerop 0) {echo no} {echo yes}"
+ "yes")
+ (eshell-command-result-equal "unless (zerop 1) {echo no} {echo yes}"
+ "no")
+ (let ((debug-on-error nil))
+ (eshell-command-result-equal "unless (zerop \"foo\") {echo no} {echo yes}"
+ "no")))
+
+(ert-deftest esh-cmd-test/unless-else-statement-ext-cmd ()
+ "Test invocation of an unless/else statement using an external command."
+ (skip-unless (executable-find "["))
+ (eshell-command-result-equal "unless {[ foo = foo ]} {echo no} {echo yes}"
+ "yes")
+ (eshell-command-result-equal "unless {[ foo = bar ]} {echo no} {echo yes}"
+ "no"))
+
+;; esh-cmd-tests.el ends here
diff --git a/test/lisp/eshell/esh-proc-tests.el b/test/lisp/eshell/esh-proc-tests.el
index 7f461d1813c..2369bb5cc00 100644
--- a/test/lisp/eshell/esh-proc-tests.el
+++ b/test/lisp/eshell/esh-proc-tests.el
@@ -28,13 +28,22 @@
(file-name-directory (or load-file-name
default-directory))))
+(defvar esh-proc-test--detect-pty-cmd
+ (concat "sh -c '"
+ "if [ -t 0 ]; then echo stdin; fi; "
+ "if [ -t 1 ]; then echo stdout; fi; "
+ "if [ -t 2 ]; then echo stderr; fi"
+ "'"))
+
+;;; Tests:
+
(ert-deftest esh-proc-test/sigpipe-exits-process ()
"Test that a SIGPIPE is properly sent to a process if a pipe closes"
(skip-unless (and (executable-find "sh")
(executable-find "echo")
(executable-find "sleep")))
(with-temp-eshell
- (eshell-command-result-p
+ (eshell-match-command-output
;; The first command is like `yes' but slower. This is to prevent
;; it from taxing Emacs's process filter too much and causing a
;; hang.
@@ -44,6 +53,41 @@
(eshell-wait-for-subprocess t)
(should (eq (process-list) nil))))
+(ert-deftest esh-proc-test/pipeline-connection-type/no-pipeline ()
+ "Test that all streams are PTYs when a command is not in a pipeline."
+ (skip-unless (executable-find "sh"))
+ (eshell-command-result-equal
+ esh-proc-test--detect-pty-cmd
+ ;; PTYs aren't supported on MS-Windows.
+ (unless (eq system-type 'windows-nt)
+ "stdin\nstdout\nstderr\n")))
+
+(ert-deftest esh-proc-test/pipeline-connection-type/first ()
+ "Test that only stdin is a PTY when a command starts a pipeline."
+ (skip-unless (and (executable-find "sh")
+ (executable-find "cat")))
+ (eshell-command-result-equal
+ (concat esh-proc-test--detect-pty-cmd " | cat")
+ (unless (eq system-type 'windows-nt)
+ "stdin\n")))
+
+(ert-deftest esh-proc-test/pipeline-connection-type/middle ()
+ "Test that all streams are pipes when a command is in the middle of a
+pipeline."
+ (skip-unless (and (executable-find "sh")
+ (executable-find "cat")))
+ (eshell-command-result-equal
+ (concat "echo | " esh-proc-test--detect-pty-cmd " | cat")
+ nil))
+
+(ert-deftest esh-proc-test/pipeline-connection-type/last ()
+ "Test that only output streams are PTYs when a command ends a pipeline."
+ (skip-unless (executable-find "sh"))
+ (eshell-command-result-equal
+ (concat "echo | " esh-proc-test--detect-pty-cmd)
+ (unless (eq system-type 'windows-nt)
+ "stdout\nstderr\n")))
+
(ert-deftest esh-proc-test/kill-pipeline ()
"Test that killing a pipeline of processes only emits a single
prompt. See bug#54136."
@@ -93,4 +137,4 @@ prompt. See bug#54136."
(kill-process (caar eshell-process-list))
;; Give `eshell-sentinel' a chance to run.
(sit-for 0.1)
- (eshell-match-result "\\[sh\\(\\.exe\\)?\\] [[:digit:]]+\n")))
+ (should (eshell-match-output "\\[sh\\(\\.exe\\)?\\] [[:digit:]]+\n"))))
diff --git a/test/lisp/eshell/esh-var-tests.el b/test/lisp/eshell/esh-var-tests.el
index 54e701a6aab..bebc57d3592 100644
--- a/test/lisp/eshell/esh-var-tests.el
+++ b/test/lisp/eshell/esh-var-tests.el
@@ -41,311 +41,282 @@
(ert-deftest esh-var-test/interp-var ()
"Interpolate variable"
- (should (equal (eshell-test-command-result "echo $user-login-name")
- user-login-name)))
+ (eshell-command-result-equal "echo $user-login-name"
+ user-login-name))
(ert-deftest esh-var-test/interp-quoted-var ()
"Interpolate quoted variable"
- (should (equal (eshell-test-command-result "echo $'user-login-name'")
- user-login-name))
- (should (equal (eshell-test-command-result "echo $\"user-login-name\"")
- user-login-name)))
+ (eshell-command-result-equal "echo $'user-login-name'"
+ user-login-name)
+ (eshell-command-result-equal "echo $\"user-login-name\""
+ user-login-name))
(ert-deftest esh-var-test/interp-quoted-var-concat ()
"Interpolate and concat quoted variable"
- (should (equal (eshell-test-command-result "echo $'user-login-name'-foo")
- (concat user-login-name "-foo")))
- (should (equal (eshell-test-command-result "echo $\"user-login-name\"-foo")
- (concat user-login-name "-foo"))))
+ (eshell-command-result-equal "echo $'user-login-name'-foo"
+ (concat user-login-name "-foo"))
+ (eshell-command-result-equal "echo $\"user-login-name\"-foo"
+ (concat user-login-name "-foo")))
(ert-deftest esh-var-test/interp-var-indices ()
"Interpolate list variable with indices"
(let ((eshell-test-value '("zero" "one" "two" "three" "four")))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[0]")
- "zero"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[0 2]")
- '("zero" "two")))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[0 2 4]")
- '("zero" "two" "four")))))
+ (eshell-command-result-equal "echo $eshell-test-value[0]"
+ "zero")
+ (eshell-command-result-equal "echo $eshell-test-value[0 2]"
+ '("zero" "two"))
+ (eshell-command-result-equal "echo $eshell-test-value[0 2 4]"
+ '("zero" "two" "four"))))
(ert-deftest esh-var-test/interp-var-split-indices ()
"Interpolate string variable with indices"
(let ((eshell-test-value "zero one two three four"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[0]")
- "zero"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[0 2]")
- '("zero" "two")))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[0 2 4]")
- '("zero" "two" "four")))))
+ (eshell-command-result-equal "echo $eshell-test-value[0]"
+ "zero")
+ (eshell-command-result-equal "echo $eshell-test-value[0 2]"
+ '("zero" "two"))
+ (eshell-command-result-equal "echo $eshell-test-value[0 2 4]"
+ '("zero" "two" "four"))))
(ert-deftest esh-var-test/interp-var-string-split-indices ()
"Interpolate string variable with string splitter and indices"
(let ((eshell-test-value "zero:one:two:three:four"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[: 0]")
- "zero"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[: 0 2]")
- '("zero" "two"))))
+ (eshell-command-result-equal "echo $eshell-test-value[: 0]"
+ "zero")
+ (eshell-command-result-equal "echo $eshell-test-value[: 0 2]"
+ '("zero" "two")))
(let ((eshell-test-value "zeroXoneXtwoXthreeXfour"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[X 0]")
- "zero"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[X 0 2]")
- '("zero" "two")))))
+ (eshell-command-result-equal "echo $eshell-test-value[X 0]"
+ "zero")
+ (eshell-command-result-equal "echo $eshell-test-value[X 0 2]"
+ '("zero" "two"))))
(ert-deftest esh-var-test/interp-var-regexp-split-indices ()
"Interpolate string variable with regexp splitter and indices"
(let ((eshell-test-value "zero:one!two:three!four"))
- (should (equal (eshell-test-command-result
- "echo $eshell-test-value['[:!]' 0]")
- "zero"))
- (should (equal (eshell-test-command-result
- "echo $eshell-test-value['[:!]' 0 2]")
- '("zero" "two")))
- (should (equal (eshell-test-command-result
- "echo $eshell-test-value[\"[:!]\" 0]")
- "zero"))
- (should (equal (eshell-test-command-result
- "echo $eshell-test-value[\"[:!]\" 0 2]")
- '("zero" "two")))))
+ (eshell-command-result-equal "echo $eshell-test-value['[:!]' 0]"
+ "zero")
+ (eshell-command-result-equal "echo $eshell-test-value['[:!]' 0 2]"
+ '("zero" "two"))
+ (eshell-command-result-equal "echo $eshell-test-value[\"[:!]\" 0]"
+ "zero")
+ (eshell-command-result-equal "echo $eshell-test-value[\"[:!]\" 0 2]"
+ '("zero" "two"))))
(ert-deftest esh-var-test/interp-var-assoc ()
"Interpolate alist variable with index"
(let ((eshell-test-value '(("foo" . 1))))
- (should (eq (eshell-test-command-result "echo $eshell-test-value[foo]")
- 1))))
+ (eshell-command-result-equal "echo $eshell-test-value[foo]"
+ 1)))
(ert-deftest esh-var-test/interp-var-length-list ()
"Interpolate length of list variable"
(let ((eshell-test-value '((1 2) (3) (5 (6 7 8 9)))))
- (should (eq (eshell-test-command-result "echo $#eshell-test-value") 3))
- (should (eq (eshell-test-command-result "echo $#eshell-test-value[1]") 1))
- (should (eq (eshell-test-command-result "echo $#eshell-test-value[2][1]")
- 4))))
+ (eshell-command-result-equal "echo $#eshell-test-value" 3)
+ (eshell-command-result-equal "echo $#eshell-test-value[1]" 1)
+ (eshell-command-result-equal "echo $#eshell-test-value[2][1]" 4)))
(ert-deftest esh-var-test/interp-var-length-string ()
"Interpolate length of string variable"
(let ((eshell-test-value "foobar"))
- (should (eq (eshell-test-command-result "echo $#eshell-test-value") 6))))
+ (eshell-command-result-equal "echo $#eshell-test-value" 6)))
(ert-deftest esh-var-test/interp-var-length-alist ()
"Interpolate length of alist variable"
(let ((eshell-test-value '(("foo" . (1 2 3)))))
- (should (eq (eshell-test-command-result "echo $#eshell-test-value") 1))
- (should (eq (eshell-test-command-result "echo $#eshell-test-value[foo]")
- 3))))
+ (eshell-command-result-equal "echo $#eshell-test-value" 1)
+ (eshell-command-result-equal "echo $#eshell-test-value[foo]" 3)))
(ert-deftest esh-var-test/interp-lisp ()
"Interpolate Lisp form evaluation"
- (should (equal (eshell-test-command-result "+ $(+ 1 2) 3") 6)))
+ (eshell-command-result-equal "+ $(+ 1 2) 3" 6))
(ert-deftest esh-var-test/interp-lisp-indices ()
"Interpolate Lisp form evaluation with index"
- (should (equal (eshell-test-command-result "+ $(list 1 2)[1] 3") 5)))
+ (eshell-command-result-equal "+ $(list 1 2)[1] 3" 5))
(ert-deftest esh-var-test/interp-cmd ()
"Interpolate command result"
- (should (equal (eshell-test-command-result "+ ${+ 1 2} 3") 6)))
+ (eshell-command-result-equal "+ ${+ 1 2} 3" 6))
(ert-deftest esh-var-test/interp-cmd-indices ()
"Interpolate command result with index"
- (should (equal (eshell-test-command-result "+ ${listify 1 2}[1] 3") 5)))
+ (eshell-command-result-equal "+ ${listify 1 2}[1] 3" 5))
(ert-deftest esh-var-test/interp-cmd-external ()
"Interpolate command result from external command"
(skip-unless (executable-find "echo"))
(with-temp-eshell
- (eshell-command-result-p "echo ${*echo hi}"
- "hi\n")))
+ (eshell-match-command-output "echo ${*echo hi}"
+ "hi\n")))
(ert-deftest esh-var-test/interp-cmd-external-indices ()
"Interpolate command result from external command with index"
(skip-unless (executable-find "echo"))
(with-temp-eshell
- (eshell-command-result-p "echo ${*echo \"hi\nbye\"}[1]"
- "bye\n")))
+ (eshell-match-command-output "echo ${*echo \"hi\nbye\"}[1]"
+ "bye\n")))
(ert-deftest esh-var-test/interp-temp-cmd ()
"Interpolate command result redirected to temp file"
- (should (equal (eshell-test-command-result "cat $<echo hi>") "hi")))
+ (eshell-command-result-equal "cat $<echo hi>" "hi"))
(ert-deftest esh-var-test/interp-concat-lisp ()
"Interpolate and concat Lisp form"
- (should (equal (eshell-test-command-result "+ $(+ 1 2)3 3") 36)))
+ (eshell-command-result-equal "+ $(+ 1 2)3 3" 36))
(ert-deftest esh-var-test/interp-concat-lisp2 ()
"Interpolate and concat two Lisp forms"
- (should (equal (eshell-test-command-result "+ $(+ 1 2)$(+ 1 2) 3") 36)))
+ (eshell-command-result-equal "+ $(+ 1 2)$(+ 1 2) 3" 36))
(ert-deftest esh-var-test/interp-concat-cmd ()
"Interpolate and concat command with literal"
- (should (equal (eshell-test-command-result "+ ${+ 1 2}3 3") 36))
- (should (equal (eshell-test-command-result "echo ${*echo \"foo\nbar\"}-baz")
- '("foo" "bar-baz")))
+ (eshell-command-result-equal "+ ${+ 1 2}3 3" 36)
+ (eshell-command-result-equal "echo ${*echo \"foo\nbar\"}-baz"
+ '("foo" "bar-baz"))
;; Concatenating to a number in a list should produce a number...
- (should (equal (eshell-test-command-result "echo ${*echo \"1\n2\"}3")
- '(1 23)))
+ (eshell-command-result-equal "echo ${*echo \"1\n2\"}3"
+ '(1 23))
;; ... but concatenating to a string that looks like a number in a list
;; should produce a string.
- (should (equal (eshell-test-command-result "echo ${*echo \"hi\n2\"}3")
- '("hi" "23"))))
+ (eshell-command-result-equal "echo ${*echo \"hi\n2\"}3"
+ '("hi" "23")))
(ert-deftest esh-var-test/interp-concat-cmd2 ()
"Interpolate and concat two commands"
- (should (equal (eshell-test-command-result "+ ${+ 1 2}${+ 1 2} 3") 36)))
+ (eshell-command-result-equal "+ ${+ 1 2}${+ 1 2} 3" 36))
(ert-deftest esh-var-test/interp-concat-cmd-external ()
"Interpolate command result from external command with concatenation"
(skip-unless (executable-find "echo"))
(with-temp-eshell
- (eshell-command-result-p "echo ${echo hi}-${*echo there}"
- "hi-there\n")))
+ (eshell-match-command-output "echo ${echo hi}-${*echo there}"
+ "hi-there\n")))
(ert-deftest esh-var-test/quoted-interp-var ()
"Interpolate variable inside double-quotes"
- (should (equal (eshell-test-command-result "echo \"$user-login-name\"")
- user-login-name)))
+ (eshell-command-result-equal "echo \"$user-login-name\""
+ user-login-name))
(ert-deftest esh-var-test/quoted-interp-quoted-var ()
"Interpolate quoted variable inside double-quotes"
- (should (equal (eshell-test-command-result
- "echo \"hi, $'user-login-name'\"")
- (concat "hi, " user-login-name)))
- (should (equal (eshell-test-command-result
- "echo \"hi, $\\\"user-login-name\\\"\"")
- (concat "hi, " user-login-name))))
+ (eshell-command-result-equal "echo \"hi, $'user-login-name'\""
+ (concat "hi, " user-login-name))
+ (eshell-command-result-equal "echo \"hi, $\\\"user-login-name\\\"\""
+ (concat "hi, " user-login-name)))
(ert-deftest esh-var-test/quoted-interp-var-indices ()
"Interpolate string variable with indices inside double-quotes"
(let ((eshell-test-value '("zero" "one" "two" "three" "four")))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[0]\"")
- "zero"))
+ (eshell-command-result-equal "echo \"$eshell-test-value[0]\""
+ "zero")
;; FIXME: These tests would use the 0th index like the other tests
;; here, but evaluating the command just above adds an `escaped'
;; property to the string "zero". This results in the output
;; printing the string properties, which is probably the wrong
;; behavior. See bug#54486.
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[1 2]\"")
- "(\"one\" \"two\")"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[1 2 4]\"")
- "(\"one\" \"two\" \"four\")"))))
+ (eshell-command-result-equal "echo \"$eshell-test-value[1 2]\""
+ "(\"one\" \"two\")")
+ (eshell-command-result-equal "echo \"$eshell-test-value[1 2 4]\""
+ "(\"one\" \"two\" \"four\")")))
(ert-deftest esh-var-test/quoted-interp-var-split-indices ()
"Interpolate string variable with indices inside double-quotes"
(let ((eshell-test-value "zero one two three four"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[0]\"")
- "zero"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[0 2]\"")
- "(\"zero\" \"two\")"))))
+ (eshell-command-result-equal "echo \"$eshell-test-value[0]\""
+ "zero")
+ (eshell-command-result-equal "echo \"$eshell-test-value[0 2]\""
+ "(\"zero\" \"two\")")))
(ert-deftest esh-var-test/quoted-interp-var-string-split-indices ()
"Interpolate string variable with string splitter and indices
inside double-quotes"
(let ((eshell-test-value "zero:one:two:three:four"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[: 0]\"")
- "zero"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[: 0 2]\"")
- "(\"zero\" \"two\")")))
+ (eshell-command-result-equal "echo \"$eshell-test-value[: 0]\""
+ "zero")
+ (eshell-command-result-equal "echo \"$eshell-test-value[: 0 2]\""
+ "(\"zero\" \"two\")"))
(let ((eshell-test-value "zeroXoneXtwoXthreeXfour"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[X 0]\"")
- "zero"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[X 0 2]\"")
- "(\"zero\" \"two\")"))))
+ (eshell-command-result-equal "echo \"$eshell-test-value[X 0]\""
+ "zero")
+ (eshell-command-result-equal "echo \"$eshell-test-value[X 0 2]\""
+ "(\"zero\" \"two\")")))
(ert-deftest esh-var-test/quoted-interp-var-regexp-split-indices ()
"Interpolate string variable with regexp splitter and indices"
(let ((eshell-test-value "zero:one!two:three!four"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value['[:!]' 0]\"")
- "zero"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value['[:!]' 0 2]\"")
- "(\"zero\" \"two\")"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[\\\"[:!]\\\" 0]\"")
- "zero"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[\\\"[:!]\\\" 0 2]\"")
- "(\"zero\" \"two\")"))))
+ (eshell-command-result-equal "echo \"$eshell-test-value['[:!]' 0]\""
+ "zero")
+ (eshell-command-result-equal "echo \"$eshell-test-value['[:!]' 0 2]\""
+ "(\"zero\" \"two\")")
+ (eshell-command-result-equal "echo \"$eshell-test-value[\\\"[:!]\\\" 0]\""
+ "zero")
+ (eshell-command-result-equal
+ "echo \"$eshell-test-value[\\\"[:!]\\\" 0 2]\""
+ "(\"zero\" \"two\")")))
(ert-deftest esh-var-test/quoted-interp-var-assoc ()
"Interpolate alist variable with index inside double-quotes"
(let ((eshell-test-value '(("foo" . 1))))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[foo]\"")
- "1"))))
+ (eshell-command-result-equal "echo \"$eshell-test-value[foo]\""
+ "1")))
(ert-deftest esh-var-test/quoted-interp-var-length-list ()
"Interpolate length of list variable inside double-quotes"
(let ((eshell-test-value '((1 2) (3) (5 (6 7 8 9)))))
- (should (equal (eshell-test-command-result "echo \"$#eshell-test-value\"")
- "3"))
- (should (equal (eshell-test-command-result
- "echo \"$#eshell-test-value[1]\"")
- "1"))
- (should (equal (eshell-test-command-result
- "echo \"$#eshell-test-value[2][1]\"")
- "4"))))
+ (eshell-command-result-equal "echo \"$#eshell-test-value\""
+ "3")
+ (eshell-command-result-equal "echo \"$#eshell-test-value[1]\""
+ "1")
+ (eshell-command-result-equal "echo \"$#eshell-test-value[2][1]\""
+ "4")))
(ert-deftest esh-var-test/quoted-interp-var-length-string ()
"Interpolate length of string variable inside double-quotes"
(let ((eshell-test-value "foobar"))
- (should (equal (eshell-test-command-result "echo \"$#eshell-test-value\"")
- "6"))))
+ (eshell-command-result-equal "echo \"$#eshell-test-value\""
+ "6")))
(ert-deftest esh-var-test/quoted-interp-var-length-alist ()
"Interpolate length of alist variable inside double-quotes"
(let ((eshell-test-value '(("foo" . (1 2 3)))))
- (should (equal (eshell-test-command-result "echo \"$#eshell-test-value\"")
- "1"))
- (should (equal (eshell-test-command-result
- "echo \"$#eshell-test-value[foo]\"")
- "3"))))
+ (eshell-command-result-equal "echo \"$#eshell-test-value\""
+ "1")
+ (eshell-command-result-equal "echo \"$#eshell-test-value[foo]\""
+ "3"))
(ert-deftest esh-var-test/quoted-interp-lisp ()
"Interpolate Lisp form evaluation inside double-quotes"
- (should (equal (eshell-test-command-result
- "echo \"hi $(concat \\\"the\\\" \\\"re\\\")\"")
- "hi there")))
+ (eshell-command-result-equal "echo \"hi $(concat \\\"the\\\" \\\"re\\\")\""
+ "hi there"))
(ert-deftest esh-var-test/quoted-interp-lisp-indices ()
"Interpolate Lisp form evaluation with index"
- (should (equal (eshell-test-command-result "concat \"$(list 1 2)[1]\" cool")
- "2cool")))
+ (eshell-command-result-equal "concat \"$(list 1 2)[1]\" cool"
+ "2cool"))
(ert-deftest esh-var-test/quoted-interp-cmd ()
"Interpolate command result inside double-quotes"
- (should (equal (eshell-test-command-result
- "echo \"hi ${echo \\\"there\\\"}\"")
- "hi there")))
+ (eshell-command-result-equal "echo \"hi ${echo \\\"there\\\"}\""
+ "hi there"))
(ert-deftest esh-var-test/quoted-interp-cmd-indices ()
"Interpolate command result with index inside double-quotes"
- (should (equal (eshell-test-command-result
- "concat \"${listify 1 2}[1]\" cool")
- "2cool")))
+ (eshell-command-result-equal "concat \"${listify 1 2}[1]\" cool"
+ "2cool"))
(ert-deftest esh-var-test/quoted-interp-temp-cmd ()
"Interpolate command result redirected to temp file inside double-quotes"
(let ((temporary-file-directory
(file-name-as-directory (make-temp-file "esh-vars-tests" t))))
(unwind-protect
- (should (equal (eshell-test-command-result "cat \"$<echo hi>\"")
- "hi"))
+ (eshell-command-result-equal "cat \"$<echo hi>\"" "hi"))
(delete-directory temporary-file-directory t))))
(ert-deftest esh-var-test/quoted-interp-concat-cmd ()
"Interpolate and concat command with literal"
- (should (equal (eshell-test-command-result
- "echo \"${echo \\\"foo\nbar\\\"} baz\"")
- "foo\nbar baz")))
+ (eshell-command-result-equal "echo \"${echo \\\"foo\nbar\\\"} baz\""
+ "foo\nbar baz"))
;; Interpolated variable conversion
@@ -353,195 +324,242 @@ inside double-quotes"
(ert-deftest esh-var-test/interp-convert-var-number ()
"Interpolate numeric variable"
(let ((eshell-test-value 123))
- (should (equal (eshell-test-command-result "type-of $eshell-test-value")
- 'integer))))
+ (eshell-command-result-equal "type-of $eshell-test-value"
+ 'integer)))
(ert-deftest esh-var-test/interp-convert-var-split-indices ()
"Interpolate and convert string variable with indices"
;; Check that numeric forms are converted to numbers.
(let ((eshell-test-value "000 010 020 030 040"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[0]")
- 0))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[0 2]")
- '(0 20))))
+ (eshell-command-result-equal "echo $eshell-test-value[0]"
+ 0)
+ (eshell-command-result-equal "echo $eshell-test-value[0 2]"
+ '(0 20)))
;; Check that multiline forms are preserved as-is.
(let ((eshell-test-value "foo\nbar:baz\n"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[: 0]")
- "foo\nbar"))
- (should (equal (eshell-test-command-result "echo $eshell-test-value[: 1]")
- "baz\n"))))
+ (eshell-command-result-equal "echo $eshell-test-value[: 0]"
+ "foo\nbar")
+ (eshell-command-result-equal "echo $eshell-test-value[: 1]"
+ "baz\n")))
(ert-deftest esh-var-test/interp-convert-quoted-var-number ()
"Interpolate numeric quoted numeric variable"
(let ((eshell-test-value 123))
- (should (equal (eshell-test-command-result "type-of $'eshell-test-value'")
- 'integer))
- (should (equal (eshell-test-command-result "type-of $\"eshell-test-value\"")
- 'integer))))
+ (eshell-command-result-equal "type-of $'eshell-test-value'"
+ 'integer)
+ (eshell-command-result-equal "type-of $\"eshell-test-value\""
+ 'integer)))
(ert-deftest esh-var-test/interp-convert-quoted-var-split-indices ()
"Interpolate and convert quoted string variable with indices"
(let ((eshell-test-value "000 010 020 030 040"))
- (should (equal (eshell-test-command-result "echo $'eshell-test-value'[0]")
- 0))
- (should (equal (eshell-test-command-result "echo $'eshell-test-value'[0 2]")
- '(0 20)))))
+ (eshell-command-result-equal "echo $'eshell-test-value'[0]"
+ 0)
+ (eshell-command-result-equal "echo $'eshell-test-value'[0 2]"
+ '(0 20))))
(ert-deftest esh-var-test/interp-convert-cmd-string-newline ()
"Interpolate trailing-newline command result"
- (should (equal (eshell-test-command-result "echo ${echo \"foo\n\"}") "foo")))
+ (eshell-command-result-equal "echo ${echo \"foo\n\"}" "foo"))
(ert-deftest esh-var-test/interp-convert-cmd-multiline ()
"Interpolate multi-line command result"
- (should (equal (eshell-test-command-result "echo ${echo \"foo\nbar\"}")
- '("foo" "bar")))
+ (eshell-command-result-equal "echo ${echo \"foo\nbar\"}"
+ '("foo" "bar"))
;; Numeric output should be converted to numbers...
- (should (equal (eshell-test-command-result "echo ${echo \"01\n02\n03\"}")
- '(1 2 3)))
+ (eshell-command-result-equal "echo ${echo \"01\n02\n03\"}"
+ '(1 2 3))
;; ... but only if every line is numeric.
- (should (equal (eshell-test-command-result "echo ${echo \"01\n02\nhi\"}")
- '("01" "02" "hi"))))
+ (eshell-command-result-equal "echo ${echo \"01\n02\nhi\"}"
+ '("01" "02" "hi")))
(ert-deftest esh-var-test/interp-convert-cmd-number ()
"Interpolate numeric command result"
- (should (equal (eshell-test-command-result "echo ${echo \"1\"}") 1)))
+ (eshell-command-result-equal "echo ${echo \"1\"}" 1))
(ert-deftest esh-var-test/interp-convert-cmd-split-indices ()
"Interpolate command result with indices"
- (should (equal (eshell-test-command-result "echo ${echo \"000 010 020\"}[0]")
- 0))
- (should (equal (eshell-test-command-result
- "echo ${echo \"000 010 020\"}[0 2]")
- '(0 20))))
+ (eshell-command-result-equal "echo ${echo \"000 010 020\"}[0]"
+ 0)
+ (eshell-command-result-equal "echo ${echo \"000 010 020\"}[0 2]"
+ '(0 20)))
(ert-deftest esh-var-test/quoted-interp-convert-var-number ()
"Interpolate numeric variable inside double-quotes"
(let ((eshell-test-value 123))
- (should (equal (eshell-test-command-result "type-of \"$eshell-test-value\"")
- 'string))))
+ (eshell-command-result-equal "type-of \"$eshell-test-value\""
+ 'string)))
(ert-deftest esh-var-test/quoted-interp-convert-var-split-indices ()
"Interpolate string variable with indices inside double-quotes"
(let ((eshell-test-value "000 010 020 030 040"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[0]\"")
- "000"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[0 2]\"")
- "(\"000\" \"020\")"))))
+ (eshell-command-result-equal "echo \"$eshell-test-value[0]\""
+ "000")
+ (eshell-command-result-equal "echo \"$eshell-test-value[0 2]\""
+ "(\"000\" \"020\")")))
(ert-deftest esh-var-test/quoted-interp-convert-quoted-var-number ()
"Interpolate numeric quoted variable inside double-quotes"
(let ((eshell-test-value 123))
- (should (equal (eshell-test-command-result
- "type-of \"$'eshell-test-value'\"")
- 'string))
- (should (equal (eshell-test-command-result
- "type-of \"$\\\"eshell-test-value\\\"\"")
- 'string))))
+ (eshell-command-result-equal "type-of \"$'eshell-test-value'\""
+ 'string)
+ (eshell-command-result-equal "type-of \"$\\\"eshell-test-value\\\"\""
+ 'string)))
(ert-deftest esh-var-test/quoted-interp-convert-quoted-var-split-indices ()
"Interpolate quoted string variable with indices inside double-quotes"
(let ((eshell-test-value "000 010 020 030 040"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[0]\"")
- "000"))
- (should (equal (eshell-test-command-result
- "echo \"$eshell-test-value[0 2]\"")
- "(\"000\" \"020\")"))))
+ (eshell-command-result-equal "echo \"$eshell-test-value[0]\""
+ "000")
+ (eshell-command-result-equal "echo \"$eshell-test-value[0 2]\""
+ "(\"000\" \"020\")")))
(ert-deftest esh-var-test/quoted-interp-convert-cmd-string-newline ()
"Interpolate trailing-newline command result inside double-quotes"
- (should (equal (eshell-test-command-result "echo \"${echo \\\"foo\n\\\"}\"")
- "foo"))
- (should (equal (eshell-test-command-result "echo \"${echo \\\"foo\n\n\\\"}\"")
- "foo")))
+ (eshell-command-result-equal "echo \"${echo \\\"foo\n\\\"}\""
+ "foo")
+ (eshell-command-result-equal "echo \"${echo \\\"foo\n\n\\\"}\""
+ "foo"))
(ert-deftest esh-var-test/quoted-interp-convert-cmd-multiline ()
"Interpolate multi-line command result inside double-quotes"
- (should (equal (eshell-test-command-result
- "echo \"${echo \\\"foo\nbar\\\"}\"")
- "foo\nbar")))
+ (eshell-command-result-equal "echo \"${echo \\\"foo\nbar\\\"}\""
+ "foo\nbar"))
(ert-deftest esh-var-test/quoted-interp-convert-cmd-number ()
"Interpolate numeric command result inside double-quotes"
- (should (equal (eshell-test-command-result "echo \"${echo \\\"1\\\"}\"")
- "1")))
+ (eshell-command-result-equal "echo \"${echo \\\"1\\\"}\"" "1"))
(ert-deftest esh-var-test/quoted-interp-convert-cmd-split-indices ()
"Interpolate command result with indices inside double-quotes"
- (should (equal (eshell-test-command-result
- "echo \"${echo \\\"000 010 020\\\"}[0]\"")
- "000")))
+ (eshell-command-result-equal "echo \"${echo \\\"000 010 020\\\"}[0]\""
+ "000"))
;; Built-in variables
(ert-deftest esh-var-test/lines-var ()
"$LINES should equal (window-body-height nil 'remap)"
- (should (equal (eshell-test-command-result "echo $LINES")
- (window-body-height nil 'remap))))
+ (eshell-command-result-equal "echo $LINES"
+ (window-body-height nil 'remap)))
(ert-deftest esh-var-test/columns-var ()
"$COLUMNS should equal (window-body-width nil 'remap)"
- (should (equal (eshell-test-command-result "echo $COLUMNS")
- (window-body-width nil 'remap))))
+ (eshell-command-result-equal "echo $COLUMNS"
+ (window-body-width nil 'remap)))
(ert-deftest esh-var-test/inside-emacs-var ()
"Test presence of \"INSIDE_EMACS\" in subprocesses"
(with-temp-eshell
- (eshell-command-result-p "env"
- (format "INSIDE_EMACS=%s,eshell"
- emacs-version))))
+ (eshell-match-command-output "env"
+ (format "INSIDE_EMACS=%s,eshell"
+ emacs-version))))
(ert-deftest esh-var-test/inside-emacs-var-split-indices ()
"Test using \"INSIDE_EMACS\" with split indices"
(with-temp-eshell
- (eshell-command-result-p "echo $INSIDE_EMACS[, 1]"
- "eshell")))
+ (eshell-match-command-output "echo $INSIDE_EMACS[, 1]"
+ "eshell")))
+
+(ert-deftest esh-var-test/last-status-var-lisp-command ()
+ "Test using the \"last exit status\" ($?) variable with a Lisp command"
+ (with-temp-eshell
+ (eshell-match-command-output "zerop 0; echo $?"
+ "t\n0\n")
+ (eshell-match-command-output "zerop 1; echo $?"
+ "0\n")
+ (let ((debug-on-error nil))
+ (eshell-match-command-output "zerop foo; echo $?"
+ "1\n"))))
+
+(ert-deftest esh-var-test/last-status-var-lisp-form ()
+ "Test using the \"last exit status\" ($?) variable with a Lisp form"
+ (let ((eshell-lisp-form-nil-is-failure t))
+ (with-temp-eshell
+ (eshell-match-command-output "(zerop 0); echo $?"
+ "t\n0\n")
+ (eshell-match-command-output "(zerop 1); echo $?"
+ "2\n")
+ (let ((debug-on-error nil))
+ (eshell-match-command-output "(zerop \"foo\"); echo $?"
+ "1\n")))))
+
+(ert-deftest esh-var-test/last-status-var-lisp-form-2 ()
+ "Test using the \"last exit status\" ($?) variable with a Lisp form.
+This tests when `eshell-lisp-form-nil-is-failure' is nil."
+ (let ((eshell-lisp-form-nil-is-failure nil))
+ (with-temp-eshell
+ (eshell-match-command-output "(zerop 0); echo $?"
+ "0\n")
+ (eshell-match-command-output "(zerop 0); echo $?"
+ "0\n")
+ (let ((debug-on-error nil))
+ (eshell-match-command-output "(zerop \"foo\"); echo $?"
+ "1\n")))))
+
+(ert-deftest esh-var-test/last-status-var-ext-cmd ()
+ "Test using the \"last exit status\" ($?) variable with an external command"
+ (skip-unless (executable-find "["))
+ (with-temp-eshell
+ (eshell-match-command-output "[ foo = foo ]; echo $?"
+ "0\n")
+ (eshell-match-command-output "[ foo = bar ]; echo $?"
+ "1\n")))
(ert-deftest esh-var-test/last-result-var ()
"Test using the \"last result\" ($$) variable"
(with-temp-eshell
- (eshell-command-result-p "+ 1 2; + $$ 2"
- "3\n5\n")))
+ (eshell-match-command-output "+ 1 2; + $$ 2"
+ "3\n5\n")))
-(ert-deftest esh-var-test/last-result-var2 ()
+(ert-deftest esh-var-test/last-result-var-twice ()
"Test using the \"last result\" ($$) variable twice"
(with-temp-eshell
- (eshell-command-result-p "+ 1 2; + $$ $$"
- "3\n6\n")))
+ (eshell-match-command-output "+ 1 2; + $$ $$"
+ "3\n6\n")))
+
+(ert-deftest esh-var-test/last-result-var-ext-cmd ()
+ "Test using the \"last result\" ($$) variable with an external command"
+ (skip-unless (executable-find "["))
+ (with-temp-eshell
+ ;; MS-DOS/MS-Windows have an external command 'format', which we
+ ;; don't want here.
+ (let ((eshell-prefer-lisp-functions t))
+ (eshell-match-command-output "[ foo = foo ]; format \"%s\" $$"
+ "t\n")
+ (eshell-match-command-output "[ foo = bar ]; format \"%s\" $$"
+ "nil\n"))))
(ert-deftest esh-var-test/last-result-var-split-indices ()
"Test using the \"last result\" ($$) variable with split indices"
(with-temp-eshell
- (eshell-command-result-p
+ (eshell-match-command-output
"string-join (list \"01\" \"02\") :; + $$[: 1] 3"
"01:02\n5\n")
- (eshell-command-result-p
+ (eshell-match-command-output
"string-join (list \"01\" \"02\") :; echo \"$$[: 1]\""
"01:02\n02\n")))
(ert-deftest esh-var-test/last-arg-var ()
"Test using the \"last arg\" ($_) variable"
(with-temp-eshell
- (eshell-command-result-p "+ 1 2; + $_ 4"
- "3\n6\n")))
+ (eshell-match-command-output "+ 1 2; + $_ 4"
+ "3\n6\n")))
(ert-deftest esh-var-test/last-arg-var-indices ()
"Test using the \"last arg\" ($_) variable with indices"
(with-temp-eshell
- (eshell-command-result-p "+ 1 2; + $_[0] 4"
- "3\n5\n")
- (eshell-command-result-p "+ 1 2; + $_[1] 4"
- "3\n6\n")))
+ (eshell-match-command-output "+ 1 2; + $_[0] 4"
+ "3\n5\n")
+ (eshell-match-command-output "+ 1 2; + $_[1] 4"
+ "3\n6\n")))
(ert-deftest esh-var-test/last-arg-var-split-indices ()
"Test using the \"last arg\" ($_) variable with split indices"
(with-temp-eshell
- (eshell-command-result-p "concat 01:02 03:04; + $_[0][: 1] 5"
- "01:0203:04\n7\n")
- (eshell-command-result-p "concat 01:02 03:04; echo \"$_[0][: 1]\""
- "01:0203:04\n02\n")))
+ (eshell-match-command-output "concat 01:02 03:04; + $_[0][: 1] 5"
+ "01:0203:04\n7\n")
+ (eshell-match-command-output "concat 01:02 03:04; echo \"$_[0][: 1]\""
+ "01:0203:04\n02\n")))
;; esh-var-tests.el ends here
diff --git a/test/lisp/eshell/eshell-tests-helpers.el b/test/lisp/eshell/eshell-tests-helpers.el
index 4ad76ca6978..8f0f993447f 100644
--- a/test/lisp/eshell/eshell-tests-helpers.el
+++ b/test/lisp/eshell/eshell-tests-helpers.el
@@ -65,24 +65,36 @@ raise an error."
(error "timed out waiting for subprocess(es)"))
(sit-for 0.1))))
-(defun eshell-insert-command (text &optional func)
- "Insert a command at the end of the buffer."
+(defun eshell-insert-command (command &optional func)
+ "Insert a COMMAND at the end of the buffer.
+After inserting, call FUNC. If FUNC is nil, instead call
+`eshell-send-input'."
(goto-char eshell-last-output-end)
- (insert-and-inherit text)
+ (insert-and-inherit command)
(funcall (or func 'eshell-send-input)))
-(defun eshell-match-result (regexp)
- "Check that output of last command matches REGEXP."
- (should
- (string-match-p
+(defun eshell-match-output (regexp)
+ "Test whether the output of the last command matches REGEXP."
+ (string-match-p
regexp (buffer-substring-no-properties
- (eshell-beginning-of-output) (eshell-end-of-output)))))
-
-(defun eshell-command-result-p (text regexp &optional func)
- "Insert a command at the end of the buffer."
- (eshell-insert-command text func)
+ (eshell-beginning-of-output) (eshell-end-of-output))))
+
+(defun eshell-match-output--explainer (regexp)
+ "Explain the result of `eshell-match-output'."
+ `(mismatched-output
+ (command ,(buffer-substring-no-properties
+ eshell-last-input-start eshell-last-input-end))
+ (output ,(buffer-substring-no-properties
+ (eshell-beginning-of-output) (eshell-end-of-output)))
+ (regexp ,regexp)))
+
+(put 'eshell-match-output 'ert-explainer #'eshell-match-output--explainer)
+
+(defun eshell-match-command-output (command regexp &optional func)
+ "Insert a COMMAND at the end of the buffer and match the output with REGEXP."
+ (eshell-insert-command command func)
(eshell-wait-for-subprocess)
- (eshell-match-result regexp))
+ (should (eshell-match-output regexp)))
(defvar eshell-history-file-name)
@@ -92,6 +104,27 @@ raise an error."
(let ((eshell-history-file-name nil))
(eshell-command-result command))))
+(defun eshell-command-result--equal (_command actual expected)
+ "Compare the ACTUAL result of a COMMAND with its EXPECTED value."
+ (equal actual expected))
+
+(defun eshell-command-result--equal-explainer (command actual expected)
+ "Explain the result of `eshell-command-result--equal'."
+ `(nonequal-result
+ (command ,command)
+ (result ,actual)
+ (expected ,expected)))
+
+(put 'eshell-command-result--equal 'ert-explainer
+ #'eshell-command-result--equal-explainer)
+
+(defun eshell-command-result-equal (command result)
+ "Execute COMMAND non-interactively and compare it to RESULT."
+ (should (eshell-command-result--equal
+ command
+ (eshell-test-command-result command)
+ result)))
+
(provide 'eshell-tests-helpers)
;;; eshell-tests-helpers.el ends here
diff --git a/test/lisp/eshell/eshell-tests.el b/test/lisp/eshell/eshell-tests.el
index 5dc18775485..1845dba2809 100644
--- a/test/lisp/eshell/eshell-tests.el
+++ b/test/lisp/eshell/eshell-tests.el
@@ -36,72 +36,19 @@
;;; Tests:
-(ert-deftest eshell-test/simple-command-result ()
- "Test `eshell-command-result' with a simple command."
- (should (equal (eshell-test-command-result "+ 1 2") 3)))
-
-(ert-deftest eshell-test/lisp-command ()
- "Test `eshell-command-result' with an elisp command."
- (should (equal (eshell-test-command-result "(+ 1 2)") 3)))
-
-(ert-deftest eshell-test/lisp-command-with-quote ()
- "Test `eshell-command-result' with an elisp command containing a quote."
- (should (equal (eshell-test-command-result "(eq 'foo nil)") nil)))
-
-(ert-deftest eshell-test/for-loop ()
- "Test `eshell-command-result' with a for loop.."
- (let ((process-environment (cons "foo" process-environment)))
- (should (equal (eshell-test-command-result
- "for foo in 5 { echo $foo }") 5))))
-
-(ert-deftest eshell-test/for-name-loop () ;Bug#15231
- "Test `eshell-command-result' with a for loop using `name'."
- (let ((process-environment (cons "name" process-environment)))
- (should (equal (eshell-test-command-result
- "for name in 3 { echo $name }") 3))))
-
-(ert-deftest eshell-test/for-name-shadow-loop () ; bug#15372
- "Test `eshell-command-result' with a for loop using an env-var."
- (let ((process-environment (cons "name=env-value" process-environment)))
- (with-temp-eshell
- (eshell-command-result-p "echo $name; for name in 3 { echo $name }; echo $name"
- "env-value\n3\nenv-value\n"))))
-
-(ert-deftest eshell-test/lisp-command-args ()
- "Test `eshell-command-result' with elisp and trailing args.
-Test that trailing arguments outside the S-expression are
-ignored. e.g. \"(+ 1 2) 3\" => 3"
- (should (equal (eshell-test-command-result "(+ 1 2) 3") 3)))
-
-(ert-deftest eshell-test/subcommand ()
- "Test `eshell-command-result' with a simple subcommand."
- (should (equal (eshell-test-command-result "{+ 1 2}") 3)))
-
-(ert-deftest eshell-test/subcommand-args ()
- "Test `eshell-command-result' with a subcommand and trailing args.
-Test that trailing arguments outside the subcommand are ignored.
-e.g. \"{+ 1 2} 3\" => 3"
- (should (equal (eshell-test-command-result "{+ 1 2} 3") 3)))
-
-(ert-deftest eshell-test/subcommand-lisp ()
- "Test `eshell-command-result' with an elisp subcommand and trailing args.
-Test that trailing arguments outside the subcommand are ignored.
-e.g. \"{(+ 1 2)} 3\" => 3"
- (should (equal (eshell-test-command-result "{(+ 1 2)} 3") 3)))
-
(ert-deftest eshell-test/pipe-headproc ()
"Check that piping a non-process to a process command waits for the process"
(skip-unless (executable-find "cat"))
(with-temp-eshell
- (eshell-command-result-p "echo hi | *cat"
- "hi")))
+ (eshell-match-command-output "echo hi | *cat"
+ "hi")))
(ert-deftest eshell-test/pipe-tailproc ()
"Check that piping a process to a non-process command waits for the process"
(skip-unless (executable-find "echo"))
(with-temp-eshell
- (eshell-command-result-p "*echo hi | echo bye"
- "bye\nhi\n")))
+ (eshell-match-command-output "*echo hi | echo bye"
+ "bye\nhi\n")))
(ert-deftest eshell-test/pipe-headproc-stdin ()
"Check that standard input is sent to the head process in a pipeline"
@@ -112,23 +59,23 @@ e.g. \"{(+ 1 2)} 3\" => 3"
(eshell-insert-command "hello")
(eshell-send-eof-to-process)
(eshell-wait-for-subprocess)
- (eshell-match-result "OLLEH\n")))
+ (should (eshell-match-output "OLLEH\n"))))
(ert-deftest eshell-test/pipe-subcommand ()
"Check that piping with an asynchronous subcommand works"
(skip-unless (and (executable-find "echo")
(executable-find "cat")))
(with-temp-eshell
- (eshell-command-result-p "echo ${*echo hi} | *cat"
- "hi")))
+ (eshell-match-command-output "echo ${*echo hi} | *cat"
+ "hi")))
(ert-deftest eshell-test/pipe-subcommand-with-pipe ()
"Check that piping with an asynchronous subcommand with its own pipe works"
(skip-unless (and (executable-find "echo")
(executable-find "cat")))
(with-temp-eshell
- (eshell-command-result-p "echo ${*echo hi | *cat} | *cat"
- "hi")))
+ (eshell-match-command-output "echo ${*echo hi | *cat} | *cat"
+ "hi")))
(ert-deftest eshell-test/subcommand-reset-in-pipeline ()
"Check that subcommands reset `eshell-in-pipeline-p'."
@@ -136,28 +83,27 @@ e.g. \"{(+ 1 2)} 3\" => 3"
(dolist (template '("echo {%s} | *cat"
"echo ${%s} | *cat"
"*cat $<%s> | *cat"))
- (should (equal (eshell-test-command-result
- (format template "echo $eshell-in-pipeline-p"))
- nil))
- (should (equal (eshell-test-command-result
- (format template "echo | echo $eshell-in-pipeline-p"))
- "last"))
- (should (equal (eshell-test-command-result
- (format template "echo $eshell-in-pipeline-p | echo"))
- "first"))
- (should (equal (eshell-test-command-result
- (format template
- "echo | echo $eshell-in-pipeline-p | echo"))
- "t"))))
+ (eshell-command-result-equal
+ (format template "echo $eshell-in-pipeline-p")
+ nil)
+ (eshell-command-result-equal
+ (format template "echo | echo $eshell-in-pipeline-p")
+ "last")
+ (eshell-command-result-equal
+ (format template "echo $eshell-in-pipeline-p | echo")
+ "first")
+ (eshell-command-result-equal
+ (format template "echo | echo $eshell-in-pipeline-p | echo")
+ "t")))
(ert-deftest eshell-test/lisp-reset-in-pipeline ()
"Check that interpolated Lisp forms reset `eshell-in-pipeline-p'."
(skip-unless (executable-find "cat"))
(dolist (template '("echo (%s) | *cat"
"echo $(%s) | *cat"))
- (should (equal (eshell-test-command-result
- (format template "format \"%s\" eshell-in-pipeline-p"))
- "nil"))))
+ (eshell-command-result-equal
+ (format template "format \"%s\" eshell-in-pipeline-p")
+ "nil")))
(ert-deftest eshell-test/redirect-buffer ()
"Check that piping to a buffer works"
@@ -182,32 +128,32 @@ e.g. \"{(+ 1 2)} 3\" => 3"
"Test that \"\\c\" and \"c\" are equivalent when \"c\" is not a
special character."
(with-temp-eshell
- (eshell-command-result-p "echo he\\llo"
- "hello\n")))
+ (eshell-match-command-output "echo he\\llo"
+ "hello\n")))
(ert-deftest eshell-test/escape-nonspecial-unicode ()
"Test that \"\\c\" and \"c\" are equivalent when \"c\" is a
unicode character (unicode characters are nonspecial by
definition)."
(with-temp-eshell
- (eshell-command-result-p "echo Vid\\éos"
- "Vidéos\n")))
+ (eshell-match-command-output "echo Vid\\éos"
+ "Vidéos\n")))
(ert-deftest eshell-test/escape-nonspecial-quoted ()
"Test that the backslash is preserved for escaped nonspecial
chars"
(with-temp-eshell
- (eshell-command-result-p "echo \"h\\i\""
- ;; Backslashes are doubled for regexp.
- "h\\\\i\n")))
+ (eshell-match-command-output "echo \"h\\i\""
+ ;; Backslashes are doubled for regexp.
+ "h\\\\i\n")))
(ert-deftest eshell-test/escape-special-quoted ()
"Test that the backslash is not preserved for escaped special
chars"
(with-temp-eshell
- (eshell-command-result-p "echo \"\\\"hi\\\\\""
- ;; Backslashes are doubled for regexp.
- "\\\"hi\\\\\n")))
+ (eshell-match-command-output "echo \"\\\"hi\\\\\""
+ ;; Backslashes are doubled for regexp.
+ "\\\"hi\\\\\n")))
(ert-deftest eshell-test/command-running-p ()
"Modeline should show no command running"
@@ -241,15 +187,15 @@ chars"
(> count 0))
(sit-for 1)
(setq count (1- count))))
- (eshell-match-result "alpha\n")))
+ (should (eshell-match-output "alpha\n"))))
(ert-deftest eshell-test/flush-output ()
"Test flushing of previous output"
(with-temp-eshell
(eshell-insert-command "echo alpha")
(eshell-kill-output)
- (eshell-match-result
- (concat "^" (regexp-quote "*** output flushed ***\n") "$"))))
+ (should (eshell-match-output
+ (concat "^" (regexp-quote "*** output flushed ***\n") "$")))))
(ert-deftest eshell-test/run-old-command ()
"Re-run an old command"
diff --git a/test/lisp/ffap-tests.el b/test/lisp/ffap-tests.el
index 4b580b5af52..076d8256421 100644
--- a/test/lisp/ffap-tests.el
+++ b/test/lisp/ffap-tests.el
@@ -28,6 +28,30 @@
(require 'ert-x)
(require 'ffap)
+(ert-deftest ffap-replace-file-component ()
+ (should (equal
+ (ffap-replace-file-component "/ftp:who@foo.com:/whatever" "/new")
+ "/ftp:who@foo.com:/new")))
+
+(ert-deftest ffap-file-remote-p ()
+ (dolist (test '(("/user@foo.bar.com:/pub" .
+ "/user@foo.bar.com:/pub")
+ ("/cssun.mathcs.emory.edu://dir" .
+ "/cssun.mathcs.emory.edu:/dir")
+ ("/ffap.el:80" .
+ "/ffap.el:80")))
+ (let ((A (car test))
+ (B (cdr test)))
+ (should (equal (ffap-file-remote-p A) B)))))
+
+(ert-deftest ffap-machine-p ()
+ (should-not (ffap-machine-p "ftp"))
+ (should-not (ffap-machine-p "nonesuch"))
+ (should (eq (ffap-machine-p "ftp.mathcs.emory.edu") 'accept))
+ (should-not (ffap-machine-p "mathcs" 5678))
+ (should-not (ffap-machine-p "foo.bonk"))
+ (should (eq (ffap-machine-p "foo.bonk.com") 'accept)))
+
(ert-deftest ffap-tests-25243 ()
"Test for https://debbugs.gnu.org/25243 ."
(ert-with-temp-file file
diff --git a/test/lisp/help-fns-tests.el b/test/lisp/help-fns-tests.el
index e3fed60b4cb..7ff7aa1ccd7 100644
--- a/test/lisp/help-fns-tests.el
+++ b/test/lisp/help-fns-tests.el
@@ -64,13 +64,13 @@ Return first line of the output of (describe-function-1 FUNC)."
(ert-deftest help-fns-test-lisp-defun ()
(let ((regexp (if (featurep 'native-compile)
- "a native compiled Lisp function in .+subr\\.el"
- "a compiled Lisp function in .+subr\\.el"))
+ "a native-compiled Lisp function in .+subr\\.el"
+ "a byte-compiled Lisp function in .+subr\\.el"))
(result (help-fns-tests--describe-function 'last)))
(should (string-match regexp result))))
(ert-deftest help-fns-test-lisp-defsubst ()
- (let ((regexp "a compiled Lisp function in .+subr\\.el")
+ (let ((regexp "a byte-compiled Lisp function in .+subr\\.el")
(result (help-fns-tests--describe-function 'posn-window)))
(should (string-match regexp result))))
diff --git a/test/lisp/help-tests.el b/test/lisp/help-tests.el
index 5c935965f78..7f30b27b00d 100644
--- a/test/lisp/help-tests.el
+++ b/test/lisp/help-tests.el
@@ -93,7 +93,9 @@
(with-substitute-command-keys-test
(test "\\`C-m'" "C-m")
(test "\\`C-m'\\`C-j'" "C-mC-j")
- (test "foo\\`C-m'bar\\`C-j'baz" "fooC-mbarC-jbaz")))
+ (test "foo\\`C-m'bar\\`C-j'baz" "fooC-mbarC-jbaz")
+ (test "\\`M-x next-line'" "M-x next-line")
+ (test "\\`mouse-1'" "mouse-1")))
(ert-deftest help-tests-substitute-command-keys/literal-key-sequence-ignore-invalid ()
"Ignore any invalid literal key sequence."
diff --git a/test/lisp/ibuffer-tests.el b/test/lisp/ibuffer-tests.el
index 343e2ae50b1..d54718e297a 100644
--- a/test/lisp/ibuffer-tests.el
+++ b/test/lisp/ibuffer-tests.el
@@ -132,7 +132,7 @@
(ibuffer-switch-to-saved-filter-groups "saved-filters")
(should (assoc "Elisp" (cdar ibuffer-saved-filter-groups))))
(setq ibuffer-saved-filter-groups orig-filters)
- (ibuffer-awhen (get-buffer "*Ibuffer*")
+ (when-let ((it (get-buffer "*Ibuffer*")))
(and (buffer-live-p it) (kill-buffer it))))))
diff --git a/test/lisp/international/ccl-tests.el b/test/lisp/international/ccl-tests.el
index 57ac74639b1..cf472415c7a 100644
--- a/test/lisp/international/ccl-tests.el
+++ b/test/lisp/international/ccl-tests.el
@@ -25,23 +25,25 @@
(ert-deftest shift ()
- ;; shift left +ve 5628 #x00000000000015fc
- (should (= (ash 5628 8) 1440768)) ; #x000000000015fc00
- (should (= (lsh 5628 8) 1440768)) ; #x000000000015fc00
-
- ;; shift left -ve -5628 #x3fffffffffffea04
- (should (= (ash -5628 8) -1440768)) ; #x3fffffffffea0400
- (should (= (lsh -5628 8) -1440768)) ; #x3fffffffffea0400
-
- ;; shift right +ve 5628 #x00000000000015fc
- (should (= (ash 5628 -8) 21)) ; #x0000000000000015
- (should (= (lsh 5628 -8) 21)) ; #x0000000000000015
-
- ;; shift right -ve -5628 #x3fffffffffffea04
- (should (= (ash -5628 -8) -22)) ; #x3fffffffffffffea
- (should (= (lsh -5628 -8)
- (ash (- -5628 (ash most-negative-fixnum 1)) -8)
- (ash (logand (ash -5628 -1) most-positive-fixnum) -7))))
+ (with-suppressed-warnings ((suspicious lsh))
+
+ ;; shift left +ve 5628 #x00000000000015fc
+ (should (= (ash 5628 8) 1440768)) ; #x000000000015fc00
+ (should (= (lsh 5628 8) 1440768)) ; #x000000000015fc00
+
+ ;; shift left -ve -5628 #x3fffffffffffea04
+ (should (= (ash -5628 8) -1440768)) ; #x3fffffffffea0400
+ (should (= (lsh -5628 8) -1440768)) ; #x3fffffffffea0400
+
+ ;; shift right +ve 5628 #x00000000000015fc
+ (should (= (ash 5628 -8) 21)) ; #x0000000000000015
+ (should (= (lsh 5628 -8) 21)) ; #x0000000000000015
+
+ ;; shift right -ve -5628 #x3fffffffffffea04
+ (should (= (ash -5628 -8) -22)) ; #x3fffffffffffffea
+ (should (= (lsh -5628 -8)
+ (ash (- -5628 (ash most-negative-fixnum 1)) -8)
+ (ash (logand (ash -5628 -1) most-positive-fixnum) -7)))))
;; CCl program from `pgg-parse-crc24' in lisp/obsolete/pgg-parse.el
(defconst prog-pgg-source
diff --git a/test/lisp/international/ucs-normalize-tests.el b/test/lisp/international/ucs-normalize-tests.el
index 27a4e70c78e..774a3ea7ec9 100644
--- a/test/lisp/international/ucs-normalize-tests.el
+++ b/test/lisp/international/ucs-normalize-tests.el
@@ -246,7 +246,7 @@ must be true for all conformant implementations:
ucs-normalize-tests--rule1-failing-for-partX
ucs-normalize-tests--rule1-holds-p
ucs-normalize-tests--rule2-holds-p))
- (or (byte-code-function-p (symbol-function fun))
+ (or (compiled-function-p (symbol-function fun))
(byte-compile fun)))
(let ((ucs-normalize-tests--chars-part1 (make-char-table 'ucs-normalize-tests t)))
(setq ucs-normalize-tests--part1-rule1-failed-lines
diff --git a/test/lisp/misc-tests.el b/test/lisp/misc-tests.el
index a56feaa0495..f84827ab025 100644
--- a/test/lisp/misc-tests.el
+++ b/test/lisp/misc-tests.el
@@ -96,5 +96,43 @@
(should (equal (buffer-string) "abc\nabc\n"))
(should (equal (point) 2))))
+(require 'rect)
+
+(ert-deftest misc--duplicate-dwim ()
+ ;; Duplicate a line.
+ (with-temp-buffer
+ (insert "abc\ndefg\nh\n")
+ (goto-char 7)
+ (duplicate-dwim 2)
+ (should (equal (buffer-string) "abc\ndefg\ndefg\ndefg\nh\n"))
+ (should (equal (point) 7)))
+
+ ;; Duplicate a region.
+ (with-temp-buffer
+ (insert "abc\ndef\n")
+ (set-mark 2)
+ (goto-char 7)
+ (transient-mark-mode)
+ (should (use-region-p))
+ (duplicate-dwim)
+ (should (equal (buffer-string) "abc\ndebc\ndef\n"))
+ (should (equal (point) 7))
+ (should (region-active-p))
+ (should (equal (mark) 2)))
+
+ ;; Duplicate a rectangular region.
+ (with-temp-buffer
+ (insert "x\n>a\n>bcde\n>fg\nyz\n")
+ (goto-char 4)
+ (rectangle-mark-mode)
+ (goto-char 15)
+ (rectangle-forward-char 1)
+ (duplicate-dwim)
+ (should (equal (buffer-string) "x\n>a a \n>bcdbcde\n>fg fg \nyz\n"))
+ (should (equal (point) 24))
+ (should (region-active-p))
+ (should rectangle-mark-mode)
+ (should (equal (mark) 4))))
+
(provide 'misc-tests)
;;; misc-tests.el ends here
diff --git a/test/lisp/net/netrc-resources/services b/test/lisp/net/netrc-resources/services
deleted file mode 100644
index fd8a0348df2..00000000000
--- a/test/lisp/net/netrc-resources/services
+++ /dev/null
@@ -1,6 +0,0 @@
-tcpmux 1/tcp # TCP port service multiplexer
-smtp 25/tcp mail
-http 80/tcp www # WorldWideWeb HTTP
-kerberos 88/tcp kerberos5 krb5 kerberos-sec # Kerberos v5
-kerberos 88/udp kerberos5 krb5 kerberos-sec # Kerberos v5
-rtmp 1/ddp # Routing Table Maintenance Protocol
diff --git a/test/lisp/net/netrc-tests.el b/test/lisp/net/netrc-tests.el
deleted file mode 100644
index 8e83f405bcc..00000000000
--- a/test/lisp/net/netrc-tests.el
+++ /dev/null
@@ -1,60 +0,0 @@
-;;; netrc-tests.el --- Tests for netrc.el -*- lexical-binding:t -*-
-
-;; Copyright (C) 2020-2022 Free Software Foundation, Inc.
-
-;; Author: Stefan Kangas <stefankangas@gmail.com>
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
-
-;;; Code:
-
-(require 'ert)
-(require 'ert-x)
-(require 'netrc)
-
-(ert-deftest test-netrc-parse-services ()
- (let ((netrc-services-file (ert-resource-file "services")))
- (should (equal (netrc-parse-services)
- '(("tcpmux" 1 tcp)
- ("smtp" 25 tcp)
- ("http" 80 tcp)
- ("kerberos" 88 tcp)
- ("kerberos" 88 udp)
- ("rtmp" 1 ddp))))))
-
-(ert-deftest test-netrc-find-service-name ()
- (let ((netrc-services-file (ert-resource-file "services")))
- (should (equal (netrc-find-service-name 25) "smtp"))
- (should (equal (netrc-find-service-name 88 'udp) "kerberos"))
- (should-not (netrc-find-service-name 12345))))
-
-(ert-deftest test-netrc-credentials ()
- (let ((netrc-file (ert-resource-file "authinfo")))
- (should (equal (netrc-credentials "imap.example.org")
- '("jrh@example.org" "*foobar*")))
- (should (equal (netrc-credentials "ftp.example.org")
- '("jrh" "*baz*")))))
-
-(ert-deftest test-netrc-credentials-2 ()
- (let ((netrc-file (ert-resource-file "netrc-folding")))
- (should
- (equal (netrc-parse netrc-file)
- '((("machine" . "XM") ("login" . "XL") ("password" . "XP"))
- (("machine" . "YM")) (("login" . "YL")) (("password" . "YP")))))))
-
-(provide 'netrc-tests)
-
-;;; netrc-tests.el ends here
diff --git a/test/lisp/net/shr-tests.el b/test/lisp/net/shr-tests.el
index 821ca5ca636..2254f9bc860 100644
--- a/test/lisp/net/shr-tests.el
+++ b/test/lisp/net/shr-tests.el
@@ -67,6 +67,21 @@
(should-not
(shr--use-cookies-p "http://www.gnu.org" '("http://www.fsf.org")))))
+(ert-deftest shr-srcset ()
+ (should (equal (shr--parse-srcset "") nil))
+
+ (should (equal (shr--parse-srcset "a 10w, b 20w")
+ '(("b" 20) ("a" 10))))
+
+ (should (equal (shr--parse-srcset "a 10w b 20w")
+ '(("a" 10))))
+
+ (should (equal (shr--parse-srcset "https://example.org/1\n\n 10w , https://example.org/2 20w ")
+ '(("https://example.org/2" 20) ("https://example.org/1" 10))))
+
+ (should (equal (shr--parse-srcset "https://example.org/1,2\n\n 10w , https://example.org/2 20w ")
+ '(("https://example.org/2" 20) ("https://example.org/1,2" 10)))))
+
(require 'shr)
;;; shr-tests.el ends here
diff --git a/test/lisp/net/tramp-archive-tests.el b/test/lisp/net/tramp-archive-tests.el
index 54d1ecf3652..f51037aabb4 100644
--- a/test/lisp/net/tramp-archive-tests.el
+++ b/test/lisp/net/tramp-archive-tests.el
@@ -31,7 +31,6 @@
(require 'ert)
(require 'ert-x)
(require 'tramp-archive)
-(defvar tramp-copy-size-limit)
(defvar tramp-persistency-file-name)
;; `ert-resource-file' was introduced in Emacs 28.1.
@@ -96,7 +95,6 @@ Do not hexlify \"/\". This hexlified string is used in `file:///' URLs."
(setq password-cache-expiry nil
tramp-cache-read-persistent-data t ;; For auth-sources.
- tramp-copy-size-limit nil
tramp-persistency-file-name nil
tramp-verbose 0)
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index 8b6d10033f1..4dcf671f51f 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -201,6 +201,14 @@ being the result.")
(file-writable-p ert-remote-temporary-file-directory))))))
(when (cdr tramp--test-enabled-checked)
+ ;; Remove old test files.
+ (dolist (dir `(,temporary-file-directory
+ ,ert-remote-temporary-file-directory))
+ (dolist (file (directory-files dir 'full "\\`\\(\\.#\\)?tramp-test"))
+ (ignore-errors
+ (if (file-directory-p file)
+ (delete-directory file 'recursive)
+ (delete-file file)))))
;; Cleanup connection.
(ignore-errors
(tramp-cleanup-connection tramp-test-vec nil 'keep-password)))
@@ -2325,8 +2333,8 @@ This checks also `file-name-as-directory', `file-name-directory',
(should-not (file-exists-p tmp-name))
;; Trashing files doesn't work when `system-move-file-to-trash'
- ;; is defined (on MS Windows and macOS), and for crypted remote
- ;; files.
+ ;; is defined (on MS-Windows and macOS), and for encrypted
+ ;; remote files.
(unless (or (fboundp 'system-move-file-to-trash) (tramp--test-crypt-p))
(let ((trash-directory (tramp--test-make-temp-name 'local quoted))
(delete-by-moving-to-trash t))
@@ -2473,6 +2481,19 @@ This checks also `file-name-as-directory', `file-name-directory',
(insert-file-contents tmp-name)
(should (string-equal (buffer-string) "foo")))
+ ;; Write empty string. Used for creation of temporary files.
+ ;; Since Emacs 27.1.
+ (when (fboundp 'make-empty-file)
+ (with-no-warnings
+ (should-error
+ (make-empty-file tmp-name)
+ :type 'file-already-exists)
+ (delete-file tmp-name)
+ (make-empty-file tmp-name)
+ (with-temp-buffer
+ (insert-file-contents tmp-name)
+ (should (string-equal (buffer-string) "")))))
+
;; Write partly.
(with-temp-buffer
(insert "123456789")
@@ -2901,7 +2922,7 @@ This tests also `file-directory-p' and `file-accessible-directory-p'."
;; Trashing directories works only since Emacs 27.1. It doesn't
;; work when `system-move-file-to-trash' is defined (on MS
- ;; Windows and macOS), for crypted remote directories and for
+ ;; Windows and macOS), for encrypted remote directories and for
;; ange-ftp.
(when (and (not (fboundp 'system-move-file-to-trash))
(not (tramp--test-crypt-p)) (not (tramp--test-ftp-p))
@@ -3174,8 +3195,8 @@ This tests also `file-directory-p' and `file-accessible-directory-p'."
;; (this is performed by `dired'). If FULL is nil, it shows just
;; one file. So we refrain from testing.
(skip-unless (not (tramp--test-ange-ftp-p)))
- ;; `insert-directory' of crypted remote directories works only since
- ;; Emacs 27.1.
+ ;; `insert-directory' of encrypted remote directories works only
+ ;; since Emacs 27.1.
(skip-unless (or (not (tramp--test-crypt-p)) (tramp--test-emacs27-p)))
(dolist (quoted (if (tramp--test-expensive-test-p) '(nil t) '(nil)))
@@ -3211,20 +3232,21 @@ This tests also `file-directory-p' and `file-accessible-directory-p'."
(goto-char (point-min))
(should
(looking-at-p (format "^.+ %s/$" (regexp-quote tmp-name1)))))
- (with-temp-buffer
- (insert-directory
- (file-name-as-directory tmp-name1) "-al" nil 'full-directory-p)
- (goto-char (point-min))
- (should
- (looking-at-p
- (concat
- ;; There might be a summary line.
- "\\(total.+[[:digit:]]+ ?[kKMGTPEZY]?i?B?\n\\)?"
- ;; We don't know in which order ".", ".." and "foo" appear.
- (format
- "\\(.+ %s\\( ->.+\\)?\n\\)\\{%d\\}"
- (regexp-opt (directory-files tmp-name1))
- (length (directory-files tmp-name1)))))))
+ (let ((directory-files (directory-files tmp-name1)))
+ (with-temp-buffer
+ (insert-directory
+ (file-name-as-directory tmp-name1) "-al" nil 'full-directory-p)
+ (goto-char (point-min))
+ (should
+ (looking-at-p
+ (concat
+ ;; There might be a summary line.
+ "\\(total.+[[:digit:]]+ ?[kKMGTPEZY]?i?B?\n\\)?"
+ ;; We don't know in which order ".", ".." and "foo" appear.
+ (format
+ "\\(.+ %s\\( ->.+\\)?\n\\)\\{%d\\}"
+ (regexp-opt directory-files)
+ (length directory-files)))))))
;; Check error cases.
(when (and (tramp--test-supports-set-file-modes-p)
@@ -3559,6 +3581,75 @@ This tests also `access-file', `file-readable-p',
(ignore-errors (delete-file tmp-name1))
(ignore-errors (delete-file tmp-name2))))))
+(defmacro tramp--test-deftest-with-stat (test)
+ "Define ert `TEST-with-stat'."
+ (declare (indent 1))
+ `(ert-deftest ,(intern (concat (symbol-name test) "-with-stat")) ()
+ ;; This is the docstring. However, it must be expanded to a
+ ;; string inside the macro. No idea.
+ ;; (concat (ert-test-documentation (get ',test 'ert--test))
+ ;; "\nUse the \"stat\" command.")
+ :tags '(:expensive-test)
+ (skip-unless (tramp--test-enabled))
+ (skip-unless (tramp--test-sh-p))
+ (skip-unless (tramp-get-remote-stat tramp-test-vec))
+ (let ((default-directory ert-remote-temporary-file-directory)
+ (ert-test (ert-get-test ',test))
+ (tramp-connection-properties
+ (cons '(nil "perl" nil)
+ tramp-connection-properties)))
+ (funcall (ert-test-body ert-test)))))
+
+(defmacro tramp--test-deftest-with-perl (test)
+ "Define ert `TEST-with-perl'."
+ (declare (indent 1))
+ `(ert-deftest ,(intern (concat (symbol-name test) "-with-perl")) ()
+ ;; This is the docstring. However, it must be expanded to a
+ ;; string inside the macro. No idea.
+ ;; (concat (ert-test-documentation (get ',test 'ert--test))
+ ;; "\nUse the \"perl\" command.")
+ :tags '(:expensive-test)
+ (skip-unless (tramp--test-enabled))
+ (skip-unless (tramp--test-sh-p))
+ (skip-unless (tramp-get-remote-perl tramp-test-vec))
+ (let ((default-directory ert-remote-temporary-file-directory)
+ (ert-test (ert-get-test ',test))
+ (tramp-connection-properties
+ (append
+ '((nil "stat" nil)
+ ;; See `tramp-sh-handle-file-truename'.
+ (nil "readlink" nil))
+ tramp-connection-properties)))
+ (funcall (ert-test-body ert-test)))))
+
+(defmacro tramp--test-deftest-with-ls (test)
+ "Define ert `TEST-with-ls'."
+ (declare (indent 1))
+ `(ert-deftest ,(intern (concat (symbol-name test) "-with-ls")) ()
+ ;; This is the docstring. However, it must be expanded to a
+ ;; string inside the macro. No idea.
+ ;; (concat (ert-test-documentation (get ',test 'ert--test))
+ ;; "\nUse the \"ls\" command.")
+ :tags '(:expensive-test)
+ (skip-unless (tramp--test-enabled))
+ (skip-unless (tramp--test-sh-p))
+ (let ((default-directory ert-remote-temporary-file-directory)
+ (ert-test (ert-get-test ',test))
+ (tramp-connection-properties
+ (append
+ '((nil "perl" nil)
+ (nil "stat" nil)
+ ;; See `tramp-sh-handle-file-truename'.
+ (nil "readlink" nil))
+ tramp-connection-properties)))
+ (funcall (ert-test-body ert-test)))))
+
+(tramp--test-deftest-with-stat tramp-test18-file-attributes)
+
+(tramp--test-deftest-with-perl tramp-test18-file-attributes)
+
+(tramp--test-deftest-with-ls tramp-test18-file-attributes)
+
(defvar tramp--test-start-time nil
"Keep the start time of the current test, a float number.")
@@ -3676,6 +3767,12 @@ They might differ only in time attributes or directory size."
;; Cleanup.
(ignore-errors (delete-directory tmp-name1 'recursive))))))
+(tramp--test-deftest-with-stat tramp-test19-directory-files-and-attributes)
+
+(tramp--test-deftest-with-perl tramp-test19-directory-files-and-attributes)
+
+(tramp--test-deftest-with-ls tramp-test19-directory-files-and-attributes)
+
(ert-deftest tramp-test20-file-modes ()
"Check `file-modes'.
This tests also `file-executable-p', `file-writable-p' and `set-file-modes'."
@@ -3707,7 +3804,11 @@ This tests also `file-executable-p', `file-writable-p' and `set-file-modes'."
(when (tramp--test-emacs28-p)
(with-no-warnings
(set-file-modes tmp-name1 #o222 'nofollow)
- (should (= (file-modes tmp-name1 'nofollow) #o222)))))
+ (should (= (file-modes tmp-name1 'nofollow) #o222))))
+ ;; Setting the mode for not existing files shall fail.
+ (should-error
+ (set-file-modes tmp-name2 #o777)
+ :type 'file-missing))
;; Cleanup.
(ignore-errors (delete-file tmp-name1)))
@@ -4003,9 +4104,9 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(setq tmp-name3 (concat (file-remote-p tmp-name3) tmp-name2)))))
;; Cleanup.
- (ignore-errors
- (delete-file tmp-name3)
- (delete-directory tmp-name1 'recursive)))
+ (ignore-errors (delete-file tmp-name2))
+ (ignore-errors (delete-file tmp-name3))
+ (ignore-errors (delete-directory tmp-name1 'recursive)))
;; Detect cyclic symbolic links.
(unwind-protect
@@ -4059,7 +4160,8 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(file-attributes tmp-name1))))
;; Skip the test, if the remote handler is not able to set
;; the correct time.
- (skip-unless (set-file-times tmp-name1 (seconds-to-time 1)))
+ ;; Some remote machines cannot resolve seconds. So we use a minute.
+ (skip-unless (set-file-times tmp-name1 (seconds-to-time 60)))
;; Dumb remote shells without perl(1) or stat(1) are not
;; able to return the date correctly. They say "don't know".
(unless (tramp-compat-time-equal-p
@@ -4069,7 +4171,11 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(should
(tramp-compat-time-equal-p
(file-attribute-modification-time (file-attributes tmp-name1))
- (seconds-to-time 1)))
+ (seconds-to-time 60)))
+ ;; Setting the time for not existing files shall fail.
+ (should-error
+ (set-file-times tmp-name2)
+ :type 'file-missing)
(write-region "bla" nil tmp-name2)
(should (file-exists-p tmp-name2))
(should (file-newer-than-file-p tmp-name2 tmp-name1))
@@ -4080,12 +4186,12 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
;; regular files, there shouldn't be a difference.
(when (tramp--test-emacs28-p)
(with-no-warnings
- (set-file-times tmp-name1 (seconds-to-time 1) 'nofollow)
+ (set-file-times tmp-name1 (seconds-to-time 60) 'nofollow)
(should
(tramp-compat-time-equal-p
(file-attribute-modification-time
(file-attributes tmp-name1))
- (seconds-to-time 1)))))))
+ (seconds-to-time 60)))))))
;; Cleanup.
(ignore-errors
@@ -4789,8 +4895,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
;; Cleanup.
(ignore-errors (delete-process proc))))))
-(defmacro tramp--test--deftest-direct-async-process
- (test docstring &optional unstable)
+(defmacro tramp--test-deftest-direct-async-process (test &optional unstable)
"Define ert test `TEST-direct-async' for direct async processes.
If UNSTABLE is non-nil, the test is tagged as `:unstable'."
(declare (indent 1))
@@ -4799,7 +4904,10 @@ If UNSTABLE is non-nil, the test is tagged as `:unstable'."
(when (let ((file-name-handler-alist '(("" . (lambda (&rest _) t)))))
(ignore-errors (make-process :file-handler t)))
`(ert-deftest ,(intern (concat (symbol-name test) "-direct-async")) ()
- ,docstring
+ ;; This is the docstring. However, it must be expanded to a
+ ;; string inside the macro. No idea.
+ ;; (concat (ert-test-documentation (get ',test 'ert--test))
+ ;; "\nUse direct async process.")
:tags (append '(:expensive-test :tramp-asynchronous-processes)
(and ,unstable '(:unstable)))
(skip-unless (tramp--test-enabled))
@@ -4819,8 +4927,7 @@ If UNSTABLE is non-nil, the test is tagged as `:unstable'."
(file-truename ert-remote-temporary-file-directory)
(funcall (ert-test-body ert-test)))))))
-(tramp--test--deftest-direct-async-process tramp-test29-start-file-process
- "Check direct async `start-file-process'.")
+(tramp--test-deftest-direct-async-process tramp-test29-start-file-process)
(ert-deftest tramp-test30-make-process ()
"Check `make-process'."
@@ -5077,8 +5184,7 @@ If UNSTABLE is non-nil, the test is tagged as `:unstable'."
;; Cleanup.
(ignore-errors (delete-process proc)))))))))
-(tramp--test--deftest-direct-async-process tramp-test30-make-process
- "Check direct async `make-process'.")
+(tramp--test-deftest-direct-async-process tramp-test30-make-process)
(ert-deftest tramp-test31-interrupt-process ()
"Check `interrupt-process'."
@@ -5364,8 +5470,7 @@ INPUT, if non-nil, is a string sent to the process."
(when (natnump cols)
(should (= cols async-shell-command-width))))))
-(tramp--test--deftest-direct-async-process tramp-test32-shell-command
- "Check direct async `shell-command'." 'unstable)
+(tramp--test-deftest-direct-async-process tramp-test32-shell-command 'unstable)
;; This test is inspired by Bug#39067.
(ert-deftest tramp-test32-shell-command-dont-erase-buffer ()
@@ -5586,9 +5691,7 @@ INPUT, if non-nil, is a string sent to the process."
this-shell-command-to-string
"printenv | grep -v PS1 | grep -v _=")))))))))
-(tramp--test--deftest-direct-async-process tramp-test33-environment-variables
- "Check that remote processes set / unset environment variables properly.
-Use direct async.")
+(tramp--test-deftest-direct-async-process tramp-test33-environment-variables)
;; This test is inspired by Bug#27009.
(ert-deftest tramp-test33-environment-variables-and-port-numbers ()
@@ -6474,7 +6577,7 @@ This is used in tests which we don't want to tag
(string-match-p "[[:multibyte:]]" default-directory)))))
(defun tramp--test-crypt-p ()
- "Check, whether the remote directory is crypted."
+ "Check, whether the remote directory is encrypted."
(tramp-crypt-file-name-p ert-remote-temporary-file-directory))
(defun tramp--test-docker-p ()
@@ -6850,8 +6953,14 @@ This requires restrictions of file name syntax."
(ignore-errors (delete-directory tmp-name1 'recursive))
(ignore-errors (delete-directory tmp-name2 'recursive))))))
-(defun tramp--test-special-characters ()
- "Perform the test in `tramp-test41-special-characters*'."
+;; These tests are inspired by Bug#17238.
+(ert-deftest tramp-test41-special-characters ()
+ "Check special characters in file names."
+ (skip-unless (tramp--test-enabled))
+ (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 245s
+ (skip-unless (not (tramp--test-rsync-p)))
+ (skip-unless (not (tramp--test-rclone-p)))
+
;; Newlines, slashes and backslashes in file names are not
;; supported. So we don't test. And we don't test the tab
;; character on Windows or Cygwin, because the backslash is
@@ -6908,80 +7017,24 @@ This requires restrictions of file name syntax."
(if (tramp--test-expensive-test-p)
files (list (mapconcat #'identity files ""))))))
-;; These tests are inspired by Bug#17238.
-(ert-deftest tramp-test41-special-characters ()
- "Check special characters in file names."
- (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 245s
- (skip-unless (tramp--test-enabled))
- (skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-rclone-p)))
+(tramp--test-deftest-with-stat tramp-test41-special-characters)
- (tramp--test-special-characters))
+(tramp--test-deftest-with-perl tramp-test41-special-characters)
-(ert-deftest tramp-test41-special-characters-with-stat ()
- "Check special characters in file names.
-Use the \"stat\" command."
- :tags '(:expensive-test)
- (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 287s
- (skip-unless (tramp--test-enabled))
- (skip-unless (tramp--test-sh-p))
- (skip-unless (not (tramp--test-rsync-p)))
- ;; We cannot use `tramp-test-vec', because this fails during compilation.
- (with-parsed-tramp-file-name ert-remote-temporary-file-directory nil
- (skip-unless (tramp-get-remote-stat v)))
-
- (let ((tramp-connection-properties
- (append
- `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "perl" nil))
- tramp-connection-properties)))
- (tramp--test-special-characters)))
-
-(ert-deftest tramp-test41-special-characters-with-perl ()
- "Check special characters in file names.
-Use the \"perl\" command."
- :tags '(:expensive-test)
- (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 266s
- (skip-unless (tramp--test-enabled))
- (skip-unless (tramp--test-sh-p))
- (skip-unless (not (tramp--test-rsync-p)))
- ;; We cannot use `tramp-test-vec', because this fails during compilation.
- (with-parsed-tramp-file-name ert-remote-temporary-file-directory nil
- (skip-unless (tramp-get-remote-perl v)))
-
- (let ((tramp-connection-properties
- (append
- `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "stat" nil)
- ;; See `tramp-sh-handle-file-truename'.
- (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "readlink" nil))
- tramp-connection-properties)))
- (tramp--test-special-characters)))
-
-(ert-deftest tramp-test41-special-characters-with-ls ()
- "Check special characters in file names.
-Use the \"ls\" command."
- :tags '(:expensive-test)
- (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 287s
+(tramp--test-deftest-with-ls tramp-test41-special-characters)
+
+(ert-deftest tramp-test42-utf8 ()
+ "Check UTF8 encoding in file names and file contents."
(skip-unless (tramp--test-enabled))
- (skip-unless (tramp--test-sh-p))
+ (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 620s
+ (skip-unless (not (tramp--test-docker-p)))
(skip-unless (not (tramp--test-rsync-p)))
+ (skip-unless (not (tramp--test-windows-nt-and-out-of-band-p)))
+ (skip-unless (not (tramp--test-ksh-p)))
+ (skip-unless (not (tramp--test-gdrive-p)))
+ (skip-unless (not (tramp--test-crypt-p)))
+ (skip-unless (not (tramp--test-rclone-p)))
- (let ((tramp-connection-properties
- (append
- `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "perl" nil)
- (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "stat" nil)
- ;; See `tramp-sh-handle-file-truename'.
- (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "readlink" nil))
- tramp-connection-properties)))
- (tramp--test-special-characters)))
-
-(defun tramp--test-utf8 ()
- "Perform the test in `tramp-test42-utf8*'."
(let* ((utf8 (if (and (eq system-type 'darwin)
(memq 'utf-8-hfs (coding-system-list)))
'utf-8-hfs 'utf-8))
@@ -6999,7 +7052,8 @@ Use the \"ls\" command."
"银河系漫游指南系列"
"Автостопом по гала́ктике"
;; Use codepoints without a name. See Bug#31272.
- "™›šbung"
+ ;; Works on some Android systems only.
+ (unless (tramp--test-adb-p) "™›šbung")
;; Use codepoints from Supplementary Multilingual Plane (U+10000
;; to U+1FFFF).
"🌈🍒👋")
@@ -7027,93 +7081,11 @@ Use the \"ls\" command."
(replace-regexp-in-string "[ \t\n/.?]" "" x)))
language-info-alist)))))))
-(ert-deftest tramp-test42-utf8 ()
- "Check UTF8 encoding in file names and file contents."
- (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 620s
- (skip-unless (tramp--test-enabled))
- (skip-unless (not (tramp--test-docker-p)))
- (skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-windows-nt-and-out-of-band-p)))
- (skip-unless (not (tramp--test-ksh-p)))
- (skip-unless (not (tramp--test-gdrive-p)))
- (skip-unless (not (tramp--test-crypt-p)))
- (skip-unless (not (tramp--test-rclone-p)))
+(tramp--test-deftest-with-stat tramp-test42-utf8)
- (tramp--test-utf8))
+(tramp--test-deftest-with-perl tramp-test42-utf8)
-(ert-deftest tramp-test42-utf8-with-stat ()
- "Check UTF8 encoding in file names and file contents.
-Use the \"stat\" command."
- :tags '(:expensive-test)
- (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 595s
- (skip-unless (tramp--test-enabled))
- (skip-unless (tramp--test-sh-p))
- (skip-unless (not (tramp--test-docker-p)))
- (skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-out-of-band-p))) ; SLOW
- (skip-unless (not (tramp--test-ksh-p)))
- (skip-unless (not (tramp--test-crypt-p)))
- ;; We cannot use `tramp-test-vec', because this fails during compilation.
- (with-parsed-tramp-file-name ert-remote-temporary-file-directory nil
- (skip-unless (tramp-get-remote-stat v)))
-
- (let ((tramp-connection-properties
- (append
- `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "perl" nil))
- tramp-connection-properties)))
- (tramp--test-utf8)))
-
-(ert-deftest tramp-test42-utf8-with-perl ()
- "Check UTF8 encoding in file names and file contents.
-Use the \"perl\" command."
- :tags '(:expensive-test)
- (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 620s
- (skip-unless (tramp--test-enabled))
- (skip-unless (tramp--test-sh-p))
- (skip-unless (not (tramp--test-docker-p)))
- (skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-out-of-band-p))) ; SLOW
- (skip-unless (not (tramp--test-ksh-p)))
- (skip-unless (not (tramp--test-crypt-p)))
- ;; We cannot use `tramp-test-vec', because this fails during compilation.
- (with-parsed-tramp-file-name ert-remote-temporary-file-directory nil
- (skip-unless (tramp-get-remote-perl v)))
-
- (let ((tramp-connection-properties
- (append
- `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "stat" nil)
- ;; See `tramp-sh-handle-file-truename'.
- (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "readlink" nil))
- tramp-connection-properties)))
- (tramp--test-utf8)))
-
-(ert-deftest tramp-test42-utf8-with-ls ()
- "Check UTF8 encoding in file names and file contents.
-Use the \"ls\" command."
- :tags '(:expensive-test)
- (skip-unless (not (getenv "EMACS_HYDRA_CI"))) ; SLOW ~ 690s
- (skip-unless (tramp--test-enabled))
- (skip-unless (tramp--test-sh-p))
- (skip-unless (not (tramp--test-docker-p)))
- (skip-unless (not (tramp--test-rsync-p)))
- (skip-unless (not (tramp--test-out-of-band-p))) ; SLOW
- (skip-unless (not (tramp--test-ksh-p)))
- (skip-unless (not (tramp--test-crypt-p)))
-
- (let ((tramp-connection-properties
- (append
- `((,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "perl" nil)
- (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "stat" nil)
- ;; See `tramp-sh-handle-file-truename'.
- (,(regexp-quote (file-remote-p ert-remote-temporary-file-directory))
- "readlink" nil))
- tramp-connection-properties)))
- (tramp--test-utf8)))
+(tramp--test-deftest-with-ls tramp-test42-utf8)
(ert-deftest tramp-test43-file-system-info ()
"Check that `file-system-info' returns proper values."
@@ -7367,8 +7339,8 @@ process sentinels. They shall not disturb each other."
(ignore-errors (cancel-timer timer))
(ignore-errors (delete-directory tmp-name 'recursive))))))
-;; (tramp--test--deftest-direct-async-process tramp-test44-asynchronous-requests
-;; "Check parallel direct asynchronous requests." 'unstable)
+;; (tramp--test-deftest-direct-async-process tramp-test44-asynchronous-requests
+;; 'unstable)
(ert-deftest tramp-test45-dired-compress-file ()
"Check that Tramp (un)compresses normal files."
@@ -7621,7 +7593,7 @@ Since it unloads Tramp, it shall be the last test to run."
(should-not (cl--find-class 'tramp-file-name))
(mapatoms
(lambda (x)
- (and (functionp x)
+ (and (functionp x) (null (autoloadp (symbol-function x)))
(string-match-p "tramp-file-name" (symbol-name x))
(ert-fail (format "Structure function `%s' still exists" x)))))
diff --git a/test/lisp/makesum-tests.el b/test/lisp/obsolete/makesum-tests.el
index e5317be847b..e5317be847b 100644
--- a/test/lisp/makesum-tests.el
+++ b/test/lisp/obsolete/makesum-tests.el
diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index 92c20288c8e..9e8fa7f5520 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -380,6 +380,162 @@ def f(x: CustomInt) -> CustomInt:
(128 . font-lock-builtin-face) (131)
(144 . font-lock-keyword-face) (150))))
+(ert-deftest python-font-lock-escape-sequence-string-newline ()
+ (python-tests-assert-faces
+ "'\\n'
+\"\\n\"
+f'\\n'
+f\"\\n\"
+u'\\n'
+u\"\\n\""
+ '((1 . font-lock-doc-face)
+ (2 . font-lock-constant-face)
+ (4 . font-lock-doc-face) (5)
+ (6 . font-lock-doc-face)
+ (7 . font-lock-constant-face)
+ (9 . font-lock-doc-face) (10)
+ (12 . font-lock-string-face)
+ (13 . font-lock-constant-face)
+ (15 . font-lock-string-face) (16)
+ (18 . font-lock-string-face)
+ (19 . font-lock-constant-face)
+ (21 . font-lock-string-face) (22)
+ (24 . font-lock-string-face)
+ (25 . font-lock-constant-face)
+ (27 . font-lock-string-face) (28)
+ (30 . font-lock-string-face)
+ (31 . font-lock-constant-face)
+ (33 . font-lock-string-face))))
+
+(ert-deftest python-font-lock-escape-sequence-multiline-string ()
+ (python-tests-assert-faces
+ (let ((escape-sequences "\\x12 \123 \\n \\u1234 \\U00010348 \\N{Plus-Minus Sign}"))
+ (cl-loop for string-prefix in '("" "f" "rf" "fr" "r" "rb" "br" "b")
+ concat (cl-loop for quote-string in '("\"\"\"" "'''")
+ concat (concat string-prefix
+ quote-string
+ escape-sequences
+ quote-string
+ "\n"))))
+ '((1 . font-lock-doc-face)
+ (4 . font-lock-constant-face)
+ (8 . font-lock-doc-face)
+ (11 . font-lock-constant-face)
+ (13 . font-lock-doc-face)
+ (14 . font-lock-constant-face)
+ (20 . font-lock-doc-face)
+ (21 . font-lock-constant-face)
+ (31 . font-lock-doc-face)
+ (32 . font-lock-constant-face)
+ (51 . font-lock-doc-face) (54)
+ (55 . font-lock-doc-face)
+ (58 . font-lock-constant-face)
+ (62 . font-lock-doc-face)
+ (65 . font-lock-constant-face)
+ (67 . font-lock-doc-face)
+ (68 . font-lock-constant-face)
+ (74 . font-lock-doc-face)
+ (75 . font-lock-constant-face)
+ (85 . font-lock-doc-face)
+ (86 . font-lock-constant-face)
+ (105 . font-lock-doc-face) (108)
+ (110 . font-lock-string-face)
+ (113 . font-lock-constant-face)
+ (117 . font-lock-string-face)
+ (120 . font-lock-constant-face)
+ (122 . font-lock-string-face)
+ (123 . font-lock-constant-face)
+ (129 . font-lock-string-face)
+ (130 . font-lock-constant-face)
+ (140 . font-lock-string-face)
+ (141 . font-lock-constant-face)
+ (160 . font-lock-string-face) (163)
+ (165 . font-lock-string-face)
+ (168 . font-lock-constant-face)
+ (172 . font-lock-string-face)
+ (175 . font-lock-constant-face)
+ (177 . font-lock-string-face)
+ (178 . font-lock-constant-face)
+ (184 . font-lock-string-face)
+ (185 . font-lock-constant-face)
+ (195 . font-lock-string-face)
+ (196 . font-lock-constant-face)
+ (215 . font-lock-string-face) (218)
+ (221 . font-lock-string-face) (274)
+ (277 . font-lock-string-face) (330)
+ (333 . font-lock-string-face) (386)
+ (389 . font-lock-string-face) (442)
+ (444 . font-lock-string-face) (497)
+ (499 . font-lock-string-face) (552)
+ (555 . font-lock-string-face) (608)
+ (611 . font-lock-string-face) (664)
+ (667 . font-lock-string-face) (720)
+ (723 . font-lock-string-face) (776)
+ (778 . font-lock-string-face)
+ (781 . font-lock-constant-face)
+ (785 . font-lock-string-face)
+ (788 . font-lock-constant-face)
+ (790 . font-lock-string-face) (831)
+ (833 . font-lock-string-face)
+ (836 . font-lock-constant-face)
+ (840 . font-lock-string-face)
+ (843 . font-lock-constant-face)
+ (845 . font-lock-string-face) (886))))
+
+(ert-deftest python-font-lock-escape-sequence-bytes-newline ()
+ (python-tests-assert-faces
+ "b'\\n'
+b\"\\n\""
+ '((1)
+ (2 . font-lock-doc-face)
+ (3 . font-lock-constant-face)
+ (5 . font-lock-doc-face) (6)
+ (8 . font-lock-doc-face)
+ (9 . font-lock-constant-face)
+ (11 . font-lock-doc-face))))
+
+(ert-deftest python-font-lock-escape-sequence-hex-octal ()
+ (python-tests-assert-faces
+ "b'\\x12 \\777 \\1\\23'
+'\\x12 \\777 \\1\\23'"
+ '((1)
+ (2 . font-lock-doc-face)
+ (3 . font-lock-constant-face)
+ (7 . font-lock-doc-face)
+ (8 . font-lock-constant-face)
+ (12 . font-lock-doc-face)
+ (13 . font-lock-constant-face)
+ (18 . font-lock-doc-face) (19)
+ (20 . font-lock-doc-face)
+ (21 . font-lock-constant-face)
+ (25 . font-lock-doc-face)
+ (26 . font-lock-constant-face)
+ (30 . font-lock-doc-face)
+ (31 . font-lock-constant-face)
+ (36 . font-lock-doc-face))))
+
+(ert-deftest python-font-lock-escape-sequence-unicode ()
+ (python-tests-assert-faces
+ "b'\\u1234 \\U00010348 \\N{Plus-Minus Sign}'
+'\\u1234 \\U00010348 \\N{Plus-Minus Sign}'"
+ '((1)
+ (2 . font-lock-doc-face) (41)
+ (42 . font-lock-doc-face)
+ (43 . font-lock-constant-face)
+ (49 . font-lock-doc-face)
+ (50 . font-lock-constant-face)
+ (60 . font-lock-doc-face)
+ (61 . font-lock-constant-face)
+ (80 . font-lock-doc-face))))
+
+(ert-deftest python-font-lock-raw-escape-sequence ()
+ (python-tests-assert-faces
+ "rb'\\x12 \123 \\n'
+r'\\x12 \123 \\n \\u1234 \\U00010348 \\N{Plus-Minus Sign}'"
+ '((1)
+ (3 . font-lock-doc-face) (14)
+ (16 . font-lock-doc-face))))
+
;;; Indentation
@@ -1122,6 +1278,35 @@ if save:
(python-indent-line t)
(should (= (python-indent-calculate-indentation t) 8))))
+(ert-deftest python-indent-dedenters-comment-else ()
+ "Test de-indentation for the else keyword with comments before it."
+ (python-tests-with-temp-buffer
+ "
+if save:
+ try:
+ write_to_disk(data)
+ except IOError:
+ msg = 'Error saving to disk'
+ message(msg)
+ logger.exception(msg)
+ except Exception:
+ if hide_details:
+ logger.exception('Unhandled exception')
+ # comment
+ else
+ finally:
+ data.free()
+"
+ (python-tests-look-at "else\n")
+ (should (eq (car (python-indent-context)) :at-dedenter-block-start))
+ (should (= (python-indent-calculate-indentation) 8))
+ (python-indent-line t)
+ (should (= (python-indent-calculate-indentation t) 4))
+ (python-indent-line t)
+ (should (= (python-indent-calculate-indentation t) 0))
+ (python-indent-line t)
+ (should (= (python-indent-calculate-indentation t) 8))))
+
(ert-deftest python-indent-dedenters-3 ()
"Test de-indentation for the except keyword."
(python-tests-with-temp-buffer
@@ -1876,7 +2061,7 @@ class C(object):
(beginning-of-line)
(point))))
;; Nested defuns should be skipped.
- (python-tests-look-at "return a" -1)
+ (forward-line -1)
(should (= (save-excursion
(python-nav-beginning-of-defun)
(point))
@@ -1885,6 +2070,15 @@ class C(object):
(beginning-of-line)
(point))))
;; Defuns on same levels should be respected.
+ (python-tests-look-at "if True:" -1)
+ (forward-line -1)
+ (should (= (save-excursion
+ (python-nav-beginning-of-defun)
+ (point))
+ (save-excursion
+ (python-tests-look-at "def a():" -1)
+ (beginning-of-line)
+ (point))))
(python-tests-look-at "def a():" -1)
(should (= (save-excursion
(python-nav-beginning-of-defun)
@@ -1893,7 +2087,7 @@ class C(object):
(python-tests-look-at "def b():" -1)
(beginning-of-line)
(point))))
- ;; Jump to a top level defun.
+ ;; Jump to an upper level defun.
(python-tests-look-at "def b():" -1)
(should (= (save-excursion
(python-nav-beginning-of-defun)
@@ -1902,6 +2096,14 @@ class C(object):
(python-tests-look-at "def m(self):" -1)
(beginning-of-line)
(point))))
+ (forward-line -1)
+ (should (= (save-excursion
+ (python-nav-beginning-of-defun)
+ (point))
+ (save-excursion
+ (python-tests-look-at "def m(self):" -1)
+ (beginning-of-line)
+ (point))))
;; Jump to a top level defun again.
(python-tests-look-at "def m(self):" -1)
(should (= (save-excursion
@@ -1978,6 +2180,32 @@ def c():
(beginning-of-line)
(point))))))
+(ert-deftest python-nav-beginning-of-defun-5 ()
+ (python-tests-with-temp-buffer
+ "
+class C:
+
+ def \\
+ m(self):
+ pass
+"
+ (python-tests-look-at "m(self):")
+ (should (= (save-excursion
+ (python-nav-beginning-of-defun)
+ (point))
+ (save-excursion
+ (python-tests-look-at "def \\" -1)
+ (beginning-of-line)
+ (point))))
+ (python-tests-look-at "class C:" -1)
+ (should (= (save-excursion
+ (python-nav-beginning-of-defun -1)
+ (point))
+ (save-excursion
+ (python-tests-look-at "def \\")
+ (beginning-of-line)
+ (point))))))
+
(ert-deftest python-nav-end-of-defun-1 ()
(python-tests-with-temp-buffer
"
@@ -2011,12 +2239,25 @@ class C(object):
(point))))
(should (= (save-excursion
(python-tests-look-at "def b():")
+ (forward-line -1)
+ (python-nav-end-of-defun)
+ (point))
+ (save-excursion
+ (python-tests-look-at "def c(self):")
+ (forward-line -1)
+ (point))))
+ (should (= (save-excursion
+ (python-tests-look-at "def b():")
(python-nav-end-of-defun)
(point))
(save-excursion
(python-tests-look-at "def b():")
(forward-line 2)
(point))))
+ (should (not (save-excursion
+ (python-tests-look-at "def a():")
+ (forward-line -1)
+ (python-nav-end-of-defun))))
(should (= (save-excursion
(python-tests-look-at "def c(self):")
(python-nav-end-of-defun)
@@ -2572,6 +2813,28 @@ def decoratorFunctionWithArguments(arg1, arg2, arg3):
(point))
(python-tests-look-at "def wwrap(f):" -1)))))
+(ert-deftest python-nav-beginning-of-block-2 ()
+ (python-tests-with-temp-buffer
+ "
+if True:
+
+ pass
+if False:
+ # comment
+ pass
+"
+ (python-tests-look-at "if True:")
+ (forward-line)
+ (should (= (save-excursion
+ (python-nav-beginning-of-block)
+ (point))
+ (python-tests-look-at "if True:" -1)))
+ (python-tests-look-at "# comment")
+ (should (= (save-excursion
+ (python-nav-beginning-of-block)
+ (point))
+ (python-tests-look-at "if False:" -1)))))
+
(ert-deftest python-nav-end-of-block-1 ()
(python-tests-with-temp-buffer
"
@@ -2679,6 +2942,22 @@ if request.user.is_authenticated():
(python-tests-look-at
"if request.user.is_authenticated():" -1)))))
+(ert-deftest python-nav-forward-block-2 ()
+ (python-tests-with-temp-buffer
+ "
+if True:
+ pass
+"
+ (python-tests-look-at "if True:")
+ (should (not (save-excursion (python-nav-forward-block))))
+ (should (not (save-excursion (python-nav-forward-block -1))))
+ (forward-char)
+ (should (not (save-excursion (python-nav-forward-block))))
+ (should (= (save-excursion (python-nav-forward-block -1))
+ (progn
+ (end-of-line)
+ (python-tests-look-at "if True:" -1))))))
+
(ert-deftest python-nav-forward-sexp-1 ()
(python-tests-with-temp-buffer
"
@@ -5891,8 +6170,4 @@ buffer with overlapping strings."
(provide 'python-tests)
-;; Local Variables:
-;; indent-tabs-mode: nil
-;; End:
-
;;; python-tests.el ends here
diff --git a/test/lisp/saveplace-tests.el b/test/lisp/saveplace-tests.el
index 6f66f3fa345..99318d295dd 100644
--- a/test/lisp/saveplace-tests.el
+++ b/test/lisp/saveplace-tests.el
@@ -84,7 +84,7 @@
(save-place-file
(ert-resource-file "saveplace"))
(save-place-alist nil))
- (load-save-place-alist-from-file)
+ (save-place-load-alist-from-file)
(should (equal save-place-alist
'(("/home/skangas/.emacs.d/cache/recentf" . 1306)
("/home/skangas/wip/emacs/"
diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el
index ced2bc5c4e5..3d03057f567 100644
--- a/test/lisp/subr-tests.el
+++ b/test/lisp/subr-tests.el
@@ -368,6 +368,17 @@
2)))
(ert-deftest string-comparison-test ()
+ (should (string-equal-ignore-case "abc" "abc"))
+ (should (string-equal-ignore-case "abc" "ABC"))
+ (should (string-equal-ignore-case "abc" "abC"))
+ (should-not (string-equal-ignore-case "abc" "abCD"))
+ (should (string-equal-ignore-case "S" "s"))
+ (should (string-equal-ignore-case "ẞ" "ß"))
+ (should (string-equal-ignore-case "Dz" "DZ"))
+ (should (string-equal-ignore-case "Όσος" "ΌΣΟΣ"))
+ ;; not yet: (should (string-equal-ignore-case "SS" "ß"))
+ ;; not yet: (should (string-equal-ignore-case "SS" "ẞ"))
+
(should (string-lessp "abc" "acb"))
(should (string-lessp "aBc" "abc"))
(should (string-lessp "abc" "abcd"))
@@ -1026,7 +1037,19 @@ final or penultimate step during initialization."))
(ert-deftest test-readablep ()
(should (readablep "foo"))
- (should-not (readablep (list (make-marker)))))
+ (should-not (readablep (list (make-marker))))
+ (should-not (readablep (make-marker))))
+
+(ert-deftest test-print-unreadable-function ()
+ ;; Check that problem with unwinding properly is fixed (bug#56773).
+ (let* ((before nil)
+ (after nil)
+ (r (with-temp-buffer
+ (setq before (current-buffer))
+ (prog1 (readablep (make-marker))
+ (setq after (current-buffer))))))
+ (should (equal after before))
+ (should (equal r nil))))
(ert-deftest test-string-lines ()
(should (equal (string-lines "") '("")))
@@ -1090,5 +1113,22 @@ final or penultimate step during initialization."))
(should-not (plistp '(1 2 3)))
(should-not (plistp '(1 2 3 . 4))))
+(defun subr-tests--butlast-ref (list &optional n)
+ "Reference implementation of `butlast'."
+ (let ((m (or n 1))
+ (len (length list)))
+ (let ((r nil))
+ (while (and list (> len m))
+ (push (car list) r)
+ (setq list (cdr list))
+ (setq len (1- len)))
+ (nreverse r))))
+
+(ert-deftest subr-butlast ()
+ (dolist (l '(nil '(a) '(a b) '(a b c) '(a b c d)))
+ (dolist (n (cons nil (number-sequence -2 6)))
+ (should (equal (butlast l n)
+ (subr-tests--butlast-ref l n))))))
+
(provide 'subr-tests)
;;; subr-tests.el ends here
diff --git a/test/lisp/textmodes/reftex-tests.el b/test/lisp/textmodes/reftex-tests.el
index 9ef41088d1e..97ff3908177 100644
--- a/test/lisp/textmodes/reftex-tests.el
+++ b/test/lisp/textmodes/reftex-tests.el
@@ -190,8 +190,8 @@
(ert-deftest reftex-format-citation-test ()
"Test `reftex-format-citation'."
- (let ((entry (reftex-parse-bibtex-entry
-"@article{Foo13,
+ (let ((entry (reftex-parse-bibtex-entry "\
+@article{Foo13,
author = {Jane Roe and John Doe and Jane Q. Taxpayer},
title = {Some Article},
journal = {Some Journal},
@@ -202,6 +202,137 @@
(should (string= (reftex-format-citation entry "%l:%A:%y:%t %j %P %a")
"Foo13:Jane Roe:2013:Some Article Some Journal 1 Jane Roe, John Doe \\& Jane Taxpayer"))))
+(ert-deftest reftex-all-used-citation-keys ()
+ "Test `reftex-all-used-citation-keys'.
+Take the cite macros provided by biblatex package as reference."
+ (ert-with-temp-directory temp-dir
+ (let ((tex-file (expand-file-name "keys.tex" temp-dir))
+ keys)
+ (with-temp-buffer
+ (insert "\
+\\documentclass{article}
+\\usepackage{biblatex}
+\\begin{document}
+
+Standard commands:
+\\cite[pre][pos]{cite:2022}
+\\Cite[pos]{Cite:2022}
+\\parencite{parencite:2022}
+\\Parencite[pre][]{Parencite:2022}
+\\footcite[][]{footcite:2022}
+\\footcitetext[pre][pos]{footcitetext:2022}
+
+Style specific commands:
+\\textcite{textcite:2022}
+\\Textcite[pos]{Textcite:2022}
+\\smartcite[pre][pos]{smartcite:2022}
+\\Smartcite[pre][]{Smartcite:2022}
+\\cite*[pre][pos]{cite*:2022}
+\\parencite*[][]{parencite*:2022}
+
+Style independent commands:
+\\autocite[pre][pos]{autocite:2022}
+\\autocite*[pos]{autocite*:2022}
+\\Autocite[pre][]{Autocite:2022}
+\\Autocite*{Autocite*:2022}
+
+Text commands:
+\\citeauthor[pre][pos]{citeauthor:2022}
+\\citeauthor*[pre][]{citeauthor*:2022}
+\\Citeauthor[pos]{Citeauthor:2022}
+\\Citeauthor*{Citeauthor*:2022}
+\\citetitle[][]{citetitle:2022}
+\\citetitle*[pre][pos]{citetitle*:2022}
+\\citeyear[pre][pos]{citeyear:2022}
+\\citeyear*[pre][pos]{citeyear*:2022}
+\\citedate[pre][pos]{citedate:2022}
+\\citedate*[pre][pos]{citedate*:2022}
+\\citeurl[pre][pos]{citeurl:2022}
+
+Special commands:
+\\nocite{nocite:2022}
+\\fullcite[pos]{fullcite:2022}
+\\footfullcite[][]{fullfootcite:2022}
+``volcite'' macros have different number of args.
+\\volcite{2}{volcite:2022}
+\\Volcite[pre]{1}{Volcite:2022}
+\\pvolcite{1}[pg]{pvolcite:2022}
+\\Pvolcite[pre]{2}[pg]{Pvolcite:2022}
+\\fvolcite[pre]{3}[pg]{fvolcite:2022}
+\\ftvolcite[pre]{3}[pg]{ftvolcite:2022}
+\\svolcite[pre]{2}[pg]{svolcite:2022}
+\\Svolcite[pre]{4}[pg]{Svolcite:2022}
+\\tvolcite[pre]{5}[pg]{tvolcite:2022}
+\\Tvolcite[pre]{2}[pg]{Tvolcite:2022}
+\\avolcite[pre]{3}[pg]{avolcite:2022}
+\\Avolcite[pre]{1}[pg]{Avolcite:2022}
+\\Notecite[pre]{Notecite:2022}
+\\pnotecite[pre]{pnotecite:2022}
+\\Pnotecite[pre]{Pnotecite:2022}
+\\fnotecite[pre]{fnotecite:2022}
+
+Natbib compatibility commands:
+\\citet{citet:2022}
+\\citet*[pre][pos]{citet*:2022}
+\\citep[pre][pos]{citep:2022}
+\\citep*[pos]{citep*:2022}
+\\citealt[pre][]{citealt:2022}
+\\citealt*[][]{citealt*:2022}
+\\citealp[pre][pos]{citealp:2022}
+\\citealp*{citealp*:2022}
+\\Citet[pre][pos]{Citet:2022}
+\\Citet*[pre][pos]{Citet*:2022}
+\\Citep[pre][pos]{Citep:2022}
+\\Citep*[pre][pos]{Citep*:2022}
+
+Test for bug#56655:
+There was a few \\% of increase in budget \\Citep*{bug:56655}.
+
+And this should be % \\cite{ignored}.
+\\end{document}")
+ (write-region (point-min) (point-max) tex-file))
+ (find-file tex-file)
+ (setq keys (reftex-all-used-citation-keys))
+ (should (equal (sort keys #'string<)
+ (sort '(;; Standard commands:
+ "cite:2022" "Cite:2022"
+ "parencite:2022" "Parencite:2022"
+ "footcite:2022" "footcitetext:2022"
+ ;; Style specific commands:
+ "textcite:2022" "Textcite:2022"
+ "smartcite:2022" "Smartcite:2022"
+ "cite*:2022" "parencite*:2022"
+ ;; Style independent commands:
+ "autocite:2022" "autocite*:2022"
+ "Autocite:2022" "Autocite*:2022"
+ ;; Text commands
+ "citeauthor:2022" "citeauthor*:2022"
+ "Citeauthor:2022" "Citeauthor*:2022"
+ "citetitle:2022" "citetitle*:2022"
+ "citeyear:2022" "citeyear*:2022"
+ "citedate:2022" "citedate*:2022"
+ "citeurl:2022"
+ ;; Special commands:
+ "nocite:2022" "fullcite:2022"
+ "fullfootcite:2022"
+ "volcite:2022" "Volcite:2022"
+ "pvolcite:2022" "Pvolcite:2022"
+ "fvolcite:2022" "ftvolcite:2022"
+ "svolcite:2022" "Svolcite:2022"
+ "tvolcite:2022" "Tvolcite:2022"
+ "avolcite:2022" "Avolcite:2022"
+ "Notecite:2022" "pnotecite:2022"
+ "Pnotecite:2022" "fnotecite:2022"
+ ;; Natbib compatibility commands:
+ "citet:2022" "citet*:2022"
+ "citep:2022" "citep*:2022"
+ "citealt:2022" "citealt*:2022"
+ "citealp:2022" "citealp*:2022"
+ "Citet:2022" "Citet*:2022"
+ "Citep:2022" "Citep*:2022"
+ "bug:56655")
+ #'string<)))
+ (kill-buffer (file-name-nondirectory tex-file)))))
;;; Autoload tests
diff --git a/test/lisp/url/url-util-tests.el b/test/lisp/url/url-util-tests.el
index 8c042c01353..cfc2d93c890 100644
--- a/test/lisp/url/url-util-tests.el
+++ b/test/lisp/url/url-util-tests.el
@@ -46,6 +46,26 @@
("key2" "val2")
("key1" "val1")))))
+(ert-deftest url-unhex-string-tests ()
+ (should (equal (url-unhex-string "foo%20bar")
+ "foo bar"))
+ (should (equal (decode-coding-string (url-unhex-string "Fran%C3%A7ois") 'utf-8)
+ "François"))
+ (should (equal (url-unhex-string "%20%21%23%24%25%26%27%28%29%2A")
+ " !#$%&'()*"))
+ (should (equal (url-unhex-string "%2B%2C%2F%3A%3B%3D%3F%40%5B%5D")
+ "+,/:;=?@[]")))
+
+(ert-deftest url-hexify-string-tests ()
+ (should (equal (url-hexify-string "foo bar")
+ "foo%20bar"))
+ (should (equal (url-hexify-string "François")
+ "Fran%C3%A7ois"))
+ (should (equal (url-hexify-string " !#$%&'()*")
+ "%20%21%23%24%25%26%27%28%29%2A"))
+ (should (equal (url-hexify-string "+,/:;=?@[]")
+ "%2B%2C%2F%3A%3B%3D%3F%40%5B%5D")))
+
(ert-deftest url-domain-tests ()
(should (equal (url-domain (url-generic-parse-url "http://www.fsf.co.uk"))
"fsf.co.uk"))
diff --git a/test/lisp/whitespace-tests.el b/test/lisp/whitespace-tests.el
index 07eaad4862b..2a59bfe9d80 100644
--- a/test/lisp/whitespace-tests.el
+++ b/test/lisp/whitespace-tests.el
@@ -52,9 +52,9 @@
;; mode. So we call its innards instead.
(defun whitespace-tests-whitespace-mode-on ()
"Turn `whitespace-mode' on even in batch mode."
+ (setq whitespace-mode t)
(whitespace-turn-on)
- (whitespace-action-when-on)
- (setq whitespace-mode t))
+ (whitespace-action-when-on))
(ert-deftest whitespace-tests-display-tables ()
"Test whitespace stores and restores the buffer display table - bug26892."
@@ -77,7 +77,6 @@
;test the stored display table is preserved
(should (equal nil
(progn (whitespace-tests-whitespace-mode-on)
- (whitespace-tests-whitespace-mode-on)
(whitespace-turn-off)
buffer-display-table))))))
diff --git a/test/lisp/x-dnd-tests.el b/test/lisp/x-dnd-tests.el
index 8856be79ebc..55994e9b724 100644
--- a/test/lisp/x-dnd-tests.el
+++ b/test/lisp/x-dnd-tests.el
@@ -90,6 +90,8 @@ AgAABQMAAAYDAAATGwAAGhsAAA==")
;;; XDS tests.
+(defvar x-dnd-xds-testing)
+
(defvar x-dnd-tests-xds-target-dir nil
"The name of the target directory where the file will be saved.")
@@ -122,8 +124,8 @@ Return the result of the selection."
(format "file://%s%s" (system-name)
(expand-file-name x-dnd-tests-xds-property-value
x-dnd-tests-xds-target-dir))
- (concat "file:///" (expand-file-name x-dnd-tests-xds-property-value
- x-dnd-tests-xds-target-dir)))))
+ (concat "file://" (expand-file-name x-dnd-tests-xds-property-value
+ x-dnd-tests-xds-target-dir)))))
(setq x-dnd-tests-xds-property-value
(encode-coding-string (url-encode-url uri)
'raw-text)))
@@ -162,7 +164,8 @@ hostname in the target URI."
(original-file (expand-file-name
(make-temp-name "x-dnd-test")
temporary-file-directory))
- (x-dnd-tests-xds-name (make-temp-name "x-dnd-test-target")))
+ (x-dnd-tests-xds-name (make-temp-name "x-dnd-test-target"))
+ (x-dnd-xds-testing t))
;; The call to `gui-set-selection' is only used for providing the
;; conventional `text/uri-list' target and can be ignored.
(cl-flet ((gui-set-selection #'ignore))
diff --git a/test/lisp/xml-tests.el b/test/lisp/xml-tests.el
index 748f1e39446..0040e5c7bab 100644
--- a/test/lisp/xml-tests.el
+++ b/test/lisp/xml-tests.el
@@ -195,8 +195,4 @@ Parser is called with and without `symbol-qnames' argument.")
(should (equal (cdr test)
(xml-parse-region (point-min) (point-max))))))
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
-
;;; xml-tests.el ends here
diff --git a/test/src/buffer-tests.el b/test/src/buffer-tests.el
index cba10a05025..3c6a9208ffa 100644
--- a/test/src/buffer-tests.el
+++ b/test/src/buffer-tests.el
@@ -1535,4 +1535,24 @@ with parameters from the *Messages* buffer modification."
(restore-buffer-modified-p 'autosaved)
(should (eq (buffer-modified-p) 'autosaved)))))
+(ert-deftest test-buffer-chars-modified-ticks ()
+ "Test `buffer-chars-modified-tick'."
+ (setq temporary-file-directory (file-truename temporary-file-directory))
+ (let ((text "foobar")
+ f1 f2)
+ (unwind-protect
+ (progn
+ (setq f1 (make-temp-file "buf-modiff-tests")
+ f2 (make-temp-file "buf-modiff-tests"))
+ (with-current-buffer (find-file f1)
+ (should (= (buffer-chars-modified-tick) 1))
+ (should (= (buffer-chars-modified-tick) (buffer-modified-tick)))
+ (write-region text nil f2 nil 'silent)
+ (insert-file-contents f2)
+ (should (= (buffer-chars-modified-tick) (buffer-modified-tick)))
+ (should (> (buffer-chars-modified-tick) 1))))
+ (if f1 (delete-file f1))
+ (if f2 (delete-file f2))
+ )))
+
;;; buffer-tests.el ends here
diff --git a/test/src/callint-tests.el b/test/src/callint-tests.el
index d964fc3c1f3..5a633fdc2bd 100644
--- a/test/src/callint-tests.el
+++ b/test/src/callint-tests.el
@@ -52,4 +52,17 @@
(call-interactively #'ignore t))
(should (= (length command-history) history-length))))
+(defun callint-test-int-args (foo bar &optional zot)
+ (declare (interactive-args
+ (bar 10)
+ (zot 11)))
+ (interactive (list 1 1 1))
+ (+ foo bar zot))
+
+(ert-deftest test-interactive-args ()
+ (let ((history-length 1)
+ (command-history ()))
+ (should (= (call-interactively 'callint-test-int-args t) 3))
+ (should (equal command-history '((callint-test-int-args 1 10 11))))))
+
;;; callint-tests.el ends here
diff --git a/test/src/coding-tests.el b/test/src/coding-tests.el
index de4ddb546df..f65d575d0c2 100644
--- a/test/src/coding-tests.el
+++ b/test/src/coding-tests.el
@@ -61,16 +61,17 @@
;; Return the contents (specified by CONTENT-TYPE; ascii, latin, or
;; binary) of a test file.
(defun coding-tests-file-contents (content-type)
- (let* ((ascii "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n")
- (latin (concat ascii "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ\n"))
- (binary (string-to-multibyte
- (concat (string-as-unibyte latin)
- (unibyte-string #xC0 #xC1 ?\n)))))
- (cond ((eq content-type 'ascii) ascii)
- ((eq content-type 'latin) latin)
- ((eq content-type 'binary) binary)
- (t
- (error "Invalid file content type: %s" content-type)))))
+ (with-suppressed-warnings ((obsolete string-as-unibyte))
+ (let* ((ascii "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n")
+ (latin (concat ascii "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ\n"))
+ (binary (string-to-multibyte
+ (concat (string-as-unibyte latin)
+ (unibyte-string #xC0 #xC1 ?\n)))))
+ (cond ((eq content-type 'ascii) ascii)
+ ((eq content-type 'latin) latin)
+ ((eq content-type 'binary) binary)
+ (t
+ (error "Invalid file content type: %s" content-type))))))
;; Generate FILE with CONTENTS encoded by CODING-SYSTEM.
;; whose encoding specified by CODING-SYSTEM.
@@ -429,9 +430,5 @@
'((iso-latin-1 3) (us-ascii 1 3))))
(should-error (check-coding-systems-region "å" nil '(bad-coding-system))))
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; End:
-
(provide 'coding-tests)
;;; coding-tests.el ends here
diff --git a/test/src/data-tests.el b/test/src/data-tests.el
index 7d8535f5f37..0f84b2fb776 100644
--- a/test/src/data-tests.el
+++ b/test/src/data-tests.el
@@ -741,14 +741,15 @@ comparing the subr with a much slower Lisp implementation."
(should (= (ash 1000 (* 2 most-negative-fixnum)) 0))
(should (= (ash -1000 (* 2 most-negative-fixnum)) -1))
(should (= (ash (* 2 most-negative-fixnum) (* 2 most-negative-fixnum)) -1))
- (should (= (lsh most-negative-fixnum 1)
- (* most-negative-fixnum 2)))
(should (= (ash (* 2 most-negative-fixnum) -1)
most-negative-fixnum))
- (should (= (lsh most-positive-fixnum -1) (/ most-positive-fixnum 2)))
- (should (= (lsh most-negative-fixnum -1) (lsh (- most-negative-fixnum) -1)))
- (should (= (lsh -1 -1) most-positive-fixnum))
- (should-error (lsh (1- most-negative-fixnum) -1)))
+ (with-suppressed-warnings ((suspicious lsh))
+ (should (= (lsh most-negative-fixnum 1)
+ (* most-negative-fixnum 2)))
+ (should (= (lsh most-positive-fixnum -1) (/ most-positive-fixnum 2)))
+ (should (= (lsh most-negative-fixnum -1) (lsh (- most-negative-fixnum) -1)))
+ (should (= (lsh -1 -1) most-positive-fixnum))
+ (should-error (lsh (1- most-negative-fixnum) -1))))
(ert-deftest data-tests-make-local-forwarded-var () ;bug#34318
;; Boy, this bug is tricky to trigger. You need to:
@@ -768,4 +769,8 @@ comparing the subr with a much slower Lisp implementation."
(default-value 'last-coding-system-used))
'(no-conversion bug34318)))))
+(ert-deftest data-tests-make_symbol_constant ()
+ "Can't set variable marked with 'make_symbol_constant'."
+ (should-error (setq most-positive-fixnum 1) :type 'setting-constant))
+
;;; data-tests.el ends here
diff --git a/test/src/fns-tests.el b/test/src/fns-tests.el
index 20074ca0d21..a84cce3ad4e 100644
--- a/test/src/fns-tests.el
+++ b/test/src/fns-tests.el
@@ -1365,4 +1365,53 @@
(should-error (string-to-unibyte "å"))
(should-error (string-to-unibyte "ABC∀BC")))
+(defun fns-tests--take-ref (n list)
+ "Reference implementation of `take'."
+ (named-let loop ((m n) (tail list) (ac nil))
+ (if (and (> m 0) tail)
+ (loop (1- m) (cdr tail) (cons (car tail) ac))
+ (nreverse ac))))
+
+(ert-deftest fns--take-ntake ()
+ "Test `take' and `ntake'."
+ ;; Check errors and edge cases.
+ (should-error (take 'x '(a)))
+ (should-error (ntake 'x '(a)))
+ (should-error (take 1 'a))
+ (should-error (ntake 1 'a))
+ (should-error (take 2 '(a . b)))
+ (should-error (ntake 2 '(a . b)))
+ ;; Tolerate non-lists for a count of zero.
+ (should (equal (take 0 'a) nil))
+ (should (equal (ntake 0 'a) nil))
+ ;; But not non-numbers for empty lists.
+ (should-error (take 'x nil))
+ (should-error (ntake 'x nil))
+
+ (dolist (list '(nil (a) (a b) (a b c) (a b c d) (a . b) (a b . c)))
+ (ert-info ((prin1-to-string list) :prefix "list: ")
+ (let ((max (if (proper-list-p list)
+ (+ 2 (length list))
+ (safe-length list))))
+ (dolist (n (number-sequence -1 max))
+ (ert-info ((prin1-to-string n) :prefix "n: ")
+ (let* ((l (copy-tree list))
+ (ref (fns-tests--take-ref n l)))
+ (should (equal (take n l) ref))
+ (should (equal l list))
+ (should (equal (ntake n l) ref))))))))
+
+ ;; Circular list.
+ (let ((list (list 'a 'b 'c)))
+ (setcdr (nthcdr 2 list) (cdr list)) ; list now (a b c b c b c ...)
+ (should (equal (take 0 list) nil))
+ (should (equal (take 1 list) '(a)))
+ (should (equal (take 2 list) '(a b)))
+ (should (equal (take 3 list) '(a b c)))
+ (should (equal (take 4 list) '(a b c b)))
+ (should (equal (take 5 list) '(a b c b c)))
+ (should (equal (take 10 list) '(a b c b c b c b c b)))
+
+ (should (equal (ntake 10 list) '(a b)))))
+
;;; fns-tests.el ends here
diff --git a/test/src/font-tests.el b/test/src/font-tests.el
index d99b0be89e1..7e9669c6513 100644
--- a/test/src/font-tests.el
+++ b/test/src/font-tests.el
@@ -96,8 +96,7 @@ expected font properties from parsing NAME.")
(put 'font-parse-check 'ert-explainer 'font-parse-explain)
(defun font-parse-explain (name prop expected)
- (let ((result (font-get (font-spec :name name) prop))
- (propname (symbol-name prop)))
+ (let ((propname (symbol-name prop)))
(format "Parsing `%s': expected %s `%s', got `%s'."
name (substring propname 1) expected
(font-get (font-spec :name name) prop))))
@@ -184,9 +183,5 @@ expected font properties from parsing NAME.")
:family)
'name-with-lots-of-dashes)))
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
-
(provide 'font-tests)
;;; font-tests.el ends here.
diff --git a/test/src/image-tests.el b/test/src/image-tests.el
index f710aadea74..36278f4b9fa 100644
--- a/test/src/image-tests.el
+++ b/test/src/image-tests.el
@@ -2,7 +2,7 @@
;; Copyright (C) 2021-2022 Free Software Foundation, Inc.
-;; Author: Stefan Kangas <stefan@marxist.se>
+;; Author: Stefan Kangas <stefankangas@gmail.com>
;; This file is part of GNU Emacs.
diff --git a/test/src/keymap-tests.el b/test/src/keymap-tests.el
index b0876664ed1..ce96be6869e 100644
--- a/test/src/keymap-tests.el
+++ b/test/src/keymap-tests.el
@@ -430,6 +430,18 @@ g .. h foo
(make-non-key-event 'keymap-tests-event)
(should (equal (where-is-internal 'keymap-tests-command) '([3 103]))))
+(ert-deftest keymap-test-duplicate-definitions ()
+ "Check that defvar-keymap rejects duplicate key definitions."
+ (should-error
+ (defvar-keymap
+ ert-keymap-duplicate
+ "a" #'next-line
+ "a" #'previous-line))
+ (should-error
+ (define-keymap
+ "a" #'next-line
+ "a" #'previous-line)))
+
(provide 'keymap-tests)
;;; keymap-tests.el ends here
diff --git a/test/src/lread-resources/lazydoc.el b/test/src/lread-resources/lazydoc.el
new file mode 100644
index 00000000000..cb434c239b5
--- /dev/null
+++ b/test/src/lread-resources/lazydoc.el
Binary files differ
diff --git a/test/src/lread-tests.el b/test/src/lread-tests.el
index f190f14781e..2f25de4cc39 100644
--- a/test/src/lread-tests.el
+++ b/test/src/lread-tests.el
@@ -322,4 +322,21 @@ literals (Bug#20852)."
(should-error (read-from-string "?\\\n x"))
(should (equal (read-from-string "\"a\\\nb\"") '("ab" . 6))))
+(ert-deftest lread-force-load-doc-strings ()
+ ;; Verify that lazy doc strings are loaded lazily by default,
+ ;; but eagerly with `force-load-doc-strings' set.
+ (let ((file (expand-file-name "lazydoc.el" (ert-resource-directory))))
+ (fmakunbound 'lazydoc-fun)
+ (load file)
+ (let ((f (symbol-function 'lazydoc-fun)))
+ (should (byte-code-function-p f))
+ (should (equal (aref f 4) (cons file 87))))
+
+ (fmakunbound 'lazydoc-fun)
+ (let ((load-force-doc-strings t))
+ (load file)
+ (let ((f (symbol-function 'lazydoc-fun)))
+ (should (byte-code-function-p f))
+ (should (equal (aref f 4) "My little\ndoc string\nhere"))))))
+
;;; lread-tests.el ends here
diff --git a/test/src/print-tests.el b/test/src/print-tests.el
index 6ff7e997837..5c349342eb3 100644
--- a/test/src/print-tests.el
+++ b/test/src/print-tests.el
@@ -514,7 +514,7 @@ otherwise, use a different charset."
(should (< lead (length numbers)))
(should (<= lead loopback-index))
(should (< loopback-index (length numbers)))
- (let ((lead-part (butlast numbers (- (length numbers) lead)))
+ (let ((lead-part (take lead numbers))
(loop-part (nthcdr lead numbers)))
;; The lead part must match exactly.
(should (equal lead-part (number-sequence 1 lead)))
@@ -529,6 +529,18 @@ otherwise, use a different charset."
(should (equal (% (- (length numbers) loopback-index) loop)
0)))))))))))
+(ert-deftest test-print-unreadable-function-buffer ()
+ (let* ((buffer nil)
+ (callback-buffer nil)
+ (str (with-temp-buffer
+ (setq buffer (current-buffer))
+ (let ((print-unreadable-function
+ (lambda (_object _escape)
+ (setq callback-buffer (current-buffer))
+ "tata")))
+ (prin1-to-string (make-marker))))))
+ (should (eq callback-buffer buffer))
+ (should (equal str "tata"))))
(provide 'print-tests)
;;; print-tests.el ends here
diff --git a/test/src/process-tests.el b/test/src/process-tests.el
index f1ed7e18d5b..db8a5044783 100644
--- a/test/src/process-tests.el
+++ b/test/src/process-tests.el
@@ -38,10 +38,11 @@
;; Timeout in seconds; the test fails if the timeout is reached.
(defvar process-test-sentinel-wait-timeout 2.0)
-;; Start a process that exits immediately. Call WAIT-FUNCTION,
-;; possibly multiple times, to wait for the process to complete.
-(defun process-test-sentinel-wait-function-working-p (wait-function)
- (let ((proc (start-process "test" nil "bash" "-c" "exit 20"))
+(defun process-test-wait-for-sentinel (proc exit-status &optional wait-function)
+ "Set a sentinel on PROC and wait for it to be called with EXIT-STATUS.
+Call WAIT-FUNCTION, possibly multiple times, to wait for the
+process to complete."
+ (let ((wait-function (or wait-function #'accept-process-output))
(sentinel-called nil)
(start-time (float-time)))
(set-process-sentinel proc (lambda (_proc _msg)
@@ -50,21 +51,22 @@
(> (- (float-time) start-time)
process-test-sentinel-wait-timeout)))
(funcall wait-function))
- (cl-assert (eq (process-status proc) 'exit))
- (cl-assert (= (process-exit-status proc) 20))
- sentinel-called))
+ (should sentinel-called)
+ (should (eq (process-status proc) 'exit))
+ (should (= (process-exit-status proc) exit-status))))
(ert-deftest process-test-sentinel-accept-process-output ()
(skip-unless (executable-find "bash"))
(with-timeout (60 (ert-fail "Test timed out"))
- (should (process-test-sentinel-wait-function-working-p
- #'accept-process-output))))
+ (let ((proc (start-process "test" nil "bash" "-c" "exit 20")))
+ (should (process-test-wait-for-sentinel proc 20)))))
(ert-deftest process-test-sentinel-sit-for ()
(skip-unless (executable-find "bash"))
(with-timeout (60 (ert-fail "Test timed out"))
- (should
- (process-test-sentinel-wait-function-working-p (lambda () (sit-for 0.01 t))))))
+ (let ((proc (start-process "test" nil "bash" "-c" "exit 20")))
+ (should (process-test-wait-for-sentinel
+ proc 20 (lambda () (sit-for 0.01 t)))))))
(when (eq system-type 'windows-nt)
(ert-deftest process-test-quoted-batfile ()
@@ -97,17 +99,8 @@
"echo hello stderr! >&2; "
"exit 20"))
:buffer stdout-buffer
- :stderr stderr-buffer))
- (sentinel-called nil)
- (start-time (float-time)))
- (set-process-sentinel proc (lambda (_proc _msg)
- (setq sentinel-called t)))
- (while (not (or sentinel-called
- (> (- (float-time) start-time)
- process-test-sentinel-wait-timeout)))
- (accept-process-output))
- (cl-assert (eq (process-status proc) 'exit))
- (cl-assert (= (process-exit-status proc) 20))
+ :stderr stderr-buffer)))
+ (process-test-wait-for-sentinel proc 20)
(should (with-current-buffer stdout-buffer
(goto-char (point-min))
(looking-at "hello stdout!")))
@@ -118,8 +111,7 @@
(ert-deftest process-test-stderr-filter ()
(skip-unless (executable-find "bash"))
(with-timeout (60 (ert-fail "Test timed out"))
- (let* ((sentinel-called nil)
- (stderr-sentinel-called nil)
+ (let* ((stderr-sentinel-called nil)
(stdout-output nil)
(stderr-output nil)
(stdout-buffer (generate-new-buffer "*stdout*"))
@@ -131,23 +123,14 @@
(concat "echo hello stdout!; "
"echo hello stderr! >&2; "
"exit 20"))
- :stderr stderr-proc))
- (start-time (float-time)))
+ :stderr stderr-proc)))
(set-process-filter proc (lambda (_proc input)
(push input stdout-output)))
- (set-process-sentinel proc (lambda (_proc _msg)
- (setq sentinel-called t)))
(set-process-filter stderr-proc (lambda (_proc input)
(push input stderr-output)))
(set-process-sentinel stderr-proc (lambda (_proc _input)
(setq stderr-sentinel-called t)))
- (while (not (or sentinel-called
- (> (- (float-time) start-time)
- process-test-sentinel-wait-timeout)))
- (accept-process-output))
- (cl-assert (eq (process-status proc) 'exit))
- (cl-assert (= (process-exit-status proc) 20))
- (should sentinel-called)
+ (process-test-wait-for-sentinel proc 20)
(should (equal 1 (with-current-buffer stdout-buffer
(point-max))))
(should (equal "hello stdout!\n"
@@ -289,6 +272,77 @@
(error :got-error))))
(should have-called-debugger))))
+(defun make-process/test-connection-type (ttys &rest args)
+ "Make a process and check whether its standard streams match TTYS.
+This calls `make-process', passing ARGS to adjust how the process
+is created. TTYS should be a list of 3 boolean values,
+indicating whether the subprocess's stdin, stdout, and stderr
+should be a TTY, respectively."
+ (declare (indent 1))
+ (let* (;; MS-Windows doesn't support communicating via pty.
+ (ttys (if (eq system-type 'windows-nt) '(nil nil nil) ttys))
+ (expected-output (concat (and (nth 0 ttys) "stdin\n")
+ (and (nth 1 ttys) "stdout\n")
+ (and (nth 2 ttys) "stderr\n")))
+ (stdout-buffer (generate-new-buffer "*stdout*"))
+ (proc (apply
+ #'make-process
+ :name "test"
+ :command (list "sh" "-c"
+ (concat "if [ -t 0 ]; then echo stdin; fi; "
+ "if [ -t 1 ]; then echo stdout; fi; "
+ "if [ -t 2 ]; then echo stderr; fi"))
+ :buffer stdout-buffer
+ args)))
+ (should (eq (and (process-tty-name proc 'stdin) t) (nth 0 ttys)))
+ (should (eq (and (process-tty-name proc 'stdout) t) (nth 1 ttys)))
+ (should (eq (and (process-tty-name proc 'stderr) t) (nth 2 ttys)))
+ (process-test-wait-for-sentinel proc 0)
+ (should (equal (with-current-buffer stdout-buffer (buffer-string))
+ expected-output))))
+
+(ert-deftest make-process/connection-type/pty ()
+ (skip-unless (executable-find "sh"))
+ (make-process/test-connection-type '(t t t)
+ :connection-type 'pty))
+
+(ert-deftest make-process/connection-type/pty-2 ()
+ (skip-unless (executable-find "sh"))
+ (make-process/test-connection-type '(t t t)
+ :connection-type '(pty . pty)))
+
+(ert-deftest make-process/connection-type/pipe ()
+ (skip-unless (executable-find "sh"))
+ (make-process/test-connection-type '(nil nil nil)
+ :connection-type 'pipe))
+
+(ert-deftest make-process/connection-type/pipe-2 ()
+ (skip-unless (executable-find "sh"))
+ (make-process/test-connection-type '(nil nil nil)
+ :connection-type '(pipe . pipe)))
+
+(ert-deftest make-process/connection-type/in-pty ()
+ (skip-unless (executable-find "sh"))
+ (make-process/test-connection-type '(t nil nil)
+ :connection-type '(pty . pipe)))
+
+(ert-deftest make-process/connection-type/out-pty ()
+ (skip-unless (executable-find "sh"))
+ (make-process/test-connection-type '(nil t t)
+ :connection-type '(pipe . pty)))
+
+(ert-deftest make-process/connection-type/pty-with-stderr-buffer ()
+ (skip-unless (executable-find "sh"))
+ (let ((stderr-buffer (generate-new-buffer "*stderr*")))
+ (make-process/test-connection-type '(t t nil)
+ :connection-type 'pty :stderr stderr-buffer)))
+
+(ert-deftest make-process/connection-type/out-pty-with-stderr-buffer ()
+ (skip-unless (executable-find "sh"))
+ (let ((stderr-buffer (generate-new-buffer "*stderr*")))
+ (make-process/test-connection-type '(nil t nil)
+ :connection-type '(pipe . pty) :stderr stderr-buffer)))
+
(ert-deftest make-process/file-handler/found ()
"Check that the `:file-handler’ argument of `make-process’
works as expected if a file name handler is found."
@@ -378,6 +432,58 @@ See Bug#30460."
(when (ipv6-is-available)
(should (network-lookup-address-info "localhost" 'ipv6)))))
+(ert-deftest lookup-hints-specification ()
+ "`network-lookup-address-info' should only accept valid hints arg."
+ (should-error (network-lookup-address-info "1.1.1.1" nil t))
+ (should-error (network-lookup-address-info "1.1.1.1" 'ipv4 t))
+ (should (network-lookup-address-info "1.1.1.1" nil 'numeric))
+ (should (network-lookup-address-info "1.1.1.1" 'ipv4 'numeric))
+ (when (ipv6-is-available)
+ (should-error (network-lookup-address-info "::1" nil t))
+ (should-error (network-lookup-address-info "::1" 'ipv6 't))
+ (should (network-lookup-address-info "::1" nil 'numeric))
+ (should (network-lookup-address-info "::1" 'ipv6 'numeric))))
+
+(ert-deftest lookup-hints-values ()
+ "`network-lookup-address-info' should succeed/fail in looking up various numeric IP addresses."
+ (let ((ipv4-invalid-addrs
+ '("localhost" "343.1.2.3" "1.2.3.4.5"))
+ ;; These are valid for IPv4 but invalid for IPv6
+ (ipv4-addrs
+ '("127.0.0.1" "127.0.1" "127.1" "127" "1" "0"
+ "0xe3010203" "0xe3.1.2.3" "227.0x1.2.3"
+ "034300201003" "0343.1.2.3" "227.001.2.3"))
+ (ipv6-only-invalid-addrs
+ '("fe80:1" "e301:203:1" "e301::203::1"
+ "1:2:3:4:5:6:7:8:9" "0xe301:203::1"
+ "343:10001:2::3"
+ ;; "00343:1:2::3" is invalid on GNU/Linux and FreeBSD, but
+ ;; valid on macOS. macOS is wrong here, but such is life.
+ ))
+ ;; These are valid for IPv6 but invalid for IPv4
+ (ipv6-addrs
+ '("fe80::1" "e301::203:1" "e301:203::1"
+ "e301:0203::1" "::1" "::0"
+ "0343:1:2::3" "343:001:2::3")))
+ (dolist (a ipv4-invalid-addrs)
+ (should-not (network-lookup-address-info a nil 'numeric))
+ (should-not (network-lookup-address-info a 'ipv4 'numeric)))
+ (dolist (a ipv6-addrs)
+ (should-not (network-lookup-address-info a 'ipv4 'numeric)))
+ (dolist (a ipv4-addrs)
+ (should (network-lookup-address-info a nil 'numeric))
+ (should (network-lookup-address-info a 'ipv4 'numeric)))
+ (when (ipv6-is-available)
+ (dolist (a ipv4-addrs)
+ (should-not (network-lookup-address-info a 'ipv6 'numeric)))
+ (dolist (a ipv6-only-invalid-addrs)
+ (should-not (network-lookup-address-info a 'ipv6 'numeric)))
+ (dolist (a ipv6-addrs)
+ (should (network-lookup-address-info a nil 'numeric))
+ (should (network-lookup-address-info a 'ipv6 'numeric))
+ (should (network-lookup-address-info (upcase a) nil 'numeric))
+ (should (network-lookup-address-info (upcase a) 'ipv6 'numeric))))))
+
(ert-deftest lookup-unicode-domains ()
"Unicode domains should fail."
(skip-unless internet-is-working)